From 86a64dfd60939a4c549de3c8e43cfc4adc50e341 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ballier?= Date: Mon, 4 Nov 2013 12:44:41 +0100 Subject: [PATCH 001/532] Add Qt5 support. --- PIL/ImageQt5.py | 85 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 PIL/ImageQt5.py diff --git a/PIL/ImageQt5.py b/PIL/ImageQt5.py new file mode 100644 index 000000000..69efd18f9 --- /dev/null +++ b/PIL/ImageQt5.py @@ -0,0 +1,85 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a simple Qt image interface. +# +# history: +# 2006-06-03 fl: created +# 2006-06-04 fl: inherit from QImage instead of wrapping it +# 2006-06-05 fl: removed toimage helper; move string support to ImageQt +# +# Copyright (c) 2006 by Secret Labs AB +# Copyright (c) 2006 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from PIL import Image +from PIL._util import isPath + +from PyQt5.QtGui import QImage, qRgb + +## +# (Internal) Turns an RGB color into a Qt compatible color integer. + +def rgb(r, g, b): + # use qRgb to pack the colors, and then turn the resulting long + # into a negative integer with the same bitpattern. + return (qRgb(r, g, b) & 0xffffff) - 0x1000000 + +## +# An PIL image wrapper for Qt. This is a subclass of PyQt5's QImage +# class. +# +# @param im A PIL Image object, or a file name (given either as Python +# string or a PyQt string object). + +class ImageQt(QImage): + + def __init__(self, im): + + data = None + colortable = None + + # handle filename, if given instead of image name + if hasattr(im, "toUtf8"): + # FIXME - is this really the best way to do this? + im = unicode(im.toUtf8(), "utf-8") + if isPath(im): + im = Image.open(im) + + if im.mode == "1": + format = QImage.Format_Mono + elif im.mode == "L": + format = QImage.Format_Indexed8 + colortable = [] + for i in range(256): + colortable.append(rgb(i, i, i)) + elif im.mode == "P": + format = QImage.Format_Indexed8 + colortable = [] + palette = im.getpalette() + for i in range(0, len(palette), 3): + colortable.append(rgb(*palette[i:i+3])) + elif im.mode == "RGB": + data = im.tobytes("raw", "BGRX") + format = QImage.Format_RGB32 + elif im.mode == "RGBA": + try: + data = im.tobytes("raw", "BGRA") + except SystemError: + # workaround for earlier versions + r, g, b, a = im.split() + im = Image.merge("RGBA", (b, g, r, a)) + format = QImage.Format_ARGB32 + else: + raise ValueError("unsupported image mode %r" % im.mode) + + # must keep a reference, or Qt will crash! + self.__data = data or im.tobytes() + + QImage.__init__(self, self.__data, im.size[0], im.size[1], format) + + if colortable: + self.setColorTable(colortable) From 6121dd5aa5cd93d1c324067e58b9f985c0ebdef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ballier?= Date: Tue, 5 Nov 2013 19:14:15 +0100 Subject: [PATCH 002/532] Add Qt5 support. --- PIL/ImageQt5.py | 1 + 1 file changed, 1 insertion(+) diff --git a/PIL/ImageQt5.py b/PIL/ImageQt5.py index 69efd18f9..936e3698f 100644 --- a/PIL/ImageQt5.py +++ b/PIL/ImageQt5.py @@ -8,6 +8,7 @@ # 2006-06-03 fl: created # 2006-06-04 fl: inherit from QImage instead of wrapping it # 2006-06-05 fl: removed toimage helper; move string support to ImageQt +# 2013-11-05 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) # # Copyright (c) 2006 by Secret Labs AB # Copyright (c) 2006 by Fredrik Lundh From 2a3422335b2495082797cf5d099e053011020934 Mon Sep 17 00:00:00 2001 From: Aurelien Ballier Date: Wed, 13 Nov 2013 12:34:09 +0100 Subject: [PATCH 003/532] Fix PyQt4&5 support. --- PIL/ImageQt.py | 6 +++- PIL/ImageQt5.py | 86 ------------------------------------------------- 2 files changed, 5 insertions(+), 87 deletions(-) delete mode 100644 PIL/ImageQt5.py diff --git a/PIL/ImageQt.py b/PIL/ImageQt.py index d8b838d25..b0c477d03 100644 --- a/PIL/ImageQt.py +++ b/PIL/ImageQt.py @@ -8,6 +8,7 @@ # 2006-06-03 fl: created # 2006-06-04 fl: inherit from QImage instead of wrapping it # 2006-06-05 fl: removed toimage helper; move string support to ImageQt +# 2013-11-13 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) # # Copyright (c) 2006 by Secret Labs AB # Copyright (c) 2006 by Fredrik Lundh @@ -18,7 +19,10 @@ from PIL import Image from PIL._util import isPath -from PyQt4.QtGui import QImage, qRgb +try: + from PyQt5.QtGui import QImage, qRgb +except: + from PyQt4.QtGui import QImage, qRgb ## # (Internal) Turns an RGB color into a Qt compatible color integer. diff --git a/PIL/ImageQt5.py b/PIL/ImageQt5.py deleted file mode 100644 index 936e3698f..000000000 --- a/PIL/ImageQt5.py +++ /dev/null @@ -1,86 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a simple Qt image interface. -# -# history: -# 2006-06-03 fl: created -# 2006-06-04 fl: inherit from QImage instead of wrapping it -# 2006-06-05 fl: removed toimage helper; move string support to ImageQt -# 2013-11-05 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) -# -# Copyright (c) 2006 by Secret Labs AB -# Copyright (c) 2006 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from PIL import Image -from PIL._util import isPath - -from PyQt5.QtGui import QImage, qRgb - -## -# (Internal) Turns an RGB color into a Qt compatible color integer. - -def rgb(r, g, b): - # use qRgb to pack the colors, and then turn the resulting long - # into a negative integer with the same bitpattern. - return (qRgb(r, g, b) & 0xffffff) - 0x1000000 - -## -# An PIL image wrapper for Qt. This is a subclass of PyQt5's QImage -# class. -# -# @param im A PIL Image object, or a file name (given either as Python -# string or a PyQt string object). - -class ImageQt(QImage): - - def __init__(self, im): - - data = None - colortable = None - - # handle filename, if given instead of image name - if hasattr(im, "toUtf8"): - # FIXME - is this really the best way to do this? - im = unicode(im.toUtf8(), "utf-8") - if isPath(im): - im = Image.open(im) - - if im.mode == "1": - format = QImage.Format_Mono - elif im.mode == "L": - format = QImage.Format_Indexed8 - colortable = [] - for i in range(256): - colortable.append(rgb(i, i, i)) - elif im.mode == "P": - format = QImage.Format_Indexed8 - colortable = [] - palette = im.getpalette() - for i in range(0, len(palette), 3): - colortable.append(rgb(*palette[i:i+3])) - elif im.mode == "RGB": - data = im.tobytes("raw", "BGRX") - format = QImage.Format_RGB32 - elif im.mode == "RGBA": - try: - data = im.tobytes("raw", "BGRA") - except SystemError: - # workaround for earlier versions - r, g, b, a = im.split() - im = Image.merge("RGBA", (b, g, r, a)) - format = QImage.Format_ARGB32 - else: - raise ValueError("unsupported image mode %r" % im.mode) - - # must keep a reference, or Qt will crash! - self.__data = data or im.tobytes() - - QImage.__init__(self, self.__data, im.size[0], im.size[1], format) - - if colortable: - self.setColorTable(colortable) From 45a616ef807219805613e3ab6c852d164b8267f2 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 18 Sep 2014 14:44:41 +0300 Subject: [PATCH 004/532] Created with Pillow: im = Image.open('hopper.jpg'); im = im.convert('1'); im.save('hopper.msp') --- Tests/images/hopper.msp | Bin 0 -> 2080 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/hopper.msp diff --git a/Tests/images/hopper.msp b/Tests/images/hopper.msp new file mode 100644 index 0000000000000000000000000000000000000000..91d9a147ff0a7d2a27f89c66405e9011a464d359 GIT binary patch literal 2080 zcmXX{Z)jWB7609*XXn{2^vP|^=oo(1WELy)+QBwPH8!W5a}-@UlSkr0KD5&0 zg>`MRlGxX#Ep{2q(WDdt1y4v|UHLUx@zV!8)M}f-=qD%ZbAp^WPN0x^WYI>vq?v2& zys|6ly?f62oxk_oqwq_kF9-;*|9`x_w?g0k>g7Frvp?O=M1tPel0-MpnA_gIkSWEA znC{Xi%~QznSdMoGvh9E>!pF|3nPPMxo8y4iH&xwu{)*Mp!=q9nVnFowJ@^;5a@{?_ zhz`aA=BvwJlzJl3Y^Dg9x;S(DMfHB6*mHo#0ud-vpWOOyeJ2;nmU=>aC{FS7JB@lH zcE+-@nP;GPz4?cYo1ZnL><$*KAB2TEb91CoAHNbQMKgR~GvQAw%a@P-J!n~c;M8M# z46%q`|Mv0Ca(7Q;@6K}@{ZsWl59)pQvvb8z;o`1pRlL;xyV&5r^SM|dx3BZkv3%s7 z*uVH}!m@Hv|55QPf%on=*1y|*Fjxxx@abxO3Qt6yJRmYJM2lSCb?BNf0G0<2NFLOi zZylc%RE6Ux$OzT%Eba(~Nds!A6e{tcs-F~4b->7Q-W`OBOL-6p!L5SKX%IrFME1if zMN8b6(FK{KDj=2%<)TmsNi;#Iy0M&!@IciBGXSf|qa~e8g^?RjXB8gH$Rhd;2!)3# z^9V_qi>aP{R@o|71P_ru>FL#un;-7f1ZBfH+I5)a#*>%p zqrgP(q10T~BDpL*+}85_GuZceO64BsdOaZCV(afF+5(Zr1QoJV><@q<2p_p7qdia6o0zyX1LzN<>M+>GhHM!9H+S*!*rxOlm1H$Ay zaW$Q`Oh7AFMChT&_xJewLQ@vyV6@G#}RJ=oU8%=iS9cFB}*BX3Gud^|f^R zeYrMF_B1GEZg&r^mN`$_WKaE8ZFOPl?NpK&+*VCIwe$;l|Bc>?laLPAncjQj?knf5 zT$-oiZqn4SDl5{hgeo?P`K*DZ>sx;tTYL8nm-Dz?6@eSC1&Zan{2lVndET5z%@xojl?D;0rL7=5qmiUJa3ZL7_ zRchCct(cvX(zX*0chB2pO^&_a}p4Wlx86DSo;yP02hROQoq|m(v_tByh#|ig_TRNH-x@jV`o) z?h6&3oJXZ1%L#nY6PWWQ&3ESUl$&oJQ%f8ncX1| zZQRd)$q-+y+5RI@1HN1=cM5tN)r4(Q27R&^y-1C~(+)cV_(MZ*pFSpP%(wn229c$(|yDySFsC>hMD?f#{7(M z*gK~a7hj{F%4jlue?`z1&%h6zMi+W75M>$!)lD*p-PfRz9Wh}L+Ut!ue5KHN3*KgO z_lg3NsGScrsOF5;`m#=ZMc-eC=La1ZOiI(lc-@#Hb+oNORq4IFA?T@~)$>QIahu@N zn$dchycqc7_$+im{I^EDXr`1#RRg7uHp+*VuK}|khJmIPt+!7F`!Y;i8r01rM(5ZH z{9|+|F_RAHg4kDnnc)je`&%cevQ>O%eZ|0C`rkWf0!<_M(TQ!S6$OvUg*nZa#}PXY zGYR8GdG5H`w1PmTrs5csZ}3tVCPx$~bcupG!ZJpkH|s?OZHD=ObN%B%v{$_{>0}v~ vIoDN%c7g~hkxCEUH*4x%Wz?`~_K~Phz$6729)j+U@)2!>qEZc8JWcjLt-ix9 literal 0 HcmV?d00001 From 3bbfcb23aa0d32d1979806c0b34db3e7810ffd84 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 18 Sep 2014 14:48:07 +0300 Subject: [PATCH 005/532] More tests for MspImagePlugin.py --- Tests/helper.py | 6 +++--- Tests/test_file_msp.py | 24 +++++++++++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index 637e77f9c..34dafa645 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -191,11 +191,11 @@ def hopper(mode="RGB", cache={}): if mode == "RGB": im = Image.open("Tests/images/hopper.ppm") elif mode == "F": - im = lena("L").convert(mode) + im = hopper("L").convert(mode) elif mode[:4] == "I;16": - im = lena("I").convert(mode) + im = hopper("I").convert(mode) else: - im = lena("RGB").convert(mode) + im = hopper("RGB").convert(mode) # cache[mode] = im return im diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py index a64faad10..2245f9ed6 100644 --- a/Tests/test_file_msp.py +++ b/Tests/test_file_msp.py @@ -1,15 +1,16 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image +TEST_FILE = "Tests/images/hopper.msp" + class TestFileMsp(PillowTestCase): def test_sanity(self): - file = self.tempfile("temp.msp") - lena("1").save(file) + hopper("1").save(file) im = Image.open(file) im.load() @@ -17,6 +18,23 @@ class TestFileMsp(PillowTestCase): self.assertEqual(im.size, (128, 128)) self.assertEqual(im.format, "MSP") + def test_open(self): + # Arrange + # Act + im = Image.open(TEST_FILE) + + # Assert + self.assertEqual(im.size, (128, 128)) + self.assert_image_similar(im, hopper("1"), 4) + + def test_cannot_save_save_wrong_mode(self): + # Arrange + im = hopper() + file = self.tempfile("temp.msp") + + # Act/Assert + self.assertRaises(IOError, lambda: im.save(file)) + if __name__ == '__main__': unittest.main() From ae7b765b532780156707a28ee7da117a9852ddfe Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 1 Oct 2014 16:50:33 +0300 Subject: [PATCH 006/532] Fix some Landscape.io errors and warnings --- PIL/PngImagePlugin.py | 4 --- Tests/helper.py | 5 ++- Tests/test_file_eps.py | 23 +++++++------- Tests/test_file_tiff.py | 58 ++++++++++++++++------------------- Tests/test_file_webp.py | 4 +-- Tests/test_file_webp_alpha.py | 8 ++--- Tests/test_imagemorph.py | 2 +- 7 files changed, 47 insertions(+), 57 deletions(-) diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index 2110aa637..fcf27aba0 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -184,7 +184,6 @@ class PngInfo: tkey = tkey.encode("utf-8", "strict") if zip: - import zlib self.add(b"iTXt", key + b"\0\x01\0" + lang + b"\0" + tkey + b"\0" + zlib.compress(value)) else: @@ -206,7 +205,6 @@ class PngInfo: key = key.encode('latin-1', 'strict') if zip: - import zlib self.add(b"zTXt", key + b"\0\0" + zlib.compress(value)) else: self.add(b"tEXt", key + b"\0" + value) @@ -359,7 +357,6 @@ class PngStream(ChunkStream): if comp_method != 0: raise SyntaxError("Unknown compression method %s in zTXt chunk" % comp_method) - import zlib try: v = zlib.decompress(v[1:]) except zlib.error: @@ -390,7 +387,6 @@ class PngStream(ChunkStream): return s if cf != 0: if cm == 0: - import zlib try: v = zlib.decompress(v) except zlib.error: diff --git a/Tests/helper.py b/Tests/helper.py index 9ee5a8259..563f42060 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -175,10 +175,10 @@ def fromstring(data): return Image.open(BytesIO(data)) -def tostring(im, format, **options): +def tostring(im, string_format, **options): from io import BytesIO out = BytesIO() - im.save(out, format, **options) + im.save(out, string_format, **options) return out.getvalue() @@ -207,7 +207,6 @@ def command_succeeds(cmd): Runs the command, which must be a list of strings. Returns True if the command succeeds, or False if an OSError was raised by subprocess.Popen. """ - import os import subprocess with open(os.devnull, 'w') as f: try: diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index a17ce274f..71c40116b 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -73,7 +73,7 @@ class TestFileEps(PillowTestCase): image1_scale1_compare = Image.open(file1_compare).convert("RGB") image1_scale1_compare.load() self.assert_image_similar(img, image1_scale1_compare, 5) - + def test_render_scale1(self): # We need png support for these render test codecs = dir(Image.core) @@ -164,11 +164,10 @@ class TestFileEps(PillowTestCase): return t = StringIO.StringIO(test_string) self._test_readline(t, ending) - + def _test_readline_io(self, test_string, ending): - import io if str is bytes: - t = io.StringIO(unicode(test_string)) + t = io.StringIO(unicode(test_string)) else: t = io.StringIO(test_string) self._test_readline(t, ending) @@ -195,35 +194,35 @@ class TestFileEps(PillowTestCase): with open(f,'rb') as r: t = EpsImagePlugin.PSFile(r) self._test_readline(t, 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'] + not_working_endings = ['\n\r', '\r'] strings = ['something', 'else', 'baz', 'bif'] for ending in line_endings: s = ending.join(strings) - # Native python versions will pass these endings. + # 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. + + # 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_file_psfile(s, ending) - + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index cf809d5d0..7a275a659 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -7,36 +7,36 @@ class TestFileTiff(PillowTestCase): def test_sanity(self): - file = self.tempfile("temp.tif") + filename = self.tempfile("temp.tif") - hopper("RGB").save(file) + hopper("RGB").save(filename) - im = Image.open(file) + im = Image.open(filename) im.load() self.assertEqual(im.mode, "RGB") self.assertEqual(im.size, (128, 128)) self.assertEqual(im.format, "TIFF") - hopper("1").save(file) - im = Image.open(file) + hopper("1").save(filename) + im = Image.open(filename) - hopper("L").save(file) - im = Image.open(file) + hopper("L").save(filename) + im = Image.open(filename) - hopper("P").save(file) - im = Image.open(file) + hopper("P").save(filename) + im = Image.open(filename) - hopper("RGB").save(file) - im = Image.open(file) + hopper("RGB").save(filename) + im = Image.open(filename) - hopper("I").save(file) - im = Image.open(file) + hopper("I").save(filename) + im = Image.open(filename) def test_mac_tiff(self): # Read RGBa images from Mac OS X [@PIL136] - file = "Tests/images/pil136.tiff" - im = Image.open(file) + filename = "Tests/images/pil136.tiff" + im = Image.open(filename) self.assertEqual(im.mode, "RGBA") self.assertEqual(im.size, (55, 43)) @@ -50,8 +50,8 @@ class TestFileTiff(PillowTestCase): if "jpeg_decoder" not in codecs: self.skipTest("jpeg support not available") - file = "Tests/images/pil168.tif" - im = Image.open(file) + filename = "Tests/images/pil168.tif" + im = Image.open(filename) self.assertEqual(im.mode, "RGB") self.assertEqual(im.size, (256, 256)) @@ -66,8 +66,8 @@ class TestFileTiff(PillowTestCase): def test_xyres_tiff(self): from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION - file = "Tests/images/pil168.tif" - im = Image.open(file) + filename = "Tests/images/pil168.tif" + im = Image.open(filename) assert isinstance(im.tag.tags[X_RESOLUTION][0], tuple) assert isinstance(im.tag.tags[Y_RESOLUTION][0], tuple) # Try to read a file where X,Y_RESOLUTION are ints @@ -169,8 +169,8 @@ class TestFileTiff(PillowTestCase): def test___str__(self): # Arrange - file = "Tests/images/pil136.tiff" - im = Image.open(file) + filename = "Tests/images/pil136.tiff" + im = Image.open(filename) # Act ret = str(im.ifd) @@ -186,8 +186,8 @@ class TestFileTiff(PillowTestCase): def test__delitem__(self): # Arrange - file = "Tests/images/pil136.tiff" - im = Image.open(file) + filename = "Tests/images/pil136.tiff" + im = Image.open(filename) len_before = len(im.ifd.as_dict()) # Act @@ -199,7 +199,6 @@ class TestFileTiff(PillowTestCase): def test_load_byte(self): # Arrange - from PIL import TiffImagePlugin ifd = TiffImagePlugin.ImageFileDirectory() data = b"abc" @@ -211,7 +210,6 @@ class TestFileTiff(PillowTestCase): def test_load_string(self): # Arrange - from PIL import TiffImagePlugin ifd = TiffImagePlugin.ImageFileDirectory() data = b"abc\0" @@ -223,7 +221,6 @@ class TestFileTiff(PillowTestCase): def test_load_float(self): # Arrange - from PIL import TiffImagePlugin ifd = TiffImagePlugin.ImageFileDirectory() data = b"abcdabcd" @@ -235,7 +232,6 @@ class TestFileTiff(PillowTestCase): def test_load_double(self): # Arrange - from PIL import TiffImagePlugin ifd = TiffImagePlugin.ImageFileDirectory() data = b"abcdefghabcdefgh" @@ -247,8 +243,8 @@ class TestFileTiff(PillowTestCase): def test_seek(self): # Arrange - file = "Tests/images/pil136.tiff" - im = Image.open(file) + filename = "Tests/images/pil136.tiff" + im = Image.open(filename) # Act im.seek(-1) @@ -258,8 +254,8 @@ class TestFileTiff(PillowTestCase): def test_seek_eof(self): # Arrange - file = "Tests/images/pil136.tiff" - im = Image.open(file) + filename = "Tests/images/pil136.tiff" + im = Image.open(filename) self.assertEqual(im.tell(), 0) # Act / Assert diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index 1ee375131..8c8313dd9 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -4,7 +4,7 @@ from PIL import Image try: from PIL import _webp -except: +except ImportError: # Skip in setUp() pass @@ -14,7 +14,7 @@ class TestFileWebp(PillowTestCase): def setUp(self): try: from PIL import _webp - except: + except ImportError: self.skipTest('WebP support not installed') def test_version(self): diff --git a/Tests/test_file_webp_alpha.py b/Tests/test_file_webp_alpha.py index 43dee648a..22c5c0922 100644 --- a/Tests/test_file_webp_alpha.py +++ b/Tests/test_file_webp_alpha.py @@ -4,7 +4,7 @@ from PIL import Image try: from PIL import _webp -except: +except ImportError: pass # Skip in setUp() @@ -14,7 +14,7 @@ class TestFileWebpAlpha(PillowTestCase): def setUp(self): try: from PIL import _webp - except: + except ImportError: self.skipTest('WebP support not installed') if _webp.WebPDecoderBuggyAlpha(self): @@ -80,8 +80,8 @@ class TestFileWebpAlpha(PillowTestCase): self.assertEqual(image.mode, "RGBA") self.assertEqual(image.size, (10, 10)) self.assertEqual(image.format, "WEBP") - image.load - image.getdata + image.load() + image.getdata() self.assert_image_similar(image, pil_image, 1.0) diff --git a/Tests/test_imagemorph.py b/Tests/test_imagemorph.py index 3bc5ce85a..bbb3ae190 100644 --- a/Tests/test_imagemorph.py +++ b/Tests/test_imagemorph.py @@ -63,7 +63,7 @@ class MorphTests(PillowTestCase): 'corner', 'dilation4', 'dilation8', 'erosion4', 'erosion8', 'edge'): lb = ImageMorph.LutBuilder(op_name=op) - lut = lb.build_lut(self) + lut = lb.build_lut() with open('Tests/images/%s.lut' % op, 'wb') as f: f.write(lut) From 29b1c81a9e059152bd9c4fb899e165d7ae598258 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 2 Oct 2014 10:31:30 +0300 Subject: [PATCH 007/532] Created with ImageMagick: convert tests\images\hopper.jpg -colorspace Gray -colors 16 -depth 4 tests\images\hopper_gray_4bpp.tif --- Tests/images/hopper_gray_4bpp.tif | Bin 0 -> 8414 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/hopper_gray_4bpp.tif diff --git a/Tests/images/hopper_gray_4bpp.tif b/Tests/images/hopper_gray_4bpp.tif new file mode 100644 index 0000000000000000000000000000000000000000..7d23958a7e56fbcdb50586748c78b8cac9e9f663 GIT binary patch literal 8414 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 N6076?^t1K({{fcVst5o8 literal 0 HcmV?d00001 From 552a9a28a04eabc241d2a3a4b5c920834a52de62 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 2 Oct 2014 10:43:22 +0300 Subject: [PATCH 008/532] Support and test for 4-bit greyscale TIFF --- PIL/TiffImagePlugin.py | 5 +++-- Tests/test_file_tiff.py | 11 +++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 50648288e..90babb9b3 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -149,6 +149,7 @@ OPEN_INFO = { (II, 0, 1, 2, (8,), ()): ("L", "L;IR"), (II, 0, 3, 1, (32,), ()): ("F", "F;32F"), (II, 1, 1, 1, (1,), ()): ("1", "1"), + (II, 1, 1, 1, (4,), ()): ("L", "L;4"), (II, 1, 1, 2, (1,), ()): ("1", "1;R"), (II, 1, 1, 1, (8,), ()): ("L", "L"), (II, 1, 1, 1, (8, 8), (2,)): ("LA", "LA"), @@ -660,7 +661,7 @@ class TiffImageFile(ImageFile.ImageFile): raise EOFError("no more images in TIFF file") if Image.DEBUG: print("Seeking to frame %s, on frame %s, __next %s, location: %s"% - (frame, self.__frame, self.__next, self.fp.tell())) + (frame, self.__frame, self.__next, self.fp.tell())) # reset python3 buffered io handle in case fp # was passed to libtiff, invalidating the buffer self.fp.tell() @@ -671,7 +672,7 @@ class TiffImageFile(ImageFile.ImageFile): self.__next = self.tag.next self.__frame += 1 self._setup() - + def _tell(self): return self.__frame diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index cf809d5d0..583e91379 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -298,6 +298,17 @@ class TestFileTiff(PillowTestCase): # Assert self.assertEqual(ret, [0, 1]) + def test_4bit(self): + # Arrange + test_file = "Tests/images/hopper_gray_4bpp.tif" + + # Act + im = Image.open(test_file) + + # Assert + self.assertEqual(im.size, (128, 128)) + self.assertEqual(im.mode, "L") + if __name__ == '__main__': unittest.main() From 8cb5688047cc71d947a7549b0b119bed37246e7c Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 2 Oct 2014 10:45:41 +0300 Subject: [PATCH 009/532] flake8 --- PIL/TiffImagePlugin.py | 8 ++++---- Tests/test_file_tiff.py | 25 +++++++++++-------------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 90babb9b3..f7a0116dd 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -450,10 +450,10 @@ class ImageFileDirectory(collections.MutableMapping): if size > 4: here = fp.tell() if Image.DEBUG: - print ("Tag Location: %s" %here) + print("Tag Location: %s" % here) fp.seek(i32(ifd, 8)) if Image.DEBUG: - print ("Data Location: %s" %fp.tell()) + print("Data Location: %s" % fp.tell()) data = ImageFile._safe_read(fp, size) fp.seek(here) else: @@ -660,14 +660,14 @@ class TiffImageFile(ImageFile.ImageFile): if not self.__next: raise EOFError("no more images in TIFF file") if Image.DEBUG: - print("Seeking to frame %s, on frame %s, __next %s, location: %s"% + print("Seeking to frame %s, on frame %s, __next %s, location: %s" % (frame, self.__frame, self.__next, self.fp.tell())) # reset python3 buffered io handle in case fp # was passed to libtiff, invalidating the buffer self.fp.tell() self.fp.seek(self.__next) if Image.DEBUG: - print("Loading tags, location: %s"%self.fp.tell()) + print("Loading tags, location: %s" % self.fp.tell()) self.tag.load(self.fp) self.__next = self.tag.next self.__frame += 1 diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 583e91379..52db1c85f 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -144,28 +144,27 @@ class TestFileTiff(PillowTestCase): def test_multipage(self): # issue #862 im = Image.open('Tests/images/multipage.tiff') - # file is a multipage tiff, 10x10 green, 10x10 red, 20x20 blue + # file is a multipage tiff: 10x10 green, 10x10 red, 20x20 blue im.seek(0) - self.assertEqual(im.size, (10,10)) - self.assertEqual(im.convert('RGB').getpixel((0,0)), (0,128,0)) + self.assertEqual(im.size, (10, 10)) + self.assertEqual(im.convert('RGB').getpixel((0, 0)), (0, 128, 0)) im.seek(1) im.load() - self.assertEqual(im.size, (10,10)) - self.assertEqual(im.convert('RGB').getpixel((0,0)), (255,0,0)) + self.assertEqual(im.size, (10, 10)) + self.assertEqual(im.convert('RGB').getpixel((0, 0)), (255, 0, 0)) im.seek(2) im.load() - self.assertEqual(im.size, (20,20)) - self.assertEqual(im.convert('RGB').getpixel((0,0)), (0,0,255)) + self.assertEqual(im.size, (20, 20)) + self.assertEqual(im.convert('RGB').getpixel((0, 0)), (0, 0, 255)) def test_multipage_last_frame(self): im = Image.open('Tests/images/multipage-lastframe.tif') im.load() - self.assertEqual(im.size, (20,20)) - self.assertEqual(im.convert('RGB').getpixel((0,0)), (0,0,255)) - + self.assertEqual(im.size, (20, 20)) + self.assertEqual(im.convert('RGB').getpixel((0, 0)), (0, 0, 255)) def test___str__(self): # Arrange @@ -199,7 +198,6 @@ class TestFileTiff(PillowTestCase): def test_load_byte(self): # Arrange - from PIL import TiffImagePlugin ifd = TiffImagePlugin.ImageFileDirectory() data = b"abc" @@ -211,7 +209,6 @@ class TestFileTiff(PillowTestCase): def test_load_string(self): # Arrange - from PIL import TiffImagePlugin ifd = TiffImagePlugin.ImageFileDirectory() data = b"abc\0" @@ -223,7 +220,6 @@ class TestFileTiff(PillowTestCase): def test_load_float(self): # Arrange - from PIL import TiffImagePlugin ifd = TiffImagePlugin.ImageFileDirectory() data = b"abcdabcd" @@ -235,7 +231,6 @@ class TestFileTiff(PillowTestCase): def test_load_double(self): # Arrange - from PIL import TiffImagePlugin ifd = TiffImagePlugin.ImageFileDirectory() data = b"abcdefghabcdefgh" @@ -301,6 +296,7 @@ class TestFileTiff(PillowTestCase): def test_4bit(self): # Arrange test_file = "Tests/images/hopper_gray_4bpp.tif" + original = hopper("L") # Act im = Image.open(test_file) @@ -308,6 +304,7 @@ class TestFileTiff(PillowTestCase): # Assert self.assertEqual(im.size, (128, 128)) self.assertEqual(im.mode, "L") + self.assert_image_similar(im, original, 7.3) if __name__ == '__main__': From 626acf705f01c094ab93682ff20382b85e209b1c Mon Sep 17 00:00:00 2001 From: homm Date: Mon, 6 Oct 2014 20:55:59 +0400 Subject: [PATCH 010/532] convert tabs to spaces --- libImaging/UnsharpMask.c | 358 +++++++++++++++++++-------------------- 1 file changed, 179 insertions(+), 179 deletions(-) diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index 231826245..fc2b4b175 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -48,9 +48,9 @@ static inline UINT8 clip(double in) { if (in >= 255.0) - return (UINT8) 255; + return (UINT8) 255; if (in <= 0.0) - return (UINT8) 0; + return (UINT8) 0; return (UINT8) in; } @@ -108,31 +108,31 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) maskData = malloc(radius * sizeof(float)); /* FIXME: error checking */ for (x = 0; x < radius; x++) { - z = ((float) (x + 2) / ((float) radius)); - dev = 0.5 + (((float) (radius * radius)) * 0.001); - /* you can adjust this factor to change the shape/center-weighting - of the gaussian */ - maskData[x] = (float) pow((1.0 / sqrt(2.0 * 3.14159265359 * dev)), - ((-(z - 1.0) * -(x - 1.0)) / - (2.0 * dev))); + z = ((float) (x + 2) / ((float) radius)); + dev = 0.5 + (((float) (radius * radius)) * 0.001); + /* you can adjust this factor to change the shape/center-weighting + of the gaussian */ + maskData[x] = (float) pow((1.0 / sqrt(2.0 * 3.14159265359 * dev)), + ((-(z - 1.0) * -(x - 1.0)) / + (2.0 * dev))); } /* if there's any remainder, multiply the first/last values in MaskData it. this allows us to support float radius values. */ if (remainder > 0.0) { - maskData[0] *= remainder; - maskData[radius - 1] *= remainder; + maskData[0] *= remainder; + maskData[radius - 1] *= remainder; } for (x = 0; x < radius; x++) { - /* this is done separately now due to the correction for float - radius values above */ - sum += maskData[x]; + /* this is done separately now due to the correction for float + radius values above */ + sum += maskData[x]; } for (i = 0; i < radius; i++) { - maskData[i] *= (1.0 / sum); - /* printf("%f\n", maskData[i]); */ + maskData[i] *= (1.0 / sum); + /* printf("%f\n", maskData[i]); */ } /* create a temporary memory buffer for the data for the first pass @@ -140,9 +140,9 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) /* don't bother about alpha/padding */ buffer = calloc((size_t) (im->xsize * im->ysize * channels), - sizeof(float)); + sizeof(float)); if (buffer == NULL) - return ImagingError_MemoryError(); + return ImagingError_MemoryError(); /* be nice to other threads while you go off to lala land */ ImagingSectionEnter(&cookie); @@ -153,94 +153,94 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) /* perform a blur on each line, and place in the temporary storage buffer */ for (y = 0; y < im->ysize; y++) { - if (channels == 1 && im->image8 != NULL) { - line8 = (UINT8 *) im->image8[y]; - } else { - line = im->image32[y]; - } - for (x = 0; x < im->xsize; x++) { - newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = 0; - /* for each neighbor pixel, factor in its value/weighting to the - current pixel */ - for (pix = 0; pix < radius; pix++) { - /* figure the offset of this neighbor pixel */ - offset = - (int) ((-((float) radius / 2.0) + (float) pix) + 0.5); - if (x + offset < 0) - offset = -x; - else if (x + offset >= im->xsize) - offset = im->xsize - x - 1; + if (channels == 1 && im->image8 != NULL) { + line8 = (UINT8 *) im->image8[y]; + } else { + line = im->image32[y]; + } + for (x = 0; x < im->xsize; x++) { + newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = 0; + /* for each neighbor pixel, factor in its value/weighting to the + current pixel */ + for (pix = 0; pix < radius; pix++) { + /* figure the offset of this neighbor pixel */ + offset = + (int) ((-((float) radius / 2.0) + (float) pix) + 0.5); + if (x + offset < 0) + offset = -x; + else if (x + offset >= im->xsize) + offset = im->xsize - x - 1; - /* add (neighbor pixel value * maskData[pix]) to the current - pixel value */ - if (channels == 1) { - buffer[(y * im->xsize) + x] += - ((float) ((UINT8 *) & line8[x + offset])[0]) * - (maskData[pix]); - } else { - for (channel = 0; channel < channels; channel++) { - buffer[(y * im->xsize * channels) + - (x * channels) + channel] += - ((float) ((UINT8 *) & line[x + offset]) - [channel]) * (maskData[pix]); - } - } - } - } + /* add (neighbor pixel value * maskData[pix]) to the current + pixel value */ + if (channels == 1) { + buffer[(y * im->xsize) + x] += + ((float) ((UINT8 *) & line8[x + offset])[0]) * + (maskData[pix]); + } else { + for (channel = 0; channel < channels; channel++) { + buffer[(y * im->xsize * channels) + + (x * channels) + channel] += + ((float) ((UINT8 *) & line[x + offset]) + [channel]) * (maskData[pix]); + } + } + } + } } /* perform a blur on each column in the buffer, and place in the output image */ for (x = 0; x < im->xsize; x++) { - for (y = 0; y < im->ysize; y++) { - newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = 0; - /* for each neighbor pixel, factor in its value/weighting to the - current pixel */ - for (pix = 0; pix < radius; pix++) { - /* figure the offset of this neighbor pixel */ - offset = - (int) (-((float) radius / 2.0) + (float) pix + 0.5); - if (y + offset < 0) - offset = -y; - else if (y + offset >= im->ysize) - offset = im->ysize - y - 1; - /* add (neighbor pixel value * maskData[pix]) to the current - pixel value */ - for (channel = 0; channel < channels; channel++) { - newPixel[channel] += - (buffer - [((y + offset) * im->xsize * channels) + - (x * channels) + channel]) * (maskData[pix]); - } - } - /* if the image is RGBX or RGBA, copy the 4th channel data to - newPixel, so it gets put in imOut */ - if (strcmp(im->mode, "RGBX") == 0 - || strcmp(im->mode, "RGBA") == 0) { - newPixel[3] = (float) ((UINT8 *) & line[x + offset])[3]; - } + for (y = 0; y < im->ysize; y++) { + newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = 0; + /* for each neighbor pixel, factor in its value/weighting to the + current pixel */ + for (pix = 0; pix < radius; pix++) { + /* figure the offset of this neighbor pixel */ + offset = + (int) (-((float) radius / 2.0) + (float) pix + 0.5); + if (y + offset < 0) + offset = -y; + else if (y + offset >= im->ysize) + offset = im->ysize - y - 1; + /* add (neighbor pixel value * maskData[pix]) to the current + pixel value */ + for (channel = 0; channel < channels; channel++) { + newPixel[channel] += + (buffer + [((y + offset) * im->xsize * channels) + + (x * channels) + channel]) * (maskData[pix]); + } + } + /* if the image is RGBX or RGBA, copy the 4th channel data to + newPixel, so it gets put in imOut */ + if (strcmp(im->mode, "RGBX") == 0 + || strcmp(im->mode, "RGBA") == 0) { + newPixel[3] = (float) ((UINT8 *) & line[x + offset])[3]; + } - /* pack the channels into an INT32 so we can put them back in - the PIL image */ - newPixelFinals = 0; - if (channels == 1) { - newPixelFinals = clip(newPixel[0]); - } else { - /* for RGB, the fourth channel isn't used anyways, so just - pack a 0 in there, this saves checking the mode for each - pixel. */ - /* this doesn't work on little-endian machines... fix it! */ - newPixelFinals = - clip(newPixel[0]) | clip(newPixel[1]) << 8 | - clip(newPixel[2]) << 16 | clip(newPixel[3]) << 24; - } - /* set the resulting pixel in imOut */ - if (channels == 1) { - imOut->image8[y][x] = (UINT8) newPixelFinals; - } else { - imOut->image32[y][x] = newPixelFinals; - } - } + /* pack the channels into an INT32 so we can put them back in + the PIL image */ + newPixelFinals = 0; + if (channels == 1) { + newPixelFinals = clip(newPixel[0]); + } else { + /* for RGB, the fourth channel isn't used anyways, so just + pack a 0 in there, this saves checking the mode for each + pixel. */ + /* this doesn't work on little-endian machines... fix it! */ + newPixelFinals = + clip(newPixel[0]) | clip(newPixel[1]) << 8 | + clip(newPixel[2]) << 16 | clip(newPixel[3]) << 24; + } + /* set the resulting pixel in imOut */ + if (channels == 1) { + imOut->image8[y][x] = (UINT8) newPixelFinals; + } else { + imOut->image32[y][x] = newPixelFinals; + } + } } /* free the buffer */ @@ -258,29 +258,29 @@ Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius) int padding = 0; if (strcmp(im->mode, "RGB") == 0) { - channels = 3; - padding = 1; + channels = 3; + padding = 1; } else if (strcmp(im->mode, "RGBA") == 0) { - channels = 3; - padding = 1; + channels = 3; + padding = 1; } else if (strcmp(im->mode, "RGBX") == 0) { - channels = 3; - padding = 1; + channels = 3; + padding = 1; } else if (strcmp(im->mode, "CMYK") == 0) { - channels = 4; - padding = 0; + channels = 4; + padding = 0; } else if (strcmp(im->mode, "L") == 0) { - channels = 1; - padding = 0; + channels = 1; + padding = 0; } else - return ImagingError_ModeError(); + return ImagingError_ModeError(); return gblur(im, imOut, radius, channels, padding); } Imaging ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, - int threshold) + int threshold) { ImagingSectionCookie cookie; @@ -302,28 +302,28 @@ ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, INT32 newPixel = 0; if (strcmp(im->mode, "RGB") == 0) { - channels = 3; - padding = 1; + channels = 3; + padding = 1; } else if (strcmp(im->mode, "RGBA") == 0) { - channels = 3; - padding = 1; + channels = 3; + padding = 1; } else if (strcmp(im->mode, "RGBX") == 0) { - channels = 3; - padding = 1; + channels = 3; + padding = 1; } else if (strcmp(im->mode, "CMYK") == 0) { - channels = 4; - padding = 0; + channels = 4; + padding = 0; } else if (strcmp(im->mode, "L") == 0) { - channels = 1; - padding = 0; + channels = 1; + padding = 0; } else - return ImagingError_ModeError(); + return ImagingError_ModeError(); /* first, do a gaussian blur on the image, putting results in imOut temporarily */ result = gblur(im, imOut, radius, channels, padding); if (!result) - return NULL; + return NULL; /* now, go through each pixel, compare "normal" pixel to blurred pixel. if the difference is more than threshold values, apply @@ -333,63 +333,63 @@ ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, ImagingSectionEnter(&cookie); for (y = 0; y < im->ysize; y++) { - if (channels == 1) { - lineIn8 = im->image8[y]; - lineOut8 = imOut->image8[y]; - } else { - lineIn = im->image32[y]; - lineOut = imOut->image32[y]; - } - for (x = 0; x < im->xsize; x++) { - newPixel = 0; - /* compare in/out pixels, apply sharpening */ - if (channels == 1) { - diff = - ((UINT8 *) & lineIn8[x])[0] - - ((UINT8 *) & lineOut8[x])[0]; - if (abs(diff) > threshold) { - /* add the diff*percent to the original pixel */ - imOut->image8[y][x] = - clip((((UINT8 *) & lineIn8[x])[0]) + - (diff * ((float) percent) / 100.0)); - } else { - /* newPixel is the same as imIn */ - imOut->image8[y][x] = ((UINT8 *) & lineIn8[x])[0]; - } - } + if (channels == 1) { + lineIn8 = im->image8[y]; + lineOut8 = imOut->image8[y]; + } else { + lineIn = im->image32[y]; + lineOut = imOut->image32[y]; + } + for (x = 0; x < im->xsize; x++) { + newPixel = 0; + /* compare in/out pixels, apply sharpening */ + if (channels == 1) { + diff = + ((UINT8 *) & lineIn8[x])[0] - + ((UINT8 *) & lineOut8[x])[0]; + if (abs(diff) > threshold) { + /* add the diff*percent to the original pixel */ + imOut->image8[y][x] = + clip((((UINT8 *) & lineIn8[x])[0]) + + (diff * ((float) percent) / 100.0)); + } else { + /* newPixel is the same as imIn */ + imOut->image8[y][x] = ((UINT8 *) & lineIn8[x])[0]; + } + } - else { - for (channel = 0; channel < channels; channel++) { - diff = (int) ((((UINT8 *) & lineIn[x])[channel]) - - (((UINT8 *) & lineOut[x])[channel])); - if (abs(diff) > threshold) { - /* add the diff*percent to the original pixel - this may not work for little-endian systems, fix it! */ - newPixel = - newPixel | - clip((float) (((UINT8 *) & lineIn[x])[channel]) - + - (diff * - (((float) percent / - 100.0)))) << (channel * 8); - } else { - /* newPixel is the same as imIn - this may not work for little-endian systems, fix it! */ - newPixel = - newPixel | ((UINT8 *) & lineIn[x])[channel] << - (channel * 8); - } - } - if (strcmp(im->mode, "RGBX") == 0 - || strcmp(im->mode, "RGBA") == 0) { - /* preserve the alpha channel - this may not work for little-endian systems, fix it! */ - newPixel = - newPixel | ((UINT8 *) & lineIn[x])[channel] << 24; - } - imOut->image32[y][x] = newPixel; - } - } + else { + for (channel = 0; channel < channels; channel++) { + diff = (int) ((((UINT8 *) & lineIn[x])[channel]) - + (((UINT8 *) & lineOut[x])[channel])); + if (abs(diff) > threshold) { + /* add the diff*percent to the original pixel + this may not work for little-endian systems, fix it! */ + newPixel = + newPixel | + clip((float) (((UINT8 *) & lineIn[x])[channel]) + + + (diff * + (((float) percent / + 100.0)))) << (channel * 8); + } else { + /* newPixel is the same as imIn + this may not work for little-endian systems, fix it! */ + newPixel = + newPixel | ((UINT8 *) & lineIn[x])[channel] << + (channel * 8); + } + } + if (strcmp(im->mode, "RGBX") == 0 + || strcmp(im->mode, "RGBA") == 0) { + /* preserve the alpha channel + this may not work for little-endian systems, fix it! */ + newPixel = + newPixel | ((UINT8 *) & lineIn[x])[channel] << 24; + } + imOut->image32[y][x] = newPixel; + } + } } ImagingSectionLeave(&cookie); From 05c99131e0e053acfd3c23895a28bd424f529d69 Mon Sep 17 00:00:00 2001 From: homm Date: Mon, 6 Oct 2014 21:27:08 +0400 Subject: [PATCH 011/532] fix blur for RGBA & RGBX --- libImaging/UnsharpMask.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index fc2b4b175..e3e975ef0 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -79,6 +79,7 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) int radius = 0; float remainder = 0.0; + int hasAlpha = 0; int i; @@ -189,6 +190,10 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) } } + if (strcmp(im->mode, "RGBX") == 0 || strcmp(im->mode, "RGBA") == 0) { + hasAlpha = 1; + } + /* perform a blur on each column in the buffer, and place in the output image */ for (x = 0; x < im->xsize; x++) { @@ -204,6 +209,7 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) offset = -y; else if (y + offset >= im->ysize) offset = im->ysize - y - 1; + /* add (neighbor pixel value * maskData[pix]) to the current pixel value */ for (channel = 0; channel < channels; channel++) { @@ -215,9 +221,8 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) } /* if the image is RGBX or RGBA, copy the 4th channel data to newPixel, so it gets put in imOut */ - if (strcmp(im->mode, "RGBX") == 0 - || strcmp(im->mode, "RGBA") == 0) { - newPixel[3] = (float) ((UINT8 *) & line[x + offset])[3]; + if (hasAlpha) { + newPixel[3] = (float) ((UINT8 *) & im->image32[y][x])[3]; } /* pack the channels into an INT32 so we can put them back in From ddae12928ae7dd919086ffcc4c0ec940e9024360 Mon Sep 17 00:00:00 2001 From: homm Date: Wed, 8 Oct 2014 06:49:56 +0400 Subject: [PATCH 012/532] add detailed test for blur and simple test for sharp --- Tests/images/color_snakes.png | Bin 0 -> 1311 bytes Tests/test_imageops_usm.py | 34 +++++++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 Tests/images/color_snakes.png diff --git a/Tests/images/color_snakes.png b/Tests/images/color_snakes.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3a351964f4d9ce61ef88222d133f66b45e4b2b GIT binary patch literal 1311 zcmZ`(Uue@n9KONSnKDEL_YYZ&;#+e`*WsF_f!eCwSm*2}cA~N@z0SC_iAhRRL73vp z1QC^qj0rwDL>LV8!HGV|UVKu)M<)m}WeDP%h@y9C*Tv8UlH7g2@4Mgc`z3eNLxabf zsdfqg(A<|yr16`Ksiv*?c_Z}Z1%5S7#8NQ;7HM8|a#(cNsA16JV8Pm7S!8{k1hN!UHEdNc z&}3bCTrb*Dh9QY+SEWu{&23~VSXEotAS4mUvmC4^Lyo$Mj6^n-WtEyMqiAZbr>p{z zhVrOjTUf`}O^1716aH7EBO8@uZWAlsL{hnsMwYG>NefOER9oUj*N`9H=txBs*Yk#n zEDOt|?yAI#`T3cRG}56^Rp15vg5#!&oyw%HT1{Te&mXOqzzcc=r1ip(>L4wXP;o Date: Wed, 8 Oct 2014 15:05:48 +0400 Subject: [PATCH 013/532] round pixel values --- Tests/test_imageops_usm.py | 18 +++++++++--------- libImaging/UnsharpMask.c | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Tests/test_imageops_usm.py b/Tests/test_imageops_usm.py index d1bdacd52..5164af015 100644 --- a/Tests/test_imageops_usm.py +++ b/Tests/test_imageops_usm.py @@ -66,7 +66,7 @@ class TestImageOpsUsm(PillowTestCase): def test_blur_accuracy(self): - i = snakes._new(ImageOps.gaussian_blur(snakes, .9)) + i = snakes._new(ImageOps.gaussian_blur(snakes, 1)) # Alpha channel must match whole. self.assertEqual(i.split()[3], snakes.split()[3]) # These pixels surrounded with pixels with 255 intensity. @@ -77,14 +77,14 @@ class TestImageOpsUsm(PillowTestCase): self.assertEqual(i.im.getpixel((x, y))[c], 255) # Fuzzy match. gp = lambda x, y: i.im.getpixel((x, y)) - self.assertTrue(212 <= gp(7, 4)[0] <= 214) - self.assertTrue(212 <= gp(7, 5)[2] <= 214) - self.assertTrue(212 <= gp(7, 6)[2] <= 214) - self.assertTrue(212 <= gp(7, 7)[1] <= 214) - self.assertTrue(212 <= gp(8, 4)[0] <= 214) - self.assertTrue(212 <= gp(8, 5)[2] <= 214) - self.assertTrue(212 <= gp(8, 6)[2] <= 214) - self.assertTrue(212 <= gp(8, 7)[1] <= 214) + self.assertTrue(211 <= gp(7, 4)[0] <= 213) + self.assertTrue(211 <= gp(7, 5)[2] <= 213) + self.assertTrue(211 <= gp(7, 6)[2] <= 213) + self.assertTrue(211 <= gp(7, 7)[1] <= 213) + self.assertTrue(211 <= gp(8, 4)[0] <= 213) + self.assertTrue(211 <= gp(8, 5)[2] <= 213) + self.assertTrue(211 <= gp(8, 6)[2] <= 213) + self.assertTrue(211 <= gp(8, 7)[1] <= 213) if __name__ == '__main__': unittest.main() diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index e3e975ef0..0e0eb66e4 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -51,7 +51,7 @@ static inline UINT8 clip(double in) return (UINT8) 255; if (in <= 0.0) return (UINT8) 0; - return (UINT8) in; + return (UINT8) (in + 0.5); } static Imaging From bef7e1dce8a47f3136b5b9d94d6e821aa2d7a0d0 Mon Sep 17 00:00:00 2001 From: homm Date: Wed, 8 Oct 2014 17:40:33 +0400 Subject: [PATCH 014/532] cache hasAlpha for ImagingUnsharpMask --- libImaging/UnsharpMask.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index 0e0eb66e4..76d630a8f 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -293,6 +293,7 @@ ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, int channel = 0; int channels = 0; int padding = 0; + int hasAlpha = 0; int x = 0; int y = 0; @@ -337,6 +338,10 @@ ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, ImagingSectionEnter(&cookie); + if (strcmp(im->mode, "RGBX") == 0 || strcmp(im->mode, "RGBA") == 0) { + hasAlpha = 1; + } + for (y = 0; y < im->ysize; y++) { if (channels == 1) { lineIn8 = im->image8[y]; @@ -385,8 +390,7 @@ ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, (channel * 8); } } - if (strcmp(im->mode, "RGBX") == 0 - || strcmp(im->mode, "RGBA") == 0) { + if (hasAlpha) { /* preserve the alpha channel this may not work for little-endian systems, fix it! */ newPixel = From 7bc19c4019a8000ced8752d5d85ab4b3655d1d4c Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 11 Oct 2014 23:03:51 +0400 Subject: [PATCH 015/532] reference gaussian_blur implementation radius meaning match graphicmagick, pixelmator other software and standard deviation from classic gaussian blur algorithm --- libImaging/UnsharpMask.c | 61 +++++++++++++--------------------------- 1 file changed, 20 insertions(+), 41 deletions(-) diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index 76d630a8f..c6a279cd4 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -62,7 +62,7 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) float *maskData = NULL; int y = 0; int x = 0; - float z = 0; + int z = 0; float sum = 0.0; float dev = 0.0; @@ -78,7 +78,7 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) INT32 newPixelFinals; int radius = 0; - float remainder = 0.0; + int diameter = 0; int hasAlpha = 0; int i; @@ -92,49 +92,35 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) radius of 5 instead of 25 lookups). So, we blur the lines first, then we blur the resulting columns. */ - /* first, round radius off to the next higher integer and hold the - remainder this is used so we can support float radius values - properly. */ - - remainder = floatRadius - ((int) floatRadius); - floatRadius = ceil(floatRadius); - /* Next, double the radius and offset by 2.0... that way "0" returns the original image instead of a black one. We multiply it by 2.0 so that it is a true "radius", not a diameter (the results match other paint programs closer that way too). */ - radius = (int) ((floatRadius * 2.0) + 2.0); + radius = (int) ceil(floatRadius * 2.57); + diameter = radius * 2 + 1; /* create the maskData for the gaussian curve */ - maskData = malloc(radius * sizeof(float)); - /* FIXME: error checking */ - for (x = 0; x < radius; x++) { - z = ((float) (x + 2) / ((float) radius)); - dev = 0.5 + (((float) (radius * radius)) * 0.001); - /* you can adjust this factor to change the shape/center-weighting - of the gaussian */ - maskData[x] = (float) pow((1.0 / sqrt(2.0 * 3.14159265359 * dev)), - ((-(z - 1.0) * -(x - 1.0)) / - (2.0 * dev))); + maskData = malloc(diameter * sizeof(float)); + for (x = 0; x < diameter; x++) { + z = x - radius; + dev = floatRadius * floatRadius; + /* http://en.wikipedia.org/wiki/Gaussian_blur + "1 / sqrt(2 * pi * dev)" is constant and will be eliminated by + normalization. */ + maskData[x] = pow(2.718281828459, -z * z / (2 * dev)); } - /* if there's any remainder, multiply the first/last values in - MaskData it. this allows us to support float radius values. */ - if (remainder > 0.0) { - maskData[0] *= remainder; - maskData[radius - 1] *= remainder; - } - - for (x = 0; x < radius; x++) { + for (x = 0; x < diameter; x++) { /* this is done separately now due to the correction for float radius values above */ sum += maskData[x]; } - for (i = 0; i < radius; i++) { + for (i = 0; i < diameter; i++) { maskData[i] *= (1.0 / sum); - /* printf("%f\n", maskData[i]); */ + // printf("%d %f\n", i, maskData[i]); } + // printf("\n"); /* create a temporary memory buffer for the data for the first pass memset the buffer to 0 so we can use it directly with += */ @@ -148,10 +134,6 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) /* be nice to other threads while you go off to lala land */ ImagingSectionEnter(&cookie); - /* memset(buffer, 0, sizeof(buffer)); */ - - newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = 0; - /* perform a blur on each line, and place in the temporary storage buffer */ for (y = 0; y < im->ysize; y++) { if (channels == 1 && im->image8 != NULL) { @@ -160,13 +142,11 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) line = im->image32[y]; } for (x = 0; x < im->xsize; x++) { - newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = 0; /* for each neighbor pixel, factor in its value/weighting to the current pixel */ - for (pix = 0; pix < radius; pix++) { + for (pix = 0; pix < diameter; pix++) { /* figure the offset of this neighbor pixel */ - offset = - (int) ((-((float) radius / 2.0) + (float) pix) + 0.5); + offset = pix - radius; if (x + offset < 0) offset = -x; else if (x + offset >= im->xsize) @@ -201,10 +181,9 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = 0; /* for each neighbor pixel, factor in its value/weighting to the current pixel */ - for (pix = 0; pix < radius; pix++) { + for (pix = 0; pix < diameter; pix++) { /* figure the offset of this neighbor pixel */ - offset = - (int) (-((float) radius / 2.0) + (float) pix + 0.5); + offset = pix - radius; if (y + offset < 0) offset = -y; else if (y + offset >= im->ysize) From b1b5db16cd35ea458f40b9aec8716c6fe7cbcb85 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 00:49:45 +0400 Subject: [PATCH 016/532] padding not using anywhere --- libImaging/UnsharpMask.c | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index c6a279cd4..7600826b7 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -55,7 +55,7 @@ static inline UINT8 clip(double in) } static Imaging -gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) +gblur(Imaging im, Imaging imOut, float floatRadius, int channels) { ImagingSectionCookie cookie; @@ -125,7 +125,7 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) /* create a temporary memory buffer for the data for the first pass memset the buffer to 0 so we can use it directly with += */ - /* don't bother about alpha/padding */ + /* don't bother about alpha */ buffer = calloc((size_t) (im->xsize * im->ysize * channels), sizeof(float)); if (buffer == NULL) @@ -239,27 +239,21 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius) { int channels = 0; - int padding = 0; if (strcmp(im->mode, "RGB") == 0) { channels = 3; - padding = 1; } else if (strcmp(im->mode, "RGBA") == 0) { channels = 3; - padding = 1; } else if (strcmp(im->mode, "RGBX") == 0) { channels = 3; - padding = 1; } else if (strcmp(im->mode, "CMYK") == 0) { channels = 4; - padding = 0; } else if (strcmp(im->mode, "L") == 0) { channels = 1; - padding = 0; } else return ImagingError_ModeError(); - return gblur(im, imOut, radius, channels, padding); + return gblur(im, imOut, radius, channels); } Imaging @@ -271,7 +265,6 @@ ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, Imaging result; int channel = 0; int channels = 0; - int padding = 0; int hasAlpha = 0; int x = 0; @@ -288,25 +281,20 @@ ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, if (strcmp(im->mode, "RGB") == 0) { channels = 3; - padding = 1; } else if (strcmp(im->mode, "RGBA") == 0) { channels = 3; - padding = 1; } else if (strcmp(im->mode, "RGBX") == 0) { channels = 3; - padding = 1; } else if (strcmp(im->mode, "CMYK") == 0) { channels = 4; - padding = 0; } else if (strcmp(im->mode, "L") == 0) { channels = 1; - padding = 0; } else return ImagingError_ModeError(); /* first, do a gaussian blur on the image, putting results in imOut temporarily */ - result = gblur(im, imOut, radius, channels, padding); + result = gblur(im, imOut, radius, channels); if (!result) return NULL; From 5bb0cfa17aa22b7fd1351af2a1150824de34b9a9 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 02:05:13 +0400 Subject: [PATCH 017/532] remove pseudo vcs --- libImaging/UnsharpMask.c | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index 7600826b7..ede49af5b 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -9,41 +9,6 @@ #include "Python.h" #include "Imaging.h" -#define PILUSMVERSION "0.6.1" - -/* version history - -0.6.1 converted to C and added to PIL 1.1.7 - -0.6.0 fixed/improved float radius support (oops!) - now that radius can be a float (properly), changed radius value to - be an actual radius (instead of diameter). So, you should get - similar results from PIL_usm as from other paint programs when - using the SAME values (no doubling of radius required any more). - Be careful, this may "break" software if you had it set for 2x - or 5x the radius as was recommended with earlier versions. - made PILusm thread-friendly (release GIL before lengthly operations, - and re-acquire it before returning to Python). This makes a huge - difference with multi-threaded applications on dual-processor - or "Hyperthreading"-enabled systems (Pentium4, Xeon, etc.) - -0.5.0 added support for float radius values! - -0.4.0 tweaked gaussian curve calculation to be closer to consistent shape - across a wide range of radius values - -0.3.0 changed deviation calculation in gausian algorithm to be dynamic - _gblur now adds 1 to the user-supplied radius before using it so - that a value of "0" returns the original image instead of a - black one. - fixed handling of alpha channel in RGBX, RGBA images - improved speed of gblur by reducing unnecessary checks and assignments - -0.2.0 fixed L-mode image support - -0.1.0 initial release - -*/ static inline UINT8 clip(double in) { From 091b15f9d5afb3e49d47e7f93b19b464af21d7cb Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 02:59:21 +0400 Subject: [PATCH 018/532] rename vars --- libImaging/UnsharpMask.c | 50 ++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index ede49af5b..52379a21c 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -20,16 +20,14 @@ static inline UINT8 clip(double in) } static Imaging -gblur(Imaging im, Imaging imOut, float floatRadius, int channels) +gblur(Imaging im, Imaging imOut, float radius, int channels) { ImagingSectionCookie cookie; float *maskData = NULL; int y = 0; int x = 0; - int z = 0; float sum = 0.0; - float dev = 0.0; float *buffer = NULL; @@ -42,12 +40,10 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels) int offset = 0; INT32 newPixelFinals; - int radius = 0; - int diameter = 0; + int effectiveRadius = 0; + int window = 0; int hasAlpha = 0; - int i; - /* Do the gaussian blur */ /* For a symmetrical gaussian blur, instead of doing a radius*radius @@ -57,33 +53,33 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels) radius of 5 instead of 25 lookups). So, we blur the lines first, then we blur the resulting columns. */ - /* Next, double the radius and offset by 2.0... that way "0" returns - the original image instead of a black one. We multiply it by 2.0 - so that it is a true "radius", not a diameter (the results match - other paint programs closer that way too). */ - radius = (int) ceil(floatRadius * 2.57); - diameter = radius * 2 + 1; + /* Only pixels in effective radius from source pixel are accounted. + The Gaussian values outside 3 x radius is near zero. */ + effectiveRadius = (int) ceil(radius * 2.57); + /* Window is number of pixels forming the result pixel on one axis. + It is source pixel and effective radius in both directions. */ + window = effectiveRadius * 2 + 1; /* create the maskData for the gaussian curve */ - maskData = malloc(diameter * sizeof(float)); - for (x = 0; x < diameter; x++) { - z = x - radius; - dev = floatRadius * floatRadius; + maskData = malloc(window * sizeof(float)); + for (pix = 0; pix < window; pix++) { + offset = pix - effectiveRadius; /* http://en.wikipedia.org/wiki/Gaussian_blur "1 / sqrt(2 * pi * dev)" is constant and will be eliminated by normalization. */ - maskData[x] = pow(2.718281828459, -z * z / (2 * dev)); + maskData[pix] = pow(2.718281828459, + -offset * offset / (2 * radius * radius)); } - for (x = 0; x < diameter; x++) { + for (pix = 0; pix < window; pix++) { /* this is done separately now due to the correction for float radius values above */ - sum += maskData[x]; + sum += maskData[pix]; } - for (i = 0; i < diameter; i++) { - maskData[i] *= (1.0 / sum); - // printf("%d %f\n", i, maskData[i]); + for (pix = 0; pix < window; pix++) { + maskData[pix] *= (1.0 / sum); + // printf("%d %f\n", pix, maskData[pix]); } // printf("\n"); @@ -109,9 +105,9 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels) for (x = 0; x < im->xsize; x++) { /* for each neighbor pixel, factor in its value/weighting to the current pixel */ - for (pix = 0; pix < diameter; pix++) { + for (pix = 0; pix < window; pix++) { /* figure the offset of this neighbor pixel */ - offset = pix - radius; + offset = pix - effectiveRadius; if (x + offset < 0) offset = -x; else if (x + offset >= im->xsize) @@ -146,9 +142,9 @@ gblur(Imaging im, Imaging imOut, float floatRadius, int channels) newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = 0; /* for each neighbor pixel, factor in its value/weighting to the current pixel */ - for (pix = 0; pix < diameter; pix++) { + for (pix = 0; pix < window; pix++) { /* figure the offset of this neighbor pixel */ - offset = pix - radius; + offset = pix - effectiveRadius; if (y + offset < 0) offset = -y; else if (y + offset >= im->ysize) From 84b9f16bfdeadbaeb7e0773b87c38c7201e1fbdc Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 03:29:20 +0400 Subject: [PATCH 019/532] add effective_scale to all APIs --- PIL/ImageFilter.py | 5 +++-- PIL/ImageOps.py | 9 ++++++--- _imaging.c | 5 +++-- libImaging/Imaging.h | 3 ++- libImaging/UnsharpMask.c | 11 ++++++----- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/PIL/ImageFilter.py b/PIL/ImageFilter.py index 1e0154d12..fed165831 100644 --- a/PIL/ImageFilter.py +++ b/PIL/ImageFilter.py @@ -149,11 +149,12 @@ class GaussianBlur(Filter): """ name = "GaussianBlur" - def __init__(self, radius=2): + def __init__(self, radius=2, effective_scale=None): self.radius = radius + self.effective_scale = effective_scale def filter(self, image): - return image.gaussian_blur(self.radius) + return image.gaussian_blur(self.radius, self.effective_scale) class UnsharpMask(Filter): diff --git a/PIL/ImageOps.py b/PIL/ImageOps.py index b3afd9e95..9a83687c1 100644 --- a/PIL/ImageOps.py +++ b/PIL/ImageOps.py @@ -413,15 +413,18 @@ def solarize(image, threshold=128): # -------------------------------------------------------------------- # PIL USM components, from Kevin Cazabon. -def gaussian_blur(im, radius=None): - """ PIL_usm.gblur(im, [radius])""" +def gaussian_blur(im, radius=None, effective_scale=None): + """ PIL_usm.gblur(im, [radius], [effective_scale])""" if radius is None: radius = 5.0 + if effective_scale is None: + effective_scale = 2.6 + im.load() - return im.im.gaussian_blur(radius) + return im.im.gaussian_blur(radius, effective_scale) gblur = gaussian_blur diff --git a/_imaging.c b/_imaging.c index 1759d4c8d..d7ec1747e 100644 --- a/_imaging.c +++ b/_imaging.c @@ -863,7 +863,8 @@ _gaussian_blur(ImagingObject* self, PyObject* args) Imaging imOut; float radius = 0; - if (!PyArg_ParseTuple(args, "f", &radius)) + float effectiveScale = 2.6; + if (!PyArg_ParseTuple(args, "f|f", &radius, &effectiveScale)) return NULL; imIn = self->image; @@ -871,7 +872,7 @@ _gaussian_blur(ImagingObject* self, PyObject* args) if (!imOut) return NULL; - if (!ImagingGaussianBlur(imIn, imOut, radius)) + if (!ImagingGaussianBlur(imIn, imOut, radius, effectiveScale)) return NULL; return PyImagingNew(imOut); diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index d958387c9..8c3bea475 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -263,7 +263,8 @@ extern Imaging ImagingFilter( FLOAT32 offset, FLOAT32 divisor); extern Imaging ImagingFlipLeftRight(Imaging imOut, Imaging imIn); extern Imaging ImagingFlipTopBottom(Imaging imOut, Imaging imIn); -extern Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius); +extern Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius, + float effectiveScale); extern Imaging ImagingGetBand(Imaging im, int band); extern int ImagingGetBBox(Imaging im, int bbox[4]); typedef struct { int x, y; INT32 count; INT32 pixel; } ImagingColorItem; diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index 52379a21c..8c75b600d 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -20,7 +20,7 @@ static inline UINT8 clip(double in) } static Imaging -gblur(Imaging im, Imaging imOut, float radius, int channels) +gblur(Imaging im, Imaging imOut, float radius, float effectiveScale, int channels) { ImagingSectionCookie cookie; @@ -55,7 +55,7 @@ gblur(Imaging im, Imaging imOut, float radius, int channels) /* Only pixels in effective radius from source pixel are accounted. The Gaussian values outside 3 x radius is near zero. */ - effectiveRadius = (int) ceil(radius * 2.57); + effectiveRadius = (int) ceil(radius * effectiveScale); /* Window is number of pixels forming the result pixel on one axis. It is source pixel and effective radius in both directions. */ window = effectiveRadius * 2 + 1; @@ -197,7 +197,8 @@ gblur(Imaging im, Imaging imOut, float radius, int channels) return imOut; } -Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius) +Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius, + float effectiveScale) { int channels = 0; @@ -214,7 +215,7 @@ Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius) } else return ImagingError_ModeError(); - return gblur(im, imOut, radius, channels); + return gblur(im, imOut, radius, effectiveScale, channels); } Imaging @@ -255,7 +256,7 @@ ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, /* first, do a gaussian blur on the image, putting results in imOut temporarily */ - result = gblur(im, imOut, radius, channels); + result = gblur(im, imOut, radius, 2.6, channels); if (!result) return NULL; From c42991120a96985340d4820d9d9d329fb3d97dee Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 14:00:34 +0400 Subject: [PATCH 020/532] fix tests and set default effective_scale value for gaussian filter --- PIL/ImageFilter.py | 2 +- Tests/test_imageops_usm.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/PIL/ImageFilter.py b/PIL/ImageFilter.py index fed165831..e3b867737 100644 --- a/PIL/ImageFilter.py +++ b/PIL/ImageFilter.py @@ -154,7 +154,7 @@ class GaussianBlur(Filter): self.effective_scale = effective_scale def filter(self, image): - return image.gaussian_blur(self.radius, self.effective_scale) + return image.gaussian_blur(self.radius, self.effective_scale or 2.6) class UnsharpMask(Filter): diff --git a/Tests/test_imageops_usm.py b/Tests/test_imageops_usm.py index 5164af015..4645b3d6e 100644 --- a/Tests/test_imageops_usm.py +++ b/Tests/test_imageops_usm.py @@ -66,15 +66,15 @@ class TestImageOpsUsm(PillowTestCase): def test_blur_accuracy(self): - i = snakes._new(ImageOps.gaussian_blur(snakes, 1)) + i = snakes._new(ImageOps.gaussian_blur(snakes, .7)) # Alpha channel must match whole. self.assertEqual(i.split()[3], snakes.split()[3]) # These pixels surrounded with pixels with 255 intensity. - # They must be 255. + # They must be very close to 255. for x, y, c in [(1, 0, 1), (2, 0, 1), (7, 8, 1), (8, 8, 1), (2, 9, 1), (7, 3, 0), (8, 3, 0), (5, 8, 0), (5, 9, 0), (1, 3, 0), (4, 3, 2), (4, 2, 2)]: - self.assertEqual(i.im.getpixel((x, y))[c], 255) + self.assertGreaterEqual(i.im.getpixel((x, y))[c], 250) # Fuzzy match. gp = lambda x, y: i.im.getpixel((x, y)) self.assertTrue(211 <= gp(7, 4)[0] <= 213) From 51984f4aa83362b9d122241692511cd50b868c57 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 14:14:56 +0400 Subject: [PATCH 021/532] fix radius == 0 --- libImaging/UnsharpMask.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index 8c75b600d..1b29fbd3c 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -64,11 +64,15 @@ gblur(Imaging im, Imaging imOut, float radius, float effectiveScale, int channel maskData = malloc(window * sizeof(float)); for (pix = 0; pix < window; pix++) { offset = pix - effectiveRadius; - /* http://en.wikipedia.org/wiki/Gaussian_blur - "1 / sqrt(2 * pi * dev)" is constant and will be eliminated by - normalization. */ - maskData[pix] = pow(2.718281828459, - -offset * offset / (2 * radius * radius)); + if (radius) { + /* http://en.wikipedia.org/wiki/Gaussian_blur + "1 / sqrt(2 * pi * dev)" is constant and will be eliminated + by normalization. */ + maskData[pix] = pow(2.718281828459, + -offset * offset / (2 * radius * radius)); + } else { + maskData[pix] = 1; + } } for (pix = 0; pix < window; pix++) { From bc246853441e599a7e605b7e269abf3fb8974382 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 14:21:13 +0400 Subject: [PATCH 022/532] do sum calculation in same loop as maskData calculation --- libImaging/UnsharpMask.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index 1b29fbd3c..15d707dd2 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -73,11 +73,6 @@ gblur(Imaging im, Imaging imOut, float radius, float effectiveScale, int channel } else { maskData[pix] = 1; } - } - - for (pix = 0; pix < window; pix++) { - /* this is done separately now due to the correction for float - radius values above */ sum += maskData[pix]; } From e38a64b21bb5ec746d97c8663b79f6cd939f7a94 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 15:13:37 +0400 Subject: [PATCH 023/532] round values with initial .5 this improves performance and readabillity --- libImaging/UnsharpMask.c | 50 +++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index 15d707dd2..907f0d29d 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -10,15 +10,6 @@ #include "Imaging.h" -static inline UINT8 clip(double in) -{ - if (in >= 255.0) - return (UINT8) 255; - if (in <= 0.0) - return (UINT8) 0; - return (UINT8) (in + 0.5); -} - static Imaging gblur(Imaging im, Imaging imOut, float radius, float effectiveScale, int channels) { @@ -138,7 +129,7 @@ gblur(Imaging im, Imaging imOut, float radius, float effectiveScale, int channel output image */ for (x = 0; x < im->xsize; x++) { for (y = 0; y < im->ysize; y++) { - newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = 0; + newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = .5; /* for each neighbor pixel, factor in its value/weighting to the current pixel */ for (pix = 0; pix < window; pix++) { @@ -158,31 +149,23 @@ gblur(Imaging im, Imaging imOut, float radius, float effectiveScale, int channel (x * channels) + channel]) * (maskData[pix]); } } - /* if the image is RGBX or RGBA, copy the 4th channel data to - newPixel, so it gets put in imOut */ - if (hasAlpha) { - newPixel[3] = (float) ((UINT8 *) & im->image32[y][x])[3]; - } - /* pack the channels into an INT32 so we can put them back in - the PIL image */ - newPixelFinals = 0; if (channels == 1) { - newPixelFinals = clip(newPixel[0]); + imOut->image8[y][x] = (UINT8)(newPixel[0]); } else { + /* if the image is RGBX or RGBA, copy the 4th channel data to + newPixel, so it gets put in imOut */ + if (hasAlpha) { + newPixel[3] = (float) ((UINT8 *) & im->image32[y][x])[3]; + } + /* for RGB, the fourth channel isn't used anyways, so just pack a 0 in there, this saves checking the mode for each pixel. */ - /* this doesn't work on little-endian machines... fix it! */ - newPixelFinals = - clip(newPixel[0]) | clip(newPixel[1]) << 8 | - clip(newPixel[2]) << 16 | clip(newPixel[3]) << 24; - } - /* set the resulting pixel in imOut */ - if (channels == 1) { - imOut->image8[y][x] = (UINT8) newPixelFinals; - } else { - imOut->image32[y][x] = newPixelFinals; + /* this might don't work on little-endian machines... fix it! */ + imOut->image32[y][x] = + (UINT8)(newPixel[0]) | (UINT8)(newPixel[1]) << 8 | + (UINT8)(newPixel[2]) << 16 | (UINT8)(newPixel[3]) << 24; } } } @@ -196,6 +179,15 @@ gblur(Imaging im, Imaging imOut, float radius, float effectiveScale, int channel return imOut; } +static inline UINT8 clip(double in) +{ + if (in >= 255.0) + return (UINT8) 255; + if (in <= 0.0) + return (UINT8) 0; + return (UINT8) (in + 0.5); +} + Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius, float effectiveScale) { From d49459f5b2a4d20aba8557529de0f9bcb10a5d71 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 16:30:00 +0400 Subject: [PATCH 024/532] box blur dummy --- _imaging.c | 24 +++++++++++++++++++++++- libImaging/BoxBlur.c | 8 ++++++++ libImaging/Imaging.h | 1 + setup.py | 2 +- 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 libImaging/BoxBlur.c diff --git a/_imaging.c b/_imaging.c index 1759d4c8d..17cfe2bfa 100644 --- a/_imaging.c +++ b/_imaging.c @@ -1791,7 +1791,6 @@ _unsharp_mask(ImagingObject* self, PyObject* args) if (!PyArg_ParseTuple(args, "fii", &radius, &percent, &threshold)) return NULL; - imIn = self->image; imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); if (!imOut) @@ -1804,6 +1803,27 @@ _unsharp_mask(ImagingObject* self, PyObject* args) } #endif +static PyObject* +_box_blur(ImagingObject* self, PyObject* args) +{ + Imaging imIn; + Imaging imOut; + + int radius; + if (!PyArg_ParseTuple(args, "i", &radius)) + return NULL; + + imIn = self->image; + imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); + if (!imOut) + return NULL; + + if (!ImagingBoxBlur(imIn, imOut, radius)) + return NULL; + + return PyImagingNew(imOut); +} + /* -------------------------------------------------------------------- */ static PyObject* @@ -3078,6 +3098,8 @@ static struct PyMethodDef methods[] = { {"unsharp_mask", (PyCFunction)_unsharp_mask, 1}, #endif + {"box_blur", (PyCFunction)_box_blur, 1}, + #ifdef WITH_EFFECTS /* Special effects */ {"effect_spread", (PyCFunction)_effect_spread, 1}, diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c new file mode 100644 index 000000000..fe57ebf97 --- /dev/null +++ b/libImaging/BoxBlur.c @@ -0,0 +1,8 @@ +#include "Python.h" +#include "Imaging.h" + + +Imaging ImagingBoxBlur(Imaging im, Imaging imOut, int radius) +{ + return imOut; +} diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index d958387c9..e6f290fc3 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -308,6 +308,7 @@ extern Imaging ImagingTransform( int fill); extern Imaging ImagingUnsharpMask( Imaging im, Imaging imOut, float radius, int percent, int threshold); +extern Imaging ImagingBoxBlur(Imaging im, Imaging imOut, int radius); extern Imaging ImagingCopy2(Imaging imOut, Imaging imIn); extern Imaging ImagingConvert2(Imaging imOut, Imaging imIn); diff --git a/setup.py b/setup.py index 2d8cafa34..95d54df01 100644 --- a/setup.py +++ b/setup.py @@ -37,7 +37,7 @@ _LIB_IMAGING = ( "RankFilter", "RawDecode", "RawEncode", "Storage", "SunRleDecode", "TgaRleDecode", "Unpack", "UnpackYCC", "UnsharpMask", "XbmDecode", "XbmEncode", "ZipDecode", "ZipEncode", "TiffDecode", "Incremental", - "Jpeg2KDecode", "Jpeg2KEncode") + "Jpeg2KDecode", "Jpeg2KEncode", "BoxBlur") def _add_directory(path, dir, where=None): From a6937d84d89afa38aa3163eda078065ab1c56670 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 17:11:24 +0400 Subject: [PATCH 025/532] first Horizontal Blur for 32 --- libImaging/BoxBlur.c | 48 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index fe57ebf97..9f44bcb5b 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -2,7 +2,53 @@ #include "Imaging.h" -Imaging ImagingBoxBlur(Imaging im, Imaging imOut, int radius) +Imaging +HorizontalBoxBlur32(Imaging im, Imaging imOut, int radius) { + ImagingSectionCookie cookie; + + int x, y, pix, offset; + int acc[4]; + + typedef UINT8 pixel[4]; + pixel *line; + + int window = radius * 2 + 1; + + ImagingSectionEnter(&cookie); + + for (y = 0; y < im->ysize; y++) { + line = (pixel *) im->image32[y]; + for (x = 0; x < im->xsize; x++) { + acc[0] = acc[1] = acc[2] = acc[3] = 0; + for (pix = x - radius; pix <= x + radius; pix++) { + offset = pix; + if (pix < 0) { + offset = 0; + } else if (pix >= im->xsize) { + offset = im->xsize - 1; + } + acc[0] += line[offset][0]; + acc[1] += line[offset][1]; + acc[2] += line[offset][2]; + acc[3] += line[offset][3]; + } + + imOut->image32[y][x] = + (UINT8)(acc[0] / window) | (UINT8)(acc[1] / window) << 8 | + (UINT8)(acc[2] / window) << 16 | (UINT8)(acc[3] / window) << 24; + } + } + + ImagingSectionLeave(&cookie); + + return imOut; +} + + +Imaging +ImagingBoxBlur(Imaging im, Imaging imOut, int radius) +{ + HorizontalBoxBlur32(im, imOut, radius); return imOut; } From cc9eff5c68f669d3f4ef77d2b9e845eb4620851a Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 17:47:00 +0400 Subject: [PATCH 026/532] fast realization with moving window. linear speed against any radius --- libImaging/BoxBlur.c | 65 ++++++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 9f44bcb5b..c707f8911 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -7,36 +7,65 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, int radius) { ImagingSectionCookie cookie; - int x, y, pix, offset; + int x, y, pix; int acc[4]; typedef UINT8 pixel[4]; pixel *line; + int lastx = im->xsize - 1; int window = radius * 2 + 1; + #define SAVE(acc) \ + (UINT8)(acc[0] / window) | (UINT8)(acc[1] / window) << 8 | \ + (UINT8)(acc[2] / window) << 16 | (UINT8)(acc[3] / window) << 24 + + #define MOVE_ACC(acc, substract, add) \ + acc[0] -= line[substract][0]; \ + acc[1] -= line[substract][1]; \ + acc[2] -= line[substract][2]; \ + acc[3] -= line[substract][3]; \ + acc[0] += line[add][0]; \ + acc[1] += line[add][1]; \ + acc[2] += line[add][2]; \ + acc[3] += line[add][3]; + ImagingSectionEnter(&cookie); for (y = 0; y < im->ysize; y++) { line = (pixel *) im->image32[y]; - for (x = 0; x < im->xsize; x++) { - acc[0] = acc[1] = acc[2] = acc[3] = 0; - for (pix = x - radius; pix <= x + radius; pix++) { - offset = pix; - if (pix < 0) { - offset = 0; - } else if (pix >= im->xsize) { - offset = im->xsize - 1; - } - acc[0] += line[offset][0]; - acc[1] += line[offset][1]; - acc[2] += line[offset][2]; - acc[3] += line[offset][3]; - } - imOut->image32[y][x] = - (UINT8)(acc[0] / window) | (UINT8)(acc[1] / window) << 8 | - (UINT8)(acc[2] / window) << 16 | (UINT8)(acc[3] / window) << 24; + /* Compute acc for -1 pixel (outside of image): + From "-radius-1" to "0" get first pixel, + then from "1" to "radius-1". */ + acc[0] = line[0][0] * (radius + 2); + acc[1] = line[0][1] * (radius + 2); + acc[2] = line[0][2] * (radius + 2); + acc[3] = line[0][3] * (radius + 2); + for (pix = 1; pix < radius; pix++) { + acc[0] += line[pix][0]; + acc[1] += line[pix][1]; + acc[2] += line[pix][2]; + acc[3] += line[pix][3]; + } + + /* Substract pixel from left ("0"). + Add pixels from radius. */ + for (x = 0; x <= radius; x++) { + MOVE_ACC(acc, 0, x + radius); + imOut->image32[y][x] = SAVE(acc); + } + /* Substract previous pixel from "-radius". + Add pixels from radius. */ + for (x = radius + 1; x < im->xsize - radius; x++) { + MOVE_ACC(acc, x - radius - 1, x + radius); + imOut->image32[y][x] = SAVE(acc); + } + /* Substract previous pixel from "-radius". + Add last pixel. */ + for (x = im->xsize - radius; x < im->xsize; x++) { + MOVE_ACC(acc, x - radius - 1, lastx); + imOut->image32[y][x] = SAVE(acc); } } From b7b3c719fad2cb36c8cf6cf44b0c45a843db89b3 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 17:59:20 +0400 Subject: [PATCH 027/532] blur in both directions --- libImaging/BoxBlur.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index c707f8911..ea1b3503e 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -53,19 +53,19 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, int radius) Add pixels from radius. */ for (x = 0; x <= radius; x++) { MOVE_ACC(acc, 0, x + radius); - imOut->image32[y][x] = SAVE(acc); + imOut->image32[x][y] = SAVE(acc); } /* Substract previous pixel from "-radius". Add pixels from radius. */ for (x = radius + 1; x < im->xsize - radius; x++) { MOVE_ACC(acc, x - radius - 1, x + radius); - imOut->image32[y][x] = SAVE(acc); + imOut->image32[x][y] = SAVE(acc); } /* Substract previous pixel from "-radius". Add last pixel. */ for (x = im->xsize - radius; x < im->xsize; x++) { MOVE_ACC(acc, x - radius - 1, lastx); - imOut->image32[y][x] = SAVE(acc); + imOut->image32[x][y] = SAVE(acc); } } @@ -78,6 +78,27 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, int radius) Imaging ImagingBoxBlur(Imaging im, Imaging imOut, int radius) { - HorizontalBoxBlur32(im, imOut, radius); + /* Create transposed temp image (im->ysize x im->xsize). */ + Imaging temp = ImagingNew(im->mode, im->ysize, im->xsize); + if ( ! temp) + return NULL; + + /* Apply one-dimensional blur. + HorizontalBoxBlur32 transposes image at same time. */ + if ( ! HorizontalBoxBlur32(im, temp, radius)) { + ImagingDelete(temp); + return NULL; + } + + /* Blur in same direction transposed result from previout step. + Reseult will be transposes again. We'll get original image + blurred in both directions. */ + if ( ! HorizontalBoxBlur32(temp, imOut, radius)) { + ImagingDelete(temp); + return NULL; + } + + ImagingDelete(temp); + return imOut; } From 23068e49beada8358dc9c52362398ec29531d353 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 18:52:32 +0400 Subject: [PATCH 028/532] allow float radius (without implementation) --- _imaging.c | 4 ++-- libImaging/BoxBlur.c | 5 +++-- libImaging/Imaging.h | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/_imaging.c b/_imaging.c index 17cfe2bfa..f5db88756 100644 --- a/_imaging.c +++ b/_imaging.c @@ -1809,8 +1809,8 @@ _box_blur(ImagingObject* self, PyObject* args) Imaging imIn; Imaging imOut; - int radius; - if (!PyArg_ParseTuple(args, "i", &radius)) + float radius; + if (!PyArg_ParseTuple(args, "f", &radius)) return NULL; imIn = self->image; diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index ea1b3503e..cf44c991d 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -3,7 +3,7 @@ Imaging -HorizontalBoxBlur32(Imaging im, Imaging imOut, int radius) +HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) { ImagingSectionCookie cookie; @@ -14,6 +14,7 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, int radius) pixel *line; int lastx = im->xsize - 1; + int radius = (int) floatRadius; int window = radius * 2 + 1; #define SAVE(acc) \ @@ -76,7 +77,7 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, int radius) Imaging -ImagingBoxBlur(Imaging im, Imaging imOut, int radius) +ImagingBoxBlur(Imaging im, Imaging imOut, float radius) { /* Create transposed temp image (im->ysize x im->xsize). */ Imaging temp = ImagingNew(im->mode, im->ysize, im->xsize); diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index e6f290fc3..8829a17bd 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -308,7 +308,7 @@ extern Imaging ImagingTransform( int fill); extern Imaging ImagingUnsharpMask( Imaging im, Imaging imOut, float radius, int percent, int threshold); -extern Imaging ImagingBoxBlur(Imaging im, Imaging imOut, int radius); +extern Imaging ImagingBoxBlur(Imaging im, Imaging imOut, float radius); extern Imaging ImagingCopy2(Imaging imOut, Imaging imIn); extern Imaging ImagingConvert2(Imaging imOut, Imaging imIn); From f711ab3eb6868e52536db0bb495e42fce79f3f59 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 20:01:49 +0400 Subject: [PATCH 029/532] float radius --- libImaging/BoxBlur.c | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index cf44c991d..a52e4e589 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -9,17 +9,15 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) int x, y, pix; int acc[4]; + float bulk[4]; typedef UINT8 pixel[4]; pixel *line; int lastx = im->xsize - 1; int radius = (int) floatRadius; - int window = radius * 2 + 1; - - #define SAVE(acc) \ - (UINT8)(acc[0] / window) | (UINT8)(acc[1] / window) << 8 | \ - (UINT8)(acc[2] / window) << 16 | (UINT8)(acc[3] / window) << 24 + float rem = floatRadius - radius; + float window = floatRadius * 2 + 1; #define MOVE_ACC(acc, substract, add) \ acc[0] -= line[substract][0]; \ @@ -31,6 +29,16 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) acc[2] += line[add][2]; \ acc[3] += line[add][3]; + #define ADD_FAR(bulk, acc, left, right) \ + bulk[0] = acc[0] + line[left][0] * rem + line[right][0] * rem; \ + bulk[1] = acc[1] + line[left][1] * rem + line[right][1] * rem; \ + bulk[2] = acc[2] + line[left][2] * rem + line[right][2] * rem; \ + bulk[3] = acc[3] + line[left][3] * rem + line[right][3] * rem; + + #define SAVE(acc) \ + (UINT8)((acc[0] + .5) / window) | (UINT8)((acc[1] + .5) / window) << 8 | \ + (UINT8)((acc[2] + .5) / window) << 16 | (UINT8)((acc[3] + .5) / window) << 24 + ImagingSectionEnter(&cookie); for (y = 0; y < im->ysize; y++) { @@ -39,11 +47,11 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) /* Compute acc for -1 pixel (outside of image): From "-radius-1" to "0" get first pixel, then from "1" to "radius-1". */ - acc[0] = line[0][0] * (radius + 2); - acc[1] = line[0][1] * (radius + 2); - acc[2] = line[0][2] * (radius + 2); - acc[3] = line[0][3] * (radius + 2); - for (pix = 1; pix < radius; pix++) { + acc[0] = line[0][0] * (radius + 1); + acc[1] = line[0][1] * (radius + 1); + acc[2] = line[0][2] * (radius + 1); + acc[3] = line[0][3] * (radius + 1); + for (pix = 0; pix < radius; pix++) { acc[0] += line[pix][0]; acc[1] += line[pix][1]; acc[2] += line[pix][2]; @@ -54,19 +62,22 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) Add pixels from radius. */ for (x = 0; x <= radius; x++) { MOVE_ACC(acc, 0, x + radius); - imOut->image32[x][y] = SAVE(acc); + ADD_FAR(bulk, acc, 0, x+radius+1); + imOut->image32[x][y] = SAVE(bulk); } /* Substract previous pixel from "-radius". Add pixels from radius. */ for (x = radius + 1; x < im->xsize - radius; x++) { MOVE_ACC(acc, x - radius - 1, x + radius); - imOut->image32[x][y] = SAVE(acc); + ADD_FAR(bulk, acc, x-radius-1, x+radius+1); + imOut->image32[x][y] = SAVE(bulk); } /* Substract previous pixel from "-radius". Add last pixel. */ for (x = im->xsize - radius; x < im->xsize; x++) { MOVE_ACC(acc, x - radius - 1, lastx); - imOut->image32[x][y] = SAVE(acc); + ADD_FAR(bulk, acc, x-radius-1, lastx); + imOut->image32[x][y] = SAVE(bulk); } } From f3af171dc4eabba17f4422fd8b5db9175dbde01c Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 20:09:28 +0400 Subject: [PATCH 030/532] fix round compensation --- libImaging/BoxBlur.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index a52e4e589..19fba92a4 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -36,8 +36,8 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) bulk[3] = acc[3] + line[left][3] * rem + line[right][3] * rem; #define SAVE(acc) \ - (UINT8)((acc[0] + .5) / window) | (UINT8)((acc[1] + .5) / window) << 8 | \ - (UINT8)((acc[2] + .5) / window) << 16 | (UINT8)((acc[3] + .5) / window) << 24 + (UINT8)(acc[0] / window + .5) << 0 | (UINT8)(acc[1] / window + .5) << 8 | \ + (UINT8)(acc[2] / window + .5) << 16 | (UINT8)(acc[3] / window + .5) << 24 ImagingSectionEnter(&cookie); From e95382eb08d84dd8ae2cd575d8df06630581617d Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 20:30:46 +0400 Subject: [PATCH 031/532] integer implementation for float radius --- libImaging/BoxBlur.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 19fba92a4..db1e65b3d 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -8,16 +8,19 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) ImagingSectionCookie cookie; int x, y, pix; - int acc[4]; - float bulk[4]; + unsigned int acc[4]; + unsigned int bulk[4]; typedef UINT8 pixel[4]; pixel *line; int lastx = im->xsize - 1; int radius = (int) floatRadius; - float rem = floatRadius - radius; - float window = floatRadius * 2 + 1; + UINT8 rem = (UINT8) (256 * (floatRadius - radius)); + int w = (int) (256 * (floatRadius * 2 + 1)); + int w2 = w / 2; + + // printf("%d %d %d\n", rem, w, w2); #define MOVE_ACC(acc, substract, add) \ acc[0] -= line[substract][0]; \ @@ -30,14 +33,14 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) acc[3] += line[add][3]; #define ADD_FAR(bulk, acc, left, right) \ - bulk[0] = acc[0] + line[left][0] * rem + line[right][0] * rem; \ - bulk[1] = acc[1] + line[left][1] * rem + line[right][1] * rem; \ - bulk[2] = acc[2] + line[left][2] * rem + line[right][2] * rem; \ - bulk[3] = acc[3] + line[left][3] * rem + line[right][3] * rem; + bulk[0] = (acc[0] << 8) + line[left][0] * rem + line[right][0] * rem; \ + bulk[1] = (acc[1] << 8) + line[left][1] * rem + line[right][1] * rem; \ + bulk[2] = (acc[2] << 8) + line[left][2] * rem + line[right][2] * rem; \ + bulk[3] = (acc[3] << 8) + line[left][3] * rem + line[right][3] * rem; #define SAVE(acc) \ - (UINT8)(acc[0] / window + .5) << 0 | (UINT8)(acc[1] / window + .5) << 8 | \ - (UINT8)(acc[2] / window + .5) << 16 | (UINT8)(acc[3] / window + .5) << 24 + (UINT8)((acc[0] + w2) / w) << 0 | (UINT8)((acc[1] + w2) / w) << 8 | \ + (UINT8)((acc[2] + w2) / w) << 16 | (UINT8)((acc[3] + w2) / w) << 24 ImagingSectionEnter(&cookie); From 92635d062469f7f55a6fb036675096c39da39bbe Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 22:26:00 +0400 Subject: [PATCH 032/532] 8bit --- libImaging/BoxBlur.c | 75 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index db1e65b3d..99908c9fa 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -2,6 +2,67 @@ #include "Imaging.h" +Imaging +HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) +{ + ImagingSectionCookie cookie; + + int x, y, pix; + unsigned int acc; + unsigned int bulk; + + UINT8 *line; + int lastx = im->xsize - 1; + + int radius = (int) floatRadius; + UINT8 rem = (UINT8) (256 * (floatRadius - radius)); + int w = (int) (256 * (floatRadius * 2 + 1)); + int w2 = w / 2; + + // printf("%d %d %d\n", rem, w, w2); + + ImagingSectionEnter(&cookie); + + for (y = 0; y < im->ysize; y++) { + line = im->image8[y]; + + /* Compute acc for -1 pixel (outside of image): + From "-radius-1" to "0" get first pixel, + then from "1" to "radius-1". */ + acc = line[0] * (radius + 1); + for (pix = 0; pix < radius; pix++) { + acc += line[pix]; + } + + /* Substract pixel from left ("0"). + Add pixels from radius. */ + for (x = 0; x <= radius; x++) { + acc = acc + line[x + radius] - line[0]; + bulk = (acc << 8) + line[0] * rem + line[x + radius + 1] * rem; + imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + } + /* Substract previous pixel from "-radius". + Add pixels from radius. */ + for (x = radius + 1; x < im->xsize - radius; x++) { + acc = acc + line[x + radius] - line[x - radius - 1]; + bulk = (acc << 8) + line[x - radius - 1] * rem + line[x + radius + 1] * rem; + imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + } + /* Substract previous pixel from "-radius". + Add last pixel. */ + for (x = im->xsize - radius; x < im->xsize; x++) { + acc = acc + line[lastx] - line[x - radius - 1]; + bulk = (acc << 8) + line[x - radius - 1] * rem + line[lastx] * rem; + imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + } + } + + ImagingSectionLeave(&cookie); + + return imOut; +} + + Imaging HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) { @@ -100,17 +161,19 @@ ImagingBoxBlur(Imaging im, Imaging imOut, float radius) /* Apply one-dimensional blur. HorizontalBoxBlur32 transposes image at same time. */ - if ( ! HorizontalBoxBlur32(im, temp, radius)) { - ImagingDelete(temp); - return NULL; + if (strcmp(im->mode, "L") == 0) { + HorizontalBoxBlur8(im, temp, radius); + } else { + HorizontalBoxBlur32(im, temp, radius); } /* Blur in same direction transposed result from previout step. Reseult will be transposes again. We'll get original image blurred in both directions. */ - if ( ! HorizontalBoxBlur32(temp, imOut, radius)) { - ImagingDelete(temp); - return NULL; + if (strcmp(im->mode, "L") == 0) { + HorizontalBoxBlur8(temp, imOut, radius); + } else { + HorizontalBoxBlur32(temp, imOut, radius); } ImagingDelete(temp); From 591fc67aae9ef50ef6d9128e52a4ee49b1b9c7fb Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 22:33:09 +0400 Subject: [PATCH 033/532] micro optimizations --- libImaging/BoxBlur.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 99908c9fa..85eded5dc 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -38,21 +38,21 @@ HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) Add pixels from radius. */ for (x = 0; x <= radius; x++) { acc = acc + line[x + radius] - line[0]; - bulk = (acc << 8) + line[0] * rem + line[x + radius + 1] * rem; + bulk = (acc << 8) + (line[0] + line[x + radius + 1]) * rem; imOut->image8[x][y] = (UINT8)((bulk + w2) / w); } /* Substract previous pixel from "-radius". Add pixels from radius. */ for (x = radius + 1; x < im->xsize - radius; x++) { acc = acc + line[x + radius] - line[x - radius - 1]; - bulk = (acc << 8) + line[x - radius - 1] * rem + line[x + radius + 1] * rem; + bulk = (acc << 8) + (line[x - radius - 1] + line[x + radius + 1]) * rem; imOut->image8[x][y] = (UINT8)((bulk + w2) / w); } /* Substract previous pixel from "-radius". Add last pixel. */ for (x = im->xsize - radius; x < im->xsize; x++) { acc = acc + line[lastx] - line[x - radius - 1]; - bulk = (acc << 8) + line[x - radius - 1] * rem + line[lastx] * rem; + bulk = (acc << 8) + (line[x - radius - 1] + line[lastx]) * rem; imOut->image8[x][y] = (UINT8)((bulk + w2) / w); } } @@ -84,20 +84,16 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) // printf("%d %d %d\n", rem, w, w2); #define MOVE_ACC(acc, substract, add) \ - acc[0] -= line[substract][0]; \ - acc[1] -= line[substract][1]; \ - acc[2] -= line[substract][2]; \ - acc[3] -= line[substract][3]; \ - acc[0] += line[add][0]; \ - acc[1] += line[add][1]; \ - acc[2] += line[add][2]; \ - acc[3] += line[add][3]; + acc[0] += line[add][0] - line[substract][0]; \ + acc[1] += line[add][1] - line[substract][1]; \ + acc[2] += line[add][2] - line[substract][2]; \ + acc[3] += line[add][3] - line[substract][3]; #define ADD_FAR(bulk, acc, left, right) \ - bulk[0] = (acc[0] << 8) + line[left][0] * rem + line[right][0] * rem; \ - bulk[1] = (acc[1] << 8) + line[left][1] * rem + line[right][1] * rem; \ - bulk[2] = (acc[2] << 8) + line[left][2] * rem + line[right][2] * rem; \ - bulk[3] = (acc[3] << 8) + line[left][3] * rem + line[right][3] * rem; + bulk[0] = (acc[0] << 8) + (line[left][0] + line[right][0]) * rem; \ + bulk[1] = (acc[1] << 8) + (line[left][1] + line[right][1]) * rem; \ + bulk[2] = (acc[2] << 8) + (line[left][2] + line[right][2]) * rem; \ + bulk[3] = (acc[3] << 8) + (line[left][3] + line[right][3]) * rem; #define SAVE(acc) \ (UINT8)((acc[0] + w2) / w) << 0 | (UINT8)((acc[1] + w2) / w) << 8 | \ From 2c723abbcaad353fcde15b54265ab8a4a6fcbfaf Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 22:37:25 +0400 Subject: [PATCH 034/532] move HorizontalBoxBlur8 down and remove comments --- libImaging/BoxBlur.c | 111 +++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 61 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 85eded5dc..9f9c1a5e2 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -2,67 +2,6 @@ #include "Imaging.h" -Imaging -HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) -{ - ImagingSectionCookie cookie; - - int x, y, pix; - unsigned int acc; - unsigned int bulk; - - UINT8 *line; - int lastx = im->xsize - 1; - - int radius = (int) floatRadius; - UINT8 rem = (UINT8) (256 * (floatRadius - radius)); - int w = (int) (256 * (floatRadius * 2 + 1)); - int w2 = w / 2; - - // printf("%d %d %d\n", rem, w, w2); - - ImagingSectionEnter(&cookie); - - for (y = 0; y < im->ysize; y++) { - line = im->image8[y]; - - /* Compute acc for -1 pixel (outside of image): - From "-radius-1" to "0" get first pixel, - then from "1" to "radius-1". */ - acc = line[0] * (radius + 1); - for (pix = 0; pix < radius; pix++) { - acc += line[pix]; - } - - /* Substract pixel from left ("0"). - Add pixels from radius. */ - for (x = 0; x <= radius; x++) { - acc = acc + line[x + radius] - line[0]; - bulk = (acc << 8) + (line[0] + line[x + radius + 1]) * rem; - imOut->image8[x][y] = (UINT8)((bulk + w2) / w); - } - /* Substract previous pixel from "-radius". - Add pixels from radius. */ - for (x = radius + 1; x < im->xsize - radius; x++) { - acc = acc + line[x + radius] - line[x - radius - 1]; - bulk = (acc << 8) + (line[x - radius - 1] + line[x + radius + 1]) * rem; - imOut->image8[x][y] = (UINT8)((bulk + w2) / w); - } - /* Substract previous pixel from "-radius". - Add last pixel. */ - for (x = im->xsize - radius; x < im->xsize; x++) { - acc = acc + line[lastx] - line[x - radius - 1]; - bulk = (acc << 8) + (line[x - radius - 1] + line[lastx]) * rem; - imOut->image8[x][y] = (UINT8)((bulk + w2) / w); - } - } - - ImagingSectionLeave(&cookie); - - return imOut; -} - - Imaging HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) { @@ -147,6 +86,56 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) } +Imaging +HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) +{ + ImagingSectionCookie cookie; + + int x, y, pix; + unsigned int acc; + unsigned int bulk; + + UINT8 *line; + int lastx = im->xsize - 1; + + int radius = (int) floatRadius; + UINT8 rem = (UINT8) (256 * (floatRadius - radius)); + int w = (int) (256 * (floatRadius * 2 + 1)); + int w2 = w / 2; + + ImagingSectionEnter(&cookie); + + for (y = 0; y < im->ysize; y++) { + line = im->image8[y]; + + acc = line[0] * (radius + 1); + for (pix = 0; pix < radius; pix++) { + acc += line[pix]; + } + + for (x = 0; x <= radius; x++) { + acc = acc + line[x + radius] - line[0]; + bulk = (acc << 8) + (line[0] + line[x + radius + 1]) * rem; + imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + } + for (x = radius + 1; x < im->xsize - radius; x++) { + acc = acc + line[x + radius] - line[x - radius - 1]; + bulk = (acc << 8) + (line[x - radius - 1] + line[x + radius + 1]) * rem; + imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + } + for (x = im->xsize - radius; x < im->xsize; x++) { + acc = acc + line[lastx] - line[x - radius - 1]; + bulk = (acc << 8) + (line[x - radius - 1] + line[lastx]) * rem; + imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + } + } + + ImagingSectionLeave(&cookie); + + return imOut; +} + + Imaging ImagingBoxBlur(Imaging im, Imaging imOut, float radius) { From 835db5d12ff165a402f0ac6b827f6a24ae3c6ffa Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 22:39:02 +0400 Subject: [PATCH 035/532] type check --- libImaging/BoxBlur.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 9f9c1a5e2..e88d29249 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -139,6 +139,16 @@ HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) Imaging ImagingBoxBlur(Imaging im, Imaging imOut, float radius) { + if (strcmp(im->mode, imOut->mode) || + im->type != imOut->type || + im->bands != imOut->bands || + im->xsize != imOut->xsize || + im->ysize != imOut->ysize) + return ImagingError_Mismatch(); + + if (im->type != IMAGING_TYPE_UINT8) + return ImagingError_ModeError(); + /* Create transposed temp image (im->ysize x im->xsize). */ Imaging temp = ImagingNew(im->mode, im->ysize, im->xsize); if ( ! temp) From 3906ff3c76199e86413b9ae5df3772bfa1a72252 Mon Sep 17 00:00:00 2001 From: homm Date: Mon, 13 Oct 2014 03:39:01 +0400 Subject: [PATCH 036/532] fix x bounds --- libImaging/BoxBlur.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index e88d29249..61cfa7f3c 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -59,21 +59,21 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) /* Substract pixel from left ("0"). Add pixels from radius. */ - for (x = 0; x <= radius; x++) { + for (x = 0; x < radius + 1; x++) { MOVE_ACC(acc, 0, x + radius); ADD_FAR(bulk, acc, 0, x+radius+1); imOut->image32[x][y] = SAVE(bulk); } /* Substract previous pixel from "-radius". Add pixels from radius. */ - for (x = radius + 1; x < im->xsize - radius; x++) { + for (x = radius + 1; x < im->xsize - radius - 1; x++) { MOVE_ACC(acc, x - radius - 1, x + radius); ADD_FAR(bulk, acc, x-radius-1, x+radius+1); imOut->image32[x][y] = SAVE(bulk); } /* Substract previous pixel from "-radius". Add last pixel. */ - for (x = im->xsize - radius; x < im->xsize; x++) { + for (x = im->xsize - radius - 1; x < im->xsize; x++) { MOVE_ACC(acc, x - radius - 1, lastx); ADD_FAR(bulk, acc, x-radius-1, lastx); imOut->image32[x][y] = SAVE(bulk); @@ -113,17 +113,17 @@ HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) acc += line[pix]; } - for (x = 0; x <= radius; x++) { + for (x = 0; x < radius + 1; x++) { acc = acc + line[x + radius] - line[0]; bulk = (acc << 8) + (line[0] + line[x + radius + 1]) * rem; imOut->image8[x][y] = (UINT8)((bulk + w2) / w); } - for (x = radius + 1; x < im->xsize - radius; x++) { + for (x = radius + 1; x < im->xsize - radius - 1; x++) { acc = acc + line[x + radius] - line[x - radius - 1]; bulk = (acc << 8) + (line[x - radius - 1] + line[x + radius + 1]) * rem; imOut->image8[x][y] = (UINT8)((bulk + w2) / w); } - for (x = im->xsize - radius; x < im->xsize; x++) { + for (x = im->xsize - radius - 1; x < im->xsize; x++) { acc = acc + line[lastx] - line[x - radius - 1]; bulk = (acc << 8) + (line[x - radius - 1] + line[lastx]) * rem; imOut->image8[x][y] = (UINT8)((bulk + w2) / w); From a000cceb2623a5b54e7f94b74b90127de164952e Mon Sep 17 00:00:00 2001 From: homm Date: Mon, 13 Oct 2014 04:07:17 +0400 Subject: [PATCH 037/532] data tests --- Tests/test_box_blur.py | 121 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 Tests/test_box_blur.py diff --git a/Tests/test_box_blur.py b/Tests/test_box_blur.py new file mode 100644 index 000000000..391e00a23 --- /dev/null +++ b/Tests/test_box_blur.py @@ -0,0 +1,121 @@ +from helper import unittest, PillowTestCase + +from PIL import Image, ImageFilter + + +sample = Image.new("L", (7, 5)) +sample.putdata(sum([ + [210, 50, 20, 10, 220, 230, 80 ], + [190, 210, 20, 180, 170, 40, 110], + [120, 210, 250, 60, 220, 0, 220], + [220, 40, 230, 80, 130, 250, 40 ], + [250, 0, 80, 30, 60, 20, 110], + ], [])) + + +def box_blur(self, radius): + return self._new(self.im.box_blur(radius)) + + +class TestBoxBlur(PillowTestCase): + + def assertImage(self, im, data, delta=0): + it = iter(im.getdata()) + for data_row in data: + im_row = [next(it) for _ in range(im.size[0])] + if any( + abs(data_v - im_v) > delta + for data_v, im_v in zip(data_row, im_row) + ): + self.assertEqual(im_row, data_row) + self.assertRaises(StopIteration, next, it) + + def test_radius_0(self): + self.assertImage( + box_blur(sample, 0), + [ + [210, 50, 20, 10, 220, 230, 80 ], + [190, 210, 20, 180, 170, 40, 110], + [120, 210, 250, 60, 220, 0, 220], + [220, 40, 230, 80, 130, 250, 40 ], + [250, 0, 80, 30, 60, 20, 110], + ] + ) + + def test_radius_0_02(self): + self.assertImage( + box_blur(sample, 0.02), + [ + [206, 55, 20, 17, 215, 223, 83 ], + [189, 203, 31, 171, 169, 46, 110], + [125, 206, 241, 69, 210, 13, 210], + [215, 49, 221, 82, 131, 235, 48 ], + [244, 7, 80, 32, 60, 27, 107], + ], + delta=2, + ) + + def test_radius_0_05(self): + self.assertImage( + box_blur(sample, 0.05), + [ + [202, 62, 22, 27, 209, 215, 88 ], + [188, 194, 44, 161, 168, 56, 111], + [131, 201, 229, 81, 198, 31, 198], + [209, 62, 209, 86, 133, 216, 59 ], + [237, 17, 80, 36, 60, 35, 103], + ], + delta=2, + ) + + def test_radius_0_1(self): + self.assertImage( + box_blur(sample, 0.1), + [ + [196, 72, 24, 40, 200, 203, 93 ], + [187, 183, 62, 148, 166, 68, 111], + [139, 193, 213, 96, 182, 54, 182], + [201, 78, 193, 91, 133, 191, 73 ], + [227, 31, 80, 42, 61, 47, 99 ], + ], + delta=1, + ) + + def test_radius_0_5(self): + self.assertImage( + box_blur(sample, 0.5), + [ + [176, 101, 46, 83, 163, 165, 111], + [176, 149, 108, 122, 144, 120, 117], + [164, 171, 159, 141, 134, 119, 129], + [170, 136, 133, 114, 116, 124, 109], + [184, 95, 72, 70, 69, 81, 89 ], + ], + delta=1, + ) + + def test_radius_1(self): + self.assertImage( + box_blur(sample, 1), + [ + [170, 109, 63, 97, 146, 153, 116], + [168, 142, 112, 128, 126, 143, 121], + [169, 166, 142, 149, 126, 131, 114], + [159, 156, 109, 127, 94, 117, 112], + [164, 128, 63, 87, 76, 89, 90 ], + ], + delta=1, + ) + + def test_radius_1_5(self): + self.assertImage( + box_blur(sample, 1.5), + [ + [155, 120, 105, 112, 124, 137, 130], + [160, 136, 124, 125, 127, 134, 130], + [166, 147, 130, 125, 120, 121, 119], + [168, 145, 119, 109, 103, 105, 110], + [168, 134, 96, 85, 85, 89, 97 ], + ], + delta=1, + ) From b1cef839bdefe6202c82070b1b285002679d8161 Mon Sep 17 00:00:00 2001 From: homm Date: Mon, 13 Oct 2014 04:40:44 +0400 Subject: [PATCH 038/532] fix window calculation --- libImaging/BoxBlur.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 61cfa7f3c..676a6cdc7 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -17,7 +17,7 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) int radius = (int) floatRadius; UINT8 rem = (UINT8) (256 * (floatRadius - radius)); - int w = (int) (256 * (floatRadius * 2 + 1)); + int w = 256 * (radius * 2 + 1) + rem * 2; int w2 = w / 2; // printf("%d %d %d\n", rem, w, w2); @@ -100,7 +100,7 @@ HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) int radius = (int) floatRadius; UINT8 rem = (UINT8) (256 * (floatRadius - radius)); - int w = (int) (256 * (floatRadius * 2 + 1)); + int w = 256 * (radius * 2 + 1) + rem * 2; int w2 = w / 2; ImagingSectionEnter(&cookie); From d3d4ff69eb969018d466fef64d64fadf9edc86b5 Mon Sep 17 00:00:00 2001 From: homm Date: Mon, 13 Oct 2014 23:45:21 +0400 Subject: [PATCH 039/532] introduce corners --- libImaging/BoxBlur.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 676a6cdc7..e13d7b7d8 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -20,6 +20,9 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) int w = 256 * (radius * 2 + 1) + rem * 2; int w2 = w / 2; + int cornerA = radius + 1; + int cornerB = im->xsize - radius - 1; + // printf("%d %d %d\n", rem, w, w2); #define MOVE_ACC(acc, substract, add) \ @@ -44,8 +47,8 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) line = (pixel *) im->image32[y]; /* Compute acc for -1 pixel (outside of image): - From "-radius-1" to "0" get first pixel, - then from "1" to "radius-1". */ + From "-radius-1" to "-1" get first pixel, + then from "0" to "radius-1". */ acc[0] = line[0][0] * (radius + 1); acc[1] = line[0][1] * (radius + 1); acc[2] = line[0][2] * (radius + 1); @@ -59,23 +62,23 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) /* Substract pixel from left ("0"). Add pixels from radius. */ - for (x = 0; x < radius + 1; x++) { + for (x = 0; x < cornerA; x++) { MOVE_ACC(acc, 0, x + radius); - ADD_FAR(bulk, acc, 0, x+radius+1); + ADD_FAR(bulk, acc, 0, x + radius + 1); imOut->image32[x][y] = SAVE(bulk); } /* Substract previous pixel from "-radius". Add pixels from radius. */ - for (x = radius + 1; x < im->xsize - radius - 1; x++) { + for (x = cornerA; x < cornerB; x++) { MOVE_ACC(acc, x - radius - 1, x + radius); - ADD_FAR(bulk, acc, x-radius-1, x+radius+1); + ADD_FAR(bulk, acc, x - radius - 1, x + radius + 1); imOut->image32[x][y] = SAVE(bulk); } /* Substract previous pixel from "-radius". Add last pixel. */ - for (x = im->xsize - radius - 1; x < im->xsize; x++) { + for (x = cornerB; x < im->xsize; x++) { MOVE_ACC(acc, x - radius - 1, lastx); - ADD_FAR(bulk, acc, x-radius-1, lastx); + ADD_FAR(bulk, acc, x - radius - 1, lastx); imOut->image32[x][y] = SAVE(bulk); } } @@ -103,6 +106,9 @@ HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) int w = 256 * (radius * 2 + 1) + rem * 2; int w2 = w / 2; + int cornerA = radius + 1; + int cornerB = im->xsize - radius - 1; + ImagingSectionEnter(&cookie); for (y = 0; y < im->ysize; y++) { @@ -113,17 +119,17 @@ HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) acc += line[pix]; } - for (x = 0; x < radius + 1; x++) { + for (x = 0; x < cornerA; x++) { acc = acc + line[x + radius] - line[0]; bulk = (acc << 8) + (line[0] + line[x + radius + 1]) * rem; imOut->image8[x][y] = (UINT8)((bulk + w2) / w); } - for (x = radius + 1; x < im->xsize - radius - 1; x++) { + for (x = cornerA; x < cornerB; x++) { acc = acc + line[x + radius] - line[x - radius - 1]; bulk = (acc << 8) + (line[x - radius - 1] + line[x + radius + 1]) * rem; imOut->image8[x][y] = (UINT8)((bulk + w2) / w); } - for (x = im->xsize - radius - 1; x < im->xsize; x++) { + for (x = cornerB; x < im->xsize; x++) { acc = acc + line[lastx] - line[x - radius - 1]; bulk = (acc << 8) + (line[x - radius - 1] + line[lastx]) * rem; imOut->image8[x][y] = (UINT8)((bulk + w2) / w); From da84cd7ea60de92fee1cc93e58a32422133cea21 Mon Sep 17 00:00:00 2001 From: homm Date: Tue, 14 Oct 2014 02:12:04 +0400 Subject: [PATCH 040/532] big radius special case --- libImaging/BoxBlur.c | 118 ++++++++++++++++++++++++++++++------------- 1 file changed, 82 insertions(+), 36 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index e13d7b7d8..7a3909adb 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -2,6 +2,10 @@ #include "Imaging.h" +#define MAX(x, y) (((x) > (y)) ? (x) : (y)) +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) + + Imaging HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) { @@ -20,8 +24,8 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) int w = 256 * (radius * 2 + 1) + rem * 2; int w2 = w / 2; - int cornerA = radius + 1; - int cornerB = im->xsize - radius - 1; + int edgeA = MIN(radius + 1, im->xsize); + int edgeB = MAX(im->xsize - radius - 1, 0); // printf("%d %d %d\n", rem, w, w2); @@ -60,26 +64,47 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) acc[3] += line[pix][3]; } - /* Substract pixel from left ("0"). - Add pixels from radius. */ - for (x = 0; x < cornerA; x++) { - MOVE_ACC(acc, 0, x + radius); - ADD_FAR(bulk, acc, 0, x + radius + 1); - imOut->image32[x][y] = SAVE(bulk); + if (edgeA <= edgeB) + { + /* Substract pixel from left ("0"). + Add pixels from radius. */ + for (x = 0; x < edgeA; x++) { + MOVE_ACC(acc, 0, x + radius); + ADD_FAR(bulk, acc, 0, x + radius + 1); + imOut->image32[x][y] = SAVE(bulk); + } + /* Substract previous pixel from "-radius". + Add pixels from radius. */ + for (x = edgeA; x < edgeB; x++) { + MOVE_ACC(acc, x - radius - 1, x + radius); + ADD_FAR(bulk, acc, x - radius - 1, x + radius + 1); + imOut->image32[x][y] = SAVE(bulk); + } + /* Substract previous pixel from "-radius". + Add last pixel. */ + for (x = edgeB; x < im->xsize; x++) { + MOVE_ACC(acc, x - radius - 1, lastx); + ADD_FAR(bulk, acc, x - radius - 1, lastx); + imOut->image32[x][y] = SAVE(bulk); + } } - /* Substract previous pixel from "-radius". - Add pixels from radius. */ - for (x = cornerA; x < cornerB; x++) { - MOVE_ACC(acc, x - radius - 1, x + radius); - ADD_FAR(bulk, acc, x - radius - 1, x + radius + 1); - imOut->image32[x][y] = SAVE(bulk); - } - /* Substract previous pixel from "-radius". - Add last pixel. */ - for (x = cornerB; x < im->xsize; x++) { - MOVE_ACC(acc, x - radius - 1, lastx); - ADD_FAR(bulk, acc, x - radius - 1, lastx); - imOut->image32[x][y] = SAVE(bulk); + else + { + for (x = 0; x < edgeB; x++) { + MOVE_ACC(acc, 0, x + radius); + ADD_FAR(bulk, acc, 0, x + radius + 1); + imOut->image32[x][y] = SAVE(bulk); + } + for (x = edgeB; x < edgeA; x++) { + MOVE_ACC(acc, 0, lastx); + ADD_FAR(bulk, acc, 0, lastx); + imOut->image32[x][y] = SAVE(bulk); + } + for (x = edgeA; x < im->xsize; x++) { + MOVE_ACC(acc, x - radius - 1, lastx); + ADD_FAR(bulk, acc, x - radius - 1, lastx); + imOut->image32[x][y] = SAVE(bulk); + } } } @@ -106,8 +131,8 @@ HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) int w = 256 * (radius * 2 + 1) + rem * 2; int w2 = w / 2; - int cornerA = radius + 1; - int cornerB = im->xsize - radius - 1; + int edgeA = MIN(radius + 1, im->xsize); + int edgeB = MAX(im->xsize - radius - 1, 0); ImagingSectionEnter(&cookie); @@ -119,20 +144,41 @@ HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) acc += line[pix]; } - for (x = 0; x < cornerA; x++) { - acc = acc + line[x + radius] - line[0]; - bulk = (acc << 8) + (line[0] + line[x + radius + 1]) * rem; - imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + if (edgeA <= edgeB) + { + for (x = 0; x < edgeA; x++) { + acc = acc + line[x + radius] - line[0]; + bulk = (acc << 8) + (line[0] + line[x + radius + 1]) * rem; + imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + } + for (x = edgeA; x < edgeB; x++) { + acc = acc + line[x + radius] - line[x - radius - 1]; + bulk = (acc << 8) + (line[x - radius - 1] + line[x + radius + 1]) * rem; + imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + } + for (x = edgeB; x < im->xsize; x++) { + acc = acc + line[lastx] - line[x - radius - 1]; + bulk = (acc << 8) + (line[x - radius - 1] + line[lastx]) * rem; + imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + } } - for (x = cornerA; x < cornerB; x++) { - acc = acc + line[x + radius] - line[x - radius - 1]; - bulk = (acc << 8) + (line[x - radius - 1] + line[x + radius + 1]) * rem; - imOut->image8[x][y] = (UINT8)((bulk + w2) / w); - } - for (x = cornerB; x < im->xsize; x++) { - acc = acc + line[lastx] - line[x - radius - 1]; - bulk = (acc << 8) + (line[x - radius - 1] + line[lastx]) * rem; - imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + else + { + for (x = 0; x < edgeB; x++) { + acc = acc + line[x + radius] - line[0]; + bulk = (acc << 8) + (line[0] + line[x + radius + 1]) * rem; + imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + } + for (x = edgeB; x < edgeA; x++) { + acc = acc + line[lastx] - line[0]; + bulk = (acc << 8) + (line[0] + line[lastx]) * rem; + imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + } + for (x = edgeA; x < im->xsize; x++) { + acc = acc + line[lastx] - line[x - radius - 1]; + bulk = (acc << 8) + (line[x - radius - 1] + line[lastx]) * rem; + imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + } } } From a27baf90be889be03cc282bb60a6acb3fe43f36c Mon Sep 17 00:00:00 2001 From: homm Date: Tue, 14 Oct 2014 03:26:46 +0400 Subject: [PATCH 041/532] fix large radius. tests --- Tests/test_box_blur.py | 39 +++++++++++++++++++++++++++++++++++++++ libImaging/BoxBlur.c | 11 +++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/Tests/test_box_blur.py b/Tests/test_box_blur.py index 391e00a23..841aefcef 100644 --- a/Tests/test_box_blur.py +++ b/Tests/test_box_blur.py @@ -119,3 +119,42 @@ class TestBoxBlur(PillowTestCase): ], delta=1, ) + + def test_radius_bigger_then_half(self): + self.assertImage( + box_blur(sample, 3), + [ + [144, 145, 142, 128, 114, 115, 117], + [148, 145, 137, 122, 109, 111, 112], + [152, 145, 131, 117, 103, 107, 108], + [156, 144, 126, 111, 97, 102, 103], + [160, 144, 121, 106, 92, 98, 99 ], + ], + delta=1, + ) + + def test_radius_bigger_then_width(self): + self.assertImage( + box_blur(sample, 10), + [ + [158, 153, 147, 141, 135, 129, 123], + [159, 153, 147, 141, 136, 130, 124], + [159, 154, 148, 142, 136, 130, 124], + [160, 154, 148, 142, 137, 131, 125], + [160, 155, 149, 143, 137, 131, 125], + ], + delta=0, + ) + + def test_exteme_large_radius(self): + self.assertImage( + box_blur(sample, 600), + [ + [162, 162, 162, 162, 162, 162, 162], + [162, 162, 162, 162, 162, 162, 162], + [162, 162, 162, 162, 162, 162, 162], + [162, 162, 162, 162, 162, 162, 162], + [162, 162, 162, 162, 162, 162, 162], + ], + delta=1, + ) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 7a3909adb..29b89dc9e 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -57,12 +57,18 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) acc[1] = line[0][1] * (radius + 1); acc[2] = line[0][2] * (radius + 1); acc[3] = line[0][3] * (radius + 1); - for (pix = 0; pix < radius; pix++) { + /* As radius can be bigger than xsize, iterate to edgeA -1. */ + for (pix = 0; pix < edgeA - 1; pix++) { acc[0] += line[pix][0]; acc[1] += line[pix][1]; acc[2] += line[pix][2]; acc[3] += line[pix][3]; } + /* Then multiply remainder to last x. */ + acc[0] += line[lastx][0] * (radius - edgeA + 1); + acc[1] += line[lastx][1] * (radius - edgeA + 1); + acc[2] += line[lastx][2] * (radius - edgeA + 1); + acc[3] += line[lastx][3] * (radius - edgeA + 1); if (edgeA <= edgeB) { @@ -140,9 +146,10 @@ HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) line = im->image8[y]; acc = line[0] * (radius + 1); - for (pix = 0; pix < radius; pix++) { + for (pix = 0; pix < edgeA - 1; pix++) { acc += line[pix]; } + acc += line[lastx] * (radius - edgeA + 1); if (edgeA <= edgeB) { From 5861a46a54d4d7a59a65ba3d6a1bcbc964f2398b Mon Sep 17 00:00:00 2001 From: homm Date: Tue, 14 Oct 2014 23:29:50 +0400 Subject: [PATCH 042/532] check image mode --- Tests/test_box_blur.py | 39 +++++++++++++++++++++++++++------------ libImaging/BoxBlur.c | 8 ++++++++ 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/Tests/test_box_blur.py b/Tests/test_box_blur.py index 841aefcef..87d9f354c 100644 --- a/Tests/test_box_blur.py +++ b/Tests/test_box_blur.py @@ -13,12 +13,15 @@ sample.putdata(sum([ ], [])) -def box_blur(self, radius): - return self._new(self.im.box_blur(radius)) +class TestBoxBlurApi(PillowTestCase): + pass class TestBoxBlur(PillowTestCase): + def box_blur(self, image, radius=1): + return image._new(image.im.box_blur(radius)) + def assertImage(self, im, data, delta=0): it = iter(im.getdata()) for data_row in data: @@ -30,9 +33,21 @@ class TestBoxBlur(PillowTestCase): self.assertEqual(im_row, data_row) self.assertRaises(StopIteration, next, it) + def test_color_modes(self): + self.assertRaises(ValueError, self.box_blur, sample.convert("1")) + self.assertRaises(ValueError, self.box_blur, sample.convert("P")) + self.box_blur(sample.convert("L")) + self.box_blur(sample.convert("LA")) + self.assertRaises(ValueError, self.box_blur, sample.convert("I")) + self.assertRaises(ValueError, self.box_blur, sample.convert("F")) + self.box_blur(sample.convert("RGB")) + self.box_blur(sample.convert("RGBA")) + self.box_blur(sample.convert("CMYK")) + self.assertRaises(ValueError, self.box_blur, sample.convert("YCbCr")) + def test_radius_0(self): self.assertImage( - box_blur(sample, 0), + self.box_blur(sample, 0), [ [210, 50, 20, 10, 220, 230, 80 ], [190, 210, 20, 180, 170, 40, 110], @@ -44,7 +59,7 @@ class TestBoxBlur(PillowTestCase): def test_radius_0_02(self): self.assertImage( - box_blur(sample, 0.02), + self.box_blur(sample, 0.02), [ [206, 55, 20, 17, 215, 223, 83 ], [189, 203, 31, 171, 169, 46, 110], @@ -57,7 +72,7 @@ class TestBoxBlur(PillowTestCase): def test_radius_0_05(self): self.assertImage( - box_blur(sample, 0.05), + self.box_blur(sample, 0.05), [ [202, 62, 22, 27, 209, 215, 88 ], [188, 194, 44, 161, 168, 56, 111], @@ -70,7 +85,7 @@ class TestBoxBlur(PillowTestCase): def test_radius_0_1(self): self.assertImage( - box_blur(sample, 0.1), + self.box_blur(sample, 0.1), [ [196, 72, 24, 40, 200, 203, 93 ], [187, 183, 62, 148, 166, 68, 111], @@ -83,7 +98,7 @@ class TestBoxBlur(PillowTestCase): def test_radius_0_5(self): self.assertImage( - box_blur(sample, 0.5), + self.box_blur(sample, 0.5), [ [176, 101, 46, 83, 163, 165, 111], [176, 149, 108, 122, 144, 120, 117], @@ -96,7 +111,7 @@ class TestBoxBlur(PillowTestCase): def test_radius_1(self): self.assertImage( - box_blur(sample, 1), + self.box_blur(sample, 1), [ [170, 109, 63, 97, 146, 153, 116], [168, 142, 112, 128, 126, 143, 121], @@ -109,7 +124,7 @@ class TestBoxBlur(PillowTestCase): def test_radius_1_5(self): self.assertImage( - box_blur(sample, 1.5), + self.box_blur(sample, 1.5), [ [155, 120, 105, 112, 124, 137, 130], [160, 136, 124, 125, 127, 134, 130], @@ -122,7 +137,7 @@ class TestBoxBlur(PillowTestCase): def test_radius_bigger_then_half(self): self.assertImage( - box_blur(sample, 3), + self.box_blur(sample, 3), [ [144, 145, 142, 128, 114, 115, 117], [148, 145, 137, 122, 109, 111, 112], @@ -135,7 +150,7 @@ class TestBoxBlur(PillowTestCase): def test_radius_bigger_then_width(self): self.assertImage( - box_blur(sample, 10), + self.box_blur(sample, 10), [ [158, 153, 147, 141, 135, 129, 123], [159, 153, 147, 141, 136, 130, 124], @@ -148,7 +163,7 @@ class TestBoxBlur(PillowTestCase): def test_exteme_large_radius(self): self.assertImage( - box_blur(sample, 600), + self.box_blur(sample, 600), [ [162, 162, 162, 162, 162, 162, 162], [162, 162, 162, 162, 162, 162, 162], diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 29b89dc9e..2dcf0a08d 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -208,6 +208,14 @@ ImagingBoxBlur(Imaging im, Imaging imOut, float radius) if (im->type != IMAGING_TYPE_UINT8) return ImagingError_ModeError(); + if ( ! (strcmp(im->mode, "RGB") == 0 || + strcmp(im->mode, "RGBA") == 0 || + strcmp(im->mode, "RGBX") == 0 || + strcmp(im->mode, "CMYK") == 0 || + strcmp(im->mode, "L") == 0 || + strcmp(im->mode, "LA") == 0)) + return ImagingError_ModeError(); + /* Create transposed temp image (im->ysize x im->xsize). */ Imaging temp = ImagingNew(im->mode, im->ysize, im->xsize); if ( ! temp) From 53c8352f3908559cda0cde1dc52db93d05bcda8e Mon Sep 17 00:00:00 2001 From: homm Date: Wed, 15 Oct 2014 04:08:21 +0400 Subject: [PATCH 043/532] highlevel api --- PIL/ImageOps.py | 17 +++++++++++++++++ Tests/test_box_blur.py | 9 +++++++-- libImaging/BoxBlur.c | 4 ++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/PIL/ImageOps.py b/PIL/ImageOps.py index b3afd9e95..2f4cbe564 100644 --- a/PIL/ImageOps.py +++ b/PIL/ImageOps.py @@ -441,3 +441,20 @@ def unsharp_mask(im, radius=None, percent=None, threshold=None): return im.im.unsharp_mask(radius, percent, threshold) usm = unsharp_mask + + +def box_blur(image, radius): + """ + Apply box blur to given image. Box blur is operation where + each pixel becomes the average value of pixels in given radius. + Supports float radius and very large ones. Fast implementation, + works in linear time relative to the radius. + + :param image: The image to blur. + :param radius: Size of the box in one direction. Radius 0 does not blur, + radius 1 takes 1 pixel in all directions, i.e. 9 pixels in total. + :return: An image. + """ + image.load() + + return image._new(image.im.box_blur(radius)) diff --git a/Tests/test_box_blur.py b/Tests/test_box_blur.py index 87d9f354c..2e4d23dec 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, ImageFilter +from PIL import Image, ImageOps sample = Image.new("L", (7, 5)) @@ -14,7 +14,12 @@ sample.putdata(sum([ class TestBoxBlurApi(PillowTestCase): - pass + + def test_imageops(self): + i = ImageOps.box_blur(sample, 1) + self.assertEqual(i.mode, sample.mode) + self.assertEqual(i.size, sample.size) + self.assertIsInstance(i, Image.Image) class TestBoxBlur(PillowTestCase): diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 2dcf0a08d..6432f888e 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -229,8 +229,8 @@ ImagingBoxBlur(Imaging im, Imaging imOut, float radius) HorizontalBoxBlur32(im, temp, radius); } - /* Blur in same direction transposed result from previout step. - Reseult will be transposes again. We'll get original image + /* Blur transposed result from previout step in same direction. + Reseult will be transposed again. We'll get original image blurred in both directions. */ if (strcmp(im->mode, "L") == 0) { HorizontalBoxBlur8(temp, imOut, radius); From 0ff4b53a727e7612dd72e89789d1ec74e564c10a Mon Sep 17 00:00:00 2001 From: homm Date: Wed, 15 Oct 2014 12:40:26 +0400 Subject: [PATCH 044/532] pep8 --- Tests/test_box_blur.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Tests/test_box_blur.py b/Tests/test_box_blur.py index 2e4d23dec..07ab80ec8 100644 --- a/Tests/test_box_blur.py +++ b/Tests/test_box_blur.py @@ -5,12 +5,12 @@ from PIL import Image, ImageOps sample = Image.new("L", (7, 5)) sample.putdata(sum([ - [210, 50, 20, 10, 220, 230, 80 ], + [210, 50, 20, 10, 220, 230, 80], [190, 210, 20, 180, 170, 40, 110], [120, 210, 250, 60, 220, 0, 220], - [220, 40, 230, 80, 130, 250, 40 ], + [220, 40, 230, 80, 130, 250, 40], [250, 0, 80, 30, 60, 20, 110], - ], [])) +], [])) class TestBoxBlurApi(PillowTestCase): @@ -54,10 +54,10 @@ class TestBoxBlur(PillowTestCase): self.assertImage( self.box_blur(sample, 0), [ - [210, 50, 20, 10, 220, 230, 80 ], + [210, 50, 20, 10, 220, 230, 80], [190, 210, 20, 180, 170, 40, 110], [120, 210, 250, 60, 220, 0, 220], - [220, 40, 230, 80, 130, 250, 40 ], + [220, 40, 230, 80, 130, 250, 40], [250, 0, 80, 30, 60, 20, 110], ] ) @@ -66,10 +66,10 @@ class TestBoxBlur(PillowTestCase): self.assertImage( self.box_blur(sample, 0.02), [ - [206, 55, 20, 17, 215, 223, 83 ], + [206, 55, 20, 17, 215, 223, 83], [189, 203, 31, 171, 169, 46, 110], [125, 206, 241, 69, 210, 13, 210], - [215, 49, 221, 82, 131, 235, 48 ], + [215, 49, 221, 82, 131, 235, 48], [244, 7, 80, 32, 60, 27, 107], ], delta=2, @@ -79,10 +79,10 @@ class TestBoxBlur(PillowTestCase): self.assertImage( self.box_blur(sample, 0.05), [ - [202, 62, 22, 27, 209, 215, 88 ], + [202, 62, 22, 27, 209, 215, 88], [188, 194, 44, 161, 168, 56, 111], [131, 201, 229, 81, 198, 31, 198], - [209, 62, 209, 86, 133, 216, 59 ], + [209, 62, 209, 86, 133, 216, 59], [237, 17, 80, 36, 60, 35, 103], ], delta=2, @@ -92,11 +92,11 @@ class TestBoxBlur(PillowTestCase): self.assertImage( self.box_blur(sample, 0.1), [ - [196, 72, 24, 40, 200, 203, 93 ], + [196, 72, 24, 40, 200, 203, 93], [187, 183, 62, 148, 166, 68, 111], [139, 193, 213, 96, 182, 54, 182], - [201, 78, 193, 91, 133, 191, 73 ], - [227, 31, 80, 42, 61, 47, 99 ], + [201, 78, 193, 91, 133, 191, 73], + [227, 31, 80, 42, 61, 47, 99], ], delta=1, ) @@ -109,7 +109,7 @@ class TestBoxBlur(PillowTestCase): [176, 149, 108, 122, 144, 120, 117], [164, 171, 159, 141, 134, 119, 129], [170, 136, 133, 114, 116, 124, 109], - [184, 95, 72, 70, 69, 81, 89 ], + [184, 95, 72, 70, 69, 81, 89], ], delta=1, ) @@ -122,7 +122,7 @@ class TestBoxBlur(PillowTestCase): [168, 142, 112, 128, 126, 143, 121], [169, 166, 142, 149, 126, 131, 114], [159, 156, 109, 127, 94, 117, 112], - [164, 128, 63, 87, 76, 89, 90 ], + [164, 128, 63, 87, 76, 89, 90], ], delta=1, ) @@ -135,7 +135,7 @@ class TestBoxBlur(PillowTestCase): [160, 136, 124, 125, 127, 134, 130], [166, 147, 130, 125, 120, 121, 119], [168, 145, 119, 109, 103, 105, 110], - [168, 134, 96, 85, 85, 89, 97 ], + [168, 134, 96, 85, 85, 89, 97], ], delta=1, ) @@ -148,7 +148,7 @@ class TestBoxBlur(PillowTestCase): [148, 145, 137, 122, 109, 111, 112], [152, 145, 131, 117, 103, 107, 108], [156, 144, 126, 111, 97, 102, 103], - [160, 144, 121, 106, 92, 98, 99 ], + [160, 144, 121, 106, 92, 98, 99], ], delta=1, ) From d07c9c2e4e9614ad6be6bf049e584a87a4bf810c Mon Sep 17 00:00:00 2001 From: homm Date: Thu, 16 Oct 2014 16:00:29 +0400 Subject: [PATCH 045/532] unused --- libImaging/UnsharpMask.c | 1 - 1 file changed, 1 deletion(-) diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index 907f0d29d..b951a549a 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -29,7 +29,6 @@ gblur(Imaging im, Imaging imOut, float radius, float effectiveScale, int channel float newPixel[4]; int channel = 0; int offset = 0; - INT32 newPixelFinals; int effectiveRadius = 0; int window = 0; From 7d77db20ad910ff5e05b1b6914ad2439fd9866db Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 18 Oct 2014 04:00:07 +0400 Subject: [PATCH 046/532] Small optimization: replace division with multiply. --- libImaging/BoxBlur.c | 82 ++++++++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 33 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 6432f888e..2cec73d65 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -12,22 +12,21 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) ImagingSectionCookie cookie; int x, y, pix; - unsigned int acc[4]; - unsigned int bulk[4]; + UINT32 acc[4]; + UINT32 bulk[4]; typedef UINT8 pixel[4]; pixel *line; int lastx = im->xsize - 1; int radius = (int) floatRadius; - UINT8 rem = (UINT8) (256 * (floatRadius - radius)); - int w = 256 * (radius * 2 + 1) + rem * 2; - int w2 = w / 2; + UINT32 ww = (UINT32) (1 << 24) / (floatRadius * 2 + 1); + UINT32 fw = ((1 << 24) - (radius * 2 + 1) * ww) / 2; int edgeA = MIN(radius + 1, im->xsize); int edgeB = MAX(im->xsize - radius - 1, 0); - // printf("%d %d %d\n", rem, w, w2); + // printf(">>> %d %d %d\n", radius, ww, fw); #define MOVE_ACC(acc, substract, add) \ acc[0] += line[add][0] - line[substract][0]; \ @@ -36,14 +35,14 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) acc[3] += line[add][3] - line[substract][3]; #define ADD_FAR(bulk, acc, left, right) \ - bulk[0] = (acc[0] << 8) + (line[left][0] + line[right][0]) * rem; \ - bulk[1] = (acc[1] << 8) + (line[left][1] + line[right][1]) * rem; \ - bulk[2] = (acc[2] << 8) + (line[left][2] + line[right][2]) * rem; \ - bulk[3] = (acc[3] << 8) + (line[left][3] + line[right][3]) * rem; + bulk[0] = (acc[0] * ww) + (line[left][0] + line[right][0]) * fw; \ + bulk[1] = (acc[1] * ww) + (line[left][1] + line[right][1]) * fw; \ + bulk[2] = (acc[2] * ww) + (line[left][2] + line[right][2]) * fw; \ + bulk[3] = (acc[3] * ww) + (line[left][3] + line[right][3]) * fw; #define SAVE(acc) \ - (UINT8)((acc[0] + w2) / w) << 0 | (UINT8)((acc[1] + w2) / w) << 8 | \ - (UINT8)((acc[2] + w2) / w) << 16 | (UINT8)((acc[3] + w2) / w) << 24 + (UINT8)((acc[0] + (1 << 23)) >> 24) << 0 | (UINT8)((acc[1] + (1 << 23)) >> 24) << 8 | \ + (UINT8)((acc[2] + (1 << 23)) >> 24) << 16 | (UINT8)((acc[3] + (1 << 23)) >> 24) << 24 ImagingSectionEnter(&cookie); @@ -116,6 +115,10 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) ImagingSectionLeave(&cookie); + #undef MOVE_ACC + #undef ADD_FAR + #undef SAVE + return imOut; } @@ -133,13 +136,22 @@ HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) int lastx = im->xsize - 1; int radius = (int) floatRadius; - UINT8 rem = (UINT8) (256 * (floatRadius - radius)); - int w = 256 * (radius * 2 + 1) + rem * 2; - int w2 = w / 2; + UINT32 ww = (UINT32) (1 << 24) / (floatRadius * 2 + 1); + UINT32 fw = ((1 << 24) - (radius * 2 + 1) * ww) / 2; int edgeA = MIN(radius + 1, im->xsize); int edgeB = MAX(im->xsize - radius - 1, 0); + + #define MOVE_ACC(acc, substract, add) \ + acc += line[add] - line[substract]; + + #define ADD_FAR(bulk, acc, left, right) \ + bulk = (acc * ww) + (line[left] + line[right]) * fw; + + #define SAVE(acc) \ + (UINT8)((acc + (1 << 23)) >> 24) + ImagingSectionEnter(&cookie); for (y = 0; y < im->ysize; y++) { @@ -154,43 +166,47 @@ HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) if (edgeA <= edgeB) { for (x = 0; x < edgeA; x++) { - acc = acc + line[x + radius] - line[0]; - bulk = (acc << 8) + (line[0] + line[x + radius + 1]) * rem; - imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + MOVE_ACC(acc, 0, x + radius); + ADD_FAR(bulk, acc, 0, x + radius + 1); + imOut->image8[x][y] = SAVE(bulk); } for (x = edgeA; x < edgeB; x++) { - acc = acc + line[x + radius] - line[x - radius - 1]; - bulk = (acc << 8) + (line[x - radius - 1] + line[x + radius + 1]) * rem; - imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + MOVE_ACC(acc, x - radius - 1, x + radius); + ADD_FAR(bulk, acc, x - radius - 1, x + radius + 1); + imOut->image8[x][y] = SAVE(bulk); } for (x = edgeB; x < im->xsize; x++) { - acc = acc + line[lastx] - line[x - radius - 1]; - bulk = (acc << 8) + (line[x - radius - 1] + line[lastx]) * rem; - imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + MOVE_ACC(acc, x - radius - 1, lastx); + ADD_FAR(bulk, acc, x - radius - 1, lastx); + imOut->image8[x][y] = SAVE(bulk); } } else { for (x = 0; x < edgeB; x++) { - acc = acc + line[x + radius] - line[0]; - bulk = (acc << 8) + (line[0] + line[x + radius + 1]) * rem; - imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + MOVE_ACC(acc, 0, x + radius); + ADD_FAR(bulk, acc, 0, x + radius + 1); + imOut->image8[x][y] = SAVE(bulk); } for (x = edgeB; x < edgeA; x++) { - acc = acc + line[lastx] - line[0]; - bulk = (acc << 8) + (line[0] + line[lastx]) * rem; - imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + MOVE_ACC(acc, 0, lastx); + ADD_FAR(bulk, acc, 0, lastx); + imOut->image8[x][y] = SAVE(bulk); } for (x = edgeA; x < im->xsize; x++) { - acc = acc + line[lastx] - line[x - radius - 1]; - bulk = (acc << 8) + (line[x - radius - 1] + line[lastx]) * rem; - imOut->image8[x][y] = (UINT8)((bulk + w2) / w); + MOVE_ACC(acc, x - radius - 1, lastx); + ADD_FAR(bulk, acc, x - radius - 1, lastx); + imOut->image8[x][y] = SAVE(bulk); } } } ImagingSectionLeave(&cookie); + #undef MOVE_ACC + #undef ADD_FAR + #undef SAVE + return imOut; } From 22668de6db81dee37aa9849f3508807d924f34de Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 18 Oct 2014 18:37:14 +0400 Subject: [PATCH 047/532] HorizontalBoxBlur unified LineBoxBlur8 & LineBoxBlur32 --- libImaging/BoxBlur.c | 326 ++++++++++++++++++++++--------------------- 1 file changed, 169 insertions(+), 157 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 2cec73d65..2f72e407c 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -6,28 +6,16 @@ #define MIN(x, y) (((x) < (y)) ? (x) : (y)) -Imaging -HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) -{ - ImagingSectionCookie cookie; +typedef UINT8 pixel[4]; - int x, y, pix; +void +LineBoxBlur32(pixel *line, UINT32 *lineOut, int lastx, int radius, int edgeA, + int edgeB, UINT32 ww, UINT32 fw) +{ + int x; UINT32 acc[4]; UINT32 bulk[4]; - typedef UINT8 pixel[4]; - pixel *line; - int lastx = im->xsize - 1; - - int radius = (int) floatRadius; - UINT32 ww = (UINT32) (1 << 24) / (floatRadius * 2 + 1); - UINT32 fw = ((1 << 24) - (radius * 2 + 1) * ww) / 2; - - int edgeA = MIN(radius + 1, im->xsize); - int edgeB = MAX(im->xsize - radius - 1, 0); - - // printf(">>> %d %d %d\n", radius, ww, fw); - #define MOVE_ACC(acc, substract, add) \ acc[0] += line[add][0] - line[substract][0]; \ acc[1] += line[add][1] - line[substract][1]; \ @@ -44,104 +32,82 @@ HorizontalBoxBlur32(Imaging im, Imaging imOut, float floatRadius) (UINT8)((acc[0] + (1 << 23)) >> 24) << 0 | (UINT8)((acc[1] + (1 << 23)) >> 24) << 8 | \ (UINT8)((acc[2] + (1 << 23)) >> 24) << 16 | (UINT8)((acc[3] + (1 << 23)) >> 24) << 24 - ImagingSectionEnter(&cookie); + /* Compute acc for -1 pixel (outside of image): + From "-radius-1" to "-1" get first pixel, + then from "0" to "radius-1". */ + acc[0] = line[0][0] * (radius + 1); + acc[1] = line[0][1] * (radius + 1); + acc[2] = line[0][2] * (radius + 1); + acc[3] = line[0][3] * (radius + 1); + /* As radius can be bigger than xsize, iterate to edgeA -1. */ + for (x = 0; x < edgeA - 1; x++) { + acc[0] += line[x][0]; + acc[1] += line[x][1]; + acc[2] += line[x][2]; + acc[3] += line[x][3]; + } + /* Then multiply remainder to last x. */ + acc[0] += line[lastx][0] * (radius - edgeA + 1); + acc[1] += line[lastx][1] * (radius - edgeA + 1); + acc[2] += line[lastx][2] * (radius - edgeA + 1); + acc[3] += line[lastx][3] * (radius - edgeA + 1); - for (y = 0; y < im->ysize; y++) { - line = (pixel *) im->image32[y]; - - /* Compute acc for -1 pixel (outside of image): - From "-radius-1" to "-1" get first pixel, - then from "0" to "radius-1". */ - acc[0] = line[0][0] * (radius + 1); - acc[1] = line[0][1] * (radius + 1); - acc[2] = line[0][2] * (radius + 1); - acc[3] = line[0][3] * (radius + 1); - /* As radius can be bigger than xsize, iterate to edgeA -1. */ - for (pix = 0; pix < edgeA - 1; pix++) { - acc[0] += line[pix][0]; - acc[1] += line[pix][1]; - acc[2] += line[pix][2]; - acc[3] += line[pix][3]; + if (edgeA <= edgeB) + { + /* Substract pixel from left ("0"). + Add pixels from radius. */ + for (x = 0; x < edgeA; x++) { + MOVE_ACC(acc, 0, x + radius); + ADD_FAR(bulk, acc, 0, x + radius + 1); + lineOut[x] = SAVE(bulk); } - /* Then multiply remainder to last x. */ - acc[0] += line[lastx][0] * (radius - edgeA + 1); - acc[1] += line[lastx][1] * (radius - edgeA + 1); - acc[2] += line[lastx][2] * (radius - edgeA + 1); - acc[3] += line[lastx][3] * (radius - edgeA + 1); - - if (edgeA <= edgeB) - { - /* Substract pixel from left ("0"). - Add pixels from radius. */ - for (x = 0; x < edgeA; x++) { - MOVE_ACC(acc, 0, x + radius); - ADD_FAR(bulk, acc, 0, x + radius + 1); - imOut->image32[x][y] = SAVE(bulk); - } - /* Substract previous pixel from "-radius". - Add pixels from radius. */ - for (x = edgeA; x < edgeB; x++) { - MOVE_ACC(acc, x - radius - 1, x + radius); - ADD_FAR(bulk, acc, x - radius - 1, x + radius + 1); - imOut->image32[x][y] = SAVE(bulk); - } - /* Substract previous pixel from "-radius". - Add last pixel. */ - for (x = edgeB; x < im->xsize; x++) { - MOVE_ACC(acc, x - radius - 1, lastx); - ADD_FAR(bulk, acc, x - radius - 1, lastx); - imOut->image32[x][y] = SAVE(bulk); - } + /* Substract previous pixel from "-radius". + Add pixels from radius. */ + for (x = edgeA; x < edgeB; x++) { + MOVE_ACC(acc, x - radius - 1, x + radius); + ADD_FAR(bulk, acc, x - radius - 1, x + radius + 1); + lineOut[x] = SAVE(bulk); } - else - { - for (x = 0; x < edgeB; x++) { - MOVE_ACC(acc, 0, x + radius); - ADD_FAR(bulk, acc, 0, x + radius + 1); - imOut->image32[x][y] = SAVE(bulk); - } - for (x = edgeB; x < edgeA; x++) { - MOVE_ACC(acc, 0, lastx); - ADD_FAR(bulk, acc, 0, lastx); - imOut->image32[x][y] = SAVE(bulk); - } - for (x = edgeA; x < im->xsize; x++) { - MOVE_ACC(acc, x - radius - 1, lastx); - ADD_FAR(bulk, acc, x - radius - 1, lastx); - imOut->image32[x][y] = SAVE(bulk); - } + /* Substract previous pixel from "-radius". + Add last pixel. */ + for (x = edgeB; x <= lastx; x++) { + MOVE_ACC(acc, x - radius - 1, lastx); + ADD_FAR(bulk, acc, x - radius - 1, lastx); + lineOut[x] = SAVE(bulk); + } + } + else + { + for (x = 0; x < edgeB; x++) { + MOVE_ACC(acc, 0, x + radius); + ADD_FAR(bulk, acc, 0, x + radius + 1); + lineOut[x] = SAVE(bulk); + } + for (x = edgeB; x < edgeA; x++) { + MOVE_ACC(acc, 0, lastx); + ADD_FAR(bulk, acc, 0, lastx); + lineOut[x] = SAVE(bulk); + } + for (x = edgeA; x <= lastx; x++) { + MOVE_ACC(acc, x - radius - 1, lastx); + ADD_FAR(bulk, acc, x - radius - 1, lastx); + lineOut[x] = SAVE(bulk); } } - - ImagingSectionLeave(&cookie); #undef MOVE_ACC #undef ADD_FAR #undef SAVE - - return imOut; } -Imaging -HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) +void +LineBoxBlur8(UINT8 *line, UINT8 *lineOut, int lastx, int radius, int edgeA, + int edgeB, UINT32 ww, UINT32 fw) { - ImagingSectionCookie cookie; - - int x, y, pix; - unsigned int acc; - unsigned int bulk; - - UINT8 *line; - int lastx = im->xsize - 1; - - int radius = (int) floatRadius; - UINT32 ww = (UINT32) (1 << 24) / (floatRadius * 2 + 1); - UINT32 fw = ((1 << 24) - (radius * 2 + 1) * ww) / 2; - - int edgeA = MIN(radius + 1, im->xsize); - int edgeB = MAX(im->xsize - radius - 1, 0); - + int x; + UINT32 acc; + UINT32 bulk; #define MOVE_ACC(acc, substract, add) \ acc += line[add] - line[substract]; @@ -152,60 +118,114 @@ HorizontalBoxBlur8(Imaging im, Imaging imOut, float floatRadius) #define SAVE(acc) \ (UINT8)((acc + (1 << 23)) >> 24) + acc = line[0] * (radius + 1); + for (x = 0; x < edgeA - 1; x++) { + acc += line[x]; + } + acc += line[lastx] * (radius - edgeA + 1); + + if (edgeA <= edgeB) + { + for (x = 0; x < edgeA; x++) { + MOVE_ACC(acc, 0, x + radius); + ADD_FAR(bulk, acc, 0, x + radius + 1); + lineOut[x] = SAVE(bulk); + } + for (x = edgeA; x < edgeB; x++) { + MOVE_ACC(acc, x - radius - 1, x + radius); + ADD_FAR(bulk, acc, x - radius - 1, x + radius + 1); + lineOut[x] = SAVE(bulk); + } + for (x = edgeB; x <= lastx; x++) { + MOVE_ACC(acc, x - radius - 1, lastx); + ADD_FAR(bulk, acc, x - radius - 1, lastx); + lineOut[x] = SAVE(bulk); + } + } + else + { + for (x = 0; x < edgeB; x++) { + MOVE_ACC(acc, 0, x + radius); + ADD_FAR(bulk, acc, 0, x + radius + 1); + lineOut[x] = SAVE(bulk); + } + for (x = edgeB; x < edgeA; x++) { + MOVE_ACC(acc, 0, lastx); + ADD_FAR(bulk, acc, 0, lastx); + lineOut[x] = SAVE(bulk); + } + for (x = edgeA; x <= lastx; x++) { + MOVE_ACC(acc, x - radius - 1, lastx); + ADD_FAR(bulk, acc, x - radius - 1, lastx); + lineOut[x] = SAVE(bulk); + } + } + + #undef MOVE_ACC + #undef ADD_FAR + #undef SAVE +} + + + +Imaging +HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) +{ + ImagingSectionCookie cookie; + + int y, x; + + int radius = (int) floatRadius; + UINT32 ww = (UINT32) (1 << 24) / (floatRadius * 2 + 1); + UINT32 fw = ((1 << 24) - (radius * 2 + 1) * ww) / 2; + + int edgeA = MIN(radius + 1, im->xsize); + int edgeB = MAX(im->xsize - radius - 1, 0); + + UINT32 *lineOut = calloc(im->xsize, sizeof(UINT32)); + if (lineOut == NULL) + return ImagingError_MemoryError(); + + // printf(">>> %d %d %d\n", radius, ww, fw); + ImagingSectionEnter(&cookie); - for (y = 0; y < im->ysize; y++) { - line = im->image8[y]; - - acc = line[0] * (radius + 1); - for (pix = 0; pix < edgeA - 1; pix++) { - acc += line[pix]; - } - acc += line[lastx] * (radius - edgeA + 1); - - if (edgeA <= edgeB) - { - for (x = 0; x < edgeA; x++) { - MOVE_ACC(acc, 0, x + radius); - ADD_FAR(bulk, acc, 0, x + radius + 1); - imOut->image8[x][y] = SAVE(bulk); - } - for (x = edgeA; x < edgeB; x++) { - MOVE_ACC(acc, x - radius - 1, x + radius); - ADD_FAR(bulk, acc, x - radius - 1, x + radius + 1); - imOut->image8[x][y] = SAVE(bulk); - } - for (x = edgeB; x < im->xsize; x++) { - MOVE_ACC(acc, x - radius - 1, lastx); - ADD_FAR(bulk, acc, x - radius - 1, lastx); - imOut->image8[x][y] = SAVE(bulk); + if (im->image8) + { + for (y = 0; y < im->ysize; y++) { + LineBoxBlur8( + im->image8[y], + (UINT8 *)lineOut, + im->xsize - 1, + radius, edgeA, edgeB, + ww, fw + ); + // Commit. + for (x = 0; x < im->xsize; x++) { + imOut->image8[x][y] = ((UINT8 *)lineOut)[x]; } } - else - { - for (x = 0; x < edgeB; x++) { - MOVE_ACC(acc, 0, x + radius); - ADD_FAR(bulk, acc, 0, x + radius + 1); - imOut->image8[x][y] = SAVE(bulk); - } - for (x = edgeB; x < edgeA; x++) { - MOVE_ACC(acc, 0, lastx); - ADD_FAR(bulk, acc, 0, lastx); - imOut->image8[x][y] = SAVE(bulk); - } - for (x = edgeA; x < im->xsize; x++) { - MOVE_ACC(acc, x - radius - 1, lastx); - ADD_FAR(bulk, acc, x - radius - 1, lastx); - imOut->image8[x][y] = SAVE(bulk); + } + else + { + for (y = 0; y < im->ysize; y++) { + LineBoxBlur32( + (pixel *) im->image32[y], + lineOut, + im->xsize - 1, + radius, edgeA, edgeB, + ww, fw + ); + // Commit. + for (x = 0; x < im->xsize; x++) { + imOut->image32[x][y] = lineOut[x]; } } } ImagingSectionLeave(&cookie); - #undef MOVE_ACC - #undef ADD_FAR - #undef SAVE + free(lineOut); return imOut; } @@ -239,20 +259,12 @@ ImagingBoxBlur(Imaging im, Imaging imOut, float radius) /* Apply one-dimensional blur. HorizontalBoxBlur32 transposes image at same time. */ - if (strcmp(im->mode, "L") == 0) { - HorizontalBoxBlur8(im, temp, radius); - } else { - HorizontalBoxBlur32(im, temp, radius); - } + HorizontalBoxBlur(im, temp, radius); /* Blur transposed result from previout step in same direction. Reseult will be transposed again. We'll get original image blurred in both directions. */ - if (strcmp(im->mode, "L") == 0) { - HorizontalBoxBlur8(temp, imOut, radius); - } else { - HorizontalBoxBlur32(temp, imOut, radius); - } + HorizontalBoxBlur(temp, imOut, radius); ImagingDelete(temp); From d91d7b9826bb877e18498f60dfa2be3621735dec Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 18 Oct 2014 23:56:17 +0400 Subject: [PATCH 048/532] significant speed improvement (about 55%) --- libImaging/BoxBlur.c | 46 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 2f72e407c..57f97e595 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -202,7 +202,7 @@ HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) ); // Commit. for (x = 0; x < im->xsize; x++) { - imOut->image8[x][y] = ((UINT8 *)lineOut)[x]; + imOut->image8[y][x] = ((UINT8 *)lineOut)[x]; } } } @@ -218,7 +218,7 @@ HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) ); // Commit. for (x = 0; x < im->xsize; x++) { - imOut->image32[x][y] = lineOut[x]; + imOut->image32[y][x] = lineOut[x]; } } } @@ -230,6 +230,42 @@ HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) return imOut; } +void +TransposeImage(Imaging im, Imaging imOut) +{ + int x, y, xx, yy, xxsize, yysize; + int size = 64; + + if (im->image8) + { + for (y = 0; y < im->ysize; y += size) { + for (x = 0; x < im->xsize; x += size) { + yysize = MIN(size, im->ysize - y); + xxsize = MIN(size, im->xsize - x); + for (yy = 0; yy < yysize; yy++) { + for (xx = 0; xx < xxsize; xx++) { + imOut->image8[x + xx][y + yy] = im->image8[y + yy][x + xx]; + } + } + } + } + } + else + { + for (y = 0; y < im->ysize; y += size) { + for (x = 0; x < im->xsize; x += size) { + yysize = MIN(size, im->ysize - y); + xxsize = MIN(size, im->xsize - x); + for (yy = 0; yy < yysize; yy++) { + for (xx = 0; xx < xxsize; xx++) { + imOut->image32[x + xx][y + yy] = im->image32[y + yy][x + xx]; + } + } + } + } + } +} + Imaging ImagingBoxBlur(Imaging im, Imaging imOut, float radius) @@ -259,12 +295,14 @@ ImagingBoxBlur(Imaging im, Imaging imOut, float radius) /* Apply one-dimensional blur. HorizontalBoxBlur32 transposes image at same time. */ - HorizontalBoxBlur(im, temp, radius); + HorizontalBoxBlur(im, imOut, radius); + TransposeImage(imOut, temp); /* Blur transposed result from previout step in same direction. Reseult will be transposed again. We'll get original image blurred in both directions. */ - HorizontalBoxBlur(temp, imOut, radius); + HorizontalBoxBlur(temp, temp, radius); + TransposeImage(temp, imOut); ImagingDelete(temp); From 516bd90cf7c9ab5b942b3f43f004d1f134525cd6 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 19 Oct 2014 00:14:26 +0400 Subject: [PATCH 049/532] support for multiple passes with only two transposes --- _imaging.c | 5 +++-- libImaging/BoxBlur.c | 21 +++++++++++++++++---- libImaging/Imaging.h | 2 +- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/_imaging.c b/_imaging.c index f5db88756..730f132ed 100644 --- a/_imaging.c +++ b/_imaging.c @@ -1810,7 +1810,8 @@ _box_blur(ImagingObject* self, PyObject* args) Imaging imOut; float radius; - if (!PyArg_ParseTuple(args, "f", &radius)) + int n = 1; + if (!PyArg_ParseTuple(args, "f|i", &radius, &n)) return NULL; imIn = self->image; @@ -1818,7 +1819,7 @@ _box_blur(ImagingObject* self, PyObject* args) if (!imOut) return NULL; - if (!ImagingBoxBlur(imIn, imOut, radius)) + if (!ImagingBoxBlur(imIn, imOut, radius, n)) return NULL; return PyImagingNew(imOut); diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 57f97e595..1f4aa01da 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -195,7 +195,7 @@ HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) for (y = 0; y < im->ysize; y++) { LineBoxBlur8( im->image8[y], - (UINT8 *)lineOut, + (UINT8 *) lineOut, im->xsize - 1, radius, edgeA, edgeB, ww, fw @@ -268,8 +268,16 @@ TransposeImage(Imaging im, Imaging imOut) Imaging -ImagingBoxBlur(Imaging im, Imaging imOut, float radius) +ImagingBoxBlur(Imaging im, Imaging imOut, float radius, int n) { + int i; + + if (n < 1) { + return ImagingError_ValueError( + "number of passes must be greater than zero" + ); + } + if (strcmp(im->mode, imOut->mode) || im->type != imOut->type || im->bands != imOut->bands || @@ -294,14 +302,19 @@ ImagingBoxBlur(Imaging im, Imaging imOut, float radius) return NULL; /* Apply one-dimensional blur. - HorizontalBoxBlur32 transposes image at same time. */ + HorizontalBoxBlur transposes image at same time. */ HorizontalBoxBlur(im, imOut, radius); + for (i = 1; i < n; i ++) { + HorizontalBoxBlur(imOut, imOut, radius); + } TransposeImage(imOut, temp); /* Blur transposed result from previout step in same direction. Reseult will be transposed again. We'll get original image blurred in both directions. */ - HorizontalBoxBlur(temp, temp, radius); + for (i = 0; i < n; i ++) { + HorizontalBoxBlur(temp, temp, radius); + } TransposeImage(temp, imOut); ImagingDelete(temp); diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index 8829a17bd..3f7768675 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -308,7 +308,7 @@ extern Imaging ImagingTransform( int fill); extern Imaging ImagingUnsharpMask( Imaging im, Imaging imOut, float radius, int percent, int threshold); -extern Imaging ImagingBoxBlur(Imaging im, Imaging imOut, float radius); +extern Imaging ImagingBoxBlur(Imaging im, Imaging imOut, float radius, int n); extern Imaging ImagingCopy2(Imaging imOut, Imaging imIn); extern Imaging ImagingConvert2(Imaging imOut, Imaging imIn); From 5ab12e0ee77b4e520ffc53b60f879241fabb5212 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 19 Oct 2014 01:05:09 +0400 Subject: [PATCH 050/532] improve test: test grayscale and rgba with same cases --- Tests/test_box_blur.py | 47 ++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/Tests/test_box_blur.py b/Tests/test_box_blur.py index 07ab80ec8..4f5031b6c 100644 --- a/Tests/test_box_blur.py +++ b/Tests/test_box_blur.py @@ -38,6 +38,13 @@ class TestBoxBlur(PillowTestCase): self.assertEqual(im_row, data_row) self.assertRaises(StopIteration, next, it) + def assertBlur(self, im, radius, data, delta=0): + # check grayscale image + self.assertImage(self.box_blur(im, radius), data, delta) + rgba = Image.merge('RGBA', (im, im, im, im)) + for band in self.box_blur(rgba, radius).split(): + self.assertImage(band, data, delta) + def test_color_modes(self): self.assertRaises(ValueError, self.box_blur, sample.convert("1")) self.assertRaises(ValueError, self.box_blur, sample.convert("P")) @@ -51,8 +58,8 @@ class TestBoxBlur(PillowTestCase): self.assertRaises(ValueError, self.box_blur, sample.convert("YCbCr")) def test_radius_0(self): - self.assertImage( - self.box_blur(sample, 0), + self.assertBlur( + sample, 0, [ [210, 50, 20, 10, 220, 230, 80], [190, 210, 20, 180, 170, 40, 110], @@ -63,8 +70,8 @@ class TestBoxBlur(PillowTestCase): ) def test_radius_0_02(self): - self.assertImage( - self.box_blur(sample, 0.02), + self.assertBlur( + sample, 0.02, [ [206, 55, 20, 17, 215, 223, 83], [189, 203, 31, 171, 169, 46, 110], @@ -76,8 +83,8 @@ class TestBoxBlur(PillowTestCase): ) def test_radius_0_05(self): - self.assertImage( - self.box_blur(sample, 0.05), + self.assertBlur( + sample, 0.05, [ [202, 62, 22, 27, 209, 215, 88], [188, 194, 44, 161, 168, 56, 111], @@ -89,8 +96,8 @@ class TestBoxBlur(PillowTestCase): ) def test_radius_0_1(self): - self.assertImage( - self.box_blur(sample, 0.1), + self.assertBlur( + sample, 0.1, [ [196, 72, 24, 40, 200, 203, 93], [187, 183, 62, 148, 166, 68, 111], @@ -102,8 +109,8 @@ class TestBoxBlur(PillowTestCase): ) def test_radius_0_5(self): - self.assertImage( - self.box_blur(sample, 0.5), + self.assertBlur( + sample, 0.5, [ [176, 101, 46, 83, 163, 165, 111], [176, 149, 108, 122, 144, 120, 117], @@ -115,8 +122,8 @@ class TestBoxBlur(PillowTestCase): ) def test_radius_1(self): - self.assertImage( - self.box_blur(sample, 1), + self.assertBlur( + sample, 1, [ [170, 109, 63, 97, 146, 153, 116], [168, 142, 112, 128, 126, 143, 121], @@ -128,8 +135,8 @@ class TestBoxBlur(PillowTestCase): ) def test_radius_1_5(self): - self.assertImage( - self.box_blur(sample, 1.5), + self.assertBlur( + sample, 1.5, [ [155, 120, 105, 112, 124, 137, 130], [160, 136, 124, 125, 127, 134, 130], @@ -141,8 +148,8 @@ class TestBoxBlur(PillowTestCase): ) def test_radius_bigger_then_half(self): - self.assertImage( - self.box_blur(sample, 3), + self.assertBlur( + sample, 3, [ [144, 145, 142, 128, 114, 115, 117], [148, 145, 137, 122, 109, 111, 112], @@ -154,8 +161,8 @@ class TestBoxBlur(PillowTestCase): ) def test_radius_bigger_then_width(self): - self.assertImage( - self.box_blur(sample, 10), + self.assertBlur( + sample, 10, [ [158, 153, 147, 141, 135, 129, 123], [159, 153, 147, 141, 136, 130, 124], @@ -167,8 +174,8 @@ class TestBoxBlur(PillowTestCase): ) def test_exteme_large_radius(self): - self.assertImage( - self.box_blur(sample, 600), + self.assertBlur( + sample, 600, [ [162, 162, 162, 162, 162, 162, 162], [162, 162, 162, 162, 162, 162, 162], From f55ea4c04c362fb7382e7283ef707e285a6582c5 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 19 Oct 2014 01:14:08 +0400 Subject: [PATCH 051/532] Do not use lineOut buffer if source and destination are different. --- libImaging/BoxBlur.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 1f4aa01da..240716496 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -195,14 +195,16 @@ HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) for (y = 0; y < im->ysize; y++) { LineBoxBlur8( im->image8[y], - (UINT8 *) lineOut, + (im == imOut ? (UINT8 *) lineOut : imOut->image8[y]), im->xsize - 1, radius, edgeA, edgeB, ww, fw ); - // Commit. - for (x = 0; x < im->xsize; x++) { - imOut->image8[y][x] = ((UINT8 *)lineOut)[x]; + if (im == imOut) { + // Commit. + for (x = 0; x < im->xsize; x++) { + imOut->image8[y][x] = ((UINT8 *)lineOut)[x]; + } } } } @@ -211,14 +213,16 @@ HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) for (y = 0; y < im->ysize; y++) { LineBoxBlur32( (pixel *) im->image32[y], - lineOut, + im == imOut ? lineOut : (UINT32 *) imOut->image32[y], im->xsize - 1, radius, edgeA, edgeB, ww, fw ); - // Commit. - for (x = 0; x < im->xsize; x++) { - imOut->image32[y][x] = lineOut[x]; + if (im == imOut) { + // Commit. + for (x = 0; x < im->xsize; x++) { + imOut->image32[y][x] = lineOut[x]; + } } } } From c1eb77a4ed331b10d8b44e9a8a4a003bb621a8ce Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 19 Oct 2014 18:19:56 +0400 Subject: [PATCH 052/532] faster commit --- libImaging/BoxBlur.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 240716496..6a9155390 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -173,7 +173,7 @@ HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) { ImagingSectionCookie cookie; - int y, x; + int y; int radius = (int) floatRadius; UINT32 ww = (UINT32) (1 << 24) / (floatRadius * 2 + 1); @@ -202,9 +202,7 @@ HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) ); if (im == imOut) { // Commit. - for (x = 0; x < im->xsize; x++) { - imOut->image8[y][x] = ((UINT8 *)lineOut)[x]; - } + memcpy(imOut->image8[y], lineOut, im->xsize); } } } @@ -220,9 +218,7 @@ HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) ); if (im == imOut) { // Commit. - for (x = 0; x < im->xsize; x++) { - imOut->image32[y][x] = lineOut[x]; - } + memcpy(imOut->image32[y], lineOut, im->xsize * 4); } } } From f477cab940b6cb2ca309a3ef2277a70cc049c623 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 19 Oct 2014 20:56:14 +0400 Subject: [PATCH 053/532] test for multiple passes --- Tests/test_box_blur.py | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/Tests/test_box_blur.py b/Tests/test_box_blur.py index 4f5031b6c..f5b97ac7d 100644 --- a/Tests/test_box_blur.py +++ b/Tests/test_box_blur.py @@ -24,8 +24,8 @@ class TestBoxBlurApi(PillowTestCase): class TestBoxBlur(PillowTestCase): - def box_blur(self, image, radius=1): - return image._new(image.im.box_blur(radius)) + def box_blur(self, image, radius=1, n=1): + return image._new(image.im.box_blur(radius, n)) def assertImage(self, im, data, delta=0): it = iter(im.getdata()) @@ -38,11 +38,11 @@ class TestBoxBlur(PillowTestCase): self.assertEqual(im_row, data_row) self.assertRaises(StopIteration, next, it) - def assertBlur(self, im, radius, data, delta=0): + def assertBlur(self, im, radius, data, passes=1, delta=0): # check grayscale image - self.assertImage(self.box_blur(im, radius), data, delta) + self.assertImage(self.box_blur(im, radius, passes), data, delta) rgba = Image.merge('RGBA', (im, im, im, im)) - for band in self.box_blur(rgba, radius).split(): + for band in self.box_blur(rgba, radius, passes).split(): self.assertImage(band, data, delta) def test_color_modes(self): @@ -185,3 +185,31 @@ class TestBoxBlur(PillowTestCase): ], delta=1, ) + + def test_two_passes(self): + self.assertBlur( + sample, 1, + [ + [153, 123, 102, 109, 132, 135, 129], + [159, 138, 123, 121, 133, 131, 126], + [162, 147, 136, 124, 127, 121, 121], + [159, 140, 125, 108, 111, 106, 108], + [154, 126, 105, 87, 94, 93, 97], + ], + passes=2, + delta=1, + ) + + def test_three_passes(self): + self.assertBlur( + sample, 1, + [ + [146, 131, 116, 118, 126, 131, 130], + [151, 138, 125, 123, 126, 128, 127], + [154, 143, 129, 123, 120, 120, 119], + [152, 139, 122, 113, 108, 108, 108], + [148, 132, 112, 102, 97, 99, 100], + ], + passes=3, + delta=1, + ) From c80fe312e47d395e6d98d96ed3602c58b562b675 Mon Sep 17 00:00:00 2001 From: homm Date: Mon, 20 Oct 2014 10:48:16 +0400 Subject: [PATCH 054/532] Add extended box blur. --- PIL/ImageOps.py | 16 ++++++++++++++++ Tests/test_box_blur.py | 31 ++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/PIL/ImageOps.py b/PIL/ImageOps.py index 2f4cbe564..4fe7bf222 100644 --- a/PIL/ImageOps.py +++ b/PIL/ImageOps.py @@ -20,6 +20,7 @@ from PIL import Image from PIL._util import isStringType import operator +import math from functools import reduce @@ -458,3 +459,18 @@ def box_blur(image, radius): image.load() return image._new(image.im.box_blur(radius)) + + +def extended_box_blur(image, radius, n=3): + sigma2 = float(radius) * radius / n + # http://www.mia.uni-saarland.de/Publications/gwosdek-ssvm11.pdf + # [7] Box length. + L = math.sqrt(12.0 * sigma2 + 1.0) + # [11] Integer part of box radius. + l = math.floor((L - 1.0) / 2.0) + # [14], [Fig. 2] Fractional part of box radius. + a = (2 * l + 1) * (l * (l + 1) - 3 * sigma2) + a /= 6 * (sigma2 - (l + 1) * (l + 1)) + + image.load() + return image._new(image.im.box_blur(l + a, n)) diff --git a/Tests/test_box_blur.py b/Tests/test_box_blur.py index f5b97ac7d..c3f46bfc2 100644 --- a/Tests/test_box_blur.py +++ b/Tests/test_box_blur.py @@ -13,14 +13,43 @@ sample.putdata(sum([ ], [])) +class ImageMock(object): + def __init__(self): + self.im = self + + def load(self): + pass + + def _new(self, im): + return im + + def box_blur(self, radius, n): + return radius, n + + class TestBoxBlurApi(PillowTestCase): - def test_imageops(self): + def test_imageops_box_blur(self): i = ImageOps.box_blur(sample, 1) self.assertEqual(i.mode, sample.mode) self.assertEqual(i.size, sample.size) self.assertIsInstance(i, Image.Image) + def test_imageops_extended_box_blur(self): + i = ImageOps.extended_box_blur(sample, 1) + self.assertEqual(i.mode, sample.mode) + self.assertEqual(i.size, sample.size) + self.assertIsInstance(i, Image.Image) + + def test_extended_box_blur_radius(self): + mock = ImageMock() + self.assertEqual((0.25, 3), ImageOps.extended_box_blur(mock, 1)) + self.assertEqual((0.25, 3), ImageOps.extended_box_blur(mock, 1, 3)) + self.assertAlmostEqual(ImageOps.extended_box_blur(mock, .5, 3)[0], + 0.0455, delta=0.0001) + self.assertAlmostEqual(ImageOps.extended_box_blur(mock, 35, 3)[0], + 34.49, delta=0.01) + class TestBoxBlur(PillowTestCase): From c2d688c4b6ca9d0854f36f48d17e96ddb2e62f61 Mon Sep 17 00:00:00 2001 From: homm Date: Fri, 24 Oct 2014 12:46:51 +0400 Subject: [PATCH 055/532] fix bicubic stretch interpolation --- libImaging/Antialias.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index d413fbb6a..e608ec8df 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -64,16 +64,14 @@ static struct filter BILINEAR = { bilinear_filter, 1.0 }; static inline float bicubic_filter(float x) { - /* FIXME: double-check this algorithm */ - /* FIXME: for best results, "a" should be -0.5 to -1.0, but we'll - set it to zero for now, to match the 1.1 magnifying filter */ -#define a 0.0 + /* http://en.wikipedia.org/wiki/Bicubic_interpolation#Bicubic_convolution_algorithm */ +#define a -1.0 if (x < 0.0) x = -x; if (x < 1.0) - return (((a + 2.0) * x) - (a + 3.0)) * x*x + 1; + return ((a + 2.0) * x - (a + 3.0)) * x*x + 1; if (x < 2.0) - return (((a * x) - 5*a) * x + 8) * x - 4*a; + return (((x - 5) * x + 8) * x - 4) * a; return 0.0; #undef a } From 0c90ce250493b6cc9e17f887d407d3eef921b827 Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 04:12:24 +0400 Subject: [PATCH 056/532] Add new fast ImagingTranspose function --- libImaging/Geometry.c | 38 ++++++++++++++++++++++++++++++++++++++ libImaging/Imaging.h | 1 + 2 files changed, 39 insertions(+) diff --git a/libImaging/Geometry.c b/libImaging/Geometry.c index 0f59ee0d5..20b0ef353 100644 --- a/libImaging/Geometry.c +++ b/libImaging/Geometry.c @@ -127,6 +127,44 @@ ImagingRotate90(Imaging imOut, Imaging imIn) } +Imaging +ImagingTranspose(Imaging imOut, Imaging imIn) +{ + ImagingSectionCookie cookie; + int x, y, xx, yy, xxsize, yysize; + int size = 64; + + if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) + return (Imaging) ImagingError_ModeError(); + if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) + return (Imaging) ImagingError_Mismatch(); + +#define TRANSPOSE(image) \ + for (y = 0; y < imIn->ysize; y += size) { \ + for (x = 0; x < imIn->xsize; x += size) { \ + yysize = size < (imIn->ysize - y) ? size : (imIn->ysize - y); \ + xxsize = size < (imIn->xsize - x) ? size : (imIn->xsize - x); \ + for (yy = 0; yy < yysize; yy++) { \ + for (xx = 0; xx < xxsize; xx++) { \ + imOut->image[x + xx][y + yy] = imIn->image[y + yy][x + xx]; \ + } \ + } \ + } \ + } + + ImagingCopyInfo(imOut, imIn); + + ImagingSectionEnter(&cookie); + if (imIn->image8) + TRANSPOSE(image8) + else + TRANSPOSE(image32) + ImagingSectionLeave(&cookie); + + return imOut; +} + + Imaging ImagingRotate180(Imaging imOut, Imaging imIn) { diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index d958387c9..f014bc0aa 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -292,6 +292,7 @@ extern Imaging ImagingRotate90(Imaging imOut, Imaging imIn); extern Imaging ImagingRotate180(Imaging imOut, Imaging imIn); extern Imaging ImagingRotate270(Imaging imOut, Imaging imIn); extern Imaging ImagingStretch(Imaging imOut, Imaging imIn, int filter); +extern Imaging ImagingTranspose(Imaging imOut, Imaging imIn); extern Imaging ImagingTransformPerspective( Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, double a[8], int filter, int fill); From 57cd15f9b11e667736df82cd38c2a224a8376c71 Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 04:27:46 +0400 Subject: [PATCH 057/532] Use Transpose from geometry. --- libImaging/BoxBlur.c | 40 ++-------------------------------------- 1 file changed, 2 insertions(+), 38 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 6a9155390..8be9c77d3 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -230,42 +230,6 @@ HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) return imOut; } -void -TransposeImage(Imaging im, Imaging imOut) -{ - int x, y, xx, yy, xxsize, yysize; - int size = 64; - - if (im->image8) - { - for (y = 0; y < im->ysize; y += size) { - for (x = 0; x < im->xsize; x += size) { - yysize = MIN(size, im->ysize - y); - xxsize = MIN(size, im->xsize - x); - for (yy = 0; yy < yysize; yy++) { - for (xx = 0; xx < xxsize; xx++) { - imOut->image8[x + xx][y + yy] = im->image8[y + yy][x + xx]; - } - } - } - } - } - else - { - for (y = 0; y < im->ysize; y += size) { - for (x = 0; x < im->xsize; x += size) { - yysize = MIN(size, im->ysize - y); - xxsize = MIN(size, im->xsize - x); - for (yy = 0; yy < yysize; yy++) { - for (xx = 0; xx < xxsize; xx++) { - imOut->image32[x + xx][y + yy] = im->image32[y + yy][x + xx]; - } - } - } - } - } -} - Imaging ImagingBoxBlur(Imaging im, Imaging imOut, float radius, int n) @@ -307,7 +271,7 @@ ImagingBoxBlur(Imaging im, Imaging imOut, float radius, int n) for (i = 1; i < n; i ++) { HorizontalBoxBlur(imOut, imOut, radius); } - TransposeImage(imOut, temp); + ImagingTranspose(temp, imOut); /* Blur transposed result from previout step in same direction. Reseult will be transposed again. We'll get original image @@ -315,7 +279,7 @@ ImagingBoxBlur(Imaging im, Imaging imOut, float radius, int n) for (i = 0; i < n; i ++) { HorizontalBoxBlur(temp, temp, radius); } - TransposeImage(temp, imOut); + ImagingTranspose(imOut, temp); ImagingDelete(temp); From d7d92275f18f8de45ac53067d03888df186323e6 Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 04:28:05 +0400 Subject: [PATCH 058/532] Change arguments order and names --- _imaging.c | 2 +- libImaging/BoxBlur.c | 32 ++++++++++++++++---------------- libImaging/Imaging.h | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/_imaging.c b/_imaging.c index 730f132ed..2c60407d2 100644 --- a/_imaging.c +++ b/_imaging.c @@ -1819,7 +1819,7 @@ _box_blur(ImagingObject* self, PyObject* args) if (!imOut) return NULL; - if (!ImagingBoxBlur(imIn, imOut, radius, n)) + if (!ImagingBoxBlur(imOut, imIn, radius, n)) return NULL; return PyImagingNew(imOut); diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 8be9c77d3..a0e23c4cd 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -232,7 +232,7 @@ HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) Imaging -ImagingBoxBlur(Imaging im, Imaging imOut, float radius, int n) +ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n) { int i; @@ -242,32 +242,32 @@ ImagingBoxBlur(Imaging im, Imaging imOut, float radius, int n) ); } - if (strcmp(im->mode, imOut->mode) || - im->type != imOut->type || - im->bands != imOut->bands || - im->xsize != imOut->xsize || - im->ysize != imOut->ysize) + if (strcmp(imIn->mode, imOut->mode) || + imIn->type != imOut->type || + imIn->bands != imOut->bands || + imIn->xsize != imOut->xsize || + imIn->ysize != imOut->ysize) return ImagingError_Mismatch(); - if (im->type != IMAGING_TYPE_UINT8) + if (imIn->type != IMAGING_TYPE_UINT8) return ImagingError_ModeError(); - if ( ! (strcmp(im->mode, "RGB") == 0 || - strcmp(im->mode, "RGBA") == 0 || - strcmp(im->mode, "RGBX") == 0 || - strcmp(im->mode, "CMYK") == 0 || - strcmp(im->mode, "L") == 0 || - strcmp(im->mode, "LA") == 0)) + if ( ! (strcmp(imIn->mode, "RGB") == 0 || + strcmp(imIn->mode, "RGBA") == 0 || + strcmp(imIn->mode, "RGBX") == 0 || + strcmp(imIn->mode, "CMYK") == 0 || + strcmp(imIn->mode, "L") == 0 || + strcmp(imIn->mode, "LA") == 0)) return ImagingError_ModeError(); - /* Create transposed temp image (im->ysize x im->xsize). */ - Imaging temp = ImagingNew(im->mode, im->ysize, im->xsize); + /* Create transposed temp image (imIn->ysize x imIn->xsize). */ + Imaging temp = ImagingNew(imIn->mode, imIn->ysize, imIn->xsize); if ( ! temp) return NULL; /* Apply one-dimensional blur. HorizontalBoxBlur transposes image at same time. */ - HorizontalBoxBlur(im, imOut, radius); + HorizontalBoxBlur(imIn, imOut, radius); for (i = 1; i < n; i ++) { HorizontalBoxBlur(imOut, imOut, radius); } diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index 8b3ce1b81..130975982 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -309,7 +309,7 @@ extern Imaging ImagingTransform( int fill); extern Imaging ImagingUnsharpMask( Imaging im, Imaging imOut, float radius, int percent, int threshold); -extern Imaging ImagingBoxBlur(Imaging im, Imaging imOut, float radius, int n); +extern Imaging ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n); extern Imaging ImagingCopy2(Imaging imOut, Imaging imIn); extern Imaging ImagingConvert2(Imaging imOut, Imaging imIn); From 12ba034dc88ab3ef269651658fb068f4ee2655f7 Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 12:39:03 +0400 Subject: [PATCH 059/532] unlock upscale filters --- libImaging/Antialias.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index e608ec8df..2f89e9db8 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -65,7 +65,7 @@ static struct filter BILINEAR = { bilinear_filter, 1.0 }; static inline float bicubic_filter(float x) { /* http://en.wikipedia.org/wiki/Bicubic_interpolation#Bicubic_convolution_algorithm */ -#define a -1.0 +#define a -0.5 if (x < 0.0) x = -x; if (x < 1.0) @@ -129,7 +129,6 @@ ImagingStretch(Imaging imOut, Imaging imIn, int filter) if (filterscale < 1.0) { filterscale = 1.0; - support = 0.5; } support = support * filterscale; From acdcdd487fef9e4ac1cc784ff4ddcfbd8e25dd5f Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 03:53:36 +0400 Subject: [PATCH 060/532] convert tabs to spaces --- libImaging/Antialias.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index 2f89e9db8..0c9c265ba 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -93,7 +93,7 @@ ImagingStretch(Imaging imOut, Imaging imIn, int filter) /* check modes */ if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) - return (Imaging) ImagingError_ModeError(); + return (Imaging) ImagingError_ModeError(); /* check filter */ switch (filter) { @@ -122,7 +122,7 @@ ImagingStretch(Imaging imOut, Imaging imIn, int filter) /* prepare for vertical stretch */ filterscale = scale = (float) imIn->ysize / imOut->ysize; } else - return (Imaging) ImagingError_Mismatch(); + return (Imaging) ImagingError_Mismatch(); /* determine support size (length of resampling filter) */ support = filterp->support; @@ -151,7 +151,7 @@ ImagingStretch(Imaging imOut, Imaging imIn, int filter) ymin = 0.0; ymax = ceil(center + support); if (ymax > (float) imIn->ysize) - ymax = (float) imIn->ysize; + ymax = (float) imIn->ysize; for (y = (int) ymin; y < (int) ymax; y++) { float w = filterp->filter((y - center + 0.5) * ss) * ss; k[y - (int) ymin] = w; @@ -227,7 +227,7 @@ ImagingStretch(Imaging imOut, Imaging imIn, int filter) xmin = 0.0; xmax = ceil(center + support); if (xmax > (float) imIn->xsize) - xmax = (float) imIn->xsize; + xmax = (float) imIn->xsize; for (x = (int) xmin; x < (int) xmax; x++) { float w = filterp->filter((x - center + 0.5) * ss) * ss; k[x - (int) xmin] = w; From 36cbb16bf6c986df58407acba66d8907299cff4d Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 14:23:07 +0400 Subject: [PATCH 061/532] Add tests. Rise for "P" and "1". --- Tests/test_imaging_stretch.py | 40 +++++++++++++++++++++++++++++++++++ libImaging/Antialias.c | 3 +++ 2 files changed, 43 insertions(+) create mode 100644 Tests/test_imaging_stretch.py diff --git a/Tests/test_imaging_stretch.py b/Tests/test_imaging_stretch.py new file mode 100644 index 000000000..d2fbe1c79 --- /dev/null +++ b/Tests/test_imaging_stretch.py @@ -0,0 +1,40 @@ +""" +Tests for ImagingCore.stretch functionality. +""" + +from helper import unittest, PillowTestCase + +from PIL import Image + + +im = Image.open("Tests/images/hopper.ppm").copy() + + +class TestImagingStretch(PillowTestCase): + + def test_modes(self): + self.assertRaises(ValueError, im.convert("1").im.stretch, + (15, 12), Image.ANTIALIAS) + self.assertRaises(ValueError, im.convert("P").im.stretch, + (15, 12), Image.ANTIALIAS) + for mode in ["L", "I", "F", "RGB", "RGBA", "CMYK", "YCbCr"]: + s = im.convert(mode).im + r = s.stretch((15, 12), Image.ANTIALIAS) + self.assertEqual(r.mode, mode) + self.assertEqual(r.size, (15, 12)) + self.assertEqual(r.bands, s.bands) + + def test_reduce_filters(self): + # There is no Image.NEAREST because im.stretch implementation + # is not NEAREST for reduction. It should be removed + # or renamed to supersampling. + for f in [Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: + r = im.im.stretch((15, 12), f) + self.assertEqual(r.mode, "RGB") + self.assertEqual(r.size, (15, 12)) + + def test_enlarge_filters(self): + for f in [Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: + r = im.im.stretch((764, 414), f) + self.assertEqual(r.mode, "RGB") + self.assertEqual(r.size, (764, 414)) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index 0c9c265ba..be49bc827 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -95,6 +95,9 @@ ImagingStretch(Imaging imOut, Imaging imIn, int filter) if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); + if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "1") == 0) + return (Imaging) ImagingError_ModeError(); + /* check filter */ switch (filter) { case IMAGING_TRANSFORM_NEAREST: From 65173f946b0a671816312fffcb1c6247a63d5b59 Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 16:36:41 +0400 Subject: [PATCH 062/532] replace gaussian blur with extended box blur implementation --- PIL/ImageFilter.py | 5 +- PIL/ImageOps.py | 24 +---- Tests/test_box_blur.py | 15 --- Tests/test_imageops_usm.py | 2 - _imaging.c | 6 +- libImaging/Imaging.h | 2 +- libImaging/UnsharpMask.c | 198 +++---------------------------------- 7 files changed, 23 insertions(+), 229 deletions(-) diff --git a/PIL/ImageFilter.py b/PIL/ImageFilter.py index e3b867737..1e0154d12 100644 --- a/PIL/ImageFilter.py +++ b/PIL/ImageFilter.py @@ -149,12 +149,11 @@ class GaussianBlur(Filter): """ name = "GaussianBlur" - def __init__(self, radius=2, effective_scale=None): + def __init__(self, radius=2): self.radius = radius - self.effective_scale = effective_scale def filter(self, image): - return image.gaussian_blur(self.radius, self.effective_scale or 2.6) + return image.gaussian_blur(self.radius) class UnsharpMask(Filter): diff --git a/PIL/ImageOps.py b/PIL/ImageOps.py index aaea9ba24..fec77620a 100644 --- a/PIL/ImageOps.py +++ b/PIL/ImageOps.py @@ -414,18 +414,15 @@ def solarize(image, threshold=128): # -------------------------------------------------------------------- # PIL USM components, from Kevin Cazabon. -def gaussian_blur(im, radius=None, effective_scale=None): - """ PIL_usm.gblur(im, [radius], [effective_scale])""" +def gaussian_blur(im, radius=None): + """ PIL_usm.gblur(im, [radius])""" if radius is None: radius = 5.0 - if effective_scale is None: - effective_scale = 2.6 - im.load() - return im.im.gaussian_blur(radius, effective_scale) + return im.im.gaussian_blur(radius) gblur = gaussian_blur @@ -462,18 +459,3 @@ def box_blur(image, radius): image.load() return image._new(image.im.box_blur(radius)) - - -def extended_box_blur(image, radius, n=3): - sigma2 = float(radius) * radius / n - # http://www.mia.uni-saarland.de/Publications/gwosdek-ssvm11.pdf - # [7] Box length. - L = math.sqrt(12.0 * sigma2 + 1.0) - # [11] Integer part of box radius. - l = math.floor((L - 1.0) / 2.0) - # [14], [Fig. 2] Fractional part of box radius. - a = (2 * l + 1) * (l * (l + 1) - 3 * sigma2) - a /= 6 * (sigma2 - (l + 1) * (l + 1)) - - image.load() - return image._new(image.im.box_blur(l + a, n)) diff --git a/Tests/test_box_blur.py b/Tests/test_box_blur.py index c3f46bfc2..17fd0bac1 100644 --- a/Tests/test_box_blur.py +++ b/Tests/test_box_blur.py @@ -35,21 +35,6 @@ class TestBoxBlurApi(PillowTestCase): self.assertEqual(i.size, sample.size) self.assertIsInstance(i, Image.Image) - def test_imageops_extended_box_blur(self): - i = ImageOps.extended_box_blur(sample, 1) - self.assertEqual(i.mode, sample.mode) - self.assertEqual(i.size, sample.size) - self.assertIsInstance(i, Image.Image) - - def test_extended_box_blur_radius(self): - mock = ImageMock() - self.assertEqual((0.25, 3), ImageOps.extended_box_blur(mock, 1)) - self.assertEqual((0.25, 3), ImageOps.extended_box_blur(mock, 1, 3)) - self.assertAlmostEqual(ImageOps.extended_box_blur(mock, .5, 3)[0], - 0.0455, delta=0.0001) - self.assertAlmostEqual(ImageOps.extended_box_blur(mock, 35, 3)[0], - 34.49, delta=0.01) - class TestBoxBlur(PillowTestCase): diff --git a/Tests/test_imageops_usm.py b/Tests/test_imageops_usm.py index 4645b3d6e..7d595c7f4 100644 --- a/Tests/test_imageops_usm.py +++ b/Tests/test_imageops_usm.py @@ -67,8 +67,6 @@ class TestImageOpsUsm(PillowTestCase): def test_blur_accuracy(self): i = snakes._new(ImageOps.gaussian_blur(snakes, .7)) - # Alpha channel must match whole. - self.assertEqual(i.split()[3], snakes.split()[3]) # These pixels surrounded with pixels with 255 intensity. # They must be very close to 255. for x, y, c in [(1, 0, 1), (2, 0, 1), (7, 8, 1), (8, 8, 1), (2, 9, 1), diff --git a/_imaging.c b/_imaging.c index aca1369fb..2811cf66c 100644 --- a/_imaging.c +++ b/_imaging.c @@ -863,8 +863,8 @@ _gaussian_blur(ImagingObject* self, PyObject* args) Imaging imOut; float radius = 0; - float effectiveScale = 2.6; - if (!PyArg_ParseTuple(args, "f|f", &radius, &effectiveScale)) + int passes = 3; + if (!PyArg_ParseTuple(args, "f|i", &radius, &passes)) return NULL; imIn = self->image; @@ -872,7 +872,7 @@ _gaussian_blur(ImagingObject* self, PyObject* args) if (!imOut) return NULL; - if (!ImagingGaussianBlur(imIn, imOut, radius, effectiveScale)) + if ( ! ImagingGaussianBlur(imIn, imOut, radius, passes)) return NULL; return PyImagingNew(imOut); diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index 5bbf0fdf7..ed516a3b7 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -264,7 +264,7 @@ extern Imaging ImagingFilter( extern Imaging ImagingFlipLeftRight(Imaging imOut, Imaging imIn); extern Imaging ImagingFlipTopBottom(Imaging imOut, Imaging imIn); extern Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius, - float effectiveScale); + int passes); extern Imaging ImagingGetBand(Imaging im, int band); extern int ImagingGetBBox(Imaging im, int bbox[4]); typedef struct { int x, y; INT32 count; INT32 pixel; } ImagingColorItem; diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index b951a549a..c341cf49c 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -10,174 +10,6 @@ #include "Imaging.h" -static Imaging -gblur(Imaging im, Imaging imOut, float radius, float effectiveScale, int channels) -{ - ImagingSectionCookie cookie; - - float *maskData = NULL; - int y = 0; - int x = 0; - float sum = 0.0; - - float *buffer = NULL; - - int *line = NULL; - UINT8 *line8 = NULL; - - int pix = 0; - float newPixel[4]; - int channel = 0; - int offset = 0; - - int effectiveRadius = 0; - int window = 0; - int hasAlpha = 0; - - /* Do the gaussian blur */ - - /* For a symmetrical gaussian blur, instead of doing a radius*radius - matrix lookup, you get the EXACT same results by doing a radius*1 - transform, followed by a 1*radius transform. This reduces the - number of lookups exponentially (10 lookups per pixel for a - radius of 5 instead of 25 lookups). So, we blur the lines first, - then we blur the resulting columns. */ - - /* Only pixels in effective radius from source pixel are accounted. - The Gaussian values outside 3 x radius is near zero. */ - effectiveRadius = (int) ceil(radius * effectiveScale); - /* Window is number of pixels forming the result pixel on one axis. - It is source pixel and effective radius in both directions. */ - window = effectiveRadius * 2 + 1; - - /* create the maskData for the gaussian curve */ - maskData = malloc(window * sizeof(float)); - for (pix = 0; pix < window; pix++) { - offset = pix - effectiveRadius; - if (radius) { - /* http://en.wikipedia.org/wiki/Gaussian_blur - "1 / sqrt(2 * pi * dev)" is constant and will be eliminated - by normalization. */ - maskData[pix] = pow(2.718281828459, - -offset * offset / (2 * radius * radius)); - } else { - maskData[pix] = 1; - } - sum += maskData[pix]; - } - - for (pix = 0; pix < window; pix++) { - maskData[pix] *= (1.0 / sum); - // printf("%d %f\n", pix, maskData[pix]); - } - // printf("\n"); - - /* create a temporary memory buffer for the data for the first pass - memset the buffer to 0 so we can use it directly with += */ - - /* don't bother about alpha */ - buffer = calloc((size_t) (im->xsize * im->ysize * channels), - sizeof(float)); - if (buffer == NULL) - return ImagingError_MemoryError(); - - /* be nice to other threads while you go off to lala land */ - ImagingSectionEnter(&cookie); - - /* perform a blur on each line, and place in the temporary storage buffer */ - for (y = 0; y < im->ysize; y++) { - if (channels == 1 && im->image8 != NULL) { - line8 = (UINT8 *) im->image8[y]; - } else { - line = im->image32[y]; - } - for (x = 0; x < im->xsize; x++) { - /* for each neighbor pixel, factor in its value/weighting to the - current pixel */ - for (pix = 0; pix < window; pix++) { - /* figure the offset of this neighbor pixel */ - offset = pix - effectiveRadius; - if (x + offset < 0) - offset = -x; - else if (x + offset >= im->xsize) - offset = im->xsize - x - 1; - - /* add (neighbor pixel value * maskData[pix]) to the current - pixel value */ - if (channels == 1) { - buffer[(y * im->xsize) + x] += - ((float) ((UINT8 *) & line8[x + offset])[0]) * - (maskData[pix]); - } else { - for (channel = 0; channel < channels; channel++) { - buffer[(y * im->xsize * channels) + - (x * channels) + channel] += - ((float) ((UINT8 *) & line[x + offset]) - [channel]) * (maskData[pix]); - } - } - } - } - } - - if (strcmp(im->mode, "RGBX") == 0 || strcmp(im->mode, "RGBA") == 0) { - hasAlpha = 1; - } - - /* perform a blur on each column in the buffer, and place in the - output image */ - for (x = 0; x < im->xsize; x++) { - for (y = 0; y < im->ysize; y++) { - newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = .5; - /* for each neighbor pixel, factor in its value/weighting to the - current pixel */ - for (pix = 0; pix < window; pix++) { - /* figure the offset of this neighbor pixel */ - offset = pix - effectiveRadius; - if (y + offset < 0) - offset = -y; - else if (y + offset >= im->ysize) - offset = im->ysize - y - 1; - - /* add (neighbor pixel value * maskData[pix]) to the current - pixel value */ - for (channel = 0; channel < channels; channel++) { - newPixel[channel] += - (buffer - [((y + offset) * im->xsize * channels) + - (x * channels) + channel]) * (maskData[pix]); - } - } - - if (channels == 1) { - imOut->image8[y][x] = (UINT8)(newPixel[0]); - } else { - /* if the image is RGBX or RGBA, copy the 4th channel data to - newPixel, so it gets put in imOut */ - if (hasAlpha) { - newPixel[3] = (float) ((UINT8 *) & im->image32[y][x])[3]; - } - - /* for RGB, the fourth channel isn't used anyways, so just - pack a 0 in there, this saves checking the mode for each - pixel. */ - /* this might don't work on little-endian machines... fix it! */ - imOut->image32[y][x] = - (UINT8)(newPixel[0]) | (UINT8)(newPixel[1]) << 8 | - (UINT8)(newPixel[2]) << 16 | (UINT8)(newPixel[3]) << 24; - } - } - } - - /* free the buffer */ - free(buffer); - - /* get the GIL back so Python knows who you are */ - ImagingSectionLeave(&cookie); - - return imOut; -} - static inline UINT8 clip(double in) { if (in >= 255.0) @@ -188,26 +20,24 @@ static inline UINT8 clip(double in) } Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius, - float effectiveScale) + int passes) { - int channels = 0; + float sigma2, L, l, a; - if (strcmp(im->mode, "RGB") == 0) { - channels = 3; - } else if (strcmp(im->mode, "RGBA") == 0) { - channels = 3; - } else if (strcmp(im->mode, "RGBX") == 0) { - channels = 3; - } else if (strcmp(im->mode, "CMYK") == 0) { - channels = 4; - } else if (strcmp(im->mode, "L") == 0) { - channels = 1; - } else - return ImagingError_ModeError(); + sigma2 = radius * radius / passes; + // from http://www.mia.uni-saarland.de/Publications/gwosdek-ssvm11.pdf + // [7] Box length. + L = sqrt(12.0 * sigma2 + 1.0); + // [11] Integer part of box radius. + l = floor((L - 1.0) / 2.0); + // [14], [Fig. 2] Fractional part of box radius. + a = (2 * l + 1) * (l * (l + 1) - 3 * sigma2); + a /= 6 * (sigma2 - (l + 1) * (l + 1)); - return gblur(im, imOut, radius, effectiveScale, channels); + return ImagingBoxBlur(imOut, im, l + a, passes); } + Imaging ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, int threshold) @@ -246,7 +76,7 @@ ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, /* first, do a gaussian blur on the image, putting results in imOut temporarily */ - result = gblur(im, imOut, radius, 2.6, channels); + result = ImagingGaussianBlur(im, imOut, radius, 3); if (!result) return NULL; From c802abe219a9b98012d6051cb2c124a5d89717b8 Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 16:53:15 +0400 Subject: [PATCH 063/532] change test due to different behavior on small radius --- Tests/test_imageops_usm.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Tests/test_imageops_usm.py b/Tests/test_imageops_usm.py index 7d595c7f4..d417772c8 100644 --- a/Tests/test_imageops_usm.py +++ b/Tests/test_imageops_usm.py @@ -66,7 +66,7 @@ class TestImageOpsUsm(PillowTestCase): def test_blur_accuracy(self): - i = snakes._new(ImageOps.gaussian_blur(snakes, .7)) + i = snakes._new(ImageOps.gaussian_blur(snakes, .4)) # These pixels surrounded with pixels with 255 intensity. # They must be very close to 255. for x, y, c in [(1, 0, 1), (2, 0, 1), (7, 8, 1), (8, 8, 1), (2, 9, 1), @@ -75,14 +75,14 @@ class TestImageOpsUsm(PillowTestCase): self.assertGreaterEqual(i.im.getpixel((x, y))[c], 250) # Fuzzy match. gp = lambda x, y: i.im.getpixel((x, y)) - self.assertTrue(211 <= gp(7, 4)[0] <= 213) - self.assertTrue(211 <= gp(7, 5)[2] <= 213) - self.assertTrue(211 <= gp(7, 6)[2] <= 213) - self.assertTrue(211 <= gp(7, 7)[1] <= 213) - self.assertTrue(211 <= gp(8, 4)[0] <= 213) - self.assertTrue(211 <= gp(8, 5)[2] <= 213) - self.assertTrue(211 <= gp(8, 6)[2] <= 213) - self.assertTrue(211 <= gp(8, 7)[1] <= 213) + self.assertTrue(236 <= gp(7, 4)[0] <= 239) + self.assertTrue(236 <= gp(7, 5)[2] <= 239) + self.assertTrue(236 <= gp(7, 6)[2] <= 239) + self.assertTrue(236 <= gp(7, 7)[1] <= 239) + self.assertTrue(236 <= gp(8, 4)[0] <= 239) + self.assertTrue(236 <= gp(8, 5)[2] <= 239) + self.assertTrue(236 <= gp(8, 6)[2] <= 239) + self.assertTrue(236 <= gp(8, 7)[1] <= 239) if __name__ == '__main__': unittest.main() From 274f0a14ba2f47b74bf4d683bc50f3175408c8f4 Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 17:16:14 +0400 Subject: [PATCH 064/532] change arguments order and names to match other functions --- _imaging.c | 4 ++-- libImaging/Imaging.h | 4 ++-- libImaging/UnsharpMask.c | 28 ++++++++++++++-------------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/_imaging.c b/_imaging.c index 2811cf66c..75a72465d 100644 --- a/_imaging.c +++ b/_imaging.c @@ -872,7 +872,7 @@ _gaussian_blur(ImagingObject* self, PyObject* args) if (!imOut) return NULL; - if ( ! ImagingGaussianBlur(imIn, imOut, radius, passes)) + if ( ! ImagingGaussianBlur(imOut, imIn, radius, passes)) return NULL; return PyImagingNew(imOut); @@ -1797,7 +1797,7 @@ _unsharp_mask(ImagingObject* self, PyObject* args) if (!imOut) return NULL; - if (!ImagingUnsharpMask(imIn, imOut, radius, percent, threshold)) + if ( ! ImagingUnsharpMask(imOut, imIn, radius, percent, threshold)) return NULL; return PyImagingNew(imOut); diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index ed516a3b7..25fe94d74 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -263,7 +263,7 @@ extern Imaging ImagingFilter( FLOAT32 offset, FLOAT32 divisor); extern Imaging ImagingFlipLeftRight(Imaging imOut, Imaging imIn); extern Imaging ImagingFlipTopBottom(Imaging imOut, Imaging imIn); -extern Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius, +extern Imaging ImagingGaussianBlur(Imaging imOut, Imaging imIn, float radius, int passes); extern Imaging ImagingGetBand(Imaging im, int band); extern int ImagingGetBBox(Imaging im, int bbox[4]); @@ -309,7 +309,7 @@ extern Imaging ImagingTransform( ImagingTransformFilter filter, void* filter_data, int fill); extern Imaging ImagingUnsharpMask( - Imaging im, Imaging imOut, float radius, int percent, int threshold); + Imaging imOut, Imaging im, float radius, int percent, int threshold); extern Imaging ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n); extern Imaging ImagingCopy2(Imaging imOut, Imaging imIn); diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index c341cf49c..019678385 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -19,7 +19,7 @@ static inline UINT8 clip(double in) return (UINT8) (in + 0.5); } -Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius, +Imaging ImagingGaussianBlur(Imaging imOut, Imaging imIn, float radius, int passes) { float sigma2, L, l, a; @@ -34,12 +34,12 @@ Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius, a = (2 * l + 1) * (l * (l + 1) - 3 * sigma2); a /= 6 * (sigma2 - (l + 1) * (l + 1)); - return ImagingBoxBlur(imOut, im, l + a, passes); + return ImagingBoxBlur(imOut, imIn, l + a, passes); } Imaging -ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, +ImagingUnsharpMask(Imaging imOut, Imaging imIn, float radius, int percent, int threshold) { ImagingSectionCookie cookie; @@ -61,22 +61,22 @@ ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, INT32 newPixel = 0; - if (strcmp(im->mode, "RGB") == 0) { + if (strcmp(imIn->mode, "RGB") == 0) { channels = 3; - } else if (strcmp(im->mode, "RGBA") == 0) { + } else if (strcmp(imIn->mode, "RGBA") == 0) { channels = 3; - } else if (strcmp(im->mode, "RGBX") == 0) { + } else if (strcmp(imIn->mode, "RGBX") == 0) { channels = 3; - } else if (strcmp(im->mode, "CMYK") == 0) { + } else if (strcmp(imIn->mode, "CMYK") == 0) { channels = 4; - } else if (strcmp(im->mode, "L") == 0) { + } else if (strcmp(imIn->mode, "L") == 0) { channels = 1; } else return ImagingError_ModeError(); /* first, do a gaussian blur on the image, putting results in imOut temporarily */ - result = ImagingGaussianBlur(im, imOut, radius, 3); + result = ImagingGaussianBlur(imOut, imIn, radius, 3); if (!result) return NULL; @@ -87,19 +87,19 @@ ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, ImagingSectionEnter(&cookie); - if (strcmp(im->mode, "RGBX") == 0 || strcmp(im->mode, "RGBA") == 0) { + if (strcmp(imIn->mode, "RGBX") == 0 || strcmp(imIn->mode, "RGBA") == 0) { hasAlpha = 1; } - for (y = 0; y < im->ysize; y++) { + for (y = 0; y < imIn->ysize; y++) { if (channels == 1) { - lineIn8 = im->image8[y]; + lineIn8 = imIn->image8[y]; lineOut8 = imOut->image8[y]; } else { - lineIn = im->image32[y]; + lineIn = imIn->image32[y]; lineOut = imOut->image32[y]; } - for (x = 0; x < im->xsize; x++) { + for (x = 0; x < imIn->xsize; x++) { newPixel = 0; /* compare in/out pixels, apply sharpening */ if (channels == 1) { From 4323683a637bf087e74cd2e3fb759b21184eae1c Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 17:17:53 +0400 Subject: [PATCH 065/532] move ImagingGaussianBlur to BoxBlur.c --- libImaging/BoxBlur.c | 19 +++++++++++++++++++ libImaging/UnsharpMask.c | 18 ------------------ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index a0e23c4cd..64d4fd430 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -285,3 +285,22 @@ ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n) return imOut; } + + +Imaging ImagingGaussianBlur(Imaging imOut, Imaging imIn, float radius, + int passes) +{ + float sigma2, L, l, a; + + sigma2 = radius * radius / passes; + // from http://www.mia.uni-saarland.de/Publications/gwosdek-ssvm11.pdf + // [7] Box length. + L = sqrt(12.0 * sigma2 + 1.0); + // [11] Integer part of box radius. + l = floor((L - 1.0) / 2.0); + // [14], [Fig. 2] Fractional part of box radius. + a = (2 * l + 1) * (l * (l + 1) - 3 * sigma2); + a /= 6 * (sigma2 - (l + 1) * (l + 1)); + + return ImagingBoxBlur(imOut, imIn, l + a, passes); +} diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index 019678385..61526cca7 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -19,24 +19,6 @@ static inline UINT8 clip(double in) return (UINT8) (in + 0.5); } -Imaging ImagingGaussianBlur(Imaging imOut, Imaging imIn, float radius, - int passes) -{ - float sigma2, L, l, a; - - sigma2 = radius * radius / passes; - // from http://www.mia.uni-saarland.de/Publications/gwosdek-ssvm11.pdf - // [7] Box length. - L = sqrt(12.0 * sigma2 + 1.0); - // [11] Integer part of box radius. - l = floor((L - 1.0) / 2.0); - // [14], [Fig. 2] Fractional part of box radius. - a = (2 * l + 1) * (l * (l + 1) - 3 * sigma2); - a /= 6 * (sigma2 - (l + 1) * (l + 1)); - - return ImagingBoxBlur(imOut, imIn, l + a, passes); -} - Imaging ImagingUnsharpMask(Imaging imOut, Imaging imIn, float radius, int percent, From 0df43e4f93fcfbbbef8befc1b71b800d6ff1a7d7 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 25 Oct 2014 23:42:02 +0300 Subject: [PATCH 066/532] Avoid divide by zero --- PIL/TiffImagePlugin.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 4e76379c0..b95fde51d 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1153,8 +1153,11 @@ def _save(im, fp, filename): # following tiffcp.c->cpTag->TIFF_RATIONAL atts[k] = float(v[0][0])/float(v[0][1]) continue - if type(v) == tuple and len(v) > 2: + if (type(v) == tuple and + (len(v) > 2 or + (len(v) == 2 and v[1] == 0))): # List of ints? + # Avoid divide by zero in next if-clause if type(v[0]) in (int, float): atts[k] = list(v) continue From 86c5fdc7aa4f20b8787ee7069953bc74f79c819f Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 26 Oct 2014 18:14:34 +0200 Subject: [PATCH 067/532] Created by printing a page in Chrome to PDF, then: /usr/bin/gs -q -sDEVICE=tiffg3 -sOutputFile=total-pages-zero.tif -dNOPAUSE /tmp/test.pdf -c quit --- Tests/images/total-pages-zero.tif | Bin 0 -> 97123 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/total-pages-zero.tif diff --git a/Tests/images/total-pages-zero.tif b/Tests/images/total-pages-zero.tif new file mode 100644 index 0000000000000000000000000000000000000000..50df07af3dd3c42d49cda056a023b9b673c3b990 GIT binary patch literal 97123 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 YY)#+Wzu608505%C53JJu&wF9~52r8vIRF3v literal 0 HcmV?d00001 From 6ec6b16eb6549c2a43daf5556d63733b7d3940c2 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 26 Oct 2014 18:16:08 +0200 Subject: [PATCH 068/532] Test TIFF with PageNumber 0 0 --- Tests/test_file_tiff.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index cf809d5d0..ad6642d0f 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -299,6 +299,26 @@ class TestFileTiff(PillowTestCase): self.assertEqual(ret, [0, 1]) + def test_page_number_x_0(self): + # Issue 973 + # Test TIFF with tag 297 (Page Number) having value of 0 0. + # The first number is the current page number. + # The second is the total number of pages, zero means not available. + + # Arrange + outfile = self.tempfile("temp.tif") + + # Created by printing a page in Chrome to PDF, then: + # /usr/bin/gs -q -sDEVICE=tiffg3 -sOutputFile=total-pages-zero.tif + # -dNOPAUSE /tmp/test.pdf -c quit + infile = "Tests/images/total-pages-zero.tif" + im = Image.open(infile) + + # Act / Assert + # Should not divide by zero + im.save("test.tif") + + if __name__ == '__main__': unittest.main() From 4a92c24aa6d316116728639f591e64938cea6da6 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 27 Oct 2014 09:31:22 +0200 Subject: [PATCH 069/532] Save to a self.tempfile() so it's properly cleaned up afterwards --- Tests/test_file_tiff.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index ad6642d0f..2241123ac 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -316,7 +316,7 @@ class TestFileTiff(PillowTestCase): # Act / Assert # Should not divide by zero - im.save("test.tif") + im.save(outfile) if __name__ == '__main__': From f67eb56203d1ca43a518ec286aa7bb9683acf595 Mon Sep 17 00:00:00 2001 From: Nathan Cahill Date: Tue, 28 Oct 2014 21:03:45 -0600 Subject: [PATCH 070/532] Add Ubuntu 14.04 prerequisites Replaces `tcl8.5-dev` and `tk8.5-dev` with `tcl8.6-dev` and `tk8.6-dev` for 14.04. --- docs/installation.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/installation.rst b/docs/installation.rst index a61213e15..fa8f93510 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -127,6 +127,11 @@ Prerequisites are installed with on **Ubuntu 12.04 LTS** or **Raspian Wheezy $ sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk +Prerequisites are installed with on **Ubuntu 14.04 LTS** with:: + + $ sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev \ + libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk + Prerequisites are installed on **Fedora 20** with:: $ sudo yum install libtiff-devel libjpeg-devel libzip-devel freetype-devel \ From 2d2474685a48575f4aa4b1e3c0d9b07dafd21b4e Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 29 Oct 2014 11:07:20 -0700 Subject: [PATCH 071/532] Added 4bit test to libtiff as well --- Tests/test_file_libtiff.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 85b796242..efd2d5817 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -342,6 +342,24 @@ class TestFileLibTiff(LibTiffTestCase): im.load() self.assertFalse(im.tag.next) + def test_4bit(self): + # Arrange + test_file = "Tests/images/hopper_gray_4bpp.tif" + original = hopper("L") + + # Act + TiffImagePlugin.READ_LIBTIFF = True + im = Image.open(test_file) + TiffImagePlugin.READ_LIBTIFF = False + + # Assert + self.assertEqual(im.size, (128, 128)) + self.assertEqual(im.mode, "L") + self.assert_image_similar(im, original, 7.3) + + + + if __name__ == '__main__': unittest.main() From cf6dc5a3bca0840c53b0eac8c15752db39d2247f Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 29 Oct 2014 20:09:00 +0200 Subject: [PATCH 072/532] Typos [CI skip] --- docs/installation.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index fa8f93510..ac02a645c 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -67,10 +67,10 @@ Many of Pillow's features require external libraries: * Pillow version 2.2.1 and below uses liblcms1, Pillow 2.3.0 and above uses liblcms2. Tested with **1.19** and **2.2**. -* **libwebp** provides the Webp format. +* **libwebp** provides the WebP format. * Pillow has been tested with version **0.1.3**, which does not read - transparent webp files. Versions **0.3.0** and **0.4.0** support + transparent WebP files. Versions **0.3.0** and **0.4.0** support transparency. * **tcl/tk** provides support for tkinter bitmap and photo images. @@ -121,13 +121,13 @@ Prerequisites are installed on **Ubuntu 10.04 LTS** with:: $ sudo apt-get install libtiff4-dev libjpeg62-dev zlib1g-dev \ libfreetype6-dev tcl8.5-dev tk8.5-dev python-tk -Prerequisites are installed with on **Ubuntu 12.04 LTS** or **Raspian Wheezy +Prerequisites are installed on **Ubuntu 12.04 LTS** or **Raspian Wheezy 7.0** with:: $ sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk -Prerequisites are installed with on **Ubuntu 14.04 LTS** with:: +Prerequisites are installed on **Ubuntu 14.04 LTS** with:: $ sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk From fb788b85a9f09273314b4118272f130477d45393 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 29 Oct 2014 21:28:29 +0200 Subject: [PATCH 073/532] Cache hopper to reduce FS reads and speed up tests --- Tests/helper.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index 9ee5a8259..c7d947414 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -185,10 +185,10 @@ def tostring(im, format, **options): def hopper(mode="RGB", cache={}): from PIL import Image im = None - # FIXME: Implement caching to reduce reading from disk but so an original - # copy is returned each time and the cached image isn't modified by tests + # Use caching to reduce reading from disk but so an original copy is + # returned each time and the cached image isn't modified by tests # (for fast, isolated, repeatable tests). - # im = cache.get(mode) + im = cache.get(mode) if im is None: if mode == "RGB": im = Image.open("Tests/images/hopper.ppm") @@ -198,8 +198,8 @@ def hopper(mode="RGB", cache={}): im = hopper("I").convert(mode) else: im = hopper("RGB").convert(mode) - # cache[mode] = im - return im + cache[mode] = im + return im.copy() def command_succeeds(cmd): From 59fa39c1dc2359d44a313e6c735d1b521c780527 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 29 Oct 2014 21:46:25 +0200 Subject: [PATCH 074/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 679eaa73b..69f0bd1e2 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,11 +4,14 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Support for 4-bit greyscale TIFF images #980 + [hugovk, wiredfool] + - Updated manifest #957 [wiredfool] - Fix PyPy 2.4 regression #952 - [wiredfool] + [wiredfool] - Webp Metadata Skip Test comments #954 [wiredfool] From 36a35e7e27e3b6b261405bc3aaf17a565ef848a9 Mon Sep 17 00:00:00 2001 From: homm Date: Thu, 30 Oct 2014 14:19:12 +0300 Subject: [PATCH 075/532] update box_blur help fix code style for `!` fix spelling --- PIL/ImageOps.py | 12 +++++++----- _imaging.c | 4 ++-- libImaging/BoxBlur.c | 44 ++++++++++++++++++++++---------------------- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/PIL/ImageOps.py b/PIL/ImageOps.py index fec77620a..30377dc62 100644 --- a/PIL/ImageOps.py +++ b/PIL/ImageOps.py @@ -446,14 +446,16 @@ usm = unsharp_mask def box_blur(image, radius): """ - Apply box blur to given image. Box blur is operation where - each pixel becomes the average value of pixels in given radius. - Supports float radius and very large ones. Fast implementation, - works in linear time relative to the radius. + Blur the image by setting each pixel to the average value of the pixels + in a square box extending radius pixels in each direction. + Supports float radius of arbitrary size. Uses an optimized implementation + which runs in linear time relative to the size of the image + for any radius value. :param image: The image to blur. :param radius: Size of the box in one direction. Radius 0 does not blur, - radius 1 takes 1 pixel in all directions, i.e. 9 pixels in total. + returns an identical image. Radius 1 takes 1 pixel + in each direction, i.e. 9 pixels in total. :return: An image. """ image.load() diff --git a/_imaging.c b/_imaging.c index 75a72465d..dfb0fd46e 100644 --- a/_imaging.c +++ b/_imaging.c @@ -872,7 +872,7 @@ _gaussian_blur(ImagingObject* self, PyObject* args) if (!imOut) return NULL; - if ( ! ImagingGaussianBlur(imOut, imIn, radius, passes)) + if (!ImagingGaussianBlur(imOut, imIn, radius, passes)) return NULL; return PyImagingNew(imOut); @@ -1797,7 +1797,7 @@ _unsharp_mask(ImagingObject* self, PyObject* args) if (!imOut) return NULL; - if ( ! ImagingUnsharpMask(imOut, imIn, radius, percent, threshold)) + if (!ImagingUnsharpMask(imOut, imIn, radius, percent, threshold)) return NULL; return PyImagingNew(imOut); diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 64d4fd430..a85c5eadc 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -16,11 +16,11 @@ LineBoxBlur32(pixel *line, UINT32 *lineOut, int lastx, int radius, int edgeA, UINT32 acc[4]; UINT32 bulk[4]; - #define MOVE_ACC(acc, substract, add) \ - acc[0] += line[add][0] - line[substract][0]; \ - acc[1] += line[add][1] - line[substract][1]; \ - acc[2] += line[add][2] - line[substract][2]; \ - acc[3] += line[add][3] - line[substract][3]; + #define MOVE_ACC(acc, subtract, add) \ + acc[0] += line[add][0] - line[subtract][0]; \ + acc[1] += line[add][1] - line[subtract][1]; \ + acc[2] += line[add][2] - line[subtract][2]; \ + acc[3] += line[add][3] - line[subtract][3]; #define ADD_FAR(bulk, acc, left, right) \ bulk[0] = (acc[0] * ww) + (line[left][0] + line[right][0]) * fw; \ @@ -28,9 +28,9 @@ LineBoxBlur32(pixel *line, UINT32 *lineOut, int lastx, int radius, int edgeA, bulk[2] = (acc[2] * ww) + (line[left][2] + line[right][2]) * fw; \ bulk[3] = (acc[3] * ww) + (line[left][3] + line[right][3]) * fw; - #define SAVE(acc) \ - (UINT8)((acc[0] + (1 << 23)) >> 24) << 0 | (UINT8)((acc[1] + (1 << 23)) >> 24) << 8 | \ - (UINT8)((acc[2] + (1 << 23)) >> 24) << 16 | (UINT8)((acc[3] + (1 << 23)) >> 24) << 24 + #define SAVE(bulk) \ + (UINT8)((bulk[0] + (1 << 23)) >> 24) << 0 | (UINT8)((bulk[1] + (1 << 23)) >> 24) << 8 | \ + (UINT8)((bulk[2] + (1 << 23)) >> 24) << 16 | (UINT8)((bulk[3] + (1 << 23)) >> 24) << 24 /* Compute acc for -1 pixel (outside of image): From "-radius-1" to "-1" get first pixel, @@ -54,21 +54,21 @@ LineBoxBlur32(pixel *line, UINT32 *lineOut, int lastx, int radius, int edgeA, if (edgeA <= edgeB) { - /* Substract pixel from left ("0"). + /* Subtract pixel from left ("0"). Add pixels from radius. */ for (x = 0; x < edgeA; x++) { MOVE_ACC(acc, 0, x + radius); ADD_FAR(bulk, acc, 0, x + radius + 1); lineOut[x] = SAVE(bulk); } - /* Substract previous pixel from "-radius". + /* Subtract previous pixel from "-radius". Add pixels from radius. */ for (x = edgeA; x < edgeB; x++) { MOVE_ACC(acc, x - radius - 1, x + radius); ADD_FAR(bulk, acc, x - radius - 1, x + radius + 1); lineOut[x] = SAVE(bulk); } - /* Substract previous pixel from "-radius". + /* Subtract previous pixel from "-radius". Add last pixel. */ for (x = edgeB; x <= lastx; x++) { MOVE_ACC(acc, x - radius - 1, lastx); @@ -109,14 +109,14 @@ LineBoxBlur8(UINT8 *line, UINT8 *lineOut, int lastx, int radius, int edgeA, UINT32 acc; UINT32 bulk; - #define MOVE_ACC(acc, substract, add) \ - acc += line[add] - line[substract]; + #define MOVE_ACC(acc, subtract, add) \ + acc += line[add] - line[subtract]; #define ADD_FAR(bulk, acc, left, right) \ bulk = (acc * ww) + (line[left] + line[right]) * fw; - #define SAVE(acc) \ - (UINT8)((acc + (1 << 23)) >> 24) + #define SAVE(bulk) \ + (UINT8)((bulk + (1 << 23)) >> 24) acc = line[0] * (radius + 1); for (x = 0; x < edgeA - 1; x++) { @@ -252,17 +252,17 @@ ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n) if (imIn->type != IMAGING_TYPE_UINT8) return ImagingError_ModeError(); - if ( ! (strcmp(imIn->mode, "RGB") == 0 || - strcmp(imIn->mode, "RGBA") == 0 || - strcmp(imIn->mode, "RGBX") == 0 || - strcmp(imIn->mode, "CMYK") == 0 || - strcmp(imIn->mode, "L") == 0 || - strcmp(imIn->mode, "LA") == 0)) + if (!(strcmp(imIn->mode, "RGB") == 0 || + strcmp(imIn->mode, "RGBA") == 0 || + strcmp(imIn->mode, "RGBX") == 0 || + strcmp(imIn->mode, "CMYK") == 0 || + strcmp(imIn->mode, "L") == 0 || + strcmp(imIn->mode, "LA") == 0)) return ImagingError_ModeError(); /* Create transposed temp image (imIn->ysize x imIn->xsize). */ Imaging temp = ImagingNew(imIn->mode, imIn->ysize, imIn->xsize); - if ( ! temp) + if (!temp) return NULL; /* Apply one-dimensional blur. From c99f05cd6ecac9c302f0017dbbf9e995c24fac39 Mon Sep 17 00:00:00 2001 From: homm Date: Thu, 30 Oct 2014 14:32:41 +0300 Subject: [PATCH 076/532] change arguments order and names in `LineBoxBlurXX` and `HorizontalBoxBlur` --- libImaging/BoxBlur.c | 94 ++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index a85c5eadc..629739b6e 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -9,7 +9,7 @@ typedef UINT8 pixel[4]; void -LineBoxBlur32(pixel *line, UINT32 *lineOut, int lastx, int radius, int edgeA, +ImagingLineBoxBlur32(UINT32 *lineOut, pixel *lineIn, int lastx, int radius, int edgeA, int edgeB, UINT32 ww, UINT32 fw) { int x; @@ -17,16 +17,16 @@ LineBoxBlur32(pixel *line, UINT32 *lineOut, int lastx, int radius, int edgeA, UINT32 bulk[4]; #define MOVE_ACC(acc, subtract, add) \ - acc[0] += line[add][0] - line[subtract][0]; \ - acc[1] += line[add][1] - line[subtract][1]; \ - acc[2] += line[add][2] - line[subtract][2]; \ - acc[3] += line[add][3] - line[subtract][3]; + acc[0] += lineIn[add][0] - lineIn[subtract][0]; \ + acc[1] += lineIn[add][1] - lineIn[subtract][1]; \ + acc[2] += lineIn[add][2] - lineIn[subtract][2]; \ + acc[3] += lineIn[add][3] - lineIn[subtract][3]; #define ADD_FAR(bulk, acc, left, right) \ - bulk[0] = (acc[0] * ww) + (line[left][0] + line[right][0]) * fw; \ - bulk[1] = (acc[1] * ww) + (line[left][1] + line[right][1]) * fw; \ - bulk[2] = (acc[2] * ww) + (line[left][2] + line[right][2]) * fw; \ - bulk[3] = (acc[3] * ww) + (line[left][3] + line[right][3]) * fw; + bulk[0] = (acc[0] * ww) + (lineIn[left][0] + lineIn[right][0]) * fw; \ + bulk[1] = (acc[1] * ww) + (lineIn[left][1] + lineIn[right][1]) * fw; \ + bulk[2] = (acc[2] * ww) + (lineIn[left][2] + lineIn[right][2]) * fw; \ + bulk[3] = (acc[3] * ww) + (lineIn[left][3] + lineIn[right][3]) * fw; #define SAVE(bulk) \ (UINT8)((bulk[0] + (1 << 23)) >> 24) << 0 | (UINT8)((bulk[1] + (1 << 23)) >> 24) << 8 | \ @@ -35,22 +35,22 @@ LineBoxBlur32(pixel *line, UINT32 *lineOut, int lastx, int radius, int edgeA, /* Compute acc for -1 pixel (outside of image): From "-radius-1" to "-1" get first pixel, then from "0" to "radius-1". */ - acc[0] = line[0][0] * (radius + 1); - acc[1] = line[0][1] * (radius + 1); - acc[2] = line[0][2] * (radius + 1); - acc[3] = line[0][3] * (radius + 1); + acc[0] = lineIn[0][0] * (radius + 1); + acc[1] = lineIn[0][1] * (radius + 1); + acc[2] = lineIn[0][2] * (radius + 1); + acc[3] = lineIn[0][3] * (radius + 1); /* As radius can be bigger than xsize, iterate to edgeA -1. */ for (x = 0; x < edgeA - 1; x++) { - acc[0] += line[x][0]; - acc[1] += line[x][1]; - acc[2] += line[x][2]; - acc[3] += line[x][3]; + acc[0] += lineIn[x][0]; + acc[1] += lineIn[x][1]; + acc[2] += lineIn[x][2]; + acc[3] += lineIn[x][3]; } /* Then multiply remainder to last x. */ - acc[0] += line[lastx][0] * (radius - edgeA + 1); - acc[1] += line[lastx][1] * (radius - edgeA + 1); - acc[2] += line[lastx][2] * (radius - edgeA + 1); - acc[3] += line[lastx][3] * (radius - edgeA + 1); + acc[0] += lineIn[lastx][0] * (radius - edgeA + 1); + acc[1] += lineIn[lastx][1] * (radius - edgeA + 1); + acc[2] += lineIn[lastx][2] * (radius - edgeA + 1); + acc[3] += lineIn[lastx][3] * (radius - edgeA + 1); if (edgeA <= edgeB) { @@ -102,7 +102,7 @@ LineBoxBlur32(pixel *line, UINT32 *lineOut, int lastx, int radius, int edgeA, void -LineBoxBlur8(UINT8 *line, UINT8 *lineOut, int lastx, int radius, int edgeA, +ImagingLineBoxBlur8(UINT8 *lineOut, UINT8 *lineIn, int lastx, int radius, int edgeA, int edgeB, UINT32 ww, UINT32 fw) { int x; @@ -110,19 +110,19 @@ LineBoxBlur8(UINT8 *line, UINT8 *lineOut, int lastx, int radius, int edgeA, UINT32 bulk; #define MOVE_ACC(acc, subtract, add) \ - acc += line[add] - line[subtract]; + acc += lineIn[add] - lineIn[subtract]; #define ADD_FAR(bulk, acc, left, right) \ - bulk = (acc * ww) + (line[left] + line[right]) * fw; + bulk = (acc * ww) + (lineIn[left] + lineIn[right]) * fw; #define SAVE(bulk) \ (UINT8)((bulk + (1 << 23)) >> 24) - acc = line[0] * (radius + 1); + acc = lineIn[0] * (radius + 1); for (x = 0; x < edgeA - 1; x++) { - acc += line[x]; + acc += lineIn[x]; } - acc += line[lastx] * (radius - edgeA + 1); + acc += lineIn[lastx] * (radius - edgeA + 1); if (edgeA <= edgeB) { @@ -169,7 +169,7 @@ LineBoxBlur8(UINT8 *line, UINT8 *lineOut, int lastx, int radius, int edgeA, Imaging -HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) +HorizontalBoxBlur(Imaging imOut, Imaging imIn, float floatRadius) { ImagingSectionCookie cookie; @@ -179,10 +179,10 @@ HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) UINT32 ww = (UINT32) (1 << 24) / (floatRadius * 2 + 1); UINT32 fw = ((1 << 24) - (radius * 2 + 1) * ww) / 2; - int edgeA = MIN(radius + 1, im->xsize); - int edgeB = MAX(im->xsize - radius - 1, 0); + int edgeA = MIN(radius + 1, imIn->xsize); + int edgeB = MAX(imIn->xsize - radius - 1, 0); - UINT32 *lineOut = calloc(im->xsize, sizeof(UINT32)); + UINT32 *lineOut = calloc(imIn->xsize, sizeof(UINT32)); if (lineOut == NULL) return ImagingError_MemoryError(); @@ -190,35 +190,35 @@ HorizontalBoxBlur(Imaging im, Imaging imOut, float floatRadius) ImagingSectionEnter(&cookie); - if (im->image8) + if (imIn->image8) { - for (y = 0; y < im->ysize; y++) { - LineBoxBlur8( - im->image8[y], - (im == imOut ? (UINT8 *) lineOut : imOut->image8[y]), - im->xsize - 1, + for (y = 0; y < imIn->ysize; y++) { + ImagingLineBoxBlur8( + (imIn == imOut ? (UINT8 *) lineOut : imOut->image8[y]), + imIn->image8[y], + imIn->xsize - 1, radius, edgeA, edgeB, ww, fw ); - if (im == imOut) { + if (imIn == imOut) { // Commit. - memcpy(imOut->image8[y], lineOut, im->xsize); + memcpy(imOut->image8[y], lineOut, imIn->xsize); } } } else { - for (y = 0; y < im->ysize; y++) { - LineBoxBlur32( - (pixel *) im->image32[y], - im == imOut ? lineOut : (UINT32 *) imOut->image32[y], - im->xsize - 1, + for (y = 0; y < imIn->ysize; y++) { + ImagingLineBoxBlur32( + imIn == imOut ? lineOut : (UINT32 *) imOut->image32[y], + (pixel *) imIn->image32[y], + imIn->xsize - 1, radius, edgeA, edgeB, ww, fw ); - if (im == imOut) { + if (imIn == imOut) { // Commit. - memcpy(imOut->image32[y], lineOut, im->xsize * 4); + memcpy(imOut->image32[y], lineOut, imIn->xsize * 4); } } } @@ -267,7 +267,7 @@ ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n) /* Apply one-dimensional blur. HorizontalBoxBlur transposes image at same time. */ - HorizontalBoxBlur(imIn, imOut, radius); + HorizontalBoxBlur(imOut, imIn, radius); for (i = 1; i < n; i ++) { HorizontalBoxBlur(imOut, imOut, radius); } From 4007a78d5379a9f254a8ef79fc092f34363dd32c Mon Sep 17 00:00:00 2001 From: homm Date: Thu, 30 Oct 2014 14:48:15 +0300 Subject: [PATCH 077/532] rename temp to imTransposed actualize comments --- libImaging/BoxBlur.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 629739b6e..5308ecb01 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -169,7 +169,7 @@ ImagingLineBoxBlur8(UINT8 *lineOut, UINT8 *lineIn, int lastx, int radius, int ed Imaging -HorizontalBoxBlur(Imaging imOut, Imaging imIn, float floatRadius) +ImagingHorizontalBoxBlur(Imaging imOut, Imaging imIn, float floatRadius) { ImagingSectionCookie cookie; @@ -260,28 +260,28 @@ ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n) strcmp(imIn->mode, "LA") == 0)) return ImagingError_ModeError(); - /* Create transposed temp image (imIn->ysize x imIn->xsize). */ - Imaging temp = ImagingNew(imIn->mode, imIn->ysize, imIn->xsize); - if (!temp) + Imaging imTransposed = ImagingNew(imIn->mode, imIn->ysize, imIn->xsize); + if (!imTransposed) return NULL; - /* Apply one-dimensional blur. - HorizontalBoxBlur transposes image at same time. */ - HorizontalBoxBlur(imOut, imIn, radius); + /* Apply blur in one dimension. + Use imOut as a destination at first pass, + then use imOut as a source too. */ + ImagingHorizontalBoxBlur(imOut, imIn, radius); for (i = 1; i < n; i ++) { - HorizontalBoxBlur(imOut, imOut, radius); + ImagingHorizontalBoxBlur(imOut, imOut, radius); } - ImagingTranspose(temp, imOut); + /* Transpose result for blur in another direction. */ + ImagingTranspose(imTransposed, imOut); - /* Blur transposed result from previout step in same direction. - Reseult will be transposed again. We'll get original image - blurred in both directions. */ + /* Reuse imTransposed as a source and destination there. */ for (i = 0; i < n; i ++) { - HorizontalBoxBlur(temp, temp, radius); + ImagingHorizontalBoxBlur(imTransposed, imTransposed, radius); } - ImagingTranspose(imOut, temp); + /* Restore original orientation. */ + ImagingTranspose(imOut, imTransposed); - ImagingDelete(temp); + ImagingDelete(imTransposed); return imOut; } From 6de030a1658c9cc667344c9a75ed44714b4fa638 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 1 Nov 2014 09:55:15 +0200 Subject: [PATCH 078/532] Don't use builtin as variable --- Tests/test_file_msp.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py index 2245f9ed6..f4b1af75e 100644 --- a/Tests/test_file_msp.py +++ b/Tests/test_file_msp.py @@ -27,13 +27,13 @@ class TestFileMsp(PillowTestCase): self.assertEqual(im.size, (128, 128)) self.assert_image_similar(im, hopper("1"), 4) - def test_cannot_save_save_wrong_mode(self): + def test_cannot_save_wrong_mode(self): # Arrange im = hopper() - file = self.tempfile("temp.msp") + filename = self.tempfile("temp.msp") # Act/Assert - self.assertRaises(IOError, lambda: im.save(file)) + self.assertRaises(IOError, lambda: im.save(filename)) if __name__ == '__main__': From f3af439a401186f771280569bf934e749736baa0 Mon Sep 17 00:00:00 2001 From: George Thomas Date: Wed, 5 Nov 2014 15:09:54 +0530 Subject: [PATCH 079/532] Update installation.rst libtiff4-dev is obsolete --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index ac02a645c..c48b30265 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -129,7 +129,7 @@ Prerequisites are installed on **Ubuntu 12.04 LTS** or **Raspian Wheezy Prerequisites are installed on **Ubuntu 14.04 LTS** with:: - $ sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev \ + $ sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk Prerequisites are installed on **Fedora 20** with:: From 6d7c010bedaddf6da8ab76cd517fa258c4b37664 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 5 Nov 2014 17:46:57 -0800 Subject: [PATCH 080/532] Update CHANGES.rst [ci skip] --- CHANGES.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 69f0bd1e2..d37ac9fdd 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,9 +3,11 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Fix Bicubic interpolation #970 + [homm] - Support for 4-bit greyscale TIFF images #980 - [hugovk, wiredfool] + [hugovk] - Updated manifest #957 [wiredfool] From 675371b9b14dd9bd24f2b5e9a01863031ed922dc Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 6 Nov 2014 11:49:30 +0200 Subject: [PATCH 081/532] Make test_imaging_stretch.py runnable as a standalone script --- Tests/test_imaging_stretch.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Tests/test_imaging_stretch.py b/Tests/test_imaging_stretch.py index d2fbe1c79..a9858eff5 100644 --- a/Tests/test_imaging_stretch.py +++ b/Tests/test_imaging_stretch.py @@ -38,3 +38,9 @@ class TestImagingStretch(PillowTestCase): r = im.im.stretch((764, 414), f) self.assertEqual(r.mode, "RGB") self.assertEqual(r.size, (764, 414)) + + +if __name__ == '__main__': + unittest.main() + +# End of file From b5315eb59b1db62288064049bff3fb9b6734f889 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 6 Nov 2014 13:01:42 +0200 Subject: [PATCH 082/532] Fork from master and send pull requests to master Master is essentially our dev branch. [CI skip] --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 30c375a17..8351625fc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,13 +2,13 @@ ## Fixes, Features and Changes -Send a pull request. We'll generally want documentation and [tests](Tests/README.rst) for new features. Tests or documentation on their own are also welcomed. Feel free to ask questions as an [issue](https://github.com/python-pillow/Pillow/issues/new) or on IRC (irc.freenode.net, #pil) +Send a pull request to the master branch. We'll generally want documentation and [tests](Tests/README.rst) for new features. Tests or documentation on their own are also welcomed. Feel free to ask questions as an [issue](https://github.com/python-pillow/Pillow/issues/new) or on IRC (irc.freenode.net, #pil) - Fork the repo -- Make a branch +- Make a branch from master - Add your changes + Tests - Run the test suite. Try to run on both Python 2.x and 3.x, or you'll get tripped up. You can enable [Travis CI on your repo](https://travis-ci.org/profile/) 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. -- Push to your fork, and make a pull request. +- Push to your fork, and make a pull request onto master. A few guidelines: - Try to keep any code commits clean and separate from reformatting commits. From 9d600859573cbc1369ed5521ea1f02afd1269536 Mon Sep 17 00:00:00 2001 From: Moriyoshi Koizumi Date: Thu, 6 Nov 2014 21:29:27 +0900 Subject: [PATCH 083/532] The optimization algorithm is only applicable to the image of mode="P" or "L". --- PIL/GifImagePlugin.py | 2 +- Tests/test_file_gif.py | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 0b154f417..55aece38c 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -433,7 +433,7 @@ def getheader(im, palette=None, info=None): usedPaletteColors = paletteBytes = None - if optimize: + if im.mode in ("P", "L") and optimize: usedPaletteColors = [] # check which colors are used diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 200b48372..57cd71ac6 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -28,13 +28,22 @@ class TestFileGif(PillowTestCase): def test_optimize(self): from io import BytesIO - def test(optimize): + def test_grayscale(optimize): im = Image.new("L", (1, 1), 0) file = BytesIO() im.save(file, "GIF", optimize=optimize) return len(file.getvalue()) - self.assertEqual(test(0), 800) - self.assertEqual(test(1), 38) + + def test_bilevel(optimize): + im = Image.new("1", (1, 1), 0) + file = BytesIO() + im.save(file, "GIF", optimize=optimize) + return len(file.getvalue()) + + self.assertEqual(test_grayscale(0), 800) + self.assertEqual(test_grayscale(1), 38) + self.assertEqual(test_bilevel(0), 800) + self.assertEqual(test_bilevel(1), 800) def test_optimize_full_l(self): from io import BytesIO From d41bc4fbfcbc2ade7ecbf554b8c8273ee51f3e5f Mon Sep 17 00:00:00 2001 From: homm Date: Fri, 7 Nov 2014 03:21:38 +0300 Subject: [PATCH 084/532] convert tabs into spaces --- libImaging/Geometry.c | 196 +++++++++++++++++++++--------------------- 1 file changed, 98 insertions(+), 98 deletions(-) diff --git a/libImaging/Geometry.c b/libImaging/Geometry.c index 20b0ef353..9cd5d683f 100644 --- a/libImaging/Geometry.c +++ b/libImaging/Geometry.c @@ -34,7 +34,7 @@ #define FLOOR(v) ((v) < 0.0 ? ((int)floor(v)) : ((int)(v))) /* -------------------------------------------------------------------- */ -/* Transpose operations */ +/* Transpose operations */ Imaging ImagingFlipLeftRight(Imaging imOut, Imaging imIn) @@ -43,25 +43,25 @@ ImagingFlipLeftRight(Imaging imOut, Imaging imIn) int x, y, xr; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) - return (Imaging) ImagingError_ModeError(); + return (Imaging) ImagingError_ModeError(); if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) - return (Imaging) ImagingError_Mismatch(); + return (Imaging) ImagingError_Mismatch(); ImagingCopyInfo(imOut, imIn); -#define FLIP_HORIZ(image)\ +#define FLIP_HORIZ(image)\ for (y = 0; y < imIn->ysize; y++) {\ - xr = imIn->xsize-1;\ - for (x = 0; x < imIn->xsize; x++, xr--)\ - imOut->image[y][x] = imIn->image[y][xr];\ + xr = imIn->xsize-1;\ + for (x = 0; x < imIn->xsize; x++, xr--)\ + imOut->image[y][x] = imIn->image[y][xr];\ } ImagingSectionEnter(&cookie); if (imIn->image8) - FLIP_HORIZ(image8) + FLIP_HORIZ(image8) else - FLIP_HORIZ(image32) + FLIP_HORIZ(image32) ImagingSectionLeave(&cookie); @@ -76,9 +76,9 @@ ImagingFlipTopBottom(Imaging imOut, Imaging imIn) int y, yr; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) - return (Imaging) ImagingError_ModeError(); + return (Imaging) ImagingError_ModeError(); if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) - return (Imaging) ImagingError_Mismatch(); + return (Imaging) ImagingError_Mismatch(); ImagingCopyInfo(imOut, imIn); @@ -86,7 +86,7 @@ ImagingFlipTopBottom(Imaging imOut, Imaging imIn) yr = imIn->ysize-1; for (y = 0; y < imIn->ysize; y++, yr--) - memcpy(imOut->image[yr], imIn->image[y], imIn->linesize); + memcpy(imOut->image[yr], imIn->image[y], imIn->linesize); ImagingSectionLeave(&cookie); @@ -101,25 +101,25 @@ ImagingRotate90(Imaging imOut, Imaging imIn) int x, y, xr; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) - return (Imaging) ImagingError_ModeError(); + return (Imaging) ImagingError_ModeError(); if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) - return (Imaging) ImagingError_Mismatch(); + return (Imaging) ImagingError_Mismatch(); ImagingCopyInfo(imOut, imIn); -#define ROTATE_90(image)\ +#define ROTATE_90(image)\ for (y = 0; y < imIn->ysize; y++) {\ - xr = imIn->xsize-1;\ - for (x = 0; x < imIn->xsize; x++, xr--)\ - imOut->image[xr][y] = imIn->image[y][x];\ + xr = imIn->xsize-1;\ + for (x = 0; x < imIn->xsize; x++, xr--)\ + imOut->image[xr][y] = imIn->image[y][x];\ } ImagingSectionEnter(&cookie); if (imIn->image8) - ROTATE_90(image8) + ROTATE_90(image8) else - ROTATE_90(image32) + ROTATE_90(image32) ImagingSectionLeave(&cookie); @@ -172,27 +172,27 @@ ImagingRotate180(Imaging imOut, Imaging imIn) int x, y, xr, yr; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) - return (Imaging) ImagingError_ModeError(); + return (Imaging) ImagingError_ModeError(); if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) - return (Imaging) ImagingError_Mismatch(); + return (Imaging) ImagingError_Mismatch(); ImagingCopyInfo(imOut, imIn); yr = imIn->ysize-1; -#define ROTATE_180(image)\ +#define ROTATE_180(image)\ for (y = 0; y < imIn->ysize; y++, yr--) {\ - xr = imIn->xsize-1;\ - for (x = 0; x < imIn->xsize; x++, xr--)\ - imOut->image[y][x] = imIn->image[yr][xr];\ + xr = imIn->xsize-1;\ + for (x = 0; x < imIn->xsize; x++, xr--)\ + imOut->image[y][x] = imIn->image[yr][xr];\ } ImagingSectionEnter(&cookie); if (imIn->image8) - ROTATE_180(image8) + ROTATE_180(image8) else - ROTATE_180(image32) + ROTATE_180(image32) ImagingSectionLeave(&cookie); @@ -207,25 +207,25 @@ ImagingRotate270(Imaging imOut, Imaging imIn) int x, y, yr; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) - return (Imaging) ImagingError_ModeError(); + return (Imaging) ImagingError_ModeError(); if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) - return (Imaging) ImagingError_Mismatch(); + return (Imaging) ImagingError_Mismatch(); ImagingCopyInfo(imOut, imIn); yr = imIn->ysize - 1; -#define ROTATE_270(image)\ +#define ROTATE_270(image)\ for (y = 0; y < imIn->ysize; y++, yr--)\ - for (x = 0; x < imIn->xsize; x++)\ - imOut->image[x][y] = imIn->image[yr][x]; + for (x = 0; x < imIn->xsize; x++)\ + imOut->image[x][y] = imIn->image[yr][x]; ImagingSectionEnter(&cookie); if (imIn->image8) - ROTATE_270(image8) + ROTATE_270(image8) else - ROTATE_270(image32) + ROTATE_270(image32) ImagingSectionLeave(&cookie); @@ -234,7 +234,7 @@ ImagingRotate270(Imaging imOut, Imaging imIn) /* -------------------------------------------------------------------- */ -/* Transforms */ +/* Transforms */ /* transform primitives (ImagingTransformMap) */ @@ -635,7 +635,7 @@ ImagingTransform( double xx, yy; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) - return (Imaging) ImagingError_ModeError(); + return (Imaging) ImagingError_ModeError(); ImagingCopyInfo(imOut, imIn); @@ -651,15 +651,15 @@ ImagingTransform( y1 = imOut->ysize; for (y = y0; y < y1; y++) { - out = imOut->image[y] + x0*imOut->pixelsize; - for (x = x0; x < x1; x++) { - if (!transform(&xx, &yy, x-x0, y-y0, transform_data) || + out = imOut->image[y] + x0*imOut->pixelsize; + for (x = x0; x < x1; x++) { + if (!transform(&xx, &yy, x-x0, y-y0, transform_data) || !filter(out, imIn, xx, yy, filter_data)) { if (fill) memset(out, 0, imOut->pixelsize); } out += imOut->pixelsize; - } + } } ImagingSectionLeave(&cookie); @@ -682,7 +682,7 @@ ImagingScaleAffine(Imaging imOut, Imaging imIn, int *xintab; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) - return (Imaging) ImagingError_ModeError(); + return (Imaging) ImagingError_ModeError(); ImagingCopyInfo(imOut, imIn); @@ -697,8 +697,8 @@ ImagingScaleAffine(Imaging imOut, Imaging imIn, xintab = (int*) malloc(imOut->xsize * sizeof(int)); if (!xintab) { - ImagingDelete(imOut); - return (Imaging) ImagingError_MemoryError(); + ImagingDelete(imOut); + return (Imaging) ImagingError_MemoryError(); } xo = a[0]; @@ -709,29 +709,29 @@ ImagingScaleAffine(Imaging imOut, Imaging imIn, /* Pretabulate horizontal pixel positions */ for (x = x0; x < x1; x++) { - xin = COORD(xo); - if (xin >= 0 && xin < (int) imIn->xsize) { - xmax = x+1; - if (x < xmin) - xmin = x; - xintab[x] = xin; - } - xo += a[1]; + xin = COORD(xo); + if (xin >= 0 && xin < (int) imIn->xsize) { + xmax = x+1; + if (x < xmin) + xmin = x; + xintab[x] = xin; + } + xo += a[1]; } -#define AFFINE_SCALE(pixel, image)\ +#define AFFINE_SCALE(pixel, image)\ for (y = y0; y < y1; y++) {\ - int yi = COORD(yo);\ - pixel *in, *out;\ - out = imOut->image[y];\ + int yi = COORD(yo);\ + pixel *in, *out;\ + out = imOut->image[y];\ if (fill && x1 > x0)\ memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ - if (yi >= 0 && yi < imIn->ysize) {\ - in = imIn->image[yi];\ - for (x = xmin; x < xmax; x++)\ - out[x] = in[xintab[x]];\ - }\ - yo += a[5];\ + if (yi >= 0 && yi < imIn->ysize) {\ + in = imIn->image[yi];\ + for (x = xmin; x < xmax; x++)\ + out[x] = in[xintab[x]];\ + }\ + yo += a[5];\ } ImagingSectionEnter(&cookie); @@ -781,32 +781,32 @@ affine_fixed(Imaging imOut, Imaging imIn, a0 = FIX(a[0]); a1 = FIX(a[1]); a2 = FIX(a[2]); a3 = FIX(a[3]); a4 = FIX(a[4]); a5 = FIX(a[5]); -#define AFFINE_TRANSFORM_FIXED(pixel, image)\ +#define AFFINE_TRANSFORM_FIXED(pixel, image)\ for (y = y0; y < y1; y++) {\ - pixel *out;\ - xx = a0;\ - yy = a3;\ - out = imOut->image[y];\ + pixel *out;\ + xx = a0;\ + yy = a3;\ + out = imOut->image[y];\ if (fill && x1 > x0)\ memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ for (x = x0; x < x1; x++, out++) {\ - xin = xx >> 16;\ - if (xin >= 0 && xin < xsize) {\ - yin = yy >> 16;\ - if (yin >= 0 && yin < ysize)\ + xin = xx >> 16;\ + if (xin >= 0 && xin < xsize) {\ + yin = yy >> 16;\ + if (yin >= 0 && yin < ysize)\ *out = imIn->image[yin][xin];\ }\ - xx += a1;\ - yy += a4;\ - }\ - a0 += a2;\ - a3 += a5;\ + xx += a1;\ + yy += a4;\ + }\ + a0 += a2;\ + a3 += a5;\ } if (imIn->image8) - AFFINE_TRANSFORM_FIXED(UINT8, image8) + AFFINE_TRANSFORM_FIXED(UINT8, image8) else - AFFINE_TRANSFORM_FIXED(INT32, image32) + AFFINE_TRANSFORM_FIXED(INT32, image32) return imOut; } @@ -839,11 +839,11 @@ ImagingTransformAffine(Imaging imOut, Imaging imIn, } if (a[2] == 0 && a[4] == 0) - /* Scaling */ - return ImagingScaleAffine(imOut, imIn, x0, y0, x1, y1, a, fill); + /* Scaling */ + return ImagingScaleAffine(imOut, imIn, x0, y0, x1, y1, a, fill); if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) - return (Imaging) ImagingError_ModeError(); + return (Imaging) ImagingError_ModeError(); if (x0 < 0) x0 = 0; @@ -873,34 +873,34 @@ ImagingTransformAffine(Imaging imOut, Imaging imIn, xo = a[0]; yo = a[3]; -#define AFFINE_TRANSFORM(pixel, image)\ +#define AFFINE_TRANSFORM(pixel, image)\ for (y = y0; y < y1; y++) {\ - pixel *out;\ - xx = xo;\ - yy = yo;\ - out = imOut->image[y];\ + pixel *out;\ + xx = xo;\ + yy = yo;\ + out = imOut->image[y];\ if (fill && x1 > x0)\ memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ for (x = x0; x < x1; x++, out++) {\ - xin = COORD(xx);\ - if (xin >= 0 && xin < xsize) {\ - yin = COORD(yy);\ - if (yin >= 0 && yin < ysize)\ + xin = COORD(xx);\ + if (xin >= 0 && xin < xsize) {\ + yin = COORD(yy);\ + if (yin >= 0 && yin < ysize)\ *out = imIn->image[yin][xin];\ }\ - xx += a[1];\ - yy += a[4];\ - }\ - xo += a[2];\ - yo += a[5];\ + xx += a[1];\ + yy += a[4];\ + }\ + xo += a[2];\ + yo += a[5];\ } ImagingSectionEnter(&cookie); if (imIn->image8) - AFFINE_TRANSFORM(UINT8, image8) + AFFINE_TRANSFORM(UINT8, image8) else - AFFINE_TRANSFORM(INT32, image32) + AFFINE_TRANSFORM(INT32, image32) ImagingSectionLeave(&cookie); @@ -950,7 +950,7 @@ ImagingResize(Imaging imOut, Imaging imIn, int filterid) double a[6]; if (imOut->xsize == imIn->xsize && imOut->ysize == imIn->ysize) - return ImagingCopy2(imOut, imIn); + return ImagingCopy2(imOut, imIn); memset(a, 0, sizeof a); a[1] = (double) imIn->xsize / imOut->xsize; From 32079b1dcc8dca39a016f9332424ee41c812c56a Mon Sep 17 00:00:00 2001 From: homm Date: Fri, 7 Nov 2014 03:37:12 +0300 Subject: [PATCH 085/532] make transpose part of public api --- PIL/Image.py | 7 ++++--- _imaging.c | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 99ab6327b..de2876f37 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -150,6 +150,7 @@ FLIP_TOP_BOTTOM = 1 ROTATE_90 = 2 ROTATE_180 = 3 ROTATE_270 = 4 +TRANSPOSE = 5 # transforms AFFINE = 0 @@ -1921,13 +1922,13 @@ class Image: :param method: One of :py:attr:`PIL.Image.FLIP_LEFT_RIGHT`, :py:attr:`PIL.Image.FLIP_TOP_BOTTOM`, :py:attr:`PIL.Image.ROTATE_90`, - :py:attr:`PIL.Image.ROTATE_180`, or :py:attr:`PIL.Image.ROTATE_270`. + :py:attr:`PIL.Image.ROTATE_180`, :py:attr:`PIL.Image.ROTATE_270` or + :py:attr:`PIL.Image.TRANSPOSE`. :returns: Returns a flipped or rotated copy of this image. """ self.load() - im = self.im.transpose(method) - return self._new(im) + return self._new(self.im.transpose(method)) def effect_spread(self, distance): """ diff --git a/_imaging.c b/_imaging.c index 1759d4c8d..4eb878cf7 100644 --- a/_imaging.c +++ b/_imaging.c @@ -1750,6 +1750,7 @@ _transpose(ImagingObject* self, PyObject* args) break; case 2: /* rotate 90 */ case 4: /* rotate 270 */ + case 5: /* transpose */ imOut = ImagingNew(imIn->mode, imIn->ysize, imIn->xsize); break; default: @@ -1774,6 +1775,9 @@ _transpose(ImagingObject* self, PyObject* args) case 4: (void) ImagingRotate270(imOut, imIn); break; + case 5: + (void) ImagingTranspose(imOut, imIn); + break; } return PyImagingNew(imOut); From a960d440db22a1e95e4aae726a9433ce2cd01a7c Mon Sep 17 00:00:00 2001 From: homm Date: Fri, 7 Nov 2014 03:57:00 +0300 Subject: [PATCH 086/532] less operations in loop --- libImaging/Geometry.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libImaging/Geometry.c b/libImaging/Geometry.c index 9cd5d683f..4adb228f5 100644 --- a/libImaging/Geometry.c +++ b/libImaging/Geometry.c @@ -132,7 +132,7 @@ ImagingTranspose(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int x, y, xx, yy, xxsize, yysize; - int size = 64; + int size = 128; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); @@ -142,11 +142,11 @@ ImagingTranspose(Imaging imOut, Imaging imIn) #define TRANSPOSE(image) \ for (y = 0; y < imIn->ysize; y += size) { \ for (x = 0; x < imIn->xsize; x += size) { \ - yysize = size < (imIn->ysize - y) ? size : (imIn->ysize - y); \ - xxsize = size < (imIn->xsize - x) ? size : (imIn->xsize - x); \ - for (yy = 0; yy < yysize; yy++) { \ - for (xx = 0; xx < xxsize; xx++) { \ - imOut->image[x + xx][y + yy] = imIn->image[y + yy][x + xx]; \ + yysize = y + size < imIn->ysize ? y + size : imIn->ysize; \ + xxsize = x + size < imIn->xsize ? x + size : imIn->xsize; \ + for (yy = y; yy < yysize; yy++) { \ + for (xx = x; xx < xxsize; xx++) { \ + imOut->image[xx][yy] = imIn->image[yy][xx]; \ } \ } \ } \ From cfa20f1004428026b6be01b2807ece30908609f0 Mon Sep 17 00:00:00 2001 From: homm Date: Fri, 7 Nov 2014 04:15:18 +0300 Subject: [PATCH 087/532] rotate 90 and 270 by chunks --- libImaging/Geometry.c | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/libImaging/Geometry.c b/libImaging/Geometry.c index 4adb228f5..4d26e644b 100644 --- a/libImaging/Geometry.c +++ b/libImaging/Geometry.c @@ -98,7 +98,8 @@ Imaging ImagingRotate90(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; - int x, y, xr; + int x, y, xx, yy, xr, xxsize, yysize; + int size = 128; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); @@ -107,11 +108,18 @@ ImagingRotate90(Imaging imOut, Imaging imIn) ImagingCopyInfo(imOut, imIn); -#define ROTATE_90(image)\ - for (y = 0; y < imIn->ysize; y++) {\ - xr = imIn->xsize-1;\ - for (x = 0; x < imIn->xsize; x++, xr--)\ - imOut->image[xr][y] = imIn->image[y][x];\ +#define ROTATE_90(image) \ + for (y = 0; y < imIn->ysize; y += size) { \ + for (x = 0; x < imIn->xsize; x += size) { \ + yysize = y + size < imIn->ysize ? y + size : imIn->ysize; \ + xxsize = x + size < imIn->xsize ? x + size : imIn->xsize; \ + for (yy = y; yy < yysize; yy++) { \ + xr = imIn->xsize - 1 - x; \ + for (xx = x; xx < xxsize; xx++, xr--) { \ + imOut->image[xr][yy] = imIn->image[yy][xx]; \ + } \ + } \ + } \ } ImagingSectionEnter(&cookie); @@ -204,7 +212,8 @@ Imaging ImagingRotate270(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; - int x, y, yr; + int x, y, xx, yy, yr, xxsize, yysize; + int size = 128; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); @@ -213,12 +222,19 @@ ImagingRotate270(Imaging imOut, Imaging imIn) ImagingCopyInfo(imOut, imIn); - yr = imIn->ysize - 1; - -#define ROTATE_270(image)\ - for (y = 0; y < imIn->ysize; y++, yr--)\ - for (x = 0; x < imIn->xsize; x++)\ - imOut->image[x][y] = imIn->image[yr][x]; +#define ROTATE_270(image) \ + for (y = 0; y < imIn->ysize; y += size) { \ + for (x = 0; x < imIn->xsize; x += size) { \ + yysize = y + size < imIn->ysize ? y + size : imIn->ysize; \ + xxsize = x + size < imIn->xsize ? x + size : imIn->xsize; \ + yr = imIn->ysize - 1 - y; \ + for (yy = y; yy < yysize; yy++, yr--) { \ + for (xx = x; xx < xxsize; xx++) { \ + imOut->image[xx][yr] = imIn->image[yy][xx]; \ + } \ + } \ + } \ + } ImagingSectionEnter(&cookie); From a51b17664499a347f7c0daeac778a0828a131d9f Mon Sep 17 00:00:00 2001 From: homm Date: Fri, 7 Nov 2014 04:46:16 +0300 Subject: [PATCH 088/532] make ROTATE_CHUNK constant add comment --- libImaging/Geometry.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/libImaging/Geometry.c b/libImaging/Geometry.c index 4d26e644b..aca183112 100644 --- a/libImaging/Geometry.c +++ b/libImaging/Geometry.c @@ -30,6 +30,13 @@ /* Undef if you don't need resampling filters */ #define WITH_FILTERS +/* Large images rotation is inefficient operation in terms of CPU cache. + One row in source image affects each column in destination. + Rotating in small chunks can speed up up to 8 times on modern CPU. + Chunk size of 128 requires only 65k of CPU cache and high enougth + for overhead from extra loop have not been manifested. */ +#define ROTATE_CHUNK 128 + #define COORD(v) ((v) < 0.0 ? -1 : ((int)(v))) #define FLOOR(v) ((v) < 0.0 ? ((int)floor(v)) : ((int)(v))) @@ -99,7 +106,6 @@ ImagingRotate90(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int x, y, xx, yy, xr, xxsize, yysize; - int size = 128; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); @@ -109,10 +115,10 @@ ImagingRotate90(Imaging imOut, Imaging imIn) ImagingCopyInfo(imOut, imIn); #define ROTATE_90(image) \ - for (y = 0; y < imIn->ysize; y += size) { \ - for (x = 0; x < imIn->xsize; x += size) { \ - yysize = y + size < imIn->ysize ? y + size : imIn->ysize; \ - xxsize = x + size < imIn->xsize ? x + size : imIn->xsize; \ + for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ + for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ + yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ + xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ for (yy = y; yy < yysize; yy++) { \ xr = imIn->xsize - 1 - x; \ for (xx = x; xx < xxsize; xx++, xr--) { \ @@ -140,7 +146,6 @@ ImagingTranspose(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int x, y, xx, yy, xxsize, yysize; - int size = 128; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); @@ -148,10 +153,10 @@ ImagingTranspose(Imaging imOut, Imaging imIn) return (Imaging) ImagingError_Mismatch(); #define TRANSPOSE(image) \ - for (y = 0; y < imIn->ysize; y += size) { \ - for (x = 0; x < imIn->xsize; x += size) { \ - yysize = y + size < imIn->ysize ? y + size : imIn->ysize; \ - xxsize = x + size < imIn->xsize ? x + size : imIn->xsize; \ + for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ + for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ + yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ + xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ for (yy = y; yy < yysize; yy++) { \ for (xx = x; xx < xxsize; xx++) { \ imOut->image[xx][yy] = imIn->image[yy][xx]; \ @@ -213,7 +218,6 @@ ImagingRotate270(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int x, y, xx, yy, yr, xxsize, yysize; - int size = 128; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); @@ -223,10 +227,10 @@ ImagingRotate270(Imaging imOut, Imaging imIn) ImagingCopyInfo(imOut, imIn); #define ROTATE_270(image) \ - for (y = 0; y < imIn->ysize; y += size) { \ - for (x = 0; x < imIn->xsize; x += size) { \ - yysize = y + size < imIn->ysize ? y + size : imIn->ysize; \ - xxsize = x + size < imIn->xsize ? x + size : imIn->xsize; \ + for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ + for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ + yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ + xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ yr = imIn->ysize - 1 - y; \ for (yy = y; yy < yysize; yy++, yr--) { \ for (xx = x; xx < xxsize; xx++) { \ From 4cf2f158b674d14693ef1728888e660174384aba Mon Sep 17 00:00:00 2001 From: homm Date: Fri, 7 Nov 2014 11:48:47 +0300 Subject: [PATCH 089/532] add test update comment --- Tests/test_image_transpose.py | 116 ++++++++++++++++++++++++++++------ libImaging/Geometry.c | 10 +-- 2 files changed, 103 insertions(+), 23 deletions(-) diff --git a/Tests/test_image_transpose.py b/Tests/test_image_transpose.py index 3e4257bc0..eb61c0c04 100644 --- a/Tests/test_image_transpose.py +++ b/Tests/test_image_transpose.py @@ -1,29 +1,108 @@ from helper import unittest, PillowTestCase, hopper -from PIL import Image - -FLIP_LEFT_RIGHT = Image.FLIP_LEFT_RIGHT -FLIP_TOP_BOTTOM = Image.FLIP_TOP_BOTTOM -ROTATE_90 = Image.ROTATE_90 -ROTATE_180 = Image.ROTATE_180 -ROTATE_270 = Image.ROTATE_270 +from PIL.Image import (FLIP_LEFT_RIGHT, FLIP_TOP_BOTTOM, ROTATE_90, ROTATE_180, + ROTATE_270, TRANSPOSE) class TestImageTranspose(PillowTestCase): - def test_sanity(self): + def test_flip_left_right(self): + def transpose(mode): + im = hopper(mode) + out = im.transpose(FLIP_LEFT_RIGHT) + self.assertEqual(out.mode, mode) + self.assertEqual(out.size, im.size) - im = hopper() + x, y = im.size + self.assertEqual(im.getpixel((1, 1)), out.getpixel((x-2, 1))) + self.assertEqual(im.getpixel((x-2, 1)), out.getpixel((1, 1))) + self.assertEqual(im.getpixel((1, y-2)), out.getpixel((x-2, y-2))) + self.assertEqual(im.getpixel((x-2, y-2)), out.getpixel((1, y-2))) - im.transpose(FLIP_LEFT_RIGHT) - im.transpose(FLIP_TOP_BOTTOM) + for mode in ("L", "RGB"): + transpose(mode) - im.transpose(ROTATE_90) - im.transpose(ROTATE_180) - im.transpose(ROTATE_270) + def test_flip_top_bottom(self): + def transpose(mode): + im = hopper(mode) + out = im.transpose(FLIP_TOP_BOTTOM) + self.assertEqual(out.mode, mode) + self.assertEqual(out.size, im.size) + + x, y = im.size + self.assertEqual(im.getpixel((1, 1)), out.getpixel((1, y-2))) + self.assertEqual(im.getpixel((x-2, 1)), out.getpixel((x-2, y-2))) + self.assertEqual(im.getpixel((1, y-2)), out.getpixel((1, 1))) + self.assertEqual(im.getpixel((x-2, y-2)), out.getpixel((x-2, 1))) + + for mode in ("L", "RGB"): + transpose(mode) + + def test_rotate_90(self): + def transpose(mode): + im = hopper(mode) + out = im.transpose(ROTATE_90) + self.assertEqual(out.mode, mode) + self.assertEqual(out.size, im.size[::-1]) + + x, y = im.size + self.assertEqual(im.getpixel((1, 1)), out.getpixel((1, y-2))) + self.assertEqual(im.getpixel((x-2, 1)), out.getpixel((1, 1))) + self.assertEqual(im.getpixel((1, y-2)), out.getpixel((x-2, y-2))) + self.assertEqual(im.getpixel((x-2, y-2)), out.getpixel((x-2, 1))) + + for mode in ("L", "RGB"): + transpose(mode) + + def test_rotate_180(self): + def transpose(mode): + im = hopper(mode) + out = im.transpose(ROTATE_180) + self.assertEqual(out.mode, mode) + self.assertEqual(out.size, im.size) + + x, y = im.size + self.assertEqual(im.getpixel((1, 1)), out.getpixel((x-2, y-2))) + self.assertEqual(im.getpixel((x-2, 1)), out.getpixel((1, y-2))) + self.assertEqual(im.getpixel((1, y-2)), out.getpixel((x-2, 1))) + self.assertEqual(im.getpixel((x-2, y-2)), out.getpixel((1, 1))) + + for mode in ("L", "RGB"): + transpose(mode) + + def test_rotate_270(self): + def transpose(mode): + im = hopper(mode) + out = im.transpose(ROTATE_270) + self.assertEqual(out.mode, mode) + self.assertEqual(out.size, im.size[::-1]) + + x, y = im.size + self.assertEqual(im.getpixel((1, 1)), out.getpixel((x-2, 1))) + self.assertEqual(im.getpixel((x-2, 1)), out.getpixel((x-2, y-2))) + self.assertEqual(im.getpixel((1, y-2)), out.getpixel((1, 1))) + self.assertEqual(im.getpixel((x-2, y-2)), out.getpixel((1, y-2))) + + for mode in ("L", "RGB"): + transpose(mode) + + def test_transpose(self): + def transpose(mode): + im = hopper(mode) + out = im.transpose(TRANSPOSE) + self.assertEqual(out.mode, mode) + self.assertEqual(out.size, im.size[::-1]) + + x, y = im.size + self.assertEqual(im.getpixel((1, 1)), out.getpixel((1, 1))) + self.assertEqual(im.getpixel((x-2, 1)), out.getpixel((1, y-2))) + self.assertEqual(im.getpixel((1, y-2)), out.getpixel((x-2, 1))) + self.assertEqual(im.getpixel((x-2, y-2)), out.getpixel((x-2, y-2))) + + for mode in ("L", "RGB"): + transpose(mode) def test_roundtrip(self): - im = hopper() def transpose(first, second): @@ -33,12 +112,13 @@ class TestImageTranspose(PillowTestCase): im, transpose(FLIP_LEFT_RIGHT, FLIP_LEFT_RIGHT)) self.assert_image_equal( im, transpose(FLIP_TOP_BOTTOM, FLIP_TOP_BOTTOM)) - self.assert_image_equal(im, transpose(ROTATE_90, ROTATE_270)) self.assert_image_equal(im, transpose(ROTATE_180, ROTATE_180)) + self.assert_image_equal( + im.transpose(TRANSPOSE), transpose(ROTATE_90, FLIP_TOP_BOTTOM)) + self.assert_image_equal( + im.transpose(TRANSPOSE), transpose(ROTATE_270, FLIP_LEFT_RIGHT)) if __name__ == '__main__': unittest.main() - -# End of file diff --git a/libImaging/Geometry.c b/libImaging/Geometry.c index aca183112..afd162dad 100644 --- a/libImaging/Geometry.c +++ b/libImaging/Geometry.c @@ -30,11 +30,11 @@ /* Undef if you don't need resampling filters */ #define WITH_FILTERS -/* Large images rotation is inefficient operation in terms of CPU cache. - One row in source image affects each column in destination. - Rotating in small chunks can speed up up to 8 times on modern CPU. - Chunk size of 128 requires only 65k of CPU cache and high enougth - for overhead from extra loop have not been manifested. */ +/* For large images rotation is an inefficient operation in terms of CPU cache. + One row in the source image affects each column in destination. + Rotating in chunks that fit in the cache can speed up rotation + 8x on a modern CPU. A chunk size of 128 requires only 65k and is large enough + that the overhead from the extra loops are not apparent. */ #define ROTATE_CHUNK 128 #define COORD(v) ((v) < 0.0 ? -1 : ((int)(v))) From 9e5ee5a5bffa6b4ce7954cfb2f908132a3a0f5d7 Mon Sep 17 00:00:00 2001 From: homm Date: Fri, 7 Nov 2014 13:15:51 +0300 Subject: [PATCH 090/532] use not square image for test, fix tests --- Tests/test_image_transpose.py | 37 ++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/Tests/test_image_transpose.py b/Tests/test_image_transpose.py index eb61c0c04..3183ceadd 100644 --- a/Tests/test_image_transpose.py +++ b/Tests/test_image_transpose.py @@ -6,9 +6,14 @@ from PIL.Image import (FLIP_LEFT_RIGHT, FLIP_TOP_BOTTOM, ROTATE_90, ROTATE_180, class TestImageTranspose(PillowTestCase): + hopper = { + 'L': hopper('L').crop((0, 0, 121, 127)).copy(), + 'RGB': hopper('RGB').crop((0, 0, 121, 127)).copy(), + } + def test_flip_left_right(self): def transpose(mode): - im = hopper(mode) + im = self.hopper[mode] out = im.transpose(FLIP_LEFT_RIGHT) self.assertEqual(out.mode, mode) self.assertEqual(out.size, im.size) @@ -24,7 +29,7 @@ class TestImageTranspose(PillowTestCase): def test_flip_top_bottom(self): def transpose(mode): - im = hopper(mode) + im = self.hopper[mode] out = im.transpose(FLIP_TOP_BOTTOM) self.assertEqual(out.mode, mode) self.assertEqual(out.size, im.size) @@ -40,23 +45,23 @@ class TestImageTranspose(PillowTestCase): def test_rotate_90(self): def transpose(mode): - im = hopper(mode) + im = self.hopper[mode] out = im.transpose(ROTATE_90) self.assertEqual(out.mode, mode) self.assertEqual(out.size, im.size[::-1]) x, y = im.size - self.assertEqual(im.getpixel((1, 1)), out.getpixel((1, y-2))) + self.assertEqual(im.getpixel((1, 1)), out.getpixel((1, x-2))) self.assertEqual(im.getpixel((x-2, 1)), out.getpixel((1, 1))) - self.assertEqual(im.getpixel((1, y-2)), out.getpixel((x-2, y-2))) - self.assertEqual(im.getpixel((x-2, y-2)), out.getpixel((x-2, 1))) + self.assertEqual(im.getpixel((1, y-2)), out.getpixel((y-2, x-2))) + self.assertEqual(im.getpixel((x-2, y-2)), out.getpixel((y-2, 1))) for mode in ("L", "RGB"): transpose(mode) def test_rotate_180(self): def transpose(mode): - im = hopper(mode) + im = self.hopper[mode] out = im.transpose(ROTATE_180) self.assertEqual(out.mode, mode) self.assertEqual(out.size, im.size) @@ -72,38 +77,38 @@ class TestImageTranspose(PillowTestCase): def test_rotate_270(self): def transpose(mode): - im = hopper(mode) + im = self.hopper[mode] out = im.transpose(ROTATE_270) self.assertEqual(out.mode, mode) self.assertEqual(out.size, im.size[::-1]) x, y = im.size - self.assertEqual(im.getpixel((1, 1)), out.getpixel((x-2, 1))) - self.assertEqual(im.getpixel((x-2, 1)), out.getpixel((x-2, y-2))) + self.assertEqual(im.getpixel((1, 1)), out.getpixel((y-2, 1))) + self.assertEqual(im.getpixel((x-2, 1)), out.getpixel((y-2, x-2))) self.assertEqual(im.getpixel((1, y-2)), out.getpixel((1, 1))) - self.assertEqual(im.getpixel((x-2, y-2)), out.getpixel((1, y-2))) + self.assertEqual(im.getpixel((x-2, y-2)), out.getpixel((1, x-2))) for mode in ("L", "RGB"): transpose(mode) def test_transpose(self): def transpose(mode): - im = hopper(mode) + im = self.hopper[mode] out = im.transpose(TRANSPOSE) self.assertEqual(out.mode, mode) self.assertEqual(out.size, im.size[::-1]) x, y = im.size self.assertEqual(im.getpixel((1, 1)), out.getpixel((1, 1))) - self.assertEqual(im.getpixel((x-2, 1)), out.getpixel((1, y-2))) - self.assertEqual(im.getpixel((1, y-2)), out.getpixel((x-2, 1))) - self.assertEqual(im.getpixel((x-2, y-2)), out.getpixel((x-2, y-2))) + self.assertEqual(im.getpixel((x-2, 1)), out.getpixel((1, x-2))) + self.assertEqual(im.getpixel((1, y-2)), out.getpixel((y-2, 1))) + self.assertEqual(im.getpixel((x-2, y-2)), out.getpixel((y-2, x-2))) for mode in ("L", "RGB"): transpose(mode) def test_roundtrip(self): - im = hopper() + im = self.hopper['L'] def transpose(first, second): return im.transpose(first).transpose(second) From b38c8e0df21a0c7c616e34f124a44b312e9db56a Mon Sep 17 00:00:00 2001 From: Herb Date: Sat, 8 Nov 2014 03:01:46 +0800 Subject: [PATCH 091/532] add ico save support --- PIL/IcoImagePlugin.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index 2dc46ea18..d18b37cfc 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -24,6 +24,12 @@ __version__ = "0.1" +import struct +try: + from io import BytesIO +except ImportError: + from cStringIO import StringIO as BytesIO + from PIL import Image, ImageFile, BmpImagePlugin, PngImagePlugin, _binary from math import log, ceil @@ -37,6 +43,41 @@ i32 = _binary.i32le _MAGIC = b"\0\0\1\0" +def _save(im, fp, filename): + fp.write(_MAGIC) # (2+2) + sizes = im.encoderinfo.get("sizes", + [(16, 16), (24, 24), (32, 32), (48, 48), + (64, 64), (128, 128), (255, 255)]) + width, height = im.size + filter(lambda x: False if (x[0] > width or x[1] > height or + x[0] > 255 or x[1] > 255) else True, sizes) + sizes = sorted(sizes, key=lambda x: x[0], reverse=True) + fp.write(struct.pack("H", len(sizes))) # idCount(2) + offset = fp.tell() + len(sizes)*16 + for size in sizes: + width, height = size + fp.write(struct.pack("B", width)) # bWidth(1) + fp.write(struct.pack("B", height)) # bHeight(1) + fp.write(b"\0") # bColorCount(1) + fp.write(b"\0") # bReserved(1) + fp.write(b"\0\0") # wPlanes(2) + fp.write(struct.pack("H", 32)) # wBitCount(2) + + image_io = BytesIO() + im.thumbnail(size, Image.ANTIALIAS) + im.save(image_io, "png") + image_io.seek(0) + image_bytes = image_io.read() + bytes_len = len(image_bytes) + fp.write(struct.pack("I", bytes_len)) # dwBytesInRes(4) + fp.write(struct.pack("I", offset)) # dwImageOffset(4) + current = fp.tell() + fp.seek(offset) + fp.write(image_bytes) + offset = offset + bytes_len + fp.seek(current) + + def _accept(prefix): return prefix[:4] == _MAGIC @@ -241,4 +282,5 @@ class IcoImageFile(ImageFile.ImageFile): # -------------------------------------------------------------------- Image.register_open("ICO", IcoImageFile, _accept) +Image.register_save("ICO", _save) Image.register_extension("ICO", ".ico") From fda52daa327a1c0976650c48c24b720b5aaf4821 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 7 Nov 2014 14:00:35 -0800 Subject: [PATCH 092/532] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index d37ac9fdd..e5fc39bfd 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,6 +3,9 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Speed up rotation by using cache aware loops, added transpose to rotations. #994 + [homm] + - Fix Bicubic interpolation #970 [homm] From 612aa99962302cc532ccf44fe9488208e68c6b37 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 7 Nov 2014 16:25:02 -0800 Subject: [PATCH 093/532] Remove Sane from manifest, add .msp --- MANIFEST.in | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 292421671..8a8694ad1 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -11,12 +11,6 @@ include .travis.yml include Makefile include tox.ini recursive-include PIL *.md -recursive-include Sane *.c -recursive-include Sane *.py -recursive-include Sane *.rst -recursive-include Sane *.txt -recursive-include Sane CHANGES -recursive-include Sane README.rst recursive-include Scripts *.py recursive-include Scripts *.rst recursive-include Scripts *.sh @@ -64,6 +58,7 @@ recursive-include Tests *.ttf recursive-include Tests *.txt recursive-include Tests *.webp recursive-include Tests *.xpm +recursive-include Tests *.msp recursive-include Tk *.c recursive-include Tk *.rst recursive-include depends *.rst From 79c7c7a01a0fc89e8b1b581bc9dbd6e326062881 Mon Sep 17 00:00:00 2001 From: Herb Date: Sat, 8 Nov 2014 14:49:50 +0800 Subject: [PATCH 094/532] add tests and docs --- PIL/IcoImagePlugin.py | 12 +++++------- Tests/test_file_ico.py | 15 ++++++++++++++- docs/handbook/image-file-formats.rst | 8 ++++++++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index d18b37cfc..145816094 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -25,10 +25,7 @@ __version__ = "0.1" import struct -try: - from io import BytesIO -except ImportError: - from cStringIO import StringIO as BytesIO +from io import BytesIO from PIL import Image, ImageFile, BmpImagePlugin, PngImagePlugin, _binary from math import log, ceil @@ -51,7 +48,7 @@ def _save(im, fp, filename): width, height = im.size filter(lambda x: False if (x[0] > width or x[1] > height or x[0] > 255 or x[1] > 255) else True, sizes) - sizes = sorted(sizes, key=lambda x: x[0], reverse=True) + sizes = sorted(sizes, key=lambda x: x[0]) fp.write(struct.pack("H", len(sizes))) # idCount(2) offset = fp.tell() + len(sizes)*16 for size in sizes: @@ -64,8 +61,9 @@ def _save(im, fp, filename): fp.write(struct.pack("H", 32)) # wBitCount(2) image_io = BytesIO() - im.thumbnail(size, Image.ANTIALIAS) - im.save(image_io, "png") + tmp = im.copy() + tmp.thumbnail(size, Image.ANTIALIAS) + tmp.save(image_io, "png") image_io.seek(0) image_bytes = image_io.read() bytes_len = len(image_bytes) diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 12f4ed3f3..200b6ba56 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -1,5 +1,6 @@ -from helper import unittest, PillowTestCase +from helper import unittest, PillowTestCase, hopper +import io from PIL import Image # sample ppm stream @@ -16,6 +17,18 @@ class TestFileIco(PillowTestCase): self.assertEqual(im.size, (16, 16)) self.assertEqual(im.format, "ICO") + def test_save_to_bytes(self): + output = io.BytesIO() + im = hopper() + im.save(output, "ico", sizes=[(32, 32), (64, 64)]) + + output.seek(0) + reloaded = Image.open(output) + + self.assertEqual(im.mode, reloaded.mode) + self.assertEqual((64, 64), reloaded.size) + self.assertEqual(reloaded.format, "ICO") + if __name__ == '__main__': unittest.main() diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 50eecd9da..a1961fa7c 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -589,6 +589,14 @@ ICO ICO is used to store icons on Windows. The largest available icon is read. +The :py:meth:`~PIL.Image.Image.save` method supports the following options: + +**sizes** + A list of sizes including in this ico file; these are a 2-tuple, + ``(width, height)``; Default to ``[(16, 16), (24, 24), (32, 32), (48, 48), + (64, 64), (128, 128), (255, 255)]``. Any size is bigger then the original + size or 255 will be ignored. + ICNS ^^^^ From c8471bcbda68b7d7bd4542bce1da9c21e1aec07d Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 05:03:27 +0400 Subject: [PATCH 095/532] Hide stretch implementation detail in Antialias.c --- _imaging.c | 25 ++----------------------- libImaging/Antialias.c | 41 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/_imaging.c b/_imaging.c index 4eb878cf7..6cddd913b 100644 --- a/_imaging.c +++ b/_imaging.c @@ -1613,7 +1613,6 @@ static PyObject* _stretch(ImagingObject* self, PyObject* args) { Imaging imIn; - Imaging imTemp; Imaging imOut; int xsize, ysize; @@ -1623,35 +1622,15 @@ _stretch(ImagingObject* self, PyObject* args) imIn = self->image; - /* two-pass resize: minimize size of intermediate image */ - if ((Py_ssize_t) imIn->xsize * ysize < (Py_ssize_t) xsize * imIn->ysize) - imTemp = ImagingNew(imIn->mode, imIn->xsize, ysize); - else - imTemp = ImagingNew(imIn->mode, xsize, imIn->ysize); - if (!imTemp) - return NULL; - - /* first pass */ - if (!ImagingStretch(imTemp, imIn, filter)) { - ImagingDelete(imTemp); - return NULL; - } - imOut = ImagingNew(imIn->mode, xsize, ysize); - if (!imOut) { - ImagingDelete(imTemp); + if ( ! imOut) return NULL; - } - /* second pass */ - if (!ImagingStretch(imOut, imTemp, filter)) { + if (!ImagingStretch(imOut, imIn, filter)) { ImagingDelete(imOut); - ImagingDelete(imTemp); return NULL; } - ImagingDelete(imTemp); - return PyImagingNew(imOut); } diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index be49bc827..fc084e952 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -79,7 +79,7 @@ static inline float bicubic_filter(float x) static struct filter BICUBIC = { bicubic_filter, 2.0 }; Imaging -ImagingStretch(Imaging imOut, Imaging imIn, int filter) +ImagingStretchPass(Imaging imOut, Imaging imIn, int filter) { /* FIXME: this is a quick and straightforward translation from a python prototype. might need some further C-ification... */ @@ -95,9 +95,6 @@ ImagingStretch(Imaging imOut, Imaging imIn, int filter) if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); - if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "1") == 0) - return (Imaging) ImagingError_ModeError(); - /* check filter */ switch (filter) { case IMAGING_TRANSFORM_NEAREST: @@ -305,3 +302,39 @@ ImagingStretch(Imaging imOut, Imaging imIn, int filter) return imOut; } + + +Imaging +ImagingStretch(Imaging imOut, Imaging imIn, int filter) +{ + Imaging imTemp; + int xsize = imOut->xsize; + int ysize = imOut->ysize; + + if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "1") == 0) + return (Imaging) ImagingError_ModeError(); + + /* two-pass resize: minimize size of intermediate image */ + if ((Py_ssize_t) imIn->xsize * ysize < (Py_ssize_t) xsize * imIn->ysize) + imTemp = ImagingNew(imIn->mode, imIn->xsize, ysize); + else + imTemp = ImagingNew(imIn->mode, xsize, imIn->ysize); + if ( ! imTemp) + return NULL; + + /* first pass */ + if ( ! ImagingStretchPass(imTemp, imIn, filter)) { + ImagingDelete(imTemp); + return NULL; + } + + /* second pass */ + if ( ! ImagingStretchPass(imOut, imTemp, filter)) { + ImagingDelete(imTemp); + return NULL; + } + + ImagingDelete(imTemp); + + return imOut; +} From 40f9f48680d4c3228c33521d458580d5c552b0e2 Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 05:20:37 +0400 Subject: [PATCH 096/532] two ImagingStretchHorizaontal pass with two transposes --- libImaging/Antialias.c | 276 ++++++++++++++++------------------------- 1 file changed, 110 insertions(+), 166 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index fc084e952..5193e6877 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -79,7 +79,7 @@ static inline float bicubic_filter(float x) static struct filter BICUBIC = { bicubic_filter, 2.0 }; Imaging -ImagingStretchPass(Imaging imOut, Imaging imIn, int filter) +ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) { /* FIXME: this is a quick and straightforward translation from a python prototype. might need some further C-ification... */ @@ -87,14 +87,19 @@ ImagingStretchPass(Imaging imOut, Imaging imIn, int filter) ImagingSectionCookie cookie; struct filter *filterp; float support, scale, filterscale; - float center, ww, ss, ymin, ymax, xmin, xmax; - int xx, yy, x, y, b; + float center, ww, ss, xmin, xmax; + int xx, yy, x, b; float *k; /* check modes */ if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); + if (imOut->ysize != imIn->ysize) + return (Imaging) ImagingError_ValueError( + "ImagingStretchHorizaontal requires equal heights" + ); + /* check filter */ switch (filter) { case IMAGING_TRANSFORM_NEAREST: @@ -115,14 +120,8 @@ ImagingStretchPass(Imaging imOut, Imaging imIn, int filter) ); } - if (imIn->ysize == imOut->ysize) { - /* prepare for horizontal stretch */ - filterscale = scale = (float) imIn->xsize / imOut->xsize; - } else if (imIn->xsize == imOut->xsize) { - /* prepare for vertical stretch */ - filterscale = scale = (float) imIn->ysize / imOut->ysize; - } else - return (Imaging) ImagingError_Mismatch(); + /* prepare for horizontal stretch */ + filterscale = scale = (float) imIn->xsize / imOut->xsize; /* determine support size (length of resampling filter) */ support = filterp->support; @@ -139,162 +138,83 @@ ImagingStretchPass(Imaging imOut, Imaging imIn, int filter) return (Imaging) ImagingError_MemoryError(); ImagingSectionEnter(&cookie); - if (imIn->xsize == imOut->xsize) { - /* vertical stretch */ - for (yy = 0; yy < imOut->ysize; yy++) { - center = (yy + 0.5) * scale; - ww = 0.0; - ss = 1.0 / filterscale; - /* calculate filter weights */ - ymin = floor(center - support); - if (ymin < 0.0) - ymin = 0.0; - ymax = ceil(center + support); - if (ymax > (float) imIn->ysize) - ymax = (float) imIn->ysize; - for (y = (int) ymin; y < (int) ymax; y++) { - float w = filterp->filter((y - center + 0.5) * ss) * ss; - k[y - (int) ymin] = w; - ww = ww + w; + /* horizontal stretch */ + for (xx = 0; xx < imOut->xsize; xx++) { + center = (xx + 0.5) * scale; + ww = 0.0; + ss = 1.0 / filterscale; + xmin = floor(center - support); + if (xmin < 0.0) + xmin = 0.0; + xmax = ceil(center + support); + if (xmax > (float) imIn->xsize) + xmax = (float) imIn->xsize; + for (x = (int) xmin; x < (int) xmax; x++) { + float w = filterp->filter((x - center + 0.5) * ss) * ss; + k[x - (int) xmin] = w; + ww = ww + w; + } + if (ww == 0.0) + ww = 1.0; + else + ww = 1.0 / ww; + if (imIn->image8) { + /* 8-bit grayscale */ + for (yy = 0; yy < imOut->ysize; yy++) { + ss = 0.0; + for (x = (int) xmin; x < (int) xmax; x++) + ss = ss + imIn->image8[yy][x] * k[x - (int) xmin]; + ss = ss * ww + 0.5; + if (ss < 0.5) + imOut->image8[yy][xx] = (UINT8) 0; + else if (ss >= 255.0) + imOut->image8[yy][xx] = (UINT8) 255; + else + imOut->image8[yy][xx] = (UINT8) ss; } - if (ww == 0.0) - ww = 1.0; - else - ww = 1.0 / ww; - if (imIn->image8) { - /* 8-bit grayscale */ - for (xx = 0; xx < imOut->xsize; xx++) { - ss = 0.0; - for (y = (int) ymin; y < (int) ymax; y++) - ss = ss + imIn->image8[y][xx] * k[y - (int) ymin]; - ss = ss * ww + 0.5; - if (ss < 0.5) - imOut->image8[yy][xx] = 0; - else if (ss >= 255.0) - imOut->image8[yy][xx] = 255; - else - imOut->image8[yy][xx] = (UINT8) ss; - } - } else - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - /* n-bit grayscale */ - for (xx = 0; xx < imOut->xsize*4; xx++) { - /* FIXME: skip over unused pixels */ + } else + switch(imIn->type) { + case IMAGING_TYPE_UINT8: + /* n-bit grayscale */ + for (yy = 0; yy < imOut->ysize; yy++) { + for (b = 0; b < imIn->bands; b++) { + if (imIn->bands == 2 && b) + b = 3; /* hack to deal with LA images */ ss = 0.0; - for (y = (int) ymin; y < (int) ymax; y++) - ss = ss + (UINT8) imIn->image[y][xx] * k[y-(int) ymin]; + for (x = (int) xmin; x < (int) xmax; x++) + ss = ss + (UINT8) imIn->image[yy][x*4+b] * k[x - (int) xmin]; ss = ss * ww + 0.5; if (ss < 0.5) - imOut->image[yy][xx] = (UINT8) 0; + imOut->image[yy][xx*4+b] = (UINT8) 0; else if (ss >= 255.0) - imOut->image[yy][xx] = (UINT8) 255; + imOut->image[yy][xx*4+b] = (UINT8) 255; else - imOut->image[yy][xx] = (UINT8) ss; + imOut->image[yy][xx*4+b] = (UINT8) ss; } - break; - case IMAGING_TYPE_INT32: - /* 32-bit integer */ - for (xx = 0; xx < imOut->xsize; xx++) { - ss = 0.0; - for (y = (int) ymin; y < (int) ymax; y++) - ss = ss + IMAGING_PIXEL_I(imIn, xx, y) * k[y - (int) ymin]; - IMAGING_PIXEL_I(imOut, xx, yy) = (int) ss * ww; - } - break; - case IMAGING_TYPE_FLOAT32: - /* 32-bit float */ - for (xx = 0; xx < imOut->xsize; xx++) { - ss = 0.0; - for (y = (int) ymin; y < (int) ymax; y++) - ss = ss + IMAGING_PIXEL_F(imIn, xx, y) * k[y - (int) ymin]; - IMAGING_PIXEL_F(imOut, xx, yy) = ss * ww; - } - break; - default: - ImagingSectionLeave(&cookie); - return (Imaging) ImagingError_ModeError(); } - } - } else { - /* horizontal stretch */ - for (xx = 0; xx < imOut->xsize; xx++) { - center = (xx + 0.5) * scale; - ww = 0.0; - ss = 1.0 / filterscale; - xmin = floor(center - support); - if (xmin < 0.0) - xmin = 0.0; - xmax = ceil(center + support); - if (xmax > (float) imIn->xsize) - xmax = (float) imIn->xsize; - for (x = (int) xmin; x < (int) xmax; x++) { - float w = filterp->filter((x - center + 0.5) * ss) * ss; - k[x - (int) xmin] = w; - ww = ww + w; - } - if (ww == 0.0) - ww = 1.0; - else - ww = 1.0 / ww; - if (imIn->image8) { - /* 8-bit grayscale */ + break; + case IMAGING_TYPE_INT32: + /* 32-bit integer */ for (yy = 0; yy < imOut->ysize; yy++) { ss = 0.0; for (x = (int) xmin; x < (int) xmax; x++) - ss = ss + imIn->image8[yy][x] * k[x - (int) xmin]; - ss = ss * ww + 0.5; - if (ss < 0.5) - imOut->image8[yy][xx] = (UINT8) 0; - else if (ss >= 255.0) - imOut->image8[yy][xx] = (UINT8) 255; - else - imOut->image8[yy][xx] = (UINT8) ss; + ss = ss + IMAGING_PIXEL_I(imIn, x, yy) * k[x - (int) xmin]; + IMAGING_PIXEL_I(imOut, xx, yy) = (int) ss * ww; } - } else - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - /* n-bit grayscale */ - for (yy = 0; yy < imOut->ysize; yy++) { - for (b = 0; b < imIn->bands; b++) { - if (imIn->bands == 2 && b) - b = 3; /* hack to deal with LA images */ - ss = 0.0; - for (x = (int) xmin; x < (int) xmax; x++) - ss = ss + (UINT8) imIn->image[yy][x*4+b] * k[x - (int) xmin]; - ss = ss * ww + 0.5; - if (ss < 0.5) - imOut->image[yy][xx*4+b] = (UINT8) 0; - else if (ss >= 255.0) - imOut->image[yy][xx*4+b] = (UINT8) 255; - else - imOut->image[yy][xx*4+b] = (UINT8) ss; - } - } - break; - case IMAGING_TYPE_INT32: - /* 32-bit integer */ - for (yy = 0; yy < imOut->ysize; yy++) { - ss = 0.0; - for (x = (int) xmin; x < (int) xmax; x++) - ss = ss + IMAGING_PIXEL_I(imIn, x, yy) * k[x - (int) xmin]; - IMAGING_PIXEL_I(imOut, xx, yy) = (int) ss * ww; - } - break; - case IMAGING_TYPE_FLOAT32: - /* 32-bit float */ - for (yy = 0; yy < imOut->ysize; yy++) { - ss = 0.0; - for (x = (int) xmin; x < (int) xmax; x++) - ss = ss + IMAGING_PIXEL_F(imIn, x, yy) * k[x - (int) xmin]; - IMAGING_PIXEL_F(imOut, xx, yy) = ss * ww; - } - break; - default: - ImagingSectionLeave(&cookie); - return (Imaging) ImagingError_ModeError(); + break; + case IMAGING_TYPE_FLOAT32: + /* 32-bit float */ + for (yy = 0; yy < imOut->ysize; yy++) { + ss = 0.0; + for (x = (int) xmin; x < (int) xmax; x++) + ss = ss + IMAGING_PIXEL_F(imIn, x, yy) * k[x - (int) xmin]; + IMAGING_PIXEL_F(imOut, xx, yy) = ss * ww; } - } + break; + default: + ImagingSectionLeave(&cookie); + return (Imaging) ImagingError_ModeError(); + } } ImagingSectionLeave(&cookie); @@ -307,34 +227,58 @@ ImagingStretchPass(Imaging imOut, Imaging imIn, int filter) Imaging ImagingStretch(Imaging imOut, Imaging imIn, int filter) { - Imaging imTemp; + Imaging imTemp1, imTemp2, imTemp3; int xsize = imOut->xsize; int ysize = imOut->ysize; if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "1") == 0) return (Imaging) ImagingError_ModeError(); - /* two-pass resize: minimize size of intermediate image */ - if ((Py_ssize_t) imIn->xsize * ysize < (Py_ssize_t) xsize * imIn->ysize) - imTemp = ImagingNew(imIn->mode, imIn->xsize, ysize); - else - imTemp = ImagingNew(imIn->mode, xsize, imIn->ysize); - if ( ! imTemp) + /* two-pass resize */ + imTemp1 = ImagingNew(imIn->mode, xsize, imIn->ysize); + if ( ! imTemp1) return NULL; /* first pass */ - if ( ! ImagingStretchPass(imTemp, imIn, filter)) { - ImagingDelete(imTemp); + if ( ! ImagingStretchHorizaontal(imTemp1, imIn, filter)) { + ImagingDelete(imTemp1); + return NULL; + } + + imTemp2 = ImagingNew(imIn->mode, imIn->ysize, xsize); + if ( ! imTemp2) { + ImagingDelete(imTemp1); + return NULL; + } + + /* transpose image once */ + if ( ! ImagingTranspose(imTemp2, imTemp1)) { + ImagingDelete(imTemp1); + ImagingDelete(imTemp2); + return NULL; + } + ImagingDelete(imTemp1); + + imTemp3 = ImagingNew(imIn->mode, ysize, xsize); + if ( ! imTemp3) { + ImagingDelete(imTemp2); return NULL; } /* second pass */ - if ( ! ImagingStretchPass(imOut, imTemp, filter)) { - ImagingDelete(imTemp); + if ( ! ImagingStretchHorizaontal(imTemp3, imTemp2, filter)) { + ImagingDelete(imTemp2); + ImagingDelete(imTemp3); return NULL; } + ImagingDelete(imTemp2); - ImagingDelete(imTemp); + /* transpose result */ + if ( ! ImagingTranspose(imOut, imTemp3)) { + ImagingDelete(imTemp3); + return NULL; + } + ImagingDelete(imTemp3); return imOut; } From b77521bd6cacc3c620a0d3bbd246f9136f3d9246 Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 05:37:33 +0400 Subject: [PATCH 097/532] Precompute coefficients for all x --- libImaging/Antialias.c | 45 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index 5193e6877..aeb9581d4 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -88,8 +88,8 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) struct filter *filterp; float support, scale, filterscale; float center, ww, ss, xmin, xmax; - int xx, yy, x, b; - float *k; + int xx, yy, x, b, kmax; + float *k, *kk, *xbounds; /* check modes */ if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) @@ -132,11 +132,45 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) support = support * filterscale; + /* maximum number of coofs */ + kmax = (int) ceil(support) * 2 + 1; + /* coefficient buffer (with rounding safety margin) */ - k = malloc(((int) support * 2 + 10) * sizeof(float)); - if (!k) + kk = malloc(imOut->xsize * kmax * sizeof(float)); + if ( ! kk) return (Imaging) ImagingError_MemoryError(); + xbounds = malloc(imOut->xsize * 3 * sizeof(float)); + if ( ! xbounds) { + free(kk); + return (Imaging) ImagingError_MemoryError(); + } + + for (xx = 0; xx < imOut->xsize; xx++) { + k = &kk[xx * kmax]; + center = (xx + 0.5) * scale; + ww = 0.0; + ss = 1.0 / filterscale; + xmin = floor(center - support); + if (xmin < 0.0) + xmin = 0.0; + xmax = ceil(center + support); + if (xmax > (float) imIn->xsize) + xmax = (float) imIn->xsize; + for (x = (int) xmin; x < (int) xmax; x++) { + float w = filterp->filter((x - center + 0.5) * ss) * ss; + k[x - (int) xmin] = w; + ww = ww + w; + } + if (ww == 0.0) + ww = 1.0; + else + ww = 1.0 / ww; + xbounds[xx * 3 + 0] = xmin; + xbounds[xx * 3 + 1] = xmax; + xbounds[xx * 3 + 2] = ww; + } + ImagingSectionEnter(&cookie); /* horizontal stretch */ for (xx = 0; xx < imOut->xsize; xx++) { @@ -218,7 +252,8 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) } ImagingSectionLeave(&cookie); - free(k); + free(kk); + free(xbounds); return imOut; } From 01b947c602f53a994d8f61f37ec8649cbfe133fd Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 05:41:38 +0400 Subject: [PATCH 098/532] Iterate pixels in native order --- libImaging/Antialias.c | 44 ++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index aeb9581d4..fc45e0ded 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -173,28 +173,14 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) ImagingSectionEnter(&cookie); /* horizontal stretch */ - for (xx = 0; xx < imOut->xsize; xx++) { - center = (xx + 0.5) * scale; - ww = 0.0; - ss = 1.0 / filterscale; - xmin = floor(center - support); - if (xmin < 0.0) - xmin = 0.0; - xmax = ceil(center + support); - if (xmax > (float) imIn->xsize) - xmax = (float) imIn->xsize; - for (x = (int) xmin; x < (int) xmax; x++) { - float w = filterp->filter((x - center + 0.5) * ss) * ss; - k[x - (int) xmin] = w; - ww = ww + w; - } - if (ww == 0.0) - ww = 1.0; - else - ww = 1.0 / ww; + for (yy = 0; yy < imOut->ysize; yy++) { if (imIn->image8) { /* 8-bit grayscale */ - for (yy = 0; yy < imOut->ysize; yy++) { + for (xx = 0; xx < imOut->xsize; xx++) { + xmin = xbounds[xx * 3 + 0]; + xmax = xbounds[xx * 3 + 1]; + ww = xbounds[xx * 3 + 2]; + k = &kk[xx * kmax]; ss = 0.0; for (x = (int) xmin; x < (int) xmax; x++) ss = ss + imIn->image8[yy][x] * k[x - (int) xmin]; @@ -210,7 +196,11 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) switch(imIn->type) { case IMAGING_TYPE_UINT8: /* n-bit grayscale */ - for (yy = 0; yy < imOut->ysize; yy++) { + for (xx = 0; xx < imOut->xsize; xx++) { + xmin = xbounds[xx * 3 + 0]; + xmax = xbounds[xx * 3 + 1]; + ww = xbounds[xx * 3 + 2]; + k = &kk[xx * kmax]; for (b = 0; b < imIn->bands; b++) { if (imIn->bands == 2 && b) b = 3; /* hack to deal with LA images */ @@ -229,7 +219,11 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) break; case IMAGING_TYPE_INT32: /* 32-bit integer */ - for (yy = 0; yy < imOut->ysize; yy++) { + for (xx = 0; xx < imOut->xsize; xx++) { + xmin = xbounds[xx * 3 + 0]; + xmax = xbounds[xx * 3 + 1]; + ww = xbounds[xx * 3 + 2]; + k = &kk[xx * kmax]; ss = 0.0; for (x = (int) xmin; x < (int) xmax; x++) ss = ss + IMAGING_PIXEL_I(imIn, x, yy) * k[x - (int) xmin]; @@ -238,7 +232,11 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) break; case IMAGING_TYPE_FLOAT32: /* 32-bit float */ - for (yy = 0; yy < imOut->ysize; yy++) { + for (xx = 0; xx < imOut->xsize; xx++) { + xmin = xbounds[xx * 3 + 0]; + xmax = xbounds[xx * 3 + 1]; + ww = xbounds[xx * 3 + 2]; + k = &kk[xx * kmax]; ss = 0.0; for (x = (int) xmin; x < (int) xmax; x++) ss = ss + IMAGING_PIXEL_F(imIn, x, yy) * k[x - (int) xmin]; From e276e6a535abe64e48b4eb1b29eff2183348257e Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 05:50:54 +0400 Subject: [PATCH 099/532] move ww into coefficients --- libImaging/Antialias.c | 47 ++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index fc45e0ded..95e854dd6 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -140,7 +140,7 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) if ( ! kk) return (Imaging) ImagingError_MemoryError(); - xbounds = malloc(imOut->xsize * 3 * sizeof(float)); + xbounds = malloc(imOut->xsize * 2 * sizeof(float)); if ( ! xbounds) { free(kk); return (Imaging) ImagingError_MemoryError(); @@ -160,15 +160,14 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) for (x = (int) xmin; x < (int) xmax; x++) { float w = filterp->filter((x - center + 0.5) * ss) * ss; k[x - (int) xmin] = w; - ww = ww + w; + ww += w; } - if (ww == 0.0) - ww = 1.0; - else - ww = 1.0 / ww; - xbounds[xx * 3 + 0] = xmin; - xbounds[xx * 3 + 1] = xmax; - xbounds[xx * 3 + 2] = ww; + for (x = 0; x < (int) xmax - (int) xmin; x++) { + if (ww != 0.0) + k[x] /= ww; + } + xbounds[xx * 2 + 0] = xmin; + xbounds[xx * 2 + 1] = xmax; } ImagingSectionEnter(&cookie); @@ -177,14 +176,12 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) if (imIn->image8) { /* 8-bit grayscale */ for (xx = 0; xx < imOut->xsize; xx++) { - xmin = xbounds[xx * 3 + 0]; - xmax = xbounds[xx * 3 + 1]; - ww = xbounds[xx * 3 + 2]; + xmin = xbounds[xx * 2 + 0]; + xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; - ss = 0.0; + ss = 0.5; for (x = (int) xmin; x < (int) xmax; x++) ss = ss + imIn->image8[yy][x] * k[x - (int) xmin]; - ss = ss * ww + 0.5; if (ss < 0.5) imOut->image8[yy][xx] = (UINT8) 0; else if (ss >= 255.0) @@ -197,17 +194,15 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) case IMAGING_TYPE_UINT8: /* n-bit grayscale */ for (xx = 0; xx < imOut->xsize; xx++) { - xmin = xbounds[xx * 3 + 0]; - xmax = xbounds[xx * 3 + 1]; - ww = xbounds[xx * 3 + 2]; + xmin = xbounds[xx * 2 + 0]; + xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; for (b = 0; b < imIn->bands; b++) { if (imIn->bands == 2 && b) b = 3; /* hack to deal with LA images */ - ss = 0.0; + ss = 0.5; for (x = (int) xmin; x < (int) xmax; x++) ss = ss + (UINT8) imIn->image[yy][x*4+b] * k[x - (int) xmin]; - ss = ss * ww + 0.5; if (ss < 0.5) imOut->image[yy][xx*4+b] = (UINT8) 0; else if (ss >= 255.0) @@ -220,27 +215,25 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) case IMAGING_TYPE_INT32: /* 32-bit integer */ for (xx = 0; xx < imOut->xsize; xx++) { - xmin = xbounds[xx * 3 + 0]; - xmax = xbounds[xx * 3 + 1]; - ww = xbounds[xx * 3 + 2]; + xmin = xbounds[xx * 2 + 0]; + xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; ss = 0.0; for (x = (int) xmin; x < (int) xmax; x++) ss = ss + IMAGING_PIXEL_I(imIn, x, yy) * k[x - (int) xmin]; - IMAGING_PIXEL_I(imOut, xx, yy) = (int) ss * ww; + IMAGING_PIXEL_I(imOut, xx, yy) = (int) ss; } break; case IMAGING_TYPE_FLOAT32: /* 32-bit float */ for (xx = 0; xx < imOut->xsize; xx++) { - xmin = xbounds[xx * 3 + 0]; - xmax = xbounds[xx * 3 + 1]; - ww = xbounds[xx * 3 + 2]; + xmin = xbounds[xx * 2 + 0]; + xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; ss = 0.0; for (x = (int) xmin; x < (int) xmax; x++) ss = ss + IMAGING_PIXEL_F(imIn, x, yy) * k[x - (int) xmin]; - IMAGING_PIXEL_F(imOut, xx, yy) = ss * ww; + IMAGING_PIXEL_F(imOut, xx, yy) = ss; } break; default: From a484d28d1f902742edac0ccd2aabfdd8371dc020 Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 05:57:08 +0400 Subject: [PATCH 100/532] make x indexes int --- libImaging/Antialias.c | 43 +++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index 95e854dd6..3ecb35936 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -87,9 +87,10 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) ImagingSectionCookie cookie; struct filter *filterp; float support, scale, filterscale; - float center, ww, ss, xmin, xmax; - int xx, yy, x, b, kmax; - float *k, *kk, *xbounds; + float center, ww, ss; + int xx, yy, x, b, kmax, xmin, xmax; + int *xbounds; + float *k, *kk; /* check modes */ if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) @@ -140,7 +141,7 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) if ( ! kk) return (Imaging) ImagingError_MemoryError(); - xbounds = malloc(imOut->xsize * 2 * sizeof(float)); + xbounds = malloc(imOut->xsize * 2 * sizeof(int)); if ( ! xbounds) { free(kk); return (Imaging) ImagingError_MemoryError(); @@ -151,18 +152,18 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) center = (xx + 0.5) * scale; ww = 0.0; ss = 1.0 / filterscale; - xmin = floor(center - support); - if (xmin < 0.0) - xmin = 0.0; - xmax = ceil(center + support); - if (xmax > (float) imIn->xsize) - xmax = (float) imIn->xsize; - for (x = (int) xmin; x < (int) xmax; x++) { + xmin = (int) floor(center - support); + if (xmin < 0) + xmin = 0; + xmax = (int) ceil(center + support); + if (xmax > imIn->xsize) + xmax = imIn->xsize; + for (x = xmin; x < xmax; x++) { float w = filterp->filter((x - center + 0.5) * ss) * ss; - k[x - (int) xmin] = w; + k[x - xmin] = w; ww += w; } - for (x = 0; x < (int) xmax - (int) xmin; x++) { + for (x = 0; x < xmax - xmin; x++) { if (ww != 0.0) k[x] /= ww; } @@ -180,8 +181,8 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; ss = 0.5; - for (x = (int) xmin; x < (int) xmax; x++) - ss = ss + imIn->image8[yy][x] * k[x - (int) xmin]; + for (x = xmin; x < xmax; x++) + ss = ss + imIn->image8[yy][x] * k[x - xmin]; if (ss < 0.5) imOut->image8[yy][xx] = (UINT8) 0; else if (ss >= 255.0) @@ -201,8 +202,8 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) if (imIn->bands == 2 && b) b = 3; /* hack to deal with LA images */ ss = 0.5; - for (x = (int) xmin; x < (int) xmax; x++) - ss = ss + (UINT8) imIn->image[yy][x*4+b] * k[x - (int) xmin]; + for (x = xmin; x < xmax; x++) + ss = ss + (UINT8) imIn->image[yy][x*4+b] * k[x - xmin]; if (ss < 0.5) imOut->image[yy][xx*4+b] = (UINT8) 0; else if (ss >= 255.0) @@ -219,8 +220,8 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; ss = 0.0; - for (x = (int) xmin; x < (int) xmax; x++) - ss = ss + IMAGING_PIXEL_I(imIn, x, yy) * k[x - (int) xmin]; + for (x = xmin; x < xmax; x++) + ss = ss + IMAGING_PIXEL_I(imIn, x, yy) * k[x - xmin]; IMAGING_PIXEL_I(imOut, xx, yy) = (int) ss; } break; @@ -231,8 +232,8 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; ss = 0.0; - for (x = (int) xmin; x < (int) xmax; x++) - ss = ss + IMAGING_PIXEL_F(imIn, x, yy) * k[x - (int) xmin]; + for (x = xmin; x < xmax; x++) + ss = ss + IMAGING_PIXEL_F(imIn, x, yy) * k[x - xmin]; IMAGING_PIXEL_F(imOut, xx, yy) = ss; } break; From e9fc720709f635f9ed0564a6c4f1243badebed0d Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 25 Oct 2014 06:04:04 +0400 Subject: [PATCH 101/532] faster float to 8bit convertion --- libImaging/Antialias.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index 3ecb35936..1b940914d 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -78,6 +78,18 @@ static inline float bicubic_filter(float x) static struct filter BICUBIC = { bicubic_filter, 2.0 }; + +static inline UINT8 clip8(float in) +{ + int out = (int) in; + if (out >= 255) + return 255; + if (out <= 0) + return 0; + return (UINT8) out; +} + + Imaging ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) { @@ -183,12 +195,7 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) ss = 0.5; for (x = xmin; x < xmax; x++) ss = ss + imIn->image8[yy][x] * k[x - xmin]; - if (ss < 0.5) - imOut->image8[yy][xx] = (UINT8) 0; - else if (ss >= 255.0) - imOut->image8[yy][xx] = (UINT8) 255; - else - imOut->image8[yy][xx] = (UINT8) ss; + imOut->image8[yy][xx] = clip8(ss); } } else switch(imIn->type) { @@ -204,12 +211,7 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) ss = 0.5; for (x = xmin; x < xmax; x++) ss = ss + (UINT8) imIn->image[yy][x*4+b] * k[x - xmin]; - if (ss < 0.5) - imOut->image[yy][xx*4+b] = (UINT8) 0; - else if (ss >= 255.0) - imOut->image[yy][xx*4+b] = (UINT8) 255; - else - imOut->image[yy][xx*4+b] = (UINT8) ss; + imOut->image[yy][xx*4+b] = clip8(ss); } } break; From c22af89ef0fee353b8f5b496147845e79b2dec26 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 26 Oct 2014 00:11:39 +0400 Subject: [PATCH 102/532] optimize memory usage --- _imaging.c | 13 ++---- libImaging/Antialias.c | 98 +++++++++++++++++++----------------------- libImaging/Imaging.h | 2 +- 3 files changed, 49 insertions(+), 64 deletions(-) diff --git a/_imaging.c b/_imaging.c index 6cddd913b..f7ea510bc 100644 --- a/_imaging.c +++ b/_imaging.c @@ -1612,22 +1612,17 @@ im_setmode(ImagingObject* self, PyObject* args) static PyObject* _stretch(ImagingObject* self, PyObject* args) { - Imaging imIn; - Imaging imOut; + Imaging imIn, imOut; int xsize, ysize; int filter = IMAGING_TRANSFORM_NEAREST; if (!PyArg_ParseTuple(args, "(ii)|i", &xsize, &ysize, &filter)) - return NULL; + return NULL; imIn = self->image; - imOut = ImagingNew(imIn->mode, xsize, ysize); - if ( ! imOut) - return NULL; - - if (!ImagingStretch(imOut, imIn, filter)) { - ImagingDelete(imOut); + imOut = ImagingStretch(imIn, xsize, ysize, filter); + if ( ! imOut) { return NULL; } diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index 1b940914d..de991290b 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -91,12 +91,13 @@ static inline UINT8 clip8(float in) Imaging -ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) +ImagingStretchHorizaontal(Imaging imIn, int xsize, int filter) { /* FIXME: this is a quick and straightforward translation from a python prototype. might need some further C-ification... */ ImagingSectionCookie cookie; + Imaging imOut; struct filter *filterp; float support, scale, filterscale; float center, ww, ss; @@ -104,15 +105,6 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) int *xbounds; float *k, *kk; - /* check modes */ - if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) - return (Imaging) ImagingError_ModeError(); - - if (imOut->ysize != imIn->ysize) - return (Imaging) ImagingError_ValueError( - "ImagingStretchHorizaontal requires equal heights" - ); - /* check filter */ switch (filter) { case IMAGING_TRANSFORM_NEAREST: @@ -134,7 +126,7 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) } /* prepare for horizontal stretch */ - filterscale = scale = (float) imIn->xsize / imOut->xsize; + filterscale = scale = (float) imIn->xsize / xsize; /* determine support size (length of resampling filter) */ support = filterp->support; @@ -149,17 +141,17 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) kmax = (int) ceil(support) * 2 + 1; /* coefficient buffer (with rounding safety margin) */ - kk = malloc(imOut->xsize * kmax * sizeof(float)); + kk = malloc(xsize * kmax * sizeof(float)); if ( ! kk) return (Imaging) ImagingError_MemoryError(); - xbounds = malloc(imOut->xsize * 2 * sizeof(int)); + xbounds = malloc(xsize * 2 * sizeof(int)); if ( ! xbounds) { free(kk); return (Imaging) ImagingError_MemoryError(); } - for (xx = 0; xx < imOut->xsize; xx++) { + for (xx = 0; xx < xsize; xx++) { k = &kk[xx * kmax]; center = (xx + 0.5) * scale; ww = 0.0; @@ -183,12 +175,19 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) xbounds[xx * 2 + 1] = xmax; } + imOut = ImagingNew(imIn->mode, xsize, imIn->ysize); + if ( ! imOut) { + free(kk); + free(xbounds); + return NULL; + } + ImagingSectionEnter(&cookie); /* horizontal stretch */ for (yy = 0; yy < imOut->ysize; yy++) { if (imIn->image8) { /* 8-bit grayscale */ - for (xx = 0; xx < imOut->xsize; xx++) { + for (xx = 0; xx < xsize; xx++) { xmin = xbounds[xx * 2 + 0]; xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; @@ -201,7 +200,7 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) switch(imIn->type) { case IMAGING_TYPE_UINT8: /* n-bit grayscale */ - for (xx = 0; xx < imOut->xsize; xx++) { + for (xx = 0; xx < xsize; xx++) { xmin = xbounds[xx * 2 + 0]; xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; @@ -217,7 +216,7 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) break; case IMAGING_TYPE_INT32: /* 32-bit integer */ - for (xx = 0; xx < imOut->xsize; xx++) { + for (xx = 0; xx < xsize; xx++) { xmin = xbounds[xx * 2 + 0]; xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; @@ -229,7 +228,7 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) break; case IMAGING_TYPE_FLOAT32: /* 32-bit float */ - for (xx = 0; xx < imOut->xsize; xx++) { + for (xx = 0; xx < xsize; xx++) { xmin = xbounds[xx * 2 + 0]; xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; @@ -254,60 +253,51 @@ ImagingStretchHorizaontal(Imaging imOut, Imaging imIn, int filter) Imaging -ImagingStretch(Imaging imOut, Imaging imIn, int filter) +ImagingTransposeToNew(Imaging imIn) +{ + Imaging imTemp = ImagingNew(imIn->mode, imIn->ysize, imIn->xsize); + if ( ! imTemp) + return NULL; + + if ( ! ImagingTranspose(imTemp, imIn)) { + ImagingDelete(imTemp); + return NULL; + } + return imTemp; +} + + +Imaging +ImagingStretch(Imaging imIn, int xsize, int ysize, int filter) { Imaging imTemp1, imTemp2, imTemp3; - int xsize = imOut->xsize; - int ysize = imOut->ysize; + Imaging imOut; if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "1") == 0) return (Imaging) ImagingError_ModeError(); - /* two-pass resize */ - imTemp1 = ImagingNew(imIn->mode, xsize, imIn->ysize); + /* two-pass resize, first pass */ + imTemp1 = ImagingStretchHorizaontal(imIn, xsize, filter); if ( ! imTemp1) return NULL; - /* first pass */ - if ( ! ImagingStretchHorizaontal(imTemp1, imIn, filter)) { - ImagingDelete(imTemp1); - return NULL; - } - - imTemp2 = ImagingNew(imIn->mode, imIn->ysize, xsize); - if ( ! imTemp2) { - ImagingDelete(imTemp1); - return NULL; - } - /* transpose image once */ - if ( ! ImagingTranspose(imTemp2, imTemp1)) { - ImagingDelete(imTemp1); - ImagingDelete(imTemp2); - return NULL; - } + imTemp2 = ImagingTransposeToNew(imTemp1); ImagingDelete(imTemp1); - - imTemp3 = ImagingNew(imIn->mode, ysize, xsize); - if ( ! imTemp3) { - ImagingDelete(imTemp2); + if ( ! imTemp2) return NULL; - } /* second pass */ - if ( ! ImagingStretchHorizaontal(imTemp3, imTemp2, filter)) { - ImagingDelete(imTemp2); - ImagingDelete(imTemp3); - return NULL; - } + imTemp3 = ImagingStretchHorizaontal(imTemp2, ysize, filter); ImagingDelete(imTemp2); + if ( ! imTemp3) + return NULL; /* transpose result */ - if ( ! ImagingTranspose(imOut, imTemp3)) { - ImagingDelete(imTemp3); - return NULL; - } + imOut = ImagingTransposeToNew(imTemp3); ImagingDelete(imTemp3); + if ( ! imOut) + return NULL; return imOut; } diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index f014bc0aa..d5aa6e27a 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -291,7 +291,7 @@ extern Imaging ImagingRotate( extern Imaging ImagingRotate90(Imaging imOut, Imaging imIn); extern Imaging ImagingRotate180(Imaging imOut, Imaging imIn); extern Imaging ImagingRotate270(Imaging imOut, Imaging imIn); -extern Imaging ImagingStretch(Imaging imOut, Imaging imIn, int filter); +extern Imaging ImagingStretch(Imaging imIn, int xsize, int ysize, int filter); extern Imaging ImagingTranspose(Imaging imOut, Imaging imIn); extern Imaging ImagingTransformPerspective( Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, From 42967dd1a62a8d32f279f6623b6760f8c15d94f6 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 26 Oct 2014 01:20:24 +0400 Subject: [PATCH 103/532] speedup by unrolling loops --- libImaging/Antialias.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index de991290b..f67053c09 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -100,8 +100,8 @@ ImagingStretchHorizaontal(Imaging imIn, int xsize, int filter) Imaging imOut; struct filter *filterp; float support, scale, filterscale; - float center, ww, ss; - int xx, yy, x, b, kmax, xmin, xmax; + float center, ww, ss, ss4[4]; + int xx, yy, x, kmax, xmin, xmax; int *xbounds; float *k, *kk; @@ -204,13 +204,27 @@ ImagingStretchHorizaontal(Imaging imIn, int xsize, int filter) xmin = xbounds[xx * 2 + 0]; xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; - for (b = 0; b < imIn->bands; b++) { - if (imIn->bands == 2 && b) - b = 3; /* hack to deal with LA images */ - ss = 0.5; - for (x = xmin; x < xmax; x++) - ss = ss + (UINT8) imIn->image[yy][x*4+b] * k[x - xmin]; - imOut->image[yy][xx*4+b] = clip8(ss); + if (imIn->bands == 3) { + ss4[0] = ss4[1] = ss4[2] = 0.5; + for (x = xmin; x < xmax; x++) { + ss4[0] += (UINT8) imIn->image[yy][x*4 + 0] * k[x - xmin]; + ss4[1] += (UINT8) imIn->image[yy][x*4 + 1] * k[x - xmin]; + ss4[2] += (UINT8) imIn->image[yy][x*4 + 2] * k[x - xmin]; + } + imOut->image32[yy][xx] = + clip8(ss4[0]) | clip8(ss4[1]) << 8 | + clip8(ss4[2]) << 16; + } else { + ss4[0] = ss4[1] = ss4[2] = ss4[3] = 0.5; + for (x = xmin; x < xmax; x++) { + ss4[0] += (UINT8) imIn->image[yy][x*4 + 0] * k[x - xmin]; + ss4[1] += (UINT8) imIn->image[yy][x*4 + 1] * k[x - xmin]; + ss4[2] += (UINT8) imIn->image[yy][x*4 + 2] * k[x - xmin]; + ss4[3] += (UINT8) imIn->image[yy][x*4 + 3] * k[x - xmin]; + } + imOut->image32[yy][xx] = + clip8(ss4[0]) | clip8(ss4[1]) << 8 | + clip8(ss4[2]) << 16 | clip8(ss4[3]) << 24; } } break; From 1cd6da4a4924aa0a5af4eda7d012a1e10177c34a Mon Sep 17 00:00:00 2001 From: homm Date: Mon, 27 Oct 2014 18:09:45 +0300 Subject: [PATCH 104/532] fix performance regression on 64 bit GCC 4.8. --- libImaging/Antialias.c | 48 ++++++++++++++++++++++++++--------------- libImaging/ImPlatform.h | 6 ++++++ 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index f67053c09..03b6767bf 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -90,6 +90,21 @@ static inline UINT8 clip8(float in) } +/* This is work around bug in GCC prior 4.9 in 64 bit mode. + GCC generates code with partial dependency which 3 times slower. + See: http://stackoverflow.com/a/26588074/253146 */ +#if defined(__x86_64__) && defined(__SSE__) && \ + ! defined(__clang__) && defined(GCC_VERSION) && (GCC_VERSION < 40900) +static float __attribute__((always_inline)) i2f(int v) { + float x; + __asm__("xorps %0, %0; cvtsi2ss %1, %0" : "=X"(x) : "r"(v) ); + return x; +} +#else +static float inline i2f(int v) { return (float) v; } +#endif + + Imaging ImagingStretchHorizaontal(Imaging imIn, int xsize, int filter) { @@ -100,7 +115,7 @@ ImagingStretchHorizaontal(Imaging imIn, int xsize, int filter) Imaging imOut; struct filter *filterp; float support, scale, filterscale; - float center, ww, ss, ss4[4]; + float center, ww, ss, ss0, ss1, ss2, ss3; int xx, yy, x, kmax, xmin, xmax; int *xbounds; float *k, *kk; @@ -193,7 +208,7 @@ ImagingStretchHorizaontal(Imaging imIn, int xsize, int filter) k = &kk[xx * kmax]; ss = 0.5; for (x = xmin; x < xmax; x++) - ss = ss + imIn->image8[yy][x] * k[x - xmin]; + ss += i2f(imIn->image8[yy][x]) * k[x - xmin]; imOut->image8[yy][xx] = clip8(ss); } } else @@ -205,26 +220,25 @@ ImagingStretchHorizaontal(Imaging imIn, int xsize, int filter) xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; if (imIn->bands == 3) { - ss4[0] = ss4[1] = ss4[2] = 0.5; + ss0 = ss1 = ss2 = 0.5; for (x = xmin; x < xmax; x++) { - ss4[0] += (UINT8) imIn->image[yy][x*4 + 0] * k[x - xmin]; - ss4[1] += (UINT8) imIn->image[yy][x*4 + 1] * k[x - xmin]; - ss4[2] += (UINT8) imIn->image[yy][x*4 + 2] * k[x - xmin]; + ss0 += i2f((UINT8) imIn->image[yy][x*4 + 0]) * k[x - xmin]; + ss1 += i2f((UINT8) imIn->image[yy][x*4 + 1]) * k[x - xmin]; + ss2 += i2f((UINT8) imIn->image[yy][x*4 + 2]) * k[x - xmin]; } imOut->image32[yy][xx] = - clip8(ss4[0]) | clip8(ss4[1]) << 8 | - clip8(ss4[2]) << 16; + clip8(ss0) | clip8(ss1) << 8 | clip8(ss2) << 16; } else { - ss4[0] = ss4[1] = ss4[2] = ss4[3] = 0.5; + ss0 = ss1 = ss2 = ss3 = 0.5; for (x = xmin; x < xmax; x++) { - ss4[0] += (UINT8) imIn->image[yy][x*4 + 0] * k[x - xmin]; - ss4[1] += (UINT8) imIn->image[yy][x*4 + 1] * k[x - xmin]; - ss4[2] += (UINT8) imIn->image[yy][x*4 + 2] * k[x - xmin]; - ss4[3] += (UINT8) imIn->image[yy][x*4 + 3] * k[x - xmin]; + ss0 += i2f((UINT8) imIn->image[yy][x*4 + 0]) * k[x - xmin]; + ss1 += i2f((UINT8) imIn->image[yy][x*4 + 1]) * k[x - xmin]; + ss2 += i2f((UINT8) imIn->image[yy][x*4 + 2]) * k[x - xmin]; + ss3 += i2f((UINT8) imIn->image[yy][x*4 + 3]) * k[x - xmin]; } imOut->image32[yy][xx] = - clip8(ss4[0]) | clip8(ss4[1]) << 8 | - clip8(ss4[2]) << 16 | clip8(ss4[3]) << 24; + clip8(ss0) | clip8(ss1) << 8 | + clip8(ss2) << 16 | clip8(ss3) << 24; } } break; @@ -236,7 +250,7 @@ ImagingStretchHorizaontal(Imaging imIn, int xsize, int filter) k = &kk[xx * kmax]; ss = 0.0; for (x = xmin; x < xmax; x++) - ss = ss + IMAGING_PIXEL_I(imIn, x, yy) * k[x - xmin]; + ss += i2f(IMAGING_PIXEL_I(imIn, x, yy)) * k[x - xmin]; IMAGING_PIXEL_I(imOut, xx, yy) = (int) ss; } break; @@ -248,7 +262,7 @@ ImagingStretchHorizaontal(Imaging imIn, int xsize, int filter) k = &kk[xx * kmax]; ss = 0.0; for (x = xmin; x < xmax; x++) - ss = ss + IMAGING_PIXEL_F(imIn, x, yy) * k[x - xmin]; + ss += IMAGING_PIXEL_F(imIn, x, yy) * k[x - xmin]; IMAGING_PIXEL_F(imOut, xx, yy) = ss; } break; diff --git a/libImaging/ImPlatform.h b/libImaging/ImPlatform.h index 70ee63119..43c17cc85 100644 --- a/libImaging/ImPlatform.h +++ b/libImaging/ImPlatform.h @@ -72,3 +72,9 @@ #ifdef _MSC_VER typedef signed __int64 int64_t; #endif + +#ifdef __GNUC__ + #define GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) +#endif From b8a2b5b907d149453bb9e1f8d1a66372ab6c9519 Mon Sep 17 00:00:00 2001 From: homm Date: Mon, 3 Nov 2014 03:09:38 +0300 Subject: [PATCH 105/532] typo. Free mem after ModeError. --- libImaging/Antialias.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index 03b6767bf..25d2461cc 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -106,11 +106,8 @@ static float inline i2f(int v) { return (float) v; } Imaging -ImagingStretchHorizaontal(Imaging imIn, int xsize, int filter) +ImagingStretchHorizontal(Imaging imIn, int xsize, int filter) { - /* FIXME: this is a quick and straightforward translation from a - python prototype. might need some further C-ification... */ - ImagingSectionCookie cookie; Imaging imOut; struct filter *filterp; @@ -268,14 +265,15 @@ ImagingStretchHorizaontal(Imaging imIn, int xsize, int filter) break; default: ImagingSectionLeave(&cookie); + ImagingDelete(imOut); + free(kk); + free(xbounds); return (Imaging) ImagingError_ModeError(); } } ImagingSectionLeave(&cookie); - free(kk); free(xbounds); - return imOut; } @@ -305,7 +303,7 @@ ImagingStretch(Imaging imIn, int xsize, int ysize, int filter) return (Imaging) ImagingError_ModeError(); /* two-pass resize, first pass */ - imTemp1 = ImagingStretchHorizaontal(imIn, xsize, filter); + imTemp1 = ImagingStretchHorizontal(imIn, xsize, filter); if ( ! imTemp1) return NULL; @@ -316,7 +314,7 @@ ImagingStretch(Imaging imIn, int xsize, int ysize, int filter) return NULL; /* second pass */ - imTemp3 = ImagingStretchHorizaontal(imTemp2, ysize, filter); + imTemp3 = ImagingStretchHorizontal(imTemp2, ysize, filter); ImagingDelete(imTemp2); if ( ! imTemp3) return NULL; From 2657c0dec0ffb8fad660949be4714572211c4148 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 7 Nov 2014 14:47:23 -0800 Subject: [PATCH 106/532] Test for endianness issues in stretch --- Tests/test_imaging_stretch.py | 67 +++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/Tests/test_imaging_stretch.py b/Tests/test_imaging_stretch.py index a9858eff5..52548e3dc 100644 --- a/Tests/test_imaging_stretch.py +++ b/Tests/test_imaging_stretch.py @@ -39,6 +39,73 @@ class TestImagingStretch(PillowTestCase): self.assertEqual(r.mode, "RGB") self.assertEqual(r.size, (764, 414)) + def test_endianess(self): + # Make an image with one colored pixel, in one channel. + # When stretched, that channel should be the same as a GS image. + # Other channels should be unaffected. + # The R and A channels should not swap, which is indicitive of + # an endianess issues + + im = Image.new('L', (2,2), 0) + im.putpixel((1,1),128) + + blank = Image.new('L', (4,4), 0) + alpha = Image.new('L', (4,4), 255) + + for f in [Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: + + im_r = Image.new('RGBA', (2,2), (0,0,0,255)) + im_r.putpixel((1,1),(128,0,0,255)) + + target = im._new(im.im.stretch((4,4), f)) + stretched = im_r._new(im_r.im.stretch((4,4),f)) + + self.assert_image_equal(stretched.split()[0],target) + self.assert_image_equal(stretched.split()[1],blank) + self.assert_image_equal(stretched.split()[2],blank) + self.assert_image_equal(stretched.split()[3],alpha) + + + im_r = Image.new('RGB', (2,2), (0,0,0)) + im_r.putpixel((1,1),(128,0,0)) + + target = im._new(im.im.stretch((4,4), f)) + stretched = im_r._new(im_r.im.stretch((4,4),f)) + + #print " ".join(hex(ord(s)) for s in stretched.split()[0].tobytes()) + #print " ".join(hex(ord(s)) for s in stretched.split()[1].tobytes()) + #print " ".join(hex(ord(s)) for s in stretched.split()[2].tobytes()) + + #print " ".join(hex(ord(s)) for s in target.tobytes()) + + #print + + self.assert_image_equal(stretched.split()[0],target, 'rxRGB R channel fail') + self.assert_image_equal(stretched.split()[1],blank, 'rxRGB G channel fail') + self.assert_image_equal(stretched.split()[2],blank, 'rxRGB B channel fail') + + + im_g = Image.new('RGBA', (2,2), (0,0,0,255)) + im_g.putpixel((1,1),(0,128,0,255)) + + stretched = im_g._new(im_g.im.stretch((4,4),f)) + + self.assert_image_equal(stretched.split()[0],blank) + self.assert_image_equal(stretched.split()[1],target) + self.assert_image_equal(stretched.split()[2],blank) + self.assert_image_equal(stretched.split()[3],alpha) + + + im_g = Image.new('RGB', (2,2), (0,0,0)) + im_g.putpixel((1,1),(0,128,0)) + + target = im._new(im.im.stretch((4,4), f)) + stretched = im_g._new(im_g.im.stretch((4,4),f)) + + self.assert_image_equal(stretched.split()[0],blank, 'gxRGB R channel fail') + self.assert_image_equal(stretched.split()[1],target, 'gxRGB G channel fail') + self.assert_image_equal(stretched.split()[2],blank, 'gxRGB B channel fail') + if __name__ == '__main__': unittest.main() From af02f2b29ed4c2721649f786c69f81dc637ed0fe Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 7 Nov 2014 15:49:04 -0800 Subject: [PATCH 107/532] Fix for endianness issues in stretch --- libImaging/Antialias.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index 25d2461cc..0cf51b521 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -223,8 +223,13 @@ ImagingStretchHorizontal(Imaging imIn, int xsize, int filter) ss1 += i2f((UINT8) imIn->image[yy][x*4 + 1]) * k[x - xmin]; ss2 += i2f((UINT8) imIn->image[yy][x*4 + 2]) * k[x - xmin]; } +#ifdef WORDS_BIGENDIAN + imOut->image32[yy][xx] = + clip8(ss2) << 8 | clip8(ss1) << 16 | clip8(ss0) << 24; +#else imOut->image32[yy][xx] = clip8(ss0) | clip8(ss1) << 8 | clip8(ss2) << 16; +#endif } else { ss0 = ss1 = ss2 = ss3 = 0.5; for (x = xmin; x < xmax; x++) { @@ -233,9 +238,15 @@ ImagingStretchHorizontal(Imaging imIn, int xsize, int filter) ss2 += i2f((UINT8) imIn->image[yy][x*4 + 2]) * k[x - xmin]; ss3 += i2f((UINT8) imIn->image[yy][x*4 + 3]) * k[x - xmin]; } +#ifdef WORDS_BIGENDIAN + imOut->image32[yy][xx] = + clip8(ss3) | clip8(ss2) << 8 | + clip8(ss1) << 16 | clip8(ss0) << 24; +#else imOut->image32[yy][xx] = clip8(ss0) | clip8(ss1) << 8 | clip8(ss2) << 16 | clip8(ss3) << 24; +#endif } } break; From 1a7c9b72ab617d947ee1a12f79cbe8a5b731ff47 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 9 Nov 2014 01:00:01 +0300 Subject: [PATCH 108/532] generalize endianess test --- Tests/test_imaging_stretch.py | 83 ++++++++++++----------------------- 1 file changed, 28 insertions(+), 55 deletions(-) diff --git a/Tests/test_imaging_stretch.py b/Tests/test_imaging_stretch.py index 52548e3dc..b5336bac2 100644 --- a/Tests/test_imaging_stretch.py +++ b/Tests/test_imaging_stretch.py @@ -1,6 +1,7 @@ """ Tests for ImagingCore.stretch functionality. """ +from itertools import permutations from helper import unittest, PillowTestCase @@ -12,6 +13,9 @@ im = Image.open("Tests/images/hopper.ppm").copy() class TestImagingStretch(PillowTestCase): + def stretch(self, im, size, f): + return im._new(im.im.stretch(size, f)) + def test_modes(self): self.assertRaises(ValueError, im.convert("1").im.stretch, (15, 12), Image.ANTIALIAS) @@ -46,65 +50,34 @@ class TestImagingStretch(PillowTestCase): # The R and A channels should not swap, which is indicitive of # an endianess issues - im = Image.new('L', (2,2), 0) - im.putpixel((1,1),128) - - blank = Image.new('L', (4,4), 0) - alpha = Image.new('L', (4,4), 255) + samples = { + 'blank': Image.new('L', (2, 2), 0), + 'filled': Image.new('L', (2, 2), 255), + 'dirty': Image.new('L', (2, 2), 0), + } + samples['dirty'].putpixel((1, 1), 128) for f in [Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: + # samples resized with current filter + resized = dict( + (name, self.stretch(ch, (4, 4), f)) + for name, ch in samples.items() + ) - im_r = Image.new('RGBA', (2,2), (0,0,0,255)) - im_r.putpixel((1,1),(128,0,0,255)) + for mode, channels_set in [ + ('RGB', ('blank', 'filled', 'dirty')), + ('RGBA', ('blank', 'blank', 'filled', 'dirty')), + ('LA', ('filled', 'dirty')), + ]: + for channels in set(permutations(channels_set)): + # compile image from different channels permutations + im = Image.merge(mode, [samples[ch] for ch in channels]) + stretched = self.stretch(im, (4, 4), f) - target = im._new(im.im.stretch((4,4), f)) - stretched = im_r._new(im_r.im.stretch((4,4),f)) - - self.assert_image_equal(stretched.split()[0],target) - self.assert_image_equal(stretched.split()[1],blank) - self.assert_image_equal(stretched.split()[2],blank) - self.assert_image_equal(stretched.split()[3],alpha) - - - im_r = Image.new('RGB', (2,2), (0,0,0)) - im_r.putpixel((1,1),(128,0,0)) - - target = im._new(im.im.stretch((4,4), f)) - stretched = im_r._new(im_r.im.stretch((4,4),f)) - - #print " ".join(hex(ord(s)) for s in stretched.split()[0].tobytes()) - #print " ".join(hex(ord(s)) for s in stretched.split()[1].tobytes()) - #print " ".join(hex(ord(s)) for s in stretched.split()[2].tobytes()) - - #print " ".join(hex(ord(s)) for s in target.tobytes()) - - #print - - self.assert_image_equal(stretched.split()[0],target, 'rxRGB R channel fail') - self.assert_image_equal(stretched.split()[1],blank, 'rxRGB G channel fail') - self.assert_image_equal(stretched.split()[2],blank, 'rxRGB B channel fail') - - - im_g = Image.new('RGBA', (2,2), (0,0,0,255)) - im_g.putpixel((1,1),(0,128,0,255)) - - stretched = im_g._new(im_g.im.stretch((4,4),f)) - - self.assert_image_equal(stretched.split()[0],blank) - self.assert_image_equal(stretched.split()[1],target) - self.assert_image_equal(stretched.split()[2],blank) - self.assert_image_equal(stretched.split()[3],alpha) - - - im_g = Image.new('RGB', (2,2), (0,0,0)) - im_g.putpixel((1,1),(0,128,0)) - - target = im._new(im.im.stretch((4,4), f)) - stretched = im_g._new(im_g.im.stretch((4,4),f)) - - self.assert_image_equal(stretched.split()[0],blank, 'gxRGB R channel fail') - self.assert_image_equal(stretched.split()[1],target, 'gxRGB G channel fail') - self.assert_image_equal(stretched.split()[2],blank, 'gxRGB B channel fail') + for i, ch in enumerate(stretched.split()): + # check what resized channel in image is the same + # as separately resized channel + self.assert_image_equal(ch, resized[channels[i]]) if __name__ == '__main__': From abc5e113716897aab33237da800d745b99db3e41 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 9 Nov 2014 01:05:50 +0300 Subject: [PATCH 109/532] two bands case --- libImaging/Antialias.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index 0cf51b521..fd2ec51be 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -216,7 +216,18 @@ ImagingStretchHorizontal(Imaging imIn, int xsize, int filter) xmin = xbounds[xx * 2 + 0]; xmax = xbounds[xx * 2 + 1]; k = &kk[xx * kmax]; - if (imIn->bands == 3) { + if (imIn->bands == 2) { + ss0 = ss1 = 0.5; + for (x = xmin; x < xmax; x++) { + ss0 += i2f((UINT8) imIn->image[yy][x*4 + 0]) * k[x - xmin]; + ss1 += i2f((UINT8) imIn->image[yy][x*4 + 3]) * k[x - xmin]; + } +#ifdef WORDS_BIGENDIAN + imOut->image32[yy][xx] = clip8(ss1) | clip8(ss0) << 24; +#else + imOut->image32[yy][xx] = clip8(ss0) | clip8(ss1) << 24; +#endif + } else if (imIn->bands == 3) { ss0 = ss1 = ss2 = 0.5; for (x = xmin; x < xmax; x++) { ss0 += i2f((UINT8) imIn->image[yy][x*4 + 0]) * k[x - xmin]; From 7a64f7be80ac675b2eec079f8430de964afbc408 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 9 Nov 2014 02:27:43 +0300 Subject: [PATCH 110/532] Replace UINT32 assignment with per-channel UINT8 assignment --- libImaging/Antialias.c | 54 ++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index fd2ec51be..4b997eaa9 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -212,36 +212,39 @@ ImagingStretchHorizontal(Imaging imIn, int xsize, int filter) switch(imIn->type) { case IMAGING_TYPE_UINT8: /* n-bit grayscale */ - for (xx = 0; xx < xsize; xx++) { - xmin = xbounds[xx * 2 + 0]; - xmax = xbounds[xx * 2 + 1]; - k = &kk[xx * kmax]; - if (imIn->bands == 2) { + if (imIn->bands == 2) { + for (xx = 0; xx < xsize; xx++) { + xmin = xbounds[xx * 2 + 0]; + xmax = xbounds[xx * 2 + 1]; + k = &kk[xx * kmax]; ss0 = ss1 = 0.5; for (x = xmin; x < xmax; x++) { ss0 += i2f((UINT8) imIn->image[yy][x*4 + 0]) * k[x - xmin]; ss1 += i2f((UINT8) imIn->image[yy][x*4 + 3]) * k[x - xmin]; } -#ifdef WORDS_BIGENDIAN - imOut->image32[yy][xx] = clip8(ss1) | clip8(ss0) << 24; -#else - imOut->image32[yy][xx] = clip8(ss0) | clip8(ss1) << 24; -#endif - } else if (imIn->bands == 3) { + imOut->image[yy][xx*4 + 0] = clip8(ss0); + imOut->image[yy][xx*4 + 3] = clip8(ss1); + } + } else if (imIn->bands == 3) { + for (xx = 0; xx < xsize; xx++) { + xmin = xbounds[xx * 2 + 0]; + xmax = xbounds[xx * 2 + 1]; + k = &kk[xx * kmax]; ss0 = ss1 = ss2 = 0.5; for (x = xmin; x < xmax; x++) { ss0 += i2f((UINT8) imIn->image[yy][x*4 + 0]) * k[x - xmin]; ss1 += i2f((UINT8) imIn->image[yy][x*4 + 1]) * k[x - xmin]; ss2 += i2f((UINT8) imIn->image[yy][x*4 + 2]) * k[x - xmin]; } -#ifdef WORDS_BIGENDIAN - imOut->image32[yy][xx] = - clip8(ss2) << 8 | clip8(ss1) << 16 | clip8(ss0) << 24; -#else - imOut->image32[yy][xx] = - clip8(ss0) | clip8(ss1) << 8 | clip8(ss2) << 16; -#endif - } else { + imOut->image[yy][xx*4 + 0] = clip8(ss0); + imOut->image[yy][xx*4 + 1] = clip8(ss1); + imOut->image[yy][xx*4 + 2] = clip8(ss2); + } + } else { + for (xx = 0; xx < xsize; xx++) { + xmin = xbounds[xx * 2 + 0]; + xmax = xbounds[xx * 2 + 1]; + k = &kk[xx * kmax]; ss0 = ss1 = ss2 = ss3 = 0.5; for (x = xmin; x < xmax; x++) { ss0 += i2f((UINT8) imIn->image[yy][x*4 + 0]) * k[x - xmin]; @@ -249,15 +252,10 @@ ImagingStretchHorizontal(Imaging imIn, int xsize, int filter) ss2 += i2f((UINT8) imIn->image[yy][x*4 + 2]) * k[x - xmin]; ss3 += i2f((UINT8) imIn->image[yy][x*4 + 3]) * k[x - xmin]; } -#ifdef WORDS_BIGENDIAN - imOut->image32[yy][xx] = - clip8(ss3) | clip8(ss2) << 8 | - clip8(ss1) << 16 | clip8(ss0) << 24; -#else - imOut->image32[yy][xx] = - clip8(ss0) | clip8(ss1) << 8 | - clip8(ss2) << 16 | clip8(ss3) << 24; -#endif + imOut->image[yy][xx*4 + 0] = clip8(ss0); + imOut->image[yy][xx*4 + 1] = clip8(ss1); + imOut->image[yy][xx*4 + 2] = clip8(ss2); + imOut->image[yy][xx*4 + 3] = clip8(ss3); } } break; From 3894dbe7542ced66fdbe27e98c27ff773fc09da3 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 9 Nov 2014 02:33:14 +0300 Subject: [PATCH 111/532] fix typo --- Tests/test_imaging_stretch.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_imaging_stretch.py b/Tests/test_imaging_stretch.py index b5336bac2..aaf1a4d1d 100644 --- a/Tests/test_imaging_stretch.py +++ b/Tests/test_imaging_stretch.py @@ -43,12 +43,12 @@ class TestImagingStretch(PillowTestCase): self.assertEqual(r.mode, "RGB") self.assertEqual(r.size, (764, 414)) - def test_endianess(self): + def test_endianness(self): # Make an image with one colored pixel, in one channel. # When stretched, that channel should be the same as a GS image. # Other channels should be unaffected. # The R and A channels should not swap, which is indicitive of - # an endianess issues + # an endianness issues. samples = { 'blank': Image.new('L', (2, 2), 0), From 90ee223305baef8c7f2d8923849fe39cd9c255f4 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 9 Nov 2014 03:15:54 +0300 Subject: [PATCH 112/532] Move ImagingTransposeToNew from Antialias.c to Geometry.c --- libImaging/Antialias.c | 15 --------------- libImaging/Geometry.c | 15 +++++++++++++++ libImaging/Imaging.h | 1 + 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index 4b997eaa9..5c9514103 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -298,21 +298,6 @@ ImagingStretchHorizontal(Imaging imIn, int xsize, int filter) } -Imaging -ImagingTransposeToNew(Imaging imIn) -{ - Imaging imTemp = ImagingNew(imIn->mode, imIn->ysize, imIn->xsize); - if ( ! imTemp) - return NULL; - - if ( ! ImagingTranspose(imTemp, imIn)) { - ImagingDelete(imTemp); - return NULL; - } - return imTemp; -} - - Imaging ImagingStretch(Imaging imIn, int xsize, int ysize, int filter) { diff --git a/libImaging/Geometry.c b/libImaging/Geometry.c index afd162dad..b987a5616 100644 --- a/libImaging/Geometry.c +++ b/libImaging/Geometry.c @@ -178,6 +178,21 @@ ImagingTranspose(Imaging imOut, Imaging imIn) } +Imaging +ImagingTransposeToNew(Imaging imIn) +{ + Imaging imTemp = ImagingNew(imIn->mode, imIn->ysize, imIn->xsize); + if ( ! imTemp) + return NULL; + + if ( ! ImagingTranspose(imTemp, imIn)) { + ImagingDelete(imTemp); + return NULL; + } + return imTemp; +} + + Imaging ImagingRotate180(Imaging imOut, Imaging imIn) { diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index d5aa6e27a..6c91958ec 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -293,6 +293,7 @@ extern Imaging ImagingRotate180(Imaging imOut, Imaging imIn); extern Imaging ImagingRotate270(Imaging imOut, Imaging imIn); extern Imaging ImagingStretch(Imaging imIn, int xsize, int ysize, int filter); extern Imaging ImagingTranspose(Imaging imOut, Imaging imIn); +extern Imaging ImagingTransposeToNew(Imaging imIn); extern Imaging ImagingTransformPerspective( Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, double a[8], int filter, int fill); From 482f65870442ae42bb833bc9b9b4df949e7ecc04 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 9 Nov 2014 10:50:38 -0800 Subject: [PATCH 113/532] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e5fc39bfd..f9434c877 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,6 +3,9 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Optimize stretch implementation. #977 + [homm] + - Speed up rotation by using cache aware loops, added transpose to rotations. #994 [homm] From aba798af259718e5a164aa42460d905fa87fb215 Mon Sep 17 00:00:00 2001 From: homm Date: Tue, 4 Nov 2014 12:31:36 +0300 Subject: [PATCH 114/532] replace resize implementation --- PIL/Image.py | 13 ++----------- _imaging.c | 23 ++++++++++++++++++++--- libImaging/Geometry.c | 24 ------------------------ libImaging/Imaging.h | 1 - 4 files changed, 22 insertions(+), 39 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 922fe36a8..8e7140847 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -876,7 +876,7 @@ class Image: elif self.mode == 'P' and mode == 'RGBA': t = self.info['transparency'] delete_trns = True - + if isinstance(t, bytes): self.im.putpalettealphas(t) elif isinstance(t, int): @@ -1539,16 +1539,7 @@ class Image: if self.mode == 'RGBA': return self.convert('RGBa').resize(size, resample).convert('RGBA') - if resample == ANTIALIAS: - # requires stretch support (imToolkit & PIL 1.1.3) - try: - im = self.im.stretch(size, resample) - except AttributeError: - raise ValueError("unsupported resampling filter") - else: - im = self.im.resize(size, resample) - - return self._new(im) + return self._new(self.im.resize(size, resample)) def rotate(self, angle, resample=NEAREST, expand=0): """ diff --git a/_imaging.c b/_imaging.c index f7ea510bc..280db9fdb 100644 --- a/_imaging.c +++ b/_imaging.c @@ -1513,9 +1513,26 @@ _resize(ImagingObject* self, PyObject* args) imIn = self->image; - imOut = ImagingNew(imIn->mode, xsize, ysize); - if (imOut) - (void) ImagingResize(imOut, imIn, filter); + if (imIn->xsize == xsize && imIn->ysize == ysize) { + imOut = ImagingCopy(imIn); + } + else if ( ! filter) { + double a[6]; + + memset(a, 0, sizeof a); + a[1] = (double) imIn->xsize / xsize; + a[5] = (double) imIn->ysize / ysize; + + imOut = ImagingNew(imIn->mode, xsize, ysize); + + imOut = ImagingTransformAffine( + imOut, imIn, + 0, 0, xsize, ysize, + a, filter, 1); + } + else { + imOut = ImagingStretch(imIn, xsize, ysize, filter); + } return PyImagingNew(imOut); } diff --git a/libImaging/Geometry.c b/libImaging/Geometry.c index b987a5616..f586974c3 100644 --- a/libImaging/Geometry.c +++ b/libImaging/Geometry.c @@ -979,30 +979,6 @@ ImagingTransformQuad(Imaging imOut, Imaging imIn, /* -------------------------------------------------------------------- */ /* Convenience functions */ -Imaging -ImagingResize(Imaging imOut, Imaging imIn, int filterid) -{ - double a[6]; - - if (imOut->xsize == imIn->xsize && imOut->ysize == imIn->ysize) - return ImagingCopy2(imOut, imIn); - - memset(a, 0, sizeof a); - a[1] = (double) imIn->xsize / imOut->xsize; - a[5] = (double) imIn->ysize / imOut->ysize; - - if (!filterid && imIn->type != IMAGING_TYPE_SPECIAL) - return ImagingScaleAffine( - imOut, imIn, - 0, 0, imOut->xsize, imOut->ysize, - a, 1); - - return ImagingTransformAffine( - imOut, imIn, - 0, 0, imOut->xsize, imOut->ysize, - a, filterid, 1); -} - Imaging ImagingRotate(Imaging imOut, Imaging imIn, double theta, int filterid) { diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index 6c91958ec..694a15c21 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -285,7 +285,6 @@ extern Imaging ImagingPointTransform( Imaging imIn, double scale, double offset); extern Imaging ImagingPutBand(Imaging im, Imaging imIn, int band); extern Imaging ImagingRankFilter(Imaging im, int size, int rank); -extern Imaging ImagingResize(Imaging imOut, Imaging imIn, int filter); extern Imaging ImagingRotate( Imaging imOut, Imaging imIn, double theta, int filter); extern Imaging ImagingRotate90(Imaging imOut, Imaging imIn); From 693aff7ee1403c1184ff6a500587077cd1195004 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 9 Nov 2014 04:20:54 +0300 Subject: [PATCH 115/532] remove thumbnail fallback --- PIL/Image.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 8e7140847..82bed82ad 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1789,14 +1789,7 @@ class Image: self.draft(None, size) - self.load() - - try: - im = self.resize(size, resample) - except ValueError: - if resample != ANTIALIAS: - raise - im = self.resize(size, NEAREST) # fallback + im = self.resize(size, resample) self.im = im.im self.mode = im.mode From f88878c20bc36c10894ba6d5b8d2940e00046fe7 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 9 Nov 2014 04:26:53 +0300 Subject: [PATCH 116/532] reflect changes in documentation --- PIL/Image.py | 19 ++++++------------- docs/handbook/concepts.rst | 22 +++++++++------------- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 82bed82ad..e3434dc56 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1515,9 +1515,8 @@ class Image: (width, height). :param resample: An optional resampling filter. This can be one of :py:attr:`PIL.Image.NEAREST` (use nearest neighbour), - :py:attr:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 - environment), :py:attr:`PIL.Image.BICUBIC` (cubic spline - interpolation in a 4x4 environment), or + :py:attr:`PIL.Image.BILINEAR` (linear interpolation), + :py:attr:`PIL.Image.BICUBIC` (cubic spline interpolation), or :py:attr:`PIL.Image.ANTIALIAS` (a high-quality downsampling filter). If omitted, or if the image has mode "1" or "P", it is set :py:attr:`PIL.Image.NEAREST`. @@ -1754,12 +1753,7 @@ class Image: :py:meth:`~PIL.Image.Image.draft` method to configure the file reader (where applicable), and finally resizes the image. - Note that the bilinear and bicubic filters in the current - version of PIL are not well-suited for thumbnail generation. - You should use :py:attr:`PIL.Image.ANTIALIAS` unless speed is much more - important than quality. - - Also note that this function modifies the :py:class:`~PIL.Image.Image` + Note that this function modifies the :py:class:`~PIL.Image.Image` object in place. If you need to use the full resolution image as well, apply this method to a :py:meth:`~PIL.Image.Image.copy` of the original image. @@ -1767,10 +1761,9 @@ class Image: :param size: Requested size. :param resample: Optional resampling filter. This can be one of :py:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BILINEAR`, - :py:attr:`PIL.Image.BICUBIC`, or :py:attr:`PIL.Image.ANTIALIAS` - (best quality). If omitted, it defaults to - :py:attr:`PIL.Image.ANTIALIAS`. (was :py:attr:`PIL.Image.NEAREST` - prior to version 2.5.0) + :py:attr:`PIL.Image.BICUBIC`, or :py:attr:`PIL.Image.ANTIALIAS`. + If omitted, it defaults to :py:attr:`PIL.Image.ANTIALIAS`. + (was :py:attr:`PIL.Image.NEAREST` prior to version 2.5.0) :returns: None """ diff --git a/docs/handbook/concepts.rst b/docs/handbook/concepts.rst index b5e5e44c1..492ec5457 100644 --- a/docs/handbook/concepts.rst +++ b/docs/handbook/concepts.rst @@ -87,25 +87,21 @@ pixel, the Python Imaging Library provides four different resampling *filters*. Pick the nearest pixel from the input image. Ignore all other input pixels. ``BILINEAR`` - Use linear interpolation over a 2x2 environment in the input image. Note - that in the current version of PIL, this filter uses a fixed input - environment when downsampling. + For resize calculate the output pixel value using linear interpolation + on all pixels that may contribute to the output value. + For other transformations linear interpolation over a 2x2 environment + in the input image is used. ``BICUBIC`` - Use cubic interpolation over a 4x4 environment in the input image. Note - that in the current version of PIL, this filter uses a fixed input - environment when downsampling. + For resize calculate the output pixel value using cubic interpolation + on all pixels that may contribute to the output value. + For other transformations cubic interpolation over a 4x4 environment + in the input image is used. ``ANTIALIAS`` - Calculate the output pixel value using a high-quality resampling filter (a + Calculate the output pixel value using a high-quality Lanczos filter (a truncated sinc) on all pixels that may contribute to the output value. In the current version of PIL, this filter can only be used with the resize and thumbnail methods. .. versionadded:: 1.1.3 - -Note that in the current version of PIL, the ``ANTIALIAS`` filter is the only -filter that behaves properly when downsampling (that is, when converting a -large image to a small one). The ``BILINEAR`` and ``BICUBIC`` filters use a -fixed input environment, and are best used for scale-preserving geometric -transforms and upsamping. From aff274011b666dab6bc3b540fc5e7532b32f9ca6 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 9 Nov 2014 11:42:39 -0800 Subject: [PATCH 117/532] Update CHANGES.rst [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index f9434c877..8c0ac2bf1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,7 +3,7 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ -- Optimize stretch implementation. #977 +- Speedup stretch implementation up to 2.5 times. #977 [homm] - Speed up rotation by using cache aware loops, added transpose to rotations. #994 From aabf66a7a419ac10df71b600e37801c2cdb58ea7 Mon Sep 17 00:00:00 2001 From: homm Date: Mon, 10 Nov 2014 02:11:12 +0300 Subject: [PATCH 118/532] fix tests: use `im.transform` directly when result is compared with other transform operations. --- Tests/test_image_transform.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index c4111d0b6..4306e9b43 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -44,7 +44,9 @@ class TestImageTransform(PillowTestCase): w//2, h//2, w//2, 0), Image.BILINEAR) - scaled = im.resize((w*2, h*2), Image.BILINEAR).crop((0, 0, w, h)) + scaled = im.transform((w, h), Image.AFFINE, + (.5, 0, 0, 0, .5, 0), + Image.BILINEAR) self.assert_image_equal(transformed, scaled) @@ -61,9 +63,9 @@ class TestImageTransform(PillowTestCase): w, h, w, 0))], # ul -> ccw around quad Image.BILINEAR) - # transformed.save('transformed.png') - - scaled = im.resize((w//2, h//2), Image.BILINEAR) + scaled = im.transform((w//2, h//2), Image.AFFINE, + (2, 0, 0, 0, 2, 0), + Image.BILINEAR) checker = Image.new('RGBA', im.size) checker.paste(scaled, (0, 0)) @@ -128,7 +130,8 @@ class TestImageTransform(PillowTestCase): foo = [ Image.new('RGBA', (1024, 1024), (a, a, a, a)) - for a in range(1, 65)] + for a in range(1, 65) + ] # Yeah. Watch some JIT optimize this out. foo = None From ba178bef85de878fd0b9391da32220e9d6672df8 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 9 Nov 2014 20:51:20 -0800 Subject: [PATCH 119/532] Added ref to getpalette --- docs/reference/Image.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index 249543004..08af684d5 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -116,6 +116,7 @@ ITU-R 709, using the D65 luminant) to the CIE XYZ color space: .. automethod:: PIL.Image.Image.getcolors .. automethod:: PIL.Image.Image.getdata .. automethod:: PIL.Image.Image.getextrema +.. automethod:: PIL.Image.Image.getpalette .. automethod:: PIL.Image.Image.getpixel .. automethod:: PIL.Image.Image.histogram .. automethod:: PIL.Image.Image.offset From 37252a67cc251fd865384fe0fb9db7a5ebd443a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ballier?= Date: Tue, 11 Nov 2014 19:39:05 +0100 Subject: [PATCH 120/532] =?UTF-8?q?Fix=20bad=20import=C3=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PIL/ImageQt.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PIL/ImageQt.py b/PIL/ImageQt.py index d7c91df13..fd662c894 100644 --- a/PIL/ImageQt.py +++ b/PIL/ImageQt.py @@ -22,11 +22,11 @@ import sys if 'PyQt4.QtGui' not in sys.modules: try: - from PyQt5.QtGui import QImage, qRgb + from PyQt5.QtGui import QImage, qRgba except: - from PyQt4.QtGui import QImage, qRgb + from PyQt4.QtGui import QImage, qRgba else: #PyQt4 is used - from PyQt4.QtGui import QImage, qRgb + from PyQt4.QtGui import QImage, qRgba ## # (Internal) Turns an RGB color into a Qt compatible color integer. From ad1b9193423a669f92352b37dac9f4b31c3586a7 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 12 Nov 2014 22:15:26 -0800 Subject: [PATCH 121/532] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 8c0ac2bf1..aac45dfcf 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,6 +3,9 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Use PyQt4 if it has already been imported, otherwise prefer PyQt5. #1003 + [AurelienBallier] + - Speedup stretch implementation up to 2.5 times. #977 [homm] From 03d20d3b6a2894a9053512b7b2d2c382bffd9a59 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 12 Nov 2014 22:45:35 -0800 Subject: [PATCH 122/532] More tests for ico save --- Tests/test_file_ico.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 200b6ba56..01d3f5904 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -22,13 +22,27 @@ class TestFileIco(PillowTestCase): im = hopper() im.save(output, "ico", sizes=[(32, 32), (64, 64)]) + # the default image output.seek(0) reloaded = Image.open(output) + self.assertEqual(reloaded.info['sizes'],set([(32, 32), (64, 64)])) self.assertEqual(im.mode, reloaded.mode) self.assertEqual((64, 64), reloaded.size) self.assertEqual(reloaded.format, "ICO") + self.assert_image_equal(reloaded, hopper().resize((64,64), Image.ANTIALIAS)) + # the other one + output.seek(0) + reloaded = Image.open(output) + reloaded.size = (32,32) + + self.assertEqual(im.mode, reloaded.mode) + self.assertEqual((32, 32), reloaded.size) + self.assertEqual(reloaded.format, "ICO") + self.assert_image_equal(reloaded, hopper().resize((32,32), Image.ANTIALIAS)) + + if __name__ == '__main__': unittest.main() From ccba6af498708a22520402efd647690ad1ce50fa Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 13 Nov 2014 10:10:42 +0200 Subject: [PATCH 123/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index aac45dfcf..ed81f995e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,6 +3,10 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ + +- Ico save, additional tests #1007 + [exherb] + - Use PyQt4 if it has already been imported, otherwise prefer PyQt5. #1003 [AurelienBallier] From a105cd7edb26c06a22c9cbadc26ae0eaa8cf19c4 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 13 Nov 2014 14:56:31 -0800 Subject: [PATCH 124/532] Test for issue #1008 --- Tests/test_image_putdata.py | 20 ++++++++++++++++++++ Tests/test_numpy.py | 10 ++++++++++ 2 files changed, 30 insertions(+) diff --git a/Tests/test_image_putdata.py b/Tests/test_image_putdata.py index 46a2ace71..3b7dc836a 100644 --- a/Tests/test_image_putdata.py +++ b/Tests/test_image_putdata.py @@ -1,4 +1,5 @@ from helper import unittest, PillowTestCase, hopper +from array import array import sys @@ -63,6 +64,25 @@ class TestImagePutData(PillowTestCase): target = [2.0 * float(elt) + 256.0 for elt in data] self.assertEqual(list(im.getdata()), target) + def test_array_B(self): + # shouldn't segfault + # see https://github.com/python-pillow/Pillow/issues/1008 + + arr = array('B', [0])*15000 + im = Image.new('L', (150, 100)) + im.putdata(arr) + + self.assertEqual(len(im.getdata()),len(arr)) + + def test_array_F(self): + # shouldn't segfault + # see https://github.com/python-pillow/Pillow/issues/1008 + + im = Image.new('F', (150, 100)) + arr = array('f', [0.0])*15000 + im.putdata(arr) + + self.assertEqual(len(im.getdata()),len(arr)) if __name__ == '__main__': unittest.main() diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index b00b8b36b..7b6f22b2b 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -121,6 +121,16 @@ class TestNumpy(PillowTestCase): im.point(lut) + def test_putdata(self): + # shouldn't segfault + # see https://github.com/python-pillow/Pillow/issues/1008 + + im = Image.new('F', (150, 100)) + arr = numpy.zeros((15000,), numpy.float32) + im.putdata(arr) + + self.assertEqual(len(im.getdata()),len(arr)) + if __name__ == '__main__': unittest.main() From f75c5562c7a6a887bdcb8c7f93022fa1fdfcee09 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 13 Nov 2014 14:56:59 -0800 Subject: [PATCH 125/532] Fix #1008, Correct argument to PySequence_Fast_GET_ITEM --- _imaging.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/_imaging.c b/_imaging.c index f7ea510bc..28ac4600e 100644 --- a/_imaging.c +++ b/_imaging.c @@ -1269,7 +1269,7 @@ _putdata(ImagingObject* self, PyObject* args) if (scale == 1.0 && offset == 0.0) { /* Clipped data */ for (i = x = y = 0; i < n; i++) { - op = PySequence_Fast_GET_ITEM(data, i); + op = PySequence_Fast_GET_ITEM(seq, i); image->image8[y][x] = (UINT8) CLIP(PyInt_AsLong(op)); if (++x >= (int) image->xsize){ x = 0, y++; @@ -1279,7 +1279,7 @@ _putdata(ImagingObject* self, PyObject* args) } else { /* Scaled and clipped data */ for (i = x = y = 0; i < n; i++) { - PyObject *op = PySequence_Fast_GET_ITEM(data, i); + PyObject *op = PySequence_Fast_GET_ITEM(seq, i); image->image8[y][x] = CLIP( (int) (PyFloat_AsDouble(op) * scale + offset)); if (++x >= (int) image->xsize){ @@ -1299,7 +1299,7 @@ _putdata(ImagingObject* self, PyObject* args) switch (image->type) { case IMAGING_TYPE_INT32: for (i = x = y = 0; i < n; i++) { - op = PySequence_Fast_GET_ITEM(data, i); + op = PySequence_Fast_GET_ITEM(seq, i); IMAGING_PIXEL_INT32(image, x, y) = (INT32) (PyFloat_AsDouble(op) * scale + offset); if (++x >= (int) image->xsize){ @@ -1310,7 +1310,7 @@ _putdata(ImagingObject* self, PyObject* args) break; case IMAGING_TYPE_FLOAT32: for (i = x = y = 0; i < n; i++) { - op = PySequence_Fast_GET_ITEM(data, i); + op = PySequence_Fast_GET_ITEM(seq, i); IMAGING_PIXEL_FLOAT32(image, x, y) = (FLOAT32) (PyFloat_AsDouble(op) * scale + offset); if (++x >= (int) image->xsize){ @@ -1326,7 +1326,7 @@ _putdata(ImagingObject* self, PyObject* args) INT32 inkint; } u; - op = PySequence_Fast_GET_ITEM(data, i); + op = PySequence_Fast_GET_ITEM(seq, i); if (!op || !getink(op, image, u.ink)) { return NULL; } From 112a4815f010dbc36df3907b2ff0bedfc925fc5a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 13 Nov 2014 15:53:51 -0800 Subject: [PATCH 126/532] Fix compilation on debug versions of python --- libImaging/Antialias.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index 5c9514103..a97141013 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -94,7 +94,8 @@ static inline UINT8 clip8(float in) GCC generates code with partial dependency which 3 times slower. See: http://stackoverflow.com/a/26588074/253146 */ #if defined(__x86_64__) && defined(__SSE__) && \ - ! defined(__clang__) && defined(GCC_VERSION) && (GCC_VERSION < 40900) + ! defined(__clang__) && defined(GCC_VERSION) && (GCC_VERSION < 40900) && \ + ! defined(Py_DEBUG) static float __attribute__((always_inline)) i2f(int v) { float x; __asm__("xorps %0, %0; cvtsi2ss %1, %0" : "=X"(x) : "r"(v) ); From 9d1fde0fff84e520fa7ff87ce8e0dac5537bed0b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 13 Nov 2014 21:35:06 -0800 Subject: [PATCH 127/532] Use __NO_INLINE__ instead of Py_DEBUG --- libImaging/Antialias.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index a97141013..1799e7fdc 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -93,9 +93,8 @@ static inline UINT8 clip8(float in) /* This is work around bug in GCC prior 4.9 in 64 bit mode. GCC generates code with partial dependency which 3 times slower. See: http://stackoverflow.com/a/26588074/253146 */ -#if defined(__x86_64__) && defined(__SSE__) && \ - ! defined(__clang__) && defined(GCC_VERSION) && (GCC_VERSION < 40900) && \ - ! defined(Py_DEBUG) +#if defined(__x86_64__) && defined(__SSE__) && ! defined(__NO_INLINE__) && \ + ! defined(__clang__) && defined(GCC_VERSION) && (GCC_VERSION < 40900) static float __attribute__((always_inline)) i2f(int v) { float x; __asm__("xorps %0, %0; cvtsi2ss %1, %0" : "=X"(x) : "r"(v) ); From ebbee834c9cd568d4ed95e32176baea1270bbb02 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 14 Nov 2014 08:40:06 +0200 Subject: [PATCH 128/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index ed81f995e..e61c3d745 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Fix for Image.putdata segfault #1009 + [wiredfool] + - Ico save, additional tests #1007 [exherb] From 9da99dee8d61f100437c6a041d003e6bdae8f844 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 14 Nov 2014 08:42:41 +0200 Subject: [PATCH 129/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e61c3d745..3edc1b577 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Fix antialias compilation on debug versions of Python #1010 + [wiredfool] + - Fix for Image.putdata segfault #1009 [wiredfool] From dd3a46520c6a5c5e43de7001c369f0a1803e8e57 Mon Sep 17 00:00:00 2001 From: Martin Fergie Date: Fri, 14 Nov 2014 12:29:10 +0000 Subject: [PATCH 130/532] Fix for saving to io.BytesIO() --- PIL/TiffImagePlugin.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 6a52e5e5c..21ff13ec6 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1128,8 +1128,12 @@ def _save(im, fp, filename): print (ifd.items()) _fp = 0 if hasattr(fp, "fileno"): - fp.seek(0) - _fp = os.dup(fp.fileno()) + import io + try: + fp.seek(0) + _fp = os.dup(fp.fileno()) + except io.UnsupportedOperation: + pass # ICC Profile crashes. blocklist = [STRIPOFFSETS, STRIPBYTECOUNTS, ROWSPERSTRIP, ICCPROFILE] From 8b0ecb6192b13066f288cc51ed3c453b70bdef50 Mon Sep 17 00:00:00 2001 From: Martin Fergie Date: Fri, 14 Nov 2014 14:37:03 +0000 Subject: [PATCH 131/532] Added test for different compression types. --- Tests/test_file_tiff.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 3939ac074..f3958f548 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -326,7 +326,34 @@ class TestFileTiff(PillowTestCase): # Should not divide by zero im.save(outfile) + def test_save_bytesio(self): + # PR 1011 + # Test TIFF saving to io.BytesIO() object. + + # Generate test image + pilim = Image.new('F', (100, 100), 0) + def save_bytesio(compression=None): + import io + + testfile = self.tempfile("temp_.tiff".format(compression)) + + buffer_io = io.BytesIO() + pilim.save(buffer_io, format="tiff", compression=compression) + buffer_io.seek(0) + data = buffer_io.read() + buffer_io.close() + with open(testfile, "wb") as fd: + fd.write(data) + + pilim_load = Image.open(testfile) + self.assert_image_similar(pilim, pilim_load, 0) + + # save_bytesio() + save_bytesio("packbits") + save_bytesio("tiff_lzw") + + if __name__ == '__main__': unittest.main() From 9a2cc7df83167f56deb5a32e02c1c487ea152260 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 15 Nov 2014 20:38:52 -0800 Subject: [PATCH 132/532] hoist import, move test to libtiff --- PIL/TiffImagePlugin.py | 2 +- Tests/test_file_libtiff.py | 32 ++++++++++++++++++++++++++++++-- Tests/test_file_tiff.py | 27 --------------------------- 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 21ff13ec6..ae7d56947 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -54,6 +54,7 @@ import sys import collections import itertools import os +import io # Set these to true to force use of libtiff for reading or writing. READ_LIBTIFF = False @@ -1128,7 +1129,6 @@ def _save(im, fp, filename): print (ifd.items()) _fp = 0 if hasattr(fp, "fileno"): - import io try: fp.seek(0) _fp = os.dup(fp.fileno()) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index efd2d5817..12f25165f 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -1,6 +1,7 @@ from helper import unittest, PillowTestCase, hopper, py3 import os +import io from PIL import Image, TiffImagePlugin @@ -59,9 +60,8 @@ class TestFileLibTiff(LibTiffTestCase): def test_g4_tiff_bytesio(self): """Testing the stringio loading code path""" - from io import BytesIO file = "Tests/images/hopper_g4_500.tif" - s = BytesIO() + s = io.BytesIO() with open(file, 'rb') as f: s.write(f.read()) s.seek(0) @@ -357,6 +357,34 @@ class TestFileLibTiff(LibTiffTestCase): self.assertEqual(im.mode, "L") self.assert_image_similar(im, original, 7.3) + def test_save_bytesio(self): + # PR 1011 + # Test TIFF saving to io.BytesIO() object. + + TiffImagePlugin.WRITE_LIBTIFF = True + TiffImagePlugin.READ_LIBTIFF = True + + # Generate test image + pilim = hopper() + + def save_bytesio(compression=None): + + testfile = self.tempfile("temp_.tiff".format(compression)) + + buffer_io = io.BytesIO() + pilim.save(buffer_io, format="tiff", compression=compression) + buffer_io.seek(0) + + pilim_load = Image.open(buffer_io) + self.assert_image_similar(pilim, pilim_load, 0) + + # save_bytesio() + save_bytesio('raw') + save_bytesio("packbits") + save_bytesio("tiff_lzw") + + TiffImagePlugin.WRITE_LIBTIFF = False + TiffImagePlugin.READ_LIBTIFF = False diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index f3958f548..fd8090196 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -326,33 +326,6 @@ class TestFileTiff(PillowTestCase): # Should not divide by zero im.save(outfile) - def test_save_bytesio(self): - # PR 1011 - # Test TIFF saving to io.BytesIO() object. - - # Generate test image - pilim = Image.new('F', (100, 100), 0) - def save_bytesio(compression=None): - import io - - testfile = self.tempfile("temp_.tiff".format(compression)) - - buffer_io = io.BytesIO() - pilim.save(buffer_io, format="tiff", compression=compression) - buffer_io.seek(0) - data = buffer_io.read() - buffer_io.close() - - with open(testfile, "wb") as fd: - fd.write(data) - - pilim_load = Image.open(testfile) - self.assert_image_similar(pilim, pilim_load, 0) - - # save_bytesio() - save_bytesio("packbits") - save_bytesio("tiff_lzw") - if __name__ == '__main__': unittest.main() From a40854499fc76095eee4cc1bda5b11ba639ae1e9 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 15 Nov 2014 21:33:21 -0800 Subject: [PATCH 133/532] Update CHANGES.rst [ci skip] --- CHANGES.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 3edc1b577..1b4826451 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,7 +3,9 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ - +- Fix for saving TIFF image into an io.BytesIO buffer #1011 + [mfergie] + - Fix antialias compilation on debug versions of Python #1010 [wiredfool] From 02476b7689085d91a1edc30e141d74e4ac41d976 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 17 Nov 2014 10:33:31 +0200 Subject: [PATCH 134/532] Remove unused variable, and other minor flake8 warnings --- Tests/test_file_libtiff.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 12f25165f..a9377bf63 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -5,6 +5,7 @@ import io from PIL import Image, TiffImagePlugin + class LibTiffTestCase(PillowTestCase): def setUp(self): @@ -32,6 +33,7 @@ class LibTiffTestCase(PillowTestCase): out = self.tempfile("temp.png") im.save(out) + class TestFileLibTiff(LibTiffTestCase): def test_g4_tiff(self): @@ -288,7 +290,7 @@ class TestFileLibTiff(LibTiffTestCase): im2 = Image.open(out) self.assert_image_equal(im, im2) - def xtest_bw_compression_wRGB(self): + def xtest_bw_compression_w_rgb(self): """ This test passes, but when running all tests causes a failure due to output on stderr from the error thrown by libtiff. We need to capture that but not now""" @@ -319,19 +321,19 @@ class TestFileLibTiff(LibTiffTestCase): # file is a multipage tiff, 10x10 green, 10x10 red, 20x20 blue im.seek(0) - self.assertEqual(im.size, (10,10)) - self.assertEqual(im.convert('RGB').getpixel((0,0)), (0,128,0)) + self.assertEqual(im.size, (10, 10)) + self.assertEqual(im.convert('RGB').getpixel((0, 0)), (0, 128, 0)) self.assertTrue(im.tag.next) im.seek(1) - self.assertEqual(im.size, (10,10)) - self.assertEqual(im.convert('RGB').getpixel((0,0)), (255,0,0)) + self.assertEqual(im.size, (10, 10)) + self.assertEqual(im.convert('RGB').getpixel((0, 0)), (255, 0, 0)) self.assertTrue(im.tag.next) im.seek(2) self.assertFalse(im.tag.next) - self.assertEqual(im.size, (20,20)) - self.assertEqual(im.convert('RGB').getpixel((0,0)), (0,0,255)) + self.assertEqual(im.size, (20, 20)) + self.assertEqual(im.convert('RGB').getpixel((0, 0)), (0, 0, 255)) TiffImagePlugin.READ_LIBTIFF = False @@ -360,7 +362,7 @@ class TestFileLibTiff(LibTiffTestCase): def test_save_bytesio(self): # PR 1011 # Test TIFF saving to io.BytesIO() object. - + TiffImagePlugin.WRITE_LIBTIFF = True TiffImagePlugin.READ_LIBTIFF = True @@ -368,26 +370,23 @@ class TestFileLibTiff(LibTiffTestCase): pilim = hopper() def save_bytesio(compression=None): - - testfile = self.tempfile("temp_.tiff".format(compression)) - + buffer_io = io.BytesIO() pilim.save(buffer_io, format="tiff", compression=compression) buffer_io.seek(0) pilim_load = Image.open(buffer_io) self.assert_image_similar(pilim, pilim_load, 0) - + # save_bytesio() save_bytesio('raw') save_bytesio("packbits") save_bytesio("tiff_lzw") - + TiffImagePlugin.WRITE_LIBTIFF = False TiffImagePlugin.READ_LIBTIFF = False - if __name__ == '__main__': unittest.main() From 513e2a12dd5108b37b9789f52d0710206a32cf28 Mon Sep 17 00:00:00 2001 From: homm Date: Wed, 19 Nov 2014 03:03:49 +0300 Subject: [PATCH 135/532] resize test rework --- Tests/test_imaging_stretch.py | 73 +++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/Tests/test_imaging_stretch.py b/Tests/test_imaging_stretch.py index aaf1a4d1d..b4e66433d 100644 --- a/Tests/test_imaging_stretch.py +++ b/Tests/test_imaging_stretch.py @@ -1,51 +1,58 @@ """ -Tests for ImagingCore.stretch functionality. +Tests for resize functionality. """ from itertools import permutations -from helper import unittest, PillowTestCase +from helper import unittest, PillowTestCase, hopper from PIL import Image -im = Image.open("Tests/images/hopper.ppm").copy() +class TestImagingCoreResize(PillowTestCase): + def resize(self, im, size, f): + # Image class independend version of resize. + im.load() + return im._new(im.im.resize(size, f)) -class TestImagingStretch(PillowTestCase): - - def stretch(self, im, size, f): - return im._new(im.im.stretch(size, f)) - - def test_modes(self): - self.assertRaises(ValueError, im.convert("1").im.stretch, - (15, 12), Image.ANTIALIAS) - self.assertRaises(ValueError, im.convert("P").im.stretch, - (15, 12), Image.ANTIALIAS) - for mode in ["L", "I", "F", "RGB", "RGBA", "CMYK", "YCbCr"]: - s = im.convert(mode).im - r = s.stretch((15, 12), Image.ANTIALIAS) + def test_nearest_mode(self): + for mode in ["1", "P", "L", "I", "F", "RGB", "RGBA", "CMYK", "YCbCr", + "I;16"]: # exotic mode + im = hopper(mode) + r = self.resize(im, (15, 12), Image.NEAREST) self.assertEqual(r.mode, mode) - self.assertEqual(r.size, (15, 12)) - self.assertEqual(r.bands, s.bands) + self.assertEqual(r.size, (15, 12) ) + self.assertEqual(r.im.bands, im.im.bands) + + def test_convolution_modes(self): + self.assertRaises(ValueError, self.resize, hopper("1"), + (15, 12), Image.BILINEAR) + self.assertRaises(ValueError, self.resize, hopper("P"), + (15, 12), Image.BILINEAR) + self.assertRaises(ValueError, self.resize, hopper("I;16"), + (15, 12), Image.BILINEAR) + for mode in ["L", "I", "F", "RGB", "RGBA", "CMYK", "YCbCr"]: + im = hopper(mode) + r = self.resize(im, (15, 12), Image.BILINEAR) + self.assertEqual(r.mode, mode) + self.assertEqual(r.size, (15, 12) ) + self.assertEqual(r.im.bands, im.im.bands) def test_reduce_filters(self): - # There is no Image.NEAREST because im.stretch implementation - # is not NEAREST for reduction. It should be removed - # or renamed to supersampling. - for f in [Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: - r = im.im.stretch((15, 12), f) + for f in [Image.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: + 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.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: - r = im.im.stretch((764, 414), f) + for f in [Image.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: + r = self.resize(hopper("RGB"), (212, 195), f) self.assertEqual(r.mode, "RGB") - self.assertEqual(r.size, (764, 414)) + self.assertEqual(r.size, (212, 195)) def test_endianness(self): # Make an image with one colored pixel, in one channel. - # When stretched, that channel should be the same as a GS image. + # When resized, that channel should be the same as a GS image. # Other channels should be unaffected. # The R and A channels should not swap, which is indicitive of # an endianness issues. @@ -57,10 +64,10 @@ class TestImagingStretch(PillowTestCase): } samples['dirty'].putpixel((1, 1), 128) - for f in [Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: + for f in [Image.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: # samples resized with current filter - resized = dict( - (name, self.stretch(ch, (4, 4), f)) + references = dict( + (name, self.resize(ch, (4, 4), f)) for name, ch in samples.items() ) @@ -72,12 +79,12 @@ class TestImagingStretch(PillowTestCase): for channels in set(permutations(channels_set)): # compile image from different channels permutations im = Image.merge(mode, [samples[ch] for ch in channels]) - stretched = self.stretch(im, (4, 4), f) + resized = self.resize(im, (4, 4), f) - for i, ch in enumerate(stretched.split()): + for i, ch in enumerate(resized.split()): # check what resized channel in image is the same # as separately resized channel - self.assert_image_equal(ch, resized[channels[i]]) + self.assert_image_equal(ch, references[channels[i]]) if __name__ == '__main__': From 24ed800fae0257c242e7c93bb3ec4e939bcf4792 Mon Sep 17 00:00:00 2001 From: homm Date: Wed, 19 Nov 2014 03:05:39 +0300 Subject: [PATCH 136/532] merge imaging and imaging core resize tests --- Tests/test_image_resize.py | 90 ++++++++++++++++++++++++++++++++- Tests/test_imaging_stretch.py | 93 ----------------------------------- 2 files changed, 88 insertions(+), 95 deletions(-) delete mode 100644 Tests/test_imaging_stretch.py diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py index 603f598d8..e14f403a3 100644 --- a/Tests/test_image_resize.py +++ b/Tests/test_image_resize.py @@ -1,5 +1,91 @@ +""" +Tests for resize functionality. +""" +from itertools import permutations + from helper import unittest, PillowTestCase, hopper +from PIL import Image + + +class TestImagingCoreResize(PillowTestCase): + + def resize(self, im, size, f): + # Image class independend version of resize. + im.load() + return im._new(im.im.resize(size, f)) + + def test_nearest_mode(self): + for mode in ["1", "P", "L", "I", "F", "RGB", "RGBA", "CMYK", "YCbCr", + "I;16"]: # exotic mode + im = hopper(mode) + r = self.resize(im, (15, 12), Image.NEAREST) + self.assertEqual(r.mode, mode) + self.assertEqual(r.size, (15, 12) ) + self.assertEqual(r.im.bands, im.im.bands) + + def test_convolution_modes(self): + self.assertRaises(ValueError, self.resize, hopper("1"), + (15, 12), Image.BILINEAR) + self.assertRaises(ValueError, self.resize, hopper("P"), + (15, 12), Image.BILINEAR) + self.assertRaises(ValueError, self.resize, hopper("I;16"), + (15, 12), Image.BILINEAR) + for mode in ["L", "I", "F", "RGB", "RGBA", "CMYK", "YCbCr"]: + im = hopper(mode) + r = self.resize(im, (15, 12), Image.BILINEAR) + self.assertEqual(r.mode, mode) + self.assertEqual(r.size, (15, 12) ) + self.assertEqual(r.im.bands, im.im.bands) + + def test_reduce_filters(self): + for f in [Image.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: + 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.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: + r = self.resize(hopper("RGB"), (212, 195), f) + self.assertEqual(r.mode, "RGB") + self.assertEqual(r.size, (212, 195)) + + def test_endianness(self): + # Make an image with one colored pixel, in one channel. + # When resized, that channel should be the same as a GS image. + # Other channels should be unaffected. + # The R and A channels should not swap, which is indicitive of + # an endianness issues. + + samples = { + 'blank': Image.new('L', (2, 2), 0), + 'filled': Image.new('L', (2, 2), 255), + 'dirty': Image.new('L', (2, 2), 0), + } + samples['dirty'].putpixel((1, 1), 128) + + for f in [Image.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: + # samples resized with current filter + references = dict( + (name, self.resize(ch, (4, 4), f)) + for name, ch in samples.items() + ) + + for mode, channels_set in [ + ('RGB', ('blank', 'filled', 'dirty')), + ('RGBA', ('blank', 'blank', 'filled', 'dirty')), + ('LA', ('filled', 'dirty')), + ]: + for channels in set(permutations(channels_set)): + # compile image from different channels permutations + im = Image.merge(mode, [samples[ch] for ch in channels]) + resized = self.resize(im, (4, 4), f) + + for i, ch in enumerate(resized.split()): + # check what resized channel in image is the same + # as separately resized channel + self.assert_image_equal(ch, references[channels[i]]) + class TestImageResize(PillowTestCase): @@ -9,8 +95,8 @@ class TestImageResize(PillowTestCase): self.assertEqual(out.mode, mode) self.assertEqual(out.size, size) for mode in "1", "P", "L", "RGB", "I", "F": - resize(mode, (100, 100)) - resize(mode, (200, 200)) + resize(mode, (112, 103)) + resize(mode, (188, 214)) if __name__ == '__main__': diff --git a/Tests/test_imaging_stretch.py b/Tests/test_imaging_stretch.py deleted file mode 100644 index b4e66433d..000000000 --- a/Tests/test_imaging_stretch.py +++ /dev/null @@ -1,93 +0,0 @@ -""" -Tests for resize functionality. -""" -from itertools import permutations - -from helper import unittest, PillowTestCase, hopper - -from PIL import Image - - -class TestImagingCoreResize(PillowTestCase): - - def resize(self, im, size, f): - # Image class independend version of resize. - im.load() - return im._new(im.im.resize(size, f)) - - def test_nearest_mode(self): - for mode in ["1", "P", "L", "I", "F", "RGB", "RGBA", "CMYK", "YCbCr", - "I;16"]: # exotic mode - im = hopper(mode) - r = self.resize(im, (15, 12), Image.NEAREST) - self.assertEqual(r.mode, mode) - self.assertEqual(r.size, (15, 12) ) - self.assertEqual(r.im.bands, im.im.bands) - - def test_convolution_modes(self): - self.assertRaises(ValueError, self.resize, hopper("1"), - (15, 12), Image.BILINEAR) - self.assertRaises(ValueError, self.resize, hopper("P"), - (15, 12), Image.BILINEAR) - self.assertRaises(ValueError, self.resize, hopper("I;16"), - (15, 12), Image.BILINEAR) - for mode in ["L", "I", "F", "RGB", "RGBA", "CMYK", "YCbCr"]: - im = hopper(mode) - r = self.resize(im, (15, 12), Image.BILINEAR) - self.assertEqual(r.mode, mode) - self.assertEqual(r.size, (15, 12) ) - self.assertEqual(r.im.bands, im.im.bands) - - def test_reduce_filters(self): - for f in [Image.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: - 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.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: - r = self.resize(hopper("RGB"), (212, 195), f) - self.assertEqual(r.mode, "RGB") - self.assertEqual(r.size, (212, 195)) - - def test_endianness(self): - # Make an image with one colored pixel, in one channel. - # When resized, that channel should be the same as a GS image. - # Other channels should be unaffected. - # The R and A channels should not swap, which is indicitive of - # an endianness issues. - - samples = { - 'blank': Image.new('L', (2, 2), 0), - 'filled': Image.new('L', (2, 2), 255), - 'dirty': Image.new('L', (2, 2), 0), - } - samples['dirty'].putpixel((1, 1), 128) - - for f in [Image.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: - # samples resized with current filter - references = dict( - (name, self.resize(ch, (4, 4), f)) - for name, ch in samples.items() - ) - - for mode, channels_set in [ - ('RGB', ('blank', 'filled', 'dirty')), - ('RGBA', ('blank', 'blank', 'filled', 'dirty')), - ('LA', ('filled', 'dirty')), - ]: - for channels in set(permutations(channels_set)): - # compile image from different channels permutations - im = Image.merge(mode, [samples[ch] for ch in channels]) - resized = self.resize(im, (4, 4), f) - - for i, ch in enumerate(resized.split()): - # check what resized channel in image is the same - # as separately resized channel - self.assert_image_equal(ch, references[channels[i]]) - - -if __name__ == '__main__': - unittest.main() - -# End of file From 6078e6e1a74c423ad0cf61d6ac11e2aac1aa01ee Mon Sep 17 00:00:00 2001 From: homm Date: Wed, 19 Nov 2014 03:15:04 +0300 Subject: [PATCH 137/532] this bug actually was in previous implementation too: type switch default case was never achieved because special images is in image8 pointers, not in image32 --- libImaging/Antialias.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/libImaging/Antialias.c b/libImaging/Antialias.c index 5c9514103..a5f0fde83 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Antialias.c @@ -208,7 +208,7 @@ ImagingStretchHorizontal(Imaging imIn, int xsize, int filter) ss += i2f(imIn->image8[yy][x]) * k[x - xmin]; imOut->image8[yy][xx] = clip8(ss); } - } else + } else { switch(imIn->type) { case IMAGING_TYPE_UINT8: /* n-bit grayscale */ @@ -283,13 +283,8 @@ ImagingStretchHorizontal(Imaging imIn, int xsize, int filter) IMAGING_PIXEL_F(imOut, xx, yy) = ss; } break; - default: - ImagingSectionLeave(&cookie); - ImagingDelete(imOut); - free(kk); - free(xbounds); - return (Imaging) ImagingError_ModeError(); } + } } ImagingSectionLeave(&cookie); free(kk); @@ -307,6 +302,9 @@ ImagingStretch(Imaging imIn, int xsize, int ysize, int filter) if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "1") == 0) return (Imaging) ImagingError_ModeError(); + if (imIn->type == IMAGING_TYPE_SPECIAL) + return (Imaging) ImagingError_ModeError(); + /* two-pass resize, first pass */ imTemp1 = ImagingStretchHorizontal(imIn, xsize, filter); if ( ! imTemp1) From 41029f0149cb91813a55b8c6217257398c53e4f8 Mon Sep 17 00:00:00 2001 From: homm Date: Wed, 19 Nov 2014 03:26:17 +0300 Subject: [PATCH 138/532] make im.stretch strong alias to im.resize. mark im.stretch as deprecated. --- _imaging.c | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/_imaging.c b/_imaging.c index 280db9fdb..fd28ef451 100644 --- a/_imaging.c +++ b/_imaging.c @@ -1626,25 +1626,6 @@ im_setmode(ImagingObject* self, PyObject* args) return Py_None; } -static PyObject* -_stretch(ImagingObject* self, PyObject* args) -{ - Imaging imIn, imOut; - - int xsize, ysize; - int filter = IMAGING_TRANSFORM_NEAREST; - if (!PyArg_ParseTuple(args, "(ii)|i", &xsize, &ysize, &filter)) - return NULL; - - imIn = self->image; - - imOut = ImagingStretch(imIn, xsize, ysize, filter); - if ( ! imOut) { - return NULL; - } - - return PyImagingNew(imOut); -} static PyObject* _transform2(ImagingObject* self, PyObject* args) @@ -3026,8 +3007,10 @@ static struct PyMethodDef methods[] = { {"rankfilter", (PyCFunction)_rankfilter, 1}, #endif {"resize", (PyCFunction)_resize, 1}, + // There was two methods for image resize before. + // Starting from 2.7 stretch is obsolete. + {"stretch", (PyCFunction)_resize, 1}, {"rotate", (PyCFunction)_rotate, 1}, - {"stretch", (PyCFunction)_stretch, 1}, {"transpose", (PyCFunction)_transpose, 1}, {"transform2", (PyCFunction)_transform2, 1}, From a86e032a1844c96c38d6c906d2726cef09373687 Mon Sep 17 00:00:00 2001 From: homm Date: Wed, 19 Nov 2014 03:41:44 +0300 Subject: [PATCH 139/532] return fresh image is no mode specified and cached version otherwise --- Tests/helper.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index c7d947414..c33660fe6 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -182,23 +182,25 @@ def tostring(im, format, **options): return out.getvalue() -def hopper(mode="RGB", cache={}): +def hopper(mode=None, cache={}): from PIL import Image - im = None - # Use caching to reduce reading from disk but so an original copy is + if mode is None: + # Always return fresh not-yet-loaded version of image. + # Operations on not-yet-loaded images is separate class of errors + # what we should catch. + return Image.open("Tests/images/hopper.ppm") + # Use caching to reduce reading from disk but so an original copy is # returned each time and the cached image isn't modified by tests # (for fast, isolated, repeatable tests). im = cache.get(mode) if im is None: - if mode == "RGB": - im = Image.open("Tests/images/hopper.ppm") - elif mode == "F": + if mode == "F": im = hopper("L").convert(mode) elif mode[:4] == "I;16": im = hopper("I").convert(mode) else: - im = hopper("RGB").convert(mode) - cache[mode] = im + im = hopper().convert(mode) + cache[mode] = im return im.copy() From 814dd3123e70eb0faff0d149a5565483b42340fa Mon Sep 17 00:00:00 2001 From: homm Date: Wed, 19 Nov 2014 11:26:02 +0300 Subject: [PATCH 140/532] fix comments --- Tests/test_image_resize.py | 2 +- _imaging.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py index e14f403a3..79816e450 100644 --- a/Tests/test_image_resize.py +++ b/Tests/test_image_resize.py @@ -11,7 +11,7 @@ from PIL import Image class TestImagingCoreResize(PillowTestCase): def resize(self, im, size, f): - # Image class independend version of resize. + # Image class independent version of resize. im.load() return im._new(im.im.resize(size, f)) diff --git a/_imaging.c b/_imaging.c index fd28ef451..97349f187 100644 --- a/_imaging.c +++ b/_imaging.c @@ -3007,8 +3007,8 @@ static struct PyMethodDef methods[] = { {"rankfilter", (PyCFunction)_rankfilter, 1}, #endif {"resize", (PyCFunction)_resize, 1}, - // There was two methods for image resize before. - // Starting from 2.7 stretch is obsolete. + // There were two methods for image resize before. + // Starting from Pillow 2.7.0 stretch is depreciated. {"stretch", (PyCFunction)_resize, 1}, {"rotate", (PyCFunction)_rotate, 1}, {"transpose", (PyCFunction)_transpose, 1}, From bc0f896a47d7b2dcd6f9fc1fff88f6a25b248f8a Mon Sep 17 00:00:00 2001 From: homm Date: Wed, 19 Nov 2014 13:59:11 +0300 Subject: [PATCH 141/532] rename Antialias and stretch to resample --- CHANGES.rst | 2 +- _imaging.c | 2 +- libImaging/Imaging.h | 2 +- libImaging/{Antialias.c => Resample.c} | 26 ++++++-------------------- setup.py | 2 +- 5 files changed, 10 insertions(+), 24 deletions(-) rename libImaging/{Antialias.c => Resample.c} (93%) diff --git a/CHANGES.rst b/CHANGES.rst index 1b4826451..45589c7d6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -18,7 +18,7 @@ Changelog (Pillow) - Use PyQt4 if it has already been imported, otherwise prefer PyQt5. #1003 [AurelienBallier] -- Speedup stretch implementation up to 2.5 times. #977 +- Speedup resample implementation up to 2.5 times. #977 [homm] - Speed up rotation by using cache aware loops, added transpose to rotations. #994 diff --git a/_imaging.c b/_imaging.c index a84350cf2..299e88662 100644 --- a/_imaging.c +++ b/_imaging.c @@ -1531,7 +1531,7 @@ _resize(ImagingObject* self, PyObject* args) a, filter, 1); } else { - imOut = ImagingStretch(imIn, xsize, ysize, filter); + imOut = ImagingResample(imIn, xsize, ysize, filter); } return PyImagingNew(imOut); diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index 694a15c21..95957bb9d 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -290,7 +290,7 @@ extern Imaging ImagingRotate( extern Imaging ImagingRotate90(Imaging imOut, Imaging imIn); extern Imaging ImagingRotate180(Imaging imOut, Imaging imIn); extern Imaging ImagingRotate270(Imaging imOut, Imaging imIn); -extern Imaging ImagingStretch(Imaging imIn, int xsize, int ysize, int filter); +extern Imaging ImagingResample(Imaging imIn, int xsize, int ysize, int filter); extern Imaging ImagingTranspose(Imaging imOut, Imaging imIn); extern Imaging ImagingTransposeToNew(Imaging imIn); extern Imaging ImagingTransformPerspective( diff --git a/libImaging/Antialias.c b/libImaging/Resample.c similarity index 93% rename from libImaging/Antialias.c rename to libImaging/Resample.c index d6b10c431..69c32beba 100644 --- a/libImaging/Antialias.c +++ b/libImaging/Resample.c @@ -2,7 +2,7 @@ * The Python Imaging Library * $Id$ * - * pilopen antialiasing support + * Pillow image resamling support * * history: * 2002-03-09 fl Created (for PIL 1.1.3) @@ -17,8 +17,6 @@ #include -/* resampling filters (from antialias.py) */ - struct filter { float (*filter)(float x); float support; @@ -42,15 +40,6 @@ static inline float antialias_filter(float x) static struct filter ANTIALIAS = { antialias_filter, 3.0 }; -static inline float nearest_filter(float x) -{ - if (-0.5 <= x && x < 0.5) - return 1.0; - return 0.0; -} - -static struct filter NEAREST = { nearest_filter, 0.5 }; - static inline float bilinear_filter(float x) { if (x < 0.0) @@ -106,7 +95,7 @@ static float inline i2f(int v) { return (float) v; } Imaging -ImagingStretchHorizontal(Imaging imIn, int xsize, int filter) +ImagingResampleHorizontal(Imaging imIn, int xsize, int filter) { ImagingSectionCookie cookie; Imaging imOut; @@ -119,9 +108,6 @@ ImagingStretchHorizontal(Imaging imIn, int xsize, int filter) /* check filter */ switch (filter) { - case IMAGING_TRANSFORM_NEAREST: - filterp = &NEAREST; - break; case IMAGING_TRANSFORM_ANTIALIAS: filterp = &ANTIALIAS; break; @@ -152,7 +138,7 @@ ImagingStretchHorizontal(Imaging imIn, int xsize, int filter) /* maximum number of coofs */ kmax = (int) ceil(support) * 2 + 1; - /* coefficient buffer (with rounding safety margin) */ + /* coefficient buffer */ kk = malloc(xsize * kmax * sizeof(float)); if ( ! kk) return (Imaging) ImagingError_MemoryError(); @@ -294,7 +280,7 @@ ImagingStretchHorizontal(Imaging imIn, int xsize, int filter) Imaging -ImagingStretch(Imaging imIn, int xsize, int ysize, int filter) +ImagingResample(Imaging imIn, int xsize, int ysize, int filter) { Imaging imTemp1, imTemp2, imTemp3; Imaging imOut; @@ -306,7 +292,7 @@ ImagingStretch(Imaging imIn, int xsize, int ysize, int filter) return (Imaging) ImagingError_ModeError(); /* two-pass resize, first pass */ - imTemp1 = ImagingStretchHorizontal(imIn, xsize, filter); + imTemp1 = ImagingResampleHorizontal(imIn, xsize, filter); if ( ! imTemp1) return NULL; @@ -317,7 +303,7 @@ ImagingStretch(Imaging imIn, int xsize, int ysize, int filter) return NULL; /* second pass */ - imTemp3 = ImagingStretchHorizontal(imTemp2, ysize, filter); + imTemp3 = ImagingResampleHorizontal(imTemp2, ysize, filter); ImagingDelete(imTemp2); if ( ! imTemp3) return NULL; diff --git a/setup.py b/setup.py index 2d8cafa34..ff50867d5 100644 --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ _IMAGING = ( "decode", "encode", "map", "display", "outline", "path") _LIB_IMAGING = ( - "Access", "AlphaComposite", "Antialias", "Bands", "BitDecode", "Blend", + "Access", "AlphaComposite", "Resample", "Bands", "BitDecode", "Blend", "Chops", "Convert", "ConvertYCbCr", "Copy", "Crc32", "Crop", "Dib", "Draw", "Effects", "EpsEncode", "File", "Fill", "Filter", "FliDecode", "Geometry", "GetBBox", "GifDecode", "GifEncode", "HexDecode", From b13a90441fbc56dd7cd06191446e54d89fb3716c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Nov 2014 11:41:46 -0800 Subject: [PATCH 142/532] Better docs explaining import _imaging failure [ci skip] --- PIL/Image.py | 10 ++++++---- docs/porting-pil-to-pillow.rst | 4 ++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 922fe36a8..d556df34c 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -55,10 +55,11 @@ except ImportError: pass try: - # If the _imaging C module is not present, you can still use - # the "open" function to identify files, but you cannot load - # them. Note that other modules should not refer to _imaging - # directly; import Image and use the Image.core variable instead. + # If the _imaging C module is not present, Pillow will not load. + # Note that other modules should not refer to _imaging directly; + # import Image and use the Image.core variable instead. + # Also note that Image.core is not a publicly documented interface, + # and should be considered private and subject to change. from PIL import _imaging as core if PILLOW_VERSION != getattr(core, 'PILLOW_VERSION', None): raise ImportError("The _imaging extension was built for another " @@ -91,6 +92,7 @@ except ImportError as v: RuntimeWarning ) # Fail here anyway. Don't let people run with a mostly broken Pillow. + # see docs/porting-pil-to-pillow.rst raise try: diff --git a/docs/porting-pil-to-pillow.rst b/docs/porting-pil-to-pillow.rst index 88a6768e9..7ad781186 100644 --- a/docs/porting-pil-to-pillow.rst +++ b/docs/porting-pil-to-pillow.rst @@ -21,3 +21,7 @@ automatically imports any file in the Python path with a name ending in :file:`ImagePlugin.py`. You will need to import your image plugin manually. +Pillow will raise an exception if the core extension can't be loaded +for any reason, including a version mismatch between the Python and +extension code. Previously PIL allowed Python only code to run if the +core extension was not available. From d823fae780221c13d0750e940cb6b7e7a445fa1b Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 19 Nov 2014 22:14:40 +0200 Subject: [PATCH 143/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 1b4826451..cc44099e8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,6 +3,10 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ + +- Better docs explaining import _imaging failure #1016 + [wiredfool] + - Fix for saving TIFF image into an io.BytesIO buffer #1011 [mfergie] From 6c85d443f49913418c770e4b2d28e07623184d0e Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Nov 2014 12:14:57 -0800 Subject: [PATCH 144/532] Build Options section [ci skip] --- docs/installation.rst | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index ac02a645c..f731c19e9 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -52,11 +52,11 @@ Many of Pillow's features require external libraries: * **libjpeg** provides JPEG functionality. - * Pillow has been tested with libjpeg versions **6b**, **8**, and **9** + * Pillow has been tested with libjpeg versions **6b**, **8**, and **9** and libjpeg-turbo version **8**. * **zlib** provides access to compressed PNGs -* **libtiff** provides group4 tiff functionality +* **libtiff** provides compressed TIFF functionality * Pillow has been tested with libtiff versions **3.x** and **4.0** @@ -93,6 +93,35 @@ line:: $ CFLAGS="-I/usr/pkg/include" pip install pillow +Build Options +------------- + +* Environment Variable: ``MAX_CONCURRENCY=n``. By default, Pillow will + use multiprocessing to build the extension in parallel. This may not + be ideal for machines that report a large number of cores compared + to the actual processor power. Set ``MAX_CONCURRENCY`` to 1 to disable + parallel building, or to a larger number to limit to that number of + parallel tasks. + +* Build flags: ``--disable-zlib``, ``--disable-jpeg``, + ``--disable-tiff``, ``--disable-freetype``, ``--disable-tcl``, + ``--disable-tk``, ``--disable-lcms``, ``--disable-webp``, + ``--disable-webpmux``, ``--disable-jpeg2000``. 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``. Require that the + corresponding feature is built. The build will raise an exception if + the libraries are not found. Webpmux (WebP metadata) relies on WebP + support. Tcl and Tk also must be used together. + +Sample Usage:: + + $ MAX_CONCURRENCY=1 python setup.py build-ext --enable-[feature] install + Linux installation ------------------ @@ -116,11 +145,6 @@ In Fedora, the command is:: $ sudo yum install python-devel -Prerequisites are installed on **Ubuntu 10.04 LTS** with:: - - $ sudo apt-get install libtiff4-dev libjpeg62-dev zlib1g-dev \ - libfreetype6-dev tcl8.5-dev tk8.5-dev python-tk - Prerequisites are installed on **Ubuntu 12.04 LTS** or **Raspian Wheezy 7.0** with:: @@ -184,7 +208,7 @@ to a specific version: :: - $ pip install --use-wheel Pillow==2.3.0 + $ pip install --use-wheel Pillow==2.6.1 FreeBSD installation --------------------- From d825c76274f6e312ba67aeef99439e6a9a7b9f7e Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Nov 2014 12:15:14 -0800 Subject: [PATCH 145/532] Updated Test/Support Matrix [ci skip] --- docs/installation.rst | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index f731c19e9..b7e79f5f1 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -246,9 +246,11 @@ current versions of Linux, OS X, and Windows. +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ |**Operating system** |**Supported**|**Tested Python versions** |**Tested Pillow versions** |**Tested processors** | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ -| Mac OS X 10.8 Mountain Lion |Yes | 2.6,2.7,3.2,3.3 | |x86-64 | +| Mac OS X 10.10 Yosemite | | | |x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ -| Mac OS X 10.7 Lion |Yes | 2.6,2.7,3.2,3.3 | 2.2.0 |x86-64 | +| Mac OS X 10.9 Mavericks |Yes | 2.7,3.4 | 2.6.1 |x86-64 | ++----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ +| Mac OS X 10.8 Mountain Lion |Yes | 2.6,2.7,3.2,3.3 | |x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Redhat Linux 6 |Yes | 2.6 | |x86 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ @@ -258,11 +260,12 @@ current versions of Linux, OS X, and Windows. +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Ubuntu Linux 10.04 LTS |Yes | 2.6 | 2.3.0 |x86,x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ -| Ubuntu Linux 12.04 LTS |Yes | 2.6,2.7,3.2,3.3,PyPy2.1 | 2.3.0 |x86,x86-64 | +| Ubuntu Linux 12.04 LTS |Yes | 2.6,2.7,3.2,3.3,PyPy2.4, | 2.6.1 |x86,x86-64 | +| | | PyPy3,v2.3 | | | | | | | | | -| | | 2.7,3.2 | 2.3.0 |ppc | +| | | 2.7,3.2 | 2.6.1 |ppc | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ -| Ubuntu Linux 13.10 |Yes | 2.7,3.2,3.3 | 2.3.0 |x86 | +| Ubuntu Linux 14.04 LTS |Yes | 2.7,3.2,3.3,3.4 | 2.3.0 |x86 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Raspian Wheezy |Yes | 2.7,3.2 | 2.3.0 |arm | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ From eedff2d59bfe9ae6a66091521fe908e4c3ebd0f7 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Nov 2014 12:49:06 -0800 Subject: [PATCH 146/532] Mode reference anchor --- docs/handbook/concepts.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/handbook/concepts.rst b/docs/handbook/concepts.rst index b5e5e44c1..61406d179 100644 --- a/docs/handbook/concepts.rst +++ b/docs/handbook/concepts.rst @@ -14,8 +14,10 @@ same dimensions and depth. To get the number and names of bands in an image, use the :py:meth:`~PIL.Image.Image.getbands` method. -Mode ----- +.. _concept-modes: + +Modes +----- The :term:`mode` of an image defines the type and depth of a pixel in the image. The current release supports the following standard modes: From d1f4633c7b729e70703945b5d9057c231d37405c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Nov 2014 12:49:27 -0800 Subject: [PATCH 147/532] Many links to mode concept anchor [ci skip] --- PIL/Image.py | 15 +++++++++------ docs/reference/Image.rst | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index d556df34c..c4f4005e9 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -804,7 +804,7 @@ class Image: use other thresholds, use the :py:meth:`~PIL.Image.Image.point` method. - :param mode: The requested mode. + :param mode: The requested mode. See: :ref:`concept-modes`. :param matrix: An optional conversion matrix. If given, this should be 4- or 16-tuple containing floating point values. :param dither: Dithering method, used when converting from @@ -2007,7 +2007,8 @@ def new(mode, size, color=0): """ Creates a new image with the given mode and size. - :param mode: The mode to use for the new image. + :param mode: The mode to use for the new image. See: + :ref:`concept-modes`. :param size: A 2-tuple, containing (width, height) in pixels. :param color: What color to use for the image. Default is black. If given, this should be a single integer or floating point value @@ -2047,7 +2048,7 @@ def frombytes(mode, size, data, decoder_name="raw", *args): :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load it. - :param mode: The image mode. + :param mode: The image mode. See: :ref:`concept-modes`. :param size: The image size. :param data: A byte buffer containing raw data for the given mode. :param decoder_name: What decoder to use. @@ -2099,7 +2100,7 @@ def frombuffer(mode, size, data, decoder_name="raw", *args): issues a warning if you do this; to disable the warning, you should provide the full set of parameters. See below for details. - :param mode: The image mode. + :param mode: The image mode. See: :ref:`concept-modes`. :param size: The image size. :param data: A bytes or other buffer object containing raw data for the given mode. @@ -2150,7 +2151,8 @@ def fromarray(obj, mode=None): :param obj: Object with array interface :param mode: Mode to use (will be determined from type if None) - :returns: An image memory. + See: :ref:`concept-modes`. + :returns: An image object. .. versionadded:: 1.1.6 """ @@ -2367,7 +2369,8 @@ def merge(mode, bands): """ Merge a set of single band images into a new multiband image. - :param mode: The mode to use for the output image. + :param mode: The mode to use for the output image. See: + :ref:`concept-modes`. :param bands: A sequence containing one single-band image for each band in the output image. All bands must have the same size. diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index 08af684d5..11d1131cb 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -164,7 +164,7 @@ Instances of the :py:class:`Image` class have the following attributes: Image mode. This is a string specifying the pixel format used by the image. Typical values are “1”, “L”, “RGB”, or “CMYK.” See - :doc:`../handbook/concepts` for a full list. + :ref:`concept-modes` for a full list. :type: :py:class:`string` From 9df3c4d67d4ac029b4c10196253d8d9a27fad5b3 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 19 Nov 2014 23:00:04 +0200 Subject: [PATCH 148/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index cc44099e8..4fe89906b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,7 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ -- Better docs explaining import _imaging failure #1016 +- Better docs explaining import _imaging failure #1016, build #1017 and mode #1018 [wiredfool] - Fix for saving TIFF image into an io.BytesIO buffer #1011 From ee6f150ef1dd73c2bf6d39dd8c64cae3d48fdc29 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Nov 2014 14:04:39 -0800 Subject: [PATCH 149/532] Docs for PyAccess, PixelAccess objects [ci skip] --- PIL/Image.py | 1 + PIL/PyAccess.py | 2 + docs/reference/PixelAccess.rst | 74 ++++++++++++++++++++++++++++++++++ docs/reference/PyAccess.rst | 38 +++++++++++++++++ docs/reference/index.rst | 2 + 5 files changed, 117 insertions(+) create mode 100644 docs/reference/PixelAccess.rst create mode 100644 docs/reference/PyAccess.rst diff --git a/PIL/Image.py b/PIL/Image.py index d556df34c..b961ae2ce 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -745,6 +745,7 @@ class Image: associated with the image. :returns: An image access object. + :rtype: :ref:`PixelAccess` or :py:class:`PIL.PyAccess` """ if self.im and self.palette and self.palette.dirty: # realize palette diff --git a/PIL/PyAccess.py b/PIL/PyAccess.py index 93aeae59e..28829051d 100644 --- a/PIL/PyAccess.py +++ b/PIL/PyAccess.py @@ -78,6 +78,8 @@ class PyAccess(object): images :param xy: The pixel coordinate, given as (x, y). + :returns: a pixel value for single band images, a tuple of + pixel values for multiband images. """ (x, y) = self.check_xy(xy) diff --git a/docs/reference/PixelAccess.rst b/docs/reference/PixelAccess.rst new file mode 100644 index 000000000..55ab8c578 --- /dev/null +++ b/docs/reference/PixelAccess.rst @@ -0,0 +1,74 @@ +.. _PixelAccess: + +:py:class:`PixelAccess` Class +============================= + +The PixelAccess class provides read and write access to +:py:class:`PIL.Image` data at a pixel level. + +.. note:: Accessing individual pixels is fairly slow. If you are looping over all of the pixels in an image, there is likely a faster way using other parts of the Pillow API. + +Example +------- + +The following script loads an image, accesses one pixel from it, then +changes it. + +.. code-block:: python + + from PIL import Image + im = Image.open('hopper.jpg') + px = im.load() + print (px[4,4]) + px[4,4] = (0,0,0) + print (px[4,4]) + +Results in the following:: + + (23, 24, 68) + (0, 0, 0) + + + +:py:class:`PixelAccess` Class +----------------------------------- + +.. class:: PixelAccess + + .. method:: __setitem__(self, xy, color): + + Modifies the pixel at x,y. The color is given as a single + numerical value for single band images, and a tuple for + multi-band images + + :param xy: The pixel coordinate, given as (x, y). + :param value: The pixel value. + + .. method:: __getitem__(self, xy): + + Returns the pixel at x,y. The pixel is returned as a single + value for single band images or a tuple for multiple band + images + + :param xy: The pixel coordinate, given as (x, y). + :returns: a pixel value for single band images, a tuple of + pixel values for multiband images. + + .. method:: putpixel(self, xy, color): + + Modifies the pixel at x,y. The color is given as a single + numerical value for single band images, and a tuple for + multi-band images + + :param xy: The pixel coordinate, given as (x, y). + :param value: The pixel value. + + .. method:: getpixel(self, xy): + + Returns the pixel at x,y. The pixel is returned as a single + value for single band images or a tuple for multiple band + images + + :param xy: The pixel coordinate, given as (x, y). + :returns: a pixel value for single band images, a tuple of + pixel values for multiband images. diff --git a/docs/reference/PyAccess.rst b/docs/reference/PyAccess.rst new file mode 100644 index 000000000..cb853f89e --- /dev/null +++ b/docs/reference/PyAccess.rst @@ -0,0 +1,38 @@ +.. py:module:: PIL.PyAccess +.. py:currentmodule:: PIL.PyAccess + +:py:mod:`PyAccess` Module +========================= + +The :py:mod:`PyAccess` module provides a CFFI/Python implementation of the :ref:`PixelAccess`. This implementation is far faster on PyPy than the PixelAccess version. + +.. note:: Accessing individual pixels is fairly slow. If you are + looping over all of the pixels in an image, there is likely + a faster way using other parts of the Pillow API. + +Example +------- + +The following script loads an image, accesses one pixel from it, then changes it. + +.. code-block:: python + + from PIL import Image + im = Image.open('hopper.jpg') + px = im.load() + print (px[4,4]) + px[4,4] = (0,0,0) + print (px[4,4]) + +Results in the following:: + + (23, 24, 68) + (0, 0, 0) + + + +:py:class:`PyAccess` Class +-------------------------- + +.. autoclass:: PIL.PyAccess.PyAccess() + :members: diff --git a/docs/reference/index.rst b/docs/reference/index.rst index 2f10b861d..73a3ecfed 100644 --- a/docs/reference/index.rst +++ b/docs/reference/index.rst @@ -28,4 +28,6 @@ Reference ExifTags OleFileIO PSDraw + PixelAccess + PyAccess ../PIL From af8588f34e82a08e94abcf37f021868ad78bb948 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Nov 2014 14:26:07 -0800 Subject: [PATCH 150/532] Docstring for Image.quantize. [ci skip] --- PIL/Image.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index d556df34c..fa6bf1031 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -939,14 +939,19 @@ class Image: return new_im def quantize(self, colors=256, method=None, kmeans=0, palette=None): + """ + Convert the image to 'P' mode with the specified number + of colors. + + :param colors: The desired number of colors, <= 256 + :param method: 0 = median cut + 1 = maximum coverage + 2 = fast octree + :param kmeans: Integer + :param palette: Quantize to the :py:class:`PIL.ImagingPalette` palette. + :returns: A new image - # methods: - # 0 = median cut - # 1 = maximum coverage - # 2 = fast octree - - # NOTE: this functionality will be moved to the extended - # quantizer interface in a later version of PIL. + """ self.load() From 962ced916d9ae8fe3d96db65f74f3b2670eeec20 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Nov 2014 14:54:43 -0800 Subject: [PATCH 151/532] Image.save docs, rename fp, link to params [ci skip] --- PIL/Image.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index d556df34c..51d2d989d 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1621,15 +1621,16 @@ class Image: Keyword options can be used to provide additional instructions to the writer. If a writer doesn't recognise an option, it is - silently ignored. The available options are described later in - this handbook. + silently ignored. The available options are described in the + :doc:`image format documentation + <../handbook/image-file-formats>` for each writer. You can use a file object instead of a filename. In this case, you must always specify the format. The file object must - implement the **seek**, **tell**, and **write** + implement the ``seek``, ``tell``, and ``write`` methods, and be opened in binary mode. - :param file: File name or file object. + :param fp: File name or file object. :param format: Optional format override. If omitted, the format to use is determined from the filename extension. If a file object was used instead of a filename, this From c770984867cfbb38124f3c803860c5b354bb84b9 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Nov 2014 15:35:01 -0800 Subject: [PATCH 152/532] Document all the save params for PNG, and their references [ci skip] --- PIL/PngImagePlugin.py | 47 +++++++++++++++++++++++----- docs/PIL.rst | 23 ++++++++++++++ docs/handbook/image-file-formats.rst | 9 ++++++ 3 files changed, 72 insertions(+), 7 deletions(-) diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index fcf27aba0..8403461be 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -149,31 +149,56 @@ class ChunkStream: return cids -# -------------------------------------------------------------------- -# Subclass of string to allow iTXt chunks to look like strings while -# keeping their extra information - class iTXt(str): + """ + Subclass of string to allow iTXt chunks to look like strings while + keeping their extra information + + """ @staticmethod def __new__(cls, text, lang, tkey): + """ + :param value: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + """ + self = str.__new__(cls, text) self.lang = lang self.tkey = tkey return self -# -------------------------------------------------------------------- -# PNG chunk container (for use with save(pnginfo=)) - class PngInfo: + """ + PNG chunk container (for use with save(pnginfo=)) + + """ def __init__(self): self.chunks = [] def add(self, cid, data): + """Appends an arbitrary chunk. Use with caution. + + :param cid: a byte string, 4 bytes long. + :param data: a byte string of the encoded data + + """ + self.chunks.append((cid, data)) def add_itxt(self, key, value, lang="", tkey="", zip=False): + """Appends an iTXt chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + :param zip: compression flag + + """ + if not isinstance(key, bytes): key = key.encode("latin-1", "strict") if not isinstance(value, bytes): @@ -191,6 +216,14 @@ class PngInfo: value) def add_text(self, key, value, zip=0): + """Appends a text chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key, text or an + :py:class:`PIL.PngImagePlugin.iTXt` instance + :param zip: compression flag + + """ if isinstance(value, iTXt): return self.add_itxt(key, value, value.lang, value.tkey, bool(zip)) diff --git a/docs/PIL.rst b/docs/PIL.rst index 8bf89c685..53a61872b 100644 --- a/docs/PIL.rst +++ b/docs/PIL.rst @@ -113,6 +113,29 @@ can be found here. :undoc-members: :show-inheritance: +:class:`PngImagePlugin.iTXt` Class +---------------------------------- + +.. autoclass:: PIL.PngImagePlugin.iTXt + :members: + :undoc-members: + :show-inheritance: + + .. method:: __new__(cls, text, lang, tkey) + + :param value: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + +:class:`PngImagePlugin.PngInfo` Class +------------------------------------- + +.. autoclass:: PIL.PngImagePlugin.PngInfo + :members: + :undoc-members: + :show-inheritance: + + :mod:`TarIO` Module ------------------- diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index a1961fa7c..f9216818d 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -332,6 +332,9 @@ The :py:meth:`~PIL.Image.Image.open` method sets the following Transparency color index. This key is omitted if the image is not a transparent palette image. +``Open`` also sets ``Image.text`` to a list of the values of the +``tEXt``, ``zTXt``, and ``iTXt`` chunks of the PNG image. + The :py:meth:`~PIL.Image.Image.save` method supports the following options: **optimize** @@ -343,6 +346,12 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: For ``P``, ``L``, and ``RGB`` images, this option controls what color image to mark as transparent. +**dpi** + A tuple of two numbers corresponding to the desired dpi in each direction. + +**pnginfo** + A :py:class:`PIL.PngImagePlugin.PngInfo` instance containing text tags. + **bits (experimental)** For ``P`` images, this option controls how many bits to store. If omitted, the PNG writer uses 8 bits (256 colors). From 176c804b3900dab3332af5cd7b714eb8a3325830 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Nov 2014 15:40:49 -0800 Subject: [PATCH 153/532] Note on info not used for saving [ci skip] --- docs/reference/Image.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index 08af684d5..d868d26c5 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -193,4 +193,6 @@ Instances of the :py:class:`Image` class have the following attributes: operation affects the dictionary. If you need the information later on, keep a reference to the info dictionary returned from the open method. + Unless noted elsewhere, this dictionary does not affect saving files. + :type: :py:class:`dict` From b8d2a55f3c7fb178b778ce5b8b328ebabefec864 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 20 Nov 2014 08:04:46 +0200 Subject: [PATCH 154/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 4fe89906b..2514bd459 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,7 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ -- Better docs explaining import _imaging failure #1016, build #1017 and mode #1018 +- Better docs explaining import _imaging failure #1016, build #1017, mode #1018, PyAccess, PixelAccess objects #1019 Image.quantize #1020 and Image.save #1021 [wiredfool] - Fix for saving TIFF image into an io.BytesIO buffer #1011 From 100309feaf59b03fa54cf637a8339b1f26abfc83 Mon Sep 17 00:00:00 2001 From: holger Date: Thu, 20 Nov 2014 23:08:58 +0100 Subject: [PATCH 155/532] [ADD] added PySide compability --- PIL/ImageQt.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/PIL/ImageQt.py b/PIL/ImageQt.py index fd662c894..35c8d5833 100644 --- a/PIL/ImageQt.py +++ b/PIL/ImageQt.py @@ -24,7 +24,11 @@ if 'PyQt4.QtGui' not in sys.modules: try: from PyQt5.QtGui import QImage, qRgba except: - from PyQt4.QtGui import QImage, qRgba + try: + from PyQt4.QtGui import QImage, qRgba + except: + from PySide.QtGui import QImage, qRgba + else: #PyQt4 is used from PyQt4.QtGui import QImage, qRgba From d0c419632e6379c15308801f01fd9852fb0b7940 Mon Sep 17 00:00:00 2001 From: homm Date: Fri, 21 Nov 2014 21:53:13 +0300 Subject: [PATCH 156/532] resolve endianness issues --- libImaging/BoxBlur.c | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 5308ecb01..020c37458 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -8,8 +8,8 @@ typedef UINT8 pixel[4]; -void -ImagingLineBoxBlur32(UINT32 *lineOut, pixel *lineIn, int lastx, int radius, int edgeA, +void inline +ImagingLineBoxBlur32(pixel *lineOut, pixel *lineIn, int lastx, int radius, int edgeA, int edgeB, UINT32 ww, UINT32 fw) { int x; @@ -28,9 +28,11 @@ ImagingLineBoxBlur32(UINT32 *lineOut, pixel *lineIn, int lastx, int radius, int bulk[2] = (acc[2] * ww) + (lineIn[left][2] + lineIn[right][2]) * fw; \ bulk[3] = (acc[3] * ww) + (lineIn[left][3] + lineIn[right][3]) * fw; - #define SAVE(bulk) \ - (UINT8)((bulk[0] + (1 << 23)) >> 24) << 0 | (UINT8)((bulk[1] + (1 << 23)) >> 24) << 8 | \ - (UINT8)((bulk[2] + (1 << 23)) >> 24) << 16 | (UINT8)((bulk[3] + (1 << 23)) >> 24) << 24 + #define SAVE(x, bulk) \ + lineOut[x][0] = (UINT8)((bulk[0] + (1 << 23)) >> 24); \ + lineOut[x][1] = (UINT8)((bulk[1] + (1 << 23)) >> 24); \ + lineOut[x][2] = (UINT8)((bulk[2] + (1 << 23)) >> 24); \ + lineOut[x][3] = (UINT8)((bulk[3] + (1 << 23)) >> 24); /* Compute acc for -1 pixel (outside of image): From "-radius-1" to "-1" get first pixel, @@ -59,21 +61,21 @@ ImagingLineBoxBlur32(UINT32 *lineOut, pixel *lineIn, int lastx, int radius, int for (x = 0; x < edgeA; x++) { MOVE_ACC(acc, 0, x + radius); ADD_FAR(bulk, acc, 0, x + radius + 1); - lineOut[x] = SAVE(bulk); + SAVE(x, bulk); } /* Subtract previous pixel from "-radius". Add pixels from radius. */ for (x = edgeA; x < edgeB; x++) { MOVE_ACC(acc, x - radius - 1, x + radius); ADD_FAR(bulk, acc, x - radius - 1, x + radius + 1); - lineOut[x] = SAVE(bulk); + SAVE(x, bulk); } /* Subtract previous pixel from "-radius". Add last pixel. */ for (x = edgeB; x <= lastx; x++) { MOVE_ACC(acc, x - radius - 1, lastx); ADD_FAR(bulk, acc, x - radius - 1, lastx); - lineOut[x] = SAVE(bulk); + SAVE(x, bulk); } } else @@ -81,17 +83,17 @@ ImagingLineBoxBlur32(UINT32 *lineOut, pixel *lineIn, int lastx, int radius, int for (x = 0; x < edgeB; x++) { MOVE_ACC(acc, 0, x + radius); ADD_FAR(bulk, acc, 0, x + radius + 1); - lineOut[x] = SAVE(bulk); + SAVE(x, bulk); } for (x = edgeB; x < edgeA; x++) { MOVE_ACC(acc, 0, lastx); ADD_FAR(bulk, acc, 0, lastx); - lineOut[x] = SAVE(bulk); + SAVE(x, bulk); } for (x = edgeA; x <= lastx; x++) { MOVE_ACC(acc, x - radius - 1, lastx); ADD_FAR(bulk, acc, x - radius - 1, lastx); - lineOut[x] = SAVE(bulk); + SAVE(x, bulk); } } @@ -101,7 +103,7 @@ ImagingLineBoxBlur32(UINT32 *lineOut, pixel *lineIn, int lastx, int radius, int } -void +void inline ImagingLineBoxBlur8(UINT8 *lineOut, UINT8 *lineIn, int lastx, int radius, int edgeA, int edgeB, UINT32 ww, UINT32 fw) { @@ -115,8 +117,8 @@ ImagingLineBoxBlur8(UINT8 *lineOut, UINT8 *lineIn, int lastx, int radius, int ed #define ADD_FAR(bulk, acc, left, right) \ bulk = (acc * ww) + (lineIn[left] + lineIn[right]) * fw; - #define SAVE(bulk) \ - (UINT8)((bulk + (1 << 23)) >> 24) + #define SAVE(x, bulk) \ + lineOut[x] = (UINT8)((bulk + (1 << 23)) >> 24) acc = lineIn[0] * (radius + 1); for (x = 0; x < edgeA - 1; x++) { @@ -129,17 +131,17 @@ ImagingLineBoxBlur8(UINT8 *lineOut, UINT8 *lineIn, int lastx, int radius, int ed for (x = 0; x < edgeA; x++) { MOVE_ACC(acc, 0, x + radius); ADD_FAR(bulk, acc, 0, x + radius + 1); - lineOut[x] = SAVE(bulk); + SAVE(x, bulk); } for (x = edgeA; x < edgeB; x++) { MOVE_ACC(acc, x - radius - 1, x + radius); ADD_FAR(bulk, acc, x - radius - 1, x + radius + 1); - lineOut[x] = SAVE(bulk); + SAVE(x, bulk); } for (x = edgeB; x <= lastx; x++) { MOVE_ACC(acc, x - radius - 1, lastx); ADD_FAR(bulk, acc, x - radius - 1, lastx); - lineOut[x] = SAVE(bulk); + SAVE(x, bulk); } } else @@ -147,17 +149,17 @@ ImagingLineBoxBlur8(UINT8 *lineOut, UINT8 *lineIn, int lastx, int radius, int ed for (x = 0; x < edgeB; x++) { MOVE_ACC(acc, 0, x + radius); ADD_FAR(bulk, acc, 0, x + radius + 1); - lineOut[x] = SAVE(bulk); + SAVE(x, bulk); } for (x = edgeB; x < edgeA; x++) { MOVE_ACC(acc, 0, lastx); ADD_FAR(bulk, acc, 0, lastx); - lineOut[x] = SAVE(bulk); + SAVE(x, bulk); } for (x = edgeA; x <= lastx; x++) { MOVE_ACC(acc, x - radius - 1, lastx); ADD_FAR(bulk, acc, x - radius - 1, lastx); - lineOut[x] = SAVE(bulk); + SAVE(x, bulk); } } @@ -210,7 +212,7 @@ ImagingHorizontalBoxBlur(Imaging imOut, Imaging imIn, float floatRadius) { for (y = 0; y < imIn->ysize; y++) { ImagingLineBoxBlur32( - imIn == imOut ? lineOut : (UINT32 *) imOut->image32[y], + imIn == imOut ? (pixel *) lineOut : (pixel *) imOut->image32[y], (pixel *) imIn->image32[y], imIn->xsize - 1, radius, edgeA, edgeB, From 107b4a8b07b153dca09b42920b1fd75c4ebce0df Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 22 Nov 2014 01:00:04 +0300 Subject: [PATCH 157/532] sharp alpha channel resolve sharp endianness issues --- Tests/test_imageops_usm.py | 5 +- libImaging/UnsharpMask.c | 128 +++++++++++++------------------------ 2 files changed, 46 insertions(+), 87 deletions(-) diff --git a/Tests/test_imageops_usm.py b/Tests/test_imageops_usm.py index d417772c8..f6eae640b 100644 --- a/Tests/test_imageops_usm.py +++ b/Tests/test_imageops_usm.py @@ -60,9 +60,10 @@ class TestImageOpsUsm(PillowTestCase): def test_usm_accuracy(self): - i = snakes._new(ImageOps.unsharp_mask(snakes, 5, 1024, 0)) + src = snakes.convert('RGB') + i = src._new(ImageOps.unsharp_mask(src, 5, 1024, 0)) # Image should not be changed because it have only 0 and 255 levels. - self.assertEqual(i.tobytes(), snakes.tobytes()) + self.assertEqual(i.tobytes(), src.tobytes()) def test_blur_accuracy(self): diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index 61526cca7..ec3bb23cc 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -10,13 +10,16 @@ #include "Imaging.h" -static inline UINT8 clip(double in) +typedef UINT8 pixel[4]; + + +static inline UINT8 clip8(int in) { - if (in >= 255.0) - return (UINT8) 255; - if (in <= 0.0) - return (UINT8) 0; - return (UINT8) (in + 0.5); + if (in >= 255) + return 255; + if (in <= 0) + return 0; + return (UINT8) in; } @@ -25,109 +28,64 @@ ImagingUnsharpMask(Imaging imOut, Imaging imIn, float radius, int percent, int threshold) { ImagingSectionCookie cookie; - Imaging result; - int channel = 0; - int channels = 0; - int hasAlpha = 0; - int x = 0; - int y = 0; + int x, y, diff; - int *lineIn = NULL; - int *lineOut = NULL; + pixel *lineIn = NULL; + pixel *lineOut = NULL; UINT8 *lineIn8 = NULL; UINT8 *lineOut8 = NULL; - int diff = 0; - - INT32 newPixel = 0; - - if (strcmp(imIn->mode, "RGB") == 0) { - channels = 3; - } else if (strcmp(imIn->mode, "RGBA") == 0) { - channels = 3; - } else if (strcmp(imIn->mode, "RGBX") == 0) { - channels = 3; - } else if (strcmp(imIn->mode, "CMYK") == 0) { - channels = 4; - } else if (strcmp(imIn->mode, "L") == 0) { - channels = 1; - } else - return ImagingError_ModeError(); - - /* first, do a gaussian blur on the image, putting results in imOut - temporarily */ + /* First, do a gaussian blur on the image, putting results in imOut + temporarily. All format checks are in gaussian blur. */ result = ImagingGaussianBlur(imOut, imIn, radius, 3); if (!result) return NULL; - /* now, go through each pixel, compare "normal" pixel to blurred - pixel. if the difference is more than threshold values, apply + /* Now, go through each pixel, compare "normal" pixel to blurred + pixel. If the difference is more than threshold values, apply the OPPOSITE correction to the amount of blur, multiplied by percent. */ ImagingSectionEnter(&cookie); - if (strcmp(imIn->mode, "RGBX") == 0 || strcmp(imIn->mode, "RGBA") == 0) { - hasAlpha = 1; - } - for (y = 0; y < imIn->ysize; y++) { - if (channels == 1) { + if (imIn->image8) + { lineIn8 = imIn->image8[y]; lineOut8 = imOut->image8[y]; - } else { - lineIn = imIn->image32[y]; - lineOut = imOut->image32[y]; - } - for (x = 0; x < imIn->xsize; x++) { - newPixel = 0; - /* compare in/out pixels, apply sharpening */ - if (channels == 1) { - diff = - ((UINT8 *) & lineIn8[x])[0] - - ((UINT8 *) & lineOut8[x])[0]; + for (x = 0; x < imIn->xsize; x++) { + /* compare in/out pixels, apply sharpening */ + diff = lineIn8[x] - lineOut8[x]; if (abs(diff) > threshold) { /* add the diff*percent to the original pixel */ - imOut->image8[y][x] = - clip((((UINT8 *) & lineIn8[x])[0]) + - (diff * ((float) percent) / 100.0)); + lineOut8[x] = clip8(lineIn8[x] + diff * percent / 100); } else { - /* newPixel is the same as imIn */ - imOut->image8[y][x] = ((UINT8 *) & lineIn8[x])[0]; + /* new pixel is the same as imIn */ + lineOut8[x] = lineIn8[x]; } } + } else { + lineIn = (pixel *)imIn->image32[y]; + lineOut = (pixel *)imOut->image32[y]; + for (x = 0; x < imIn->xsize; x++) { + /* compare in/out pixels, apply sharpening */ + diff = lineIn[x][0] - lineOut[x][0]; + lineOut[x][0] = abs(diff) > threshold ? + clip8(lineIn[x][0] + diff * percent / 100) : lineIn[x][0]; - else { - for (channel = 0; channel < channels; channel++) { - diff = (int) ((((UINT8 *) & lineIn[x])[channel]) - - (((UINT8 *) & lineOut[x])[channel])); - if (abs(diff) > threshold) { - /* add the diff*percent to the original pixel - this may not work for little-endian systems, fix it! */ - newPixel = - newPixel | - clip((float) (((UINT8 *) & lineIn[x])[channel]) - + - (diff * - (((float) percent / - 100.0)))) << (channel * 8); - } else { - /* newPixel is the same as imIn - this may not work for little-endian systems, fix it! */ - newPixel = - newPixel | ((UINT8 *) & lineIn[x])[channel] << - (channel * 8); - } - } - if (hasAlpha) { - /* preserve the alpha channel - this may not work for little-endian systems, fix it! */ - newPixel = - newPixel | ((UINT8 *) & lineIn[x])[channel] << 24; - } - imOut->image32[y][x] = newPixel; + diff = lineIn[x][1] - lineOut[x][1]; + lineOut[x][1] = abs(diff) > threshold ? + clip8(lineIn[x][1] + diff * percent / 100) : lineIn[x][1]; + + diff = lineIn[x][2] - lineOut[x][2]; + lineOut[x][2] = abs(diff) > threshold ? + clip8(lineIn[x][2] + diff * percent / 100) : lineIn[x][2]; + + diff = lineIn[x][3] - lineOut[x][3]; + lineOut[x][3] = abs(diff) > threshold ? + clip8(lineIn[x][3] + diff * percent / 100) : lineIn[x][3]; } } } From b6d8b3f950fe6fa0d4a2bc0178216395caff905b Mon Sep 17 00:00:00 2001 From: holger Date: Sat, 22 Nov 2014 09:52:23 +0100 Subject: [PATCH 158/532] [ADD] added PySide compability changes to Tests/test_imageqt.py --- Tests/test_imageqt.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Tests/test_imageqt.py b/Tests/test_imageqt.py index cd26e0038..7d57ed1d2 100644 --- a/Tests/test_imageqt.py +++ b/Tests/test_imageqt.py @@ -7,8 +7,11 @@ except: try: from PyQt4.QtGui import QImage, qRgb, qRgba except: - # Will be skipped in setUp - pass + try: + from PySide.QtGui import QImage, qRgb, qRgba + except: + # Will be skipped in setUp + pass class TestImageQt(PillowTestCase): @@ -20,7 +23,10 @@ class TestImageQt(PillowTestCase): try: from PyQt4.QtGui import QImage, qRgb, qRgba except: - self.skipTest('PyQt4 or 5 not installed') + try: + from PySide.QtGui import QImage, qRgb, qRgba + except: + self.skipTest('PyQt4 or 5 or PySide not installed') def test_rgb(self): # from https://qt-project.org/doc/qt-4.8/qcolor.html From 2c14d0836cb4053928089538116b7e51b59ce4e6 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 27 Nov 2014 10:23:05 -0800 Subject: [PATCH 159/532] Update CHANGES.rst [ci skip] --- CHANGES.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 2514bd459..ac3970eb4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,6 +3,8 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Replace Gaussian Blur implementation with iterated fast box blur. #961 Note: Radius parameter is interpreted differently than before. + [homm] - Better docs explaining import _imaging failure #1016, build #1017, mode #1018, PyAccess, PixelAccess objects #1019 Image.quantize #1020 and Image.save #1021 [wiredfool] From 9d14ae4fa4aabe3f3ca4ee90140be944d89e765b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 27 Nov 2014 10:28:28 -0800 Subject: [PATCH 160/532] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 618fc4815..972be2845 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,6 +3,9 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Replace affine-based im.resize implementation with convolution-based im.stretch #997 + [homm] + - Replace Gaussian Blur implementation with iterated fast box blur. #961 Note: Radius parameter is interpreted differently than before. [homm] From 8593cd2d026cafb1ebdb1055587c0e4e8a88ccad Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 27 Nov 2014 10:33:19 -0800 Subject: [PATCH 161/532] Update CHANGES.rst [ci skip] --- CHANGES.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 972be2845..fe13825a2 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,6 +3,10 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ + +- Use PySide as an alernative to PyQt4/5. + [holg] + - Replace affine-based im.resize implementation with convolution-based im.stretch #997 [homm] From 6d1dda76bb20bc2e9eed16bf3e873098529dfc2f Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 27 Nov 2014 10:38:30 -0800 Subject: [PATCH 162/532] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index fe13825a2..715d39896 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- The GIF Palette optimization algorithm is only applicable to mode='P' or 'L' #993 + [moriyoshi] + - Use PySide as an alernative to PyQt4/5. [holg] From c859e3bf40617969f2e820c3dfeab9be4c51b947 Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 27 Nov 2014 21:43:45 +0200 Subject: [PATCH 163/532] Some landscape.io fixes --- PIL/ImageOps.py | 1 - PIL/ImageQt.py | 12 ++++++------ Tests/test_box_blur.py | 6 ++++++ Tests/test_file_gif.py | 6 +++--- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/PIL/ImageOps.py b/PIL/ImageOps.py index 30377dc62..a1706875d 100644 --- a/PIL/ImageOps.py +++ b/PIL/ImageOps.py @@ -20,7 +20,6 @@ from PIL import Image from PIL._util import isStringType import operator -import math from functools import reduce diff --git a/PIL/ImageQt.py b/PIL/ImageQt.py index 35c8d5833..22ee2ea8f 100644 --- a/PIL/ImageQt.py +++ b/PIL/ImageQt.py @@ -21,16 +21,16 @@ from PIL._util import isPath import sys if 'PyQt4.QtGui' not in sys.modules: - try: - from PyQt5.QtGui import QImage, qRgba - except: try: - from PyQt4.QtGui import QImage, qRgba + from PyQt5.QtGui import QImage, qRgba except: - from PySide.QtGui import QImage, qRgba + try: + from PyQt4.QtGui import QImage, qRgba + except: + from PySide.QtGui import QImage, qRgba else: #PyQt4 is used - from PyQt4.QtGui import QImage, qRgba + from PyQt4.QtGui import QImage, qRgba ## # (Internal) Turns an RGB color into a Qt compatible color integer. diff --git a/Tests/test_box_blur.py b/Tests/test_box_blur.py index 17fd0bac1..8c52054a2 100644 --- a/Tests/test_box_blur.py +++ b/Tests/test_box_blur.py @@ -227,3 +227,9 @@ class TestBoxBlur(PillowTestCase): passes=3, delta=1, ) + + +if __name__ == '__main__': + unittest.main() + +# End of file diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 57cd71ac6..1046c166d 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -30,9 +30,9 @@ class TestFileGif(PillowTestCase): def test_grayscale(optimize): im = Image.new("L", (1, 1), 0) - file = BytesIO() - im.save(file, "GIF", optimize=optimize) - return len(file.getvalue()) + filename = BytesIO() + im.save(filename, "GIF", optimize=optimize) + return len(filename.getvalue()) def test_bilevel(optimize): im = Image.new("1", (1, 1), 0) From 43d5d06ce4269e8ccc045f60c1bd419d67ccac4f Mon Sep 17 00:00:00 2001 From: homm Date: Fri, 28 Nov 2014 01:41:56 +0300 Subject: [PATCH 164/532] rename Image.ANTIALIAS to Image.LANCZOS --- PIL/IcoImagePlugin.py | 2 +- PIL/Image.py | 19 +++++++++---------- Tests/test_file_gif.py | 2 +- Tests/test_file_ico.py | 8 ++++---- Tests/test_image_resize.py | 6 +++--- docs/handbook/concepts.rst | 2 +- docs/reference/Image.rst | 2 +- libImaging/Imaging.h | 2 +- libImaging/Resample.c | 10 +++++----- 9 files changed, 26 insertions(+), 27 deletions(-) diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index 145816094..db8cec0ca 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -62,7 +62,7 @@ def _save(im, fp, filename): image_io = BytesIO() tmp = im.copy() - tmp.thumbnail(size, Image.ANTIALIAS) + tmp.thumbnail(size, Image.LANCZOS) tmp.save(image_io, "png") image_io.seek(0) image_bytes = image_io.read() diff --git a/PIL/Image.py b/PIL/Image.py index 5cf262668..37cee9e07 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -162,11 +162,10 @@ QUAD = 3 MESH = 4 # resampling filters -NONE = 0 -NEAREST = 0 -ANTIALIAS = 1 # 3-lobed lanczos -LINEAR = BILINEAR = 2 -CUBIC = BICUBIC = 3 +NEAREST = NONE = 0 +LANCZOS = ANTIALIAS = 1 +BILINEAR = LINEAR = 2 +BICUBIC = CUBIC = 3 # dithers NONE = 0 @@ -1525,13 +1524,13 @@ class Image: one of :py:attr:`PIL.Image.NEAREST` (use nearest neighbour), :py:attr:`PIL.Image.BILINEAR` (linear interpolation), :py:attr:`PIL.Image.BICUBIC` (cubic spline interpolation), or - :py:attr:`PIL.Image.ANTIALIAS` (a high-quality downsampling filter). + :py:attr:`PIL.Image.LANCZOS` (a high-quality downsampling filter). If omitted, or if the image has mode "1" or "P", it is set :py:attr:`PIL.Image.NEAREST`. :returns: An :py:class:`~PIL.Image.Image` object. """ - if resample not in (NEAREST, BILINEAR, BICUBIC, ANTIALIAS): + if resample not in (NEAREST, BILINEAR, BICUBIC, LANCZOS): raise ValueError("unknown resampling filter") self.load() @@ -1753,7 +1752,7 @@ class Image: """ return 0 - def thumbnail(self, size, resample=ANTIALIAS): + def thumbnail(self, size, resample=LANCZOS): """ Make this image into a thumbnail. This method modifies the image to contain a thumbnail version of itself, no larger than @@ -1770,8 +1769,8 @@ class Image: :param size: Requested size. :param resample: Optional resampling filter. This can be one of :py:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BILINEAR`, - :py:attr:`PIL.Image.BICUBIC`, or :py:attr:`PIL.Image.ANTIALIAS`. - If omitted, it defaults to :py:attr:`PIL.Image.ANTIALIAS`. + :py:attr:`PIL.Image.BICUBIC`, or :py:attr:`PIL.Image.LANCZOS`. + If omitted, it defaults to :py:attr:`PIL.Image.LANCZOS`. (was :py:attr:`PIL.Image.NEAREST` prior to version 2.5.0) :returns: None """ diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 1046c166d..2ce728801 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -77,7 +77,7 @@ class TestFileGif(PillowTestCase): im = Image.open(TEST_GIF) im = im.convert('RGB') - im = im.resize((100, 100), Image.ANTIALIAS) + im = im.resize((100, 100), Image.LANCZOS) im2 = im.convert('P', palette=Image.ADAPTIVE, colors=256) f = self.tempfile('temp.gif') diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 01d3f5904..4f53fe1c1 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -30,7 +30,7 @@ class TestFileIco(PillowTestCase): self.assertEqual(im.mode, reloaded.mode) self.assertEqual((64, 64), reloaded.size) self.assertEqual(reloaded.format, "ICO") - self.assert_image_equal(reloaded, hopper().resize((64,64), Image.ANTIALIAS)) + self.assert_image_equal(reloaded, hopper().resize((64,64), Image.LANCZOS)) # the other one output.seek(0) @@ -40,9 +40,9 @@ class TestFileIco(PillowTestCase): self.assertEqual(im.mode, reloaded.mode) self.assertEqual((32, 32), reloaded.size) self.assertEqual(reloaded.format, "ICO") - self.assert_image_equal(reloaded, hopper().resize((32,32), Image.ANTIALIAS)) - - + self.assert_image_equal(reloaded, hopper().resize((32,32), Image.LANCZOS)) + + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py index 79816e450..9cd85d1b1 100644 --- a/Tests/test_image_resize.py +++ b/Tests/test_image_resize.py @@ -39,13 +39,13 @@ class TestImagingCoreResize(PillowTestCase): self.assertEqual(r.im.bands, im.im.bands) def test_reduce_filters(self): - for f in [Image.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: + for f in [Image.LINEAR, Image.BILINEAR, 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.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: + for f in [Image.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.LANCZOS]: r = self.resize(hopper("RGB"), (212, 195), f) self.assertEqual(r.mode, "RGB") self.assertEqual(r.size, (212, 195)) @@ -64,7 +64,7 @@ class TestImagingCoreResize(PillowTestCase): } samples['dirty'].putpixel((1, 1), 128) - for f in [Image.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.ANTIALIAS]: + for f in [Image.LINEAR, Image.BILINEAR, Image.BICUBIC, Image.LANCZOS]: # samples resized with current filter references = dict( (name, self.resize(ch, (4, 4), f)) diff --git a/docs/handbook/concepts.rst b/docs/handbook/concepts.rst index f374984fc..fb97fe098 100644 --- a/docs/handbook/concepts.rst +++ b/docs/handbook/concepts.rst @@ -100,7 +100,7 @@ pixel, the Python Imaging Library provides four different resampling *filters*. For other transformations cubic interpolation over a 4x4 environment in the input image is used. -``ANTIALIAS`` +``LANCZOS`` Calculate the output pixel value using a high-quality Lanczos filter (a truncated sinc) on all pixels that may contribute to the output value. In the current version of PIL, this filter can only be used with the resize diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index 3a4eb4dac..2617bc2bf 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -41,7 +41,7 @@ Create thumbnails for infile in glob.glob("*.jpg"): file, ext = os.path.splitext(infile) im = Image.open(infile) - im.thumbnail(size, Image.ANTIALIAS) + im.thumbnail(size) im.save(file + ".thumbnail", "JPEG") Functions diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index ce20b26b3..4a2c650ed 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -229,7 +229,7 @@ extern void ImagingError_Clear(void); /* standard filters */ #define IMAGING_TRANSFORM_NEAREST 0 -#define IMAGING_TRANSFORM_ANTIALIAS 1 +#define IMAGING_TRANSFORM_LANCZOS 1 #define IMAGING_TRANSFORM_BILINEAR 2 #define IMAGING_TRANSFORM_BICUBIC 3 diff --git a/libImaging/Resample.c b/libImaging/Resample.c index 69c32beba..a87f2db83 100644 --- a/libImaging/Resample.c +++ b/libImaging/Resample.c @@ -30,15 +30,15 @@ static inline float sinc_filter(float x) return sin(x) / x; } -static inline float antialias_filter(float x) +static inline float lanczos_filter(float x) { - /* lanczos (truncated sinc) */ + /* truncated sinc */ if (-3.0 <= x && x < 3.0) return sinc_filter(x) * sinc_filter(x/3); return 0.0; } -static struct filter ANTIALIAS = { antialias_filter, 3.0 }; +static struct filter LANCZOS = { lanczos_filter, 3.0 }; static inline float bilinear_filter(float x) { @@ -108,8 +108,8 @@ ImagingResampleHorizontal(Imaging imIn, int xsize, int filter) /* check filter */ switch (filter) { - case IMAGING_TRANSFORM_ANTIALIAS: - filterp = &ANTIALIAS; + case IMAGING_TRANSFORM_LANCZOS: + filterp = &LANCZOS; break; case IMAGING_TRANSFORM_BILINEAR: filterp = &BILINEAR; From 90658af48dccad0d9f14c83964f5669cda164e12 Mon Sep 17 00:00:00 2001 From: homm Date: Sat, 29 Nov 2014 03:58:52 +0300 Subject: [PATCH 165/532] new section framework --- docs/index.rst | 1 + docs/releasenotes/2.7.rst | 39 +++++++++++++++++++++++++++++++++++++ docs/releasenotes/index.rst | 7 +++++++ 3 files changed, 47 insertions(+) create mode 100644 docs/releasenotes/2.7.rst create mode 100644 docs/releasenotes/index.rst diff --git a/docs/index.rst b/docs/index.rst index 16e450856..4351438de 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -29,6 +29,7 @@ To install Pillow, please follow the :doc:`installation instructions Date: Sat, 29 Nov 2014 23:04:51 +0300 Subject: [PATCH 166/532] chapters: Antialias renamed to Lanczos Default filter for thumbnails Image transposing --- docs/releasenotes/2.7.rst | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/docs/releasenotes/2.7.rst b/docs/releasenotes/2.7.rst index 2f4581c25..9e762e1df 100644 --- a/docs/releasenotes/2.7.rst +++ b/docs/releasenotes/2.7.rst @@ -10,6 +10,18 @@ Bicubic and Bilinear downscalling Antialias renamed to Lanczos ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +New :py:attr:`PIL.Image.LANCZOS` constant was added instead of +:py:attr:`PIL.Image.ANTIALIAS`. + +When :py:attr:`~PIL.Image.ANTIALIAS` was initially added, it was the only +high-qality filter based on convolutions. It's name was supposed to reflect +this. Starting from 2.7 all resize method are based on convolutions. All of them +are antialias from now. And the real name of :py:attr:`~PIL.Image.ANTIALIAS` +filter is Lanczos filter. + +:py:attr:`~PIL.Image.ANTIALIAS` constant is leaved for backward compatibility +and is an alias for :py:attr:`~PIL.Image.LANCZOS`. + Lanczos upscaling quality ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -22,9 +34,28 @@ Resize performance Default filter for thumbnails ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In Pillow 2.5 default filter for :py:meth:`~PIL.Image.Image.thumbnail` was +changed from :py:attr:`~PIL.Image.NEAREST` to :py:attr:`~PIL.Image.ANTIALIAS`. +Antialias was chosen because all other filters gave poor quality for reduction. +Starting from Pillow 2.7 :py:attr:`~PIL.Image.ANTIALIAS` replaced with +:py:attr:`~PIL.Image.BICUBIC`, because bicubic is faster and +:py:attr:`~PIL.Image.ANTIALIAS` doesn't give any advantages after +downscaling with libJPEG, which uses supersampling internaly, not convolutions. + Image transposing ----------------- +New method :py:attr:`PIL.Image.TRANSPOSE` was added for +:py:meth:`~PIL.Image.Image.transpose` operation in addition to +:py:attr:`~PIL.Image.FLIP_LEFT_RIGHT`, :py:attr:`~PIL.Image.FLIP_TOP_BOTTOM`, +:py:attr:`~PIL.Image.ROTATE_90`, :py:attr:`~PIL.Image.ROTATE_180`, +:py:attr:`~PIL.Image.ROTATE_270`. :py:attr:`~PIL.Image.TRANSPOSE` is algebra +transpose, when image reflected over its main diagonal. + +Speed of :py:attr:`~PIL.Image.ROTATE_90`, :py:attr:`~PIL.Image.ROTATE_270` +and :py:attr:`~PIL.Image.TRANSPOSE` was significantly improved for large images, +which doesn't fit in processor cache. + Gaussian blur and unsharp mask ------------------------------ From b183f50ebcd01b5b3e7e08ec8df5c2d3aeca0569 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 30 Nov 2014 03:09:39 +0300 Subject: [PATCH 167/532] chapters: Image resizing filters Bicubic and Bilinear downscaling Lanczos upscaling quality Bicubic upscaling quality --- docs/releasenotes/2.7.rst | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/docs/releasenotes/2.7.rst b/docs/releasenotes/2.7.rst index 9e762e1df..97c57e1b0 100644 --- a/docs/releasenotes/2.7.rst +++ b/docs/releasenotes/2.7.rst @@ -4,14 +4,36 @@ Pillow 2.7 Image resizing filters ---------------------- -Bicubic and Bilinear downscalling +Image resizing methods :py:meth:`~PIL.Image.Image.resize` and +:py:meth:`~PIL.Image.Image.thumbnail` takes `resample` argument, which tells +what filter should be used for resampling. Possible values are: +:py:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BILINEAR`, +:py:attr:`PIL.Image.BICUBIC` and :py:attr:`PIL.Image.ANTIALIAS`. +Almost all of them was changed in this version. + +Bicubic and Bilinear downscaling ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +From very begining :py:attr:`~PIL.Image.BILINEAR` and +:py:attr:`~PIL.Image.BICUBIC` filters was based on afine transformations +and uses fixed number of pixels from source image for every destination pixel +(that was 2x2 pixels for :py:attr:`~PIL.Image.BILINEAR` and 4x4 for +:py:attr:`~PIL.Image.BICUBIC`). This gave an unsatisfied result for downscaling. +At the same time high quality convolutions-based algorithm with flexeible kernel +was used for :py:attr:`~PIL.Image.ANTIALIAS` filter). + +Starting from 2.7 high quality convolutions-based algorithm is used for all of +these three filters. + +If you have previously used any tricks to maintain quality when downscaling with +:py:attr:`~PIL.Image.BILINEAR` and :py:attr:`~PIL.Image.BICUBIC` filters +(for example, reducing within several steps), they a unnecessary now. + Antialias renamed to Lanczos ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ New :py:attr:`PIL.Image.LANCZOS` constant was added instead of -:py:attr:`PIL.Image.ANTIALIAS`. +:py:attr:`~PIL.Image.ANTIALIAS`. When :py:attr:`~PIL.Image.ANTIALIAS` was initially added, it was the only high-qality filter based on convolutions. It's name was supposed to reflect @@ -25,9 +47,16 @@ and is an alias for :py:attr:`~PIL.Image.LANCZOS`. Lanczos upscaling quality ^^^^^^^^^^^^^^^^^^^^^^^^^ +Image upscaling quality with :py:attr:`PIL.Image.LANCZOS` filter was almost +the same as :py:attr:`PIL.Image.BILINEAR` due to bug. This was fixed. + Bicubic upscaling quality ^^^^^^^^^^^^^^^^^^^^^^^^^ +:py:attr:`~PIL.Image.BICUBIC` filter for affine trnsformations was producing +sharp, slightly pixelated image for upscaling. Bicubic for convolutions is +more soft. + Resize performance ^^^^^^^^^^^^^^^^^^ From ca108113ba9735af19e5ddd572d79b2ea28e1635 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 30 Nov 2014 20:31:33 +0300 Subject: [PATCH 168/532] chapters: Resize performance --- docs/releasenotes/2.7.rst | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/2.7.rst b/docs/releasenotes/2.7.rst index 97c57e1b0..c9fd9e7af 100644 --- a/docs/releasenotes/2.7.rst +++ b/docs/releasenotes/2.7.rst @@ -47,8 +47,8 @@ and is an alias for :py:attr:`~PIL.Image.LANCZOS`. Lanczos upscaling quality ^^^^^^^^^^^^^^^^^^^^^^^^^ -Image upscaling quality with :py:attr:`PIL.Image.LANCZOS` filter was almost -the same as :py:attr:`PIL.Image.BILINEAR` due to bug. This was fixed. +Image upscaling quality with :py:attr:`~PIL.Image.LANCZOS` filter was almost +the same as :py:attr:`~PIL.Image.BILINEAR` due to bug. This was fixed. Bicubic upscaling quality ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -60,6 +60,21 @@ more soft. Resize performance ^^^^^^^^^^^^^^^^^^ +In most cases convolution is more expensive algorithm for downscaling because +it tekes in account all pixels of source image. Therefore +:py:attr:`~PIL.Image.BILINEAR` and :py:attr:`~PIL.Image.BICUBIC` filters +performance can be lower than before. On the other hand quality of +:py:attr:`~PIL.Image.BILINEAR` and :py:attr:`~PIL.Image.BICUBIC` was close to +:py:attr:`~PIL.Image.NEAREST`. So if such quality is suitable for your task +you can switch to :py:attr:`~PIL.Image.NEAREST` filter for downscaling, +that will give huge win in performance. + +At the same time performance of convolution resampling for downscaling was +improved in about two times compared to previous version. +Upscaling performance of :py:attr:`~PIL.Image.LANCZOS` filter remained the same. +For :py:attr:`~PIL.Image.BILINEAR` filter it grew in 1.5 times and +for :py:attr:`~PIL.Image.BICUBIC` in 4 times. + Default filter for thumbnails ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -67,7 +82,7 @@ In Pillow 2.5 default filter for :py:meth:`~PIL.Image.Image.thumbnail` was changed from :py:attr:`~PIL.Image.NEAREST` to :py:attr:`~PIL.Image.ANTIALIAS`. Antialias was chosen because all other filters gave poor quality for reduction. Starting from Pillow 2.7 :py:attr:`~PIL.Image.ANTIALIAS` replaced with -:py:attr:`~PIL.Image.BICUBIC`, because bicubic is faster and +:py:attr:`~PIL.Image.BICUBIC`, because it faster and :py:attr:`~PIL.Image.ANTIALIAS` doesn't give any advantages after downscaling with libJPEG, which uses supersampling internaly, not convolutions. From c830b1ffcb4abb9b3b7f8e0c5064994b5eed5253 Mon Sep 17 00:00:00 2001 From: homm Date: Mon, 1 Dec 2014 02:18:11 +0300 Subject: [PATCH 169/532] Gaussian blur and unsharp mask chapters --- docs/releasenotes/2.7.rst | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/docs/releasenotes/2.7.rst b/docs/releasenotes/2.7.rst index c9fd9e7af..001ce831f 100644 --- a/docs/releasenotes/2.7.rst +++ b/docs/releasenotes/2.7.rst @@ -103,12 +103,42 @@ which doesn't fit in processor cache. Gaussian blur and unsharp mask ------------------------------ +:py:meth:`~PIL.ImageFilter.GaussianBlur` implementation was replaced with +sequential applying of series of box filters. New implementation is based on +"Theoretical foundations of Gaussian convolution by extended box filtering" from +Mathematical Image Analysis Group. As :py:meth:`~PIL.ImageFilter.UnsharpMask` +implementations uses Gaussian blur internally, all changes from this chapter +alse applyable to it. + Blur radius ^^^^^^^^^^^ +There was an error in previous version of PIL, when blur radius (the standard +deviation of Gaussian) is actually meant blur diameter. +For example for blurring image with actual radius 5 you were forced +to use value 10. This was fixed. For now the meaning of the radius +is the same as in other software. + +If you used a Gaussian blur with some radius value, you need to devide this +value by two. + Blur Performance ^^^^^^^^^^^^^^^^ +Box filter computation time is constant relative to the radius and depends +on source image size only. Because new Gaussian blur implementation +is based on box filter, it's computation time is also doesn't depends on blur +radius. + +If before execution time for the same test image was 1 second for radius 1, +3.6 seconds for radius 10, 17 seconds for 50. Now blur with any radius on same +image is executed for 0.2 seconds. + Blur quality ^^^^^^^^^^^^ +Previous implementation takes in account only source pixels within +2 * standard deviation radius for every destination pixel. This was not enought, +so qulity was worse compared to other Gaussian blur software. + +The new implementation does not have this drawback. From b0152e1e5b4c4bd1ee381f5b2f2b220296b0532c Mon Sep 17 00:00:00 2001 From: homm Date: Mon, 1 Dec 2014 02:23:31 +0300 Subject: [PATCH 170/532] fix spelling --- docs/releasenotes/2.7.rst | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/releasenotes/2.7.rst b/docs/releasenotes/2.7.rst index 001ce831f..8b6daab6c 100644 --- a/docs/releasenotes/2.7.rst +++ b/docs/releasenotes/2.7.rst @@ -15,11 +15,11 @@ Bicubic and Bilinear downscaling ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From very begining :py:attr:`~PIL.Image.BILINEAR` and -:py:attr:`~PIL.Image.BICUBIC` filters was based on afine transformations +:py:attr:`~PIL.Image.BICUBIC` filters was based on affine transformations and uses fixed number of pixels from source image for every destination pixel (that was 2x2 pixels for :py:attr:`~PIL.Image.BILINEAR` and 4x4 for :py:attr:`~PIL.Image.BICUBIC`). This gave an unsatisfied result for downscaling. -At the same time high quality convolutions-based algorithm with flexeible kernel +At the same time high quality convolutions-based algorithm with flexible kernel was used for :py:attr:`~PIL.Image.ANTIALIAS` filter). Starting from 2.7 high quality convolutions-based algorithm is used for all of @@ -36,7 +36,7 @@ New :py:attr:`PIL.Image.LANCZOS` constant was added instead of :py:attr:`~PIL.Image.ANTIALIAS`. When :py:attr:`~PIL.Image.ANTIALIAS` was initially added, it was the only -high-qality filter based on convolutions. It's name was supposed to reflect +high-quality filter based on convolutions. It's name was supposed to reflect this. Starting from 2.7 all resize method are based on convolutions. All of them are antialias from now. And the real name of :py:attr:`~PIL.Image.ANTIALIAS` filter is Lanczos filter. @@ -53,7 +53,7 @@ the same as :py:attr:`~PIL.Image.BILINEAR` due to bug. This was fixed. Bicubic upscaling quality ^^^^^^^^^^^^^^^^^^^^^^^^^ -:py:attr:`~PIL.Image.BICUBIC` filter for affine trnsformations was producing +:py:attr:`~PIL.Image.BICUBIC` filter for affine transformations produced sharp, slightly pixelated image for upscaling. Bicubic for convolutions is more soft. @@ -61,7 +61,7 @@ Resize performance ^^^^^^^^^^^^^^^^^^ In most cases convolution is more expensive algorithm for downscaling because -it tekes in account all pixels of source image. Therefore +it takes in account all pixels of source image. Therefore :py:attr:`~PIL.Image.BILINEAR` and :py:attr:`~PIL.Image.BICUBIC` filters performance can be lower than before. On the other hand quality of :py:attr:`~PIL.Image.BILINEAR` and :py:attr:`~PIL.Image.BICUBIC` was close to @@ -84,7 +84,7 @@ Antialias was chosen because all other filters gave poor quality for reduction. Starting from Pillow 2.7 :py:attr:`~PIL.Image.ANTIALIAS` replaced with :py:attr:`~PIL.Image.BICUBIC`, because it faster and :py:attr:`~PIL.Image.ANTIALIAS` doesn't give any advantages after -downscaling with libJPEG, which uses supersampling internaly, not convolutions. +downscaling with libJPEG, which uses supersampling internally, not convolutions. Image transposing ----------------- @@ -108,7 +108,7 @@ sequential applying of series of box filters. New implementation is based on "Theoretical foundations of Gaussian convolution by extended box filtering" from Mathematical Image Analysis Group. As :py:meth:`~PIL.ImageFilter.UnsharpMask` implementations uses Gaussian blur internally, all changes from this chapter -alse applyable to it. +also applicable to it. Blur radius ^^^^^^^^^^^ @@ -119,7 +119,7 @@ For example for blurring image with actual radius 5 you were forced to use value 10. This was fixed. For now the meaning of the radius is the same as in other software. -If you used a Gaussian blur with some radius value, you need to devide this +If you used a Gaussian blur with some radius value, you need to divide this value by two. Blur Performance @@ -138,7 +138,7 @@ Blur quality ^^^^^^^^^^^^ Previous implementation takes in account only source pixels within -2 * standard deviation radius for every destination pixel. This was not enought, -so qulity was worse compared to other Gaussian blur software. +2 * standard deviation radius for every destination pixel. This was not enough, +so quality was worse compared to other Gaussian blur software. The new implementation does not have this drawback. From 05b578e7f40cd3fedf0b2f19bbc887c11e891e3b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 1 Dec 2014 20:40:10 -0800 Subject: [PATCH 171/532] Fix for building on OSX/Clang. --- libImaging/BoxBlur.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 020c37458..8b6ebcf7e 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -8,7 +8,7 @@ typedef UINT8 pixel[4]; -void inline +void static inline ImagingLineBoxBlur32(pixel *lineOut, pixel *lineIn, int lastx, int radius, int edgeA, int edgeB, UINT32 ww, UINT32 fw) { @@ -103,7 +103,7 @@ ImagingLineBoxBlur32(pixel *lineOut, pixel *lineIn, int lastx, int radius, int e } -void inline +void static inline ImagingLineBoxBlur8(UINT8 *lineOut, UINT8 *lineIn, int lastx, int radius, int edgeA, int edgeB, UINT32 ww, UINT32 fw) { From 806c06f49f8d769cb93a1b0acaeac83e6e69a5c3 Mon Sep 17 00:00:00 2001 From: homm Date: Fri, 28 Nov 2014 04:21:03 +0300 Subject: [PATCH 172/532] use less expensive BICUBIC resampling --- PIL/Image.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 37cee9e07..98e3644c0 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -59,7 +59,7 @@ try: # Note that other modules should not refer to _imaging directly; # import Image and use the Image.core variable instead. # Also note that Image.core is not a publicly documented interface, - # and should be considered private and subject to change. + # and should be considered private and subject to change. from PIL import _imaging as core if PILLOW_VERSION != getattr(core, 'PILLOW_VERSION', None): raise ImportError("The _imaging extension was built for another " @@ -744,7 +744,7 @@ class Image: associated with the image. :returns: An image access object. - :rtype: :ref:`PixelAccess` or :py:class:`PIL.PyAccess` + :rtype: :ref:`PixelAccess` or :py:class:`PIL.PyAccess` """ if self.im and self.palette and self.palette.dirty: # realize palette @@ -942,14 +942,14 @@ class Image: """ Convert the image to 'P' mode with the specified number of colors. - + :param colors: The desired number of colors, <= 256 :param method: 0 = median cut 1 = maximum coverage 2 = fast octree :param kmeans: Integer :param palette: Quantize to the :py:class:`PIL.ImagingPalette` palette. - :returns: A new image + :returns: A new image """ @@ -1752,7 +1752,7 @@ class Image: """ return 0 - def thumbnail(self, size, resample=LANCZOS): + def thumbnail(self, size, resample=BICUBIC): """ Make this image into a thumbnail. This method modifies the image to contain a thumbnail version of itself, no larger than @@ -1770,7 +1770,7 @@ class Image: :param resample: Optional resampling filter. This can be one of :py:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BILINEAR`, :py:attr:`PIL.Image.BICUBIC`, or :py:attr:`PIL.Image.LANCZOS`. - If omitted, it defaults to :py:attr:`PIL.Image.LANCZOS`. + If omitted, it defaults to :py:attr:`PIL.Image.BICUBIC`. (was :py:attr:`PIL.Image.NEAREST` prior to version 2.5.0) :returns: None """ From 66cacc282b1861f4d14fb11e1b9d0ab469e82a8f Mon Sep 17 00:00:00 2001 From: homm Date: Fri, 28 Nov 2014 04:21:46 +0300 Subject: [PATCH 173/532] do not use really draft JPEG decoding quality --- PIL/JpegImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index a3b603458..9dd79d5e6 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -355,7 +355,7 @@ class JpegImageFile(ImageFile.ImageFile): scale = s self.tile = [(d, e, o, a)] - self.decoderconfig = (scale, 1) + self.decoderconfig = (scale, 0) return self From 53e54b6f966fc717369eb6dec5573066a5ad6bc1 Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 4 Dec 2014 11:03:34 +0200 Subject: [PATCH 174/532] Rename to include full version number --- docs/releasenotes/{2.7.rst => 2.7.0.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/releasenotes/{2.7.rst => 2.7.0.rst} (100%) diff --git a/docs/releasenotes/2.7.rst b/docs/releasenotes/2.7.0.rst similarity index 100% rename from docs/releasenotes/2.7.rst rename to docs/releasenotes/2.7.0.rst From cfe41caa8a450da58ca661956e5aaad1d10bb8de Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 4 Dec 2014 11:04:22 +0200 Subject: [PATCH 175/532] Review edits [CI skip] --- docs/releasenotes/2.7.0.rst | 133 ++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 67 deletions(-) diff --git a/docs/releasenotes/2.7.0.rst b/docs/releasenotes/2.7.0.rst index 8b6daab6c..e055c2460 100644 --- a/docs/releasenotes/2.7.0.rst +++ b/docs/releasenotes/2.7.0.rst @@ -1,144 +1,143 @@ -Pillow 2.7 -========== +Pillow 2.7.0 +============ Image resizing filters ---------------------- Image resizing methods :py:meth:`~PIL.Image.Image.resize` and -:py:meth:`~PIL.Image.Image.thumbnail` takes `resample` argument, which tells -what filter should be used for resampling. Possible values are: +:py:meth:`~PIL.Image.Image.thumbnail` take a `resample` argument, which tells +which filter should be used for resampling. Possible values are: :py:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BILINEAR`, :py:attr:`PIL.Image.BICUBIC` and :py:attr:`PIL.Image.ANTIALIAS`. -Almost all of them was changed in this version. +Almost all of them were changed in this version. -Bicubic and Bilinear downscaling -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Bicubic and bilinear downscaling +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -From very begining :py:attr:`~PIL.Image.BILINEAR` and -:py:attr:`~PIL.Image.BICUBIC` filters was based on affine transformations -and uses fixed number of pixels from source image for every destination pixel -(that was 2x2 pixels for :py:attr:`~PIL.Image.BILINEAR` and 4x4 for -:py:attr:`~PIL.Image.BICUBIC`). This gave an unsatisfied result for downscaling. -At the same time high quality convolutions-based algorithm with flexible kernel -was used for :py:attr:`~PIL.Image.ANTIALIAS` filter). +From the beginning :py:attr:`~PIL.Image.BILINEAR` and +:py:attr:`~PIL.Image.BICUBIC` filters were based on affine transformations +and used a fixed number of pixels from the source image for every destination +pixel (2x2 pixels for :py:attr:`~PIL.Image.BILINEAR` and 4x4 for +:py:attr:`~PIL.Image.BICUBIC`). This gave an unsatisfactory result for +downscaling. At the same time, a high quality convolutions-based algorithm with +flexible kernel was used for :py:attr:`~PIL.Image.ANTIALIAS` filter). -Starting from 2.7 high quality convolutions-based algorithm is used for all of -these three filters. +Starting from Pillow 2.7.0, a high quality convolutions-based algorithm is used +for all of these three filters. If you have previously used any tricks to maintain quality when downscaling with :py:attr:`~PIL.Image.BILINEAR` and :py:attr:`~PIL.Image.BICUBIC` filters -(for example, reducing within several steps), they a unnecessary now. +(for example, reducing within several steps), they are unnecessary now. Antialias renamed to Lanczos ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -New :py:attr:`PIL.Image.LANCZOS` constant was added instead of +A new :py:attr:`PIL.Image.LANCZOS` constant was added instead of :py:attr:`~PIL.Image.ANTIALIAS`. When :py:attr:`~PIL.Image.ANTIALIAS` was initially added, it was the only high-quality filter based on convolutions. It's name was supposed to reflect -this. Starting from 2.7 all resize method are based on convolutions. All of them -are antialias from now. And the real name of :py:attr:`~PIL.Image.ANTIALIAS` -filter is Lanczos filter. +this. Starting from Pillow 2.7.0 all resize method are based on convolutions. +All of them are antialias from now on. And the real name of the +:py:attr:`~PIL.Image.ANTIALIAS` filter is Lanczos filter. -:py:attr:`~PIL.Image.ANTIALIAS` constant is leaved for backward compatibility +The :py:attr:`~PIL.Image.ANTIALIAS` constant is left for backward compatibility and is an alias for :py:attr:`~PIL.Image.LANCZOS`. Lanczos upscaling quality ^^^^^^^^^^^^^^^^^^^^^^^^^ -Image upscaling quality with :py:attr:`~PIL.Image.LANCZOS` filter was almost -the same as :py:attr:`~PIL.Image.BILINEAR` due to bug. This was fixed. +The image upscaling quality with :py:attr:`~PIL.Image.LANCZOS` filter was +almost the same as :py:attr:`~PIL.Image.BILINEAR` due to bug. This has been fixed. Bicubic upscaling quality ^^^^^^^^^^^^^^^^^^^^^^^^^ -:py:attr:`~PIL.Image.BICUBIC` filter for affine transformations produced +The :py:attr:`~PIL.Image.BICUBIC` filter for affine transformations produced sharp, slightly pixelated image for upscaling. Bicubic for convolutions is more soft. Resize performance ^^^^^^^^^^^^^^^^^^ -In most cases convolution is more expensive algorithm for downscaling because -it takes in account all pixels of source image. Therefore -:py:attr:`~PIL.Image.BILINEAR` and :py:attr:`~PIL.Image.BICUBIC` filters -performance can be lower than before. On the other hand quality of +In most cases, convolution is more a expensive algorithm for downscaling +because it takes into account all the pixels of source image. Therefore +:py:attr:`~PIL.Image.BILINEAR` and :py:attr:`~PIL.Image.BICUBIC` filters' +performance can be lower than before. On the other hand the quality of :py:attr:`~PIL.Image.BILINEAR` and :py:attr:`~PIL.Image.BICUBIC` was close to -:py:attr:`~PIL.Image.NEAREST`. So if such quality is suitable for your task +:py:attr:`~PIL.Image.NEAREST`. So if such quality is suitable for your tasks you can switch to :py:attr:`~PIL.Image.NEAREST` filter for downscaling, -that will give huge win in performance. +which will give a huge improvement in performance. -At the same time performance of convolution resampling for downscaling was -improved in about two times compared to previous version. -Upscaling performance of :py:attr:`~PIL.Image.LANCZOS` filter remained the same. -For :py:attr:`~PIL.Image.BILINEAR` filter it grew in 1.5 times and -for :py:attr:`~PIL.Image.BICUBIC` in 4 times. +At the same time performance of convolution resampling for downscaling has been +improved by around a factor of two compared to the previous version. +The upscaling performance of the :py:attr:`~PIL.Image.LANCZOS` filter has +remained the same. For :py:attr:`~PIL.Image.BILINEAR` filter it has improved by +1.5 times and for :py:attr:`~PIL.Image.BICUBIC` by four times. Default filter for thumbnails ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -In Pillow 2.5 default filter for :py:meth:`~PIL.Image.Image.thumbnail` was +In Pillow 2.5 the default filter for :py:meth:`~PIL.Image.Image.thumbnail` was changed from :py:attr:`~PIL.Image.NEAREST` to :py:attr:`~PIL.Image.ANTIALIAS`. -Antialias was chosen because all other filters gave poor quality for reduction. -Starting from Pillow 2.7 :py:attr:`~PIL.Image.ANTIALIAS` replaced with -:py:attr:`~PIL.Image.BICUBIC`, because it faster and +Antialias was chosen because all the other filters gave poor quality for +reduction. Starting from Pillow 2.7.0, :py:attr:`~PIL.Image.ANTIALIAS` has been +replaced with :py:attr:`~PIL.Image.BICUBIC`, because it's faster and :py:attr:`~PIL.Image.ANTIALIAS` doesn't give any advantages after -downscaling with libJPEG, which uses supersampling internally, not convolutions. +downscaling with libjpeg, which uses supersampling internally, not convolutions. -Image transposing ------------------ +Image transposition +------------------- -New method :py:attr:`PIL.Image.TRANSPOSE` was added for +A new method :py:attr:`PIL.Image.TRANSPOSE` has been added for the :py:meth:`~PIL.Image.Image.transpose` operation in addition to :py:attr:`~PIL.Image.FLIP_LEFT_RIGHT`, :py:attr:`~PIL.Image.FLIP_TOP_BOTTOM`, :py:attr:`~PIL.Image.ROTATE_90`, :py:attr:`~PIL.Image.ROTATE_180`, -:py:attr:`~PIL.Image.ROTATE_270`. :py:attr:`~PIL.Image.TRANSPOSE` is algebra -transpose, when image reflected over its main diagonal. +:py:attr:`~PIL.Image.ROTATE_270`. :py:attr:`~PIL.Image.TRANSPOSE` is an algebra +transpose, with an image reflected across its main diagonal. -Speed of :py:attr:`~PIL.Image.ROTATE_90`, :py:attr:`~PIL.Image.ROTATE_270` -and :py:attr:`~PIL.Image.TRANSPOSE` was significantly improved for large images, -which doesn't fit in processor cache. +The speed of :py:attr:`~PIL.Image.ROTATE_90`, :py:attr:`~PIL.Image.ROTATE_270` +and :py:attr:`~PIL.Image.TRANSPOSE` has been significantly improved for large +images which don't fit in the processor cache. Gaussian blur and unsharp mask ------------------------------ -:py:meth:`~PIL.ImageFilter.GaussianBlur` implementation was replaced with -sequential applying of series of box filters. New implementation is based on +The :py:meth:`~PIL.ImageFilter.GaussianBlur` implementation has been replaced +with a sequential application of box filters. The new implementation is based on "Theoretical foundations of Gaussian convolution by extended box filtering" from -Mathematical Image Analysis Group. As :py:meth:`~PIL.ImageFilter.UnsharpMask` -implementations uses Gaussian blur internally, all changes from this chapter -also applicable to it. +the Mathematical Image Analysis Group. As :py:meth:`~PIL.ImageFilter.UnsharpMask` +implementations use Gaussian blur internally, all changes from this chapter +are also applicable to it. Blur radius ^^^^^^^^^^^ -There was an error in previous version of PIL, when blur radius (the standard -deviation of Gaussian) is actually meant blur diameter. -For example for blurring image with actual radius 5 you were forced -to use value 10. This was fixed. For now the meaning of the radius -is the same as in other software. +There was an error in the previous version of Pillow, where blur radius (the +standard deviation of Gaussian) actually meant blur diameter. For example, to +blur an image with actual radius 5 you were forced to use value 10. This has +been fixed. Now the meaning of the radius is the same as in other software. If you used a Gaussian blur with some radius value, you need to divide this value by two. -Blur Performance +Blur performance ^^^^^^^^^^^^^^^^ Box filter computation time is constant relative to the radius and depends -on source image size only. Because new Gaussian blur implementation -is based on box filter, it's computation time is also doesn't depends on blur +on source image size only. Because the new Gaussian blur implementation +is based on box filter, its computation time also doesn't depends on the blur radius. -If before execution time for the same test image was 1 second for radius 1, -3.6 seconds for radius 10, 17 seconds for 50. Now blur with any radius on same -image is executed for 0.2 seconds. +For example, previously, if the execution time for a given test image was 1 +second for radius 1, 3.6 seconds for radius 10 and 17 seconds for 50, now blur +with any radius on same image is executed for 0.2 seconds. Blur quality ^^^^^^^^^^^^ -Previous implementation takes in account only source pixels within +The previous implementation takes into account only source pixels within 2 * standard deviation radius for every destination pixel. This was not enough, -so quality was worse compared to other Gaussian blur software. +so the quality was worse compared to other Gaussian blur software. The new implementation does not have this drawback. From 7e167a12333eef9857dc7cbec9ea426ded588b4a Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 4 Dec 2014 14:22:25 +0200 Subject: [PATCH 176/532] Remove stray ) and update version number --- docs/releasenotes/2.7.0.rst | 2 +- docs/releasenotes/index.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/releasenotes/2.7.0.rst b/docs/releasenotes/2.7.0.rst index e055c2460..bf3f163f2 100644 --- a/docs/releasenotes/2.7.0.rst +++ b/docs/releasenotes/2.7.0.rst @@ -20,7 +20,7 @@ and used a fixed number of pixels from the source image for every destination pixel (2x2 pixels for :py:attr:`~PIL.Image.BILINEAR` and 4x4 for :py:attr:`~PIL.Image.BICUBIC`). This gave an unsatisfactory result for downscaling. At the same time, a high quality convolutions-based algorithm with -flexible kernel was used for :py:attr:`~PIL.Image.ANTIALIAS` filter). +flexible kernel was used for :py:attr:`~PIL.Image.ANTIALIAS` filter. Starting from Pillow 2.7.0, a high quality convolutions-based algorithm is used for all of these three filters. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index ce3bfe9bf..c2f95f670 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -4,4 +4,4 @@ Release Notes .. toctree:: :maxdepth: 2 - 2.7 + 2.7.0 From 83fc485392b1949301f0fef74862e9e94dcf1ba6 Mon Sep 17 00:00:00 2001 From: homm Date: Mon, 8 Dec 2014 22:15:44 +0300 Subject: [PATCH 177/532] Limit default MAX_CONCURRENCY to 4. --- .travis.yml | 2 -- docs/installation.rst | 8 +++----- mp_compile.py | 4 ++-- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6f14035e8..0b6263480 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,6 @@ language: python notifications: irc: "chat.freenode.net#pil" -env: MAX_CONCURRENCY=4 - # Run slow PyPy* first, 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. diff --git a/docs/installation.rst b/docs/installation.rst index aba6d14a6..7e29e70e0 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -97,11 +97,9 @@ Build Options ------------- * Environment Variable: ``MAX_CONCURRENCY=n``. By default, Pillow will - use multiprocessing to build the extension in parallel. This may not - be ideal for machines that report a large number of cores compared - to the actual processor power. Set ``MAX_CONCURRENCY`` to 1 to disable - parallel building, or to a larger number to limit to that number of - parallel tasks. + use multiprocessing to build the extension on all available CPU, + but not more than 4. Setting ``MAX_CONCURRENCY`` to 1 will disable + parallel building. * Build flags: ``--disable-zlib``, ``--disable-jpeg``, ``--disable-tiff``, ``--disable-freetype``, ``--disable-tcl``, diff --git a/mp_compile.py b/mp_compile.py index c8a437400..955cd9c1b 100644 --- a/mp_compile.py +++ b/mp_compile.py @@ -6,8 +6,8 @@ from distutils.ccompiler import CCompiler import os, sys try: - MAX_PROCS = int(os.environ.get('MAX_CONCURRENCY', cpu_count())) -except: + MAX_PROCS = int(os.environ.get('MAX_CONCURRENCY', min(4, cpu_count()))) +except NotImplementedError: MAX_PROCS = None From 9581da4daa54f6da7e9172af02ab9b28dde8ceb5 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 8 Dec 2014 15:56:07 -0800 Subject: [PATCH 178/532] Add plural [ci skip] --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index 7e29e70e0..cca94a135 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -97,7 +97,7 @@ Build Options ------------- * Environment Variable: ``MAX_CONCURRENCY=n``. By default, Pillow will - use multiprocessing to build the extension on all available CPU, + use multiprocessing to build the extension on all available CPUs, but not more than 4. Setting ``MAX_CONCURRENCY`` to 1 will disable parallel building. From 800480db526b3c763fc821db4d29775ec9ba3c73 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Tue, 9 Dec 2014 15:17:33 -0800 Subject: [PATCH 179/532] Use underscores, not spaces, in TIFF tag kwargs. kwargs with spaces ("x resolution", "y resolution", "resolution unit" and "date time") are deprecated. --- PIL/TiffImagePlugin.py | 44 ++++++++++++---------------- docs/handbook/image-file-formats.rst | 8 ++--- 2 files changed, 23 insertions(+), 29 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index ae7d56947..a533c27ea 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1068,31 +1068,25 @@ def _save(im, fp, filename): if "icc_profile" in im.info: ifd[ICCPROFILE] = im.info["icc_profile"] - if "description" in im.encoderinfo: - ifd[IMAGEDESCRIPTION] = im.encoderinfo["description"] - if "resolution" in im.encoderinfo: - ifd[X_RESOLUTION] = ifd[Y_RESOLUTION] \ - = _cvt_res(im.encoderinfo["resolution"]) - if "x resolution" in im.encoderinfo: - ifd[X_RESOLUTION] = _cvt_res(im.encoderinfo["x resolution"]) - if "y resolution" in im.encoderinfo: - ifd[Y_RESOLUTION] = _cvt_res(im.encoderinfo["y resolution"]) - if "resolution unit" in im.encoderinfo: - unit = im.encoderinfo["resolution unit"] - if unit == "inch": - ifd[RESOLUTION_UNIT] = 2 - elif unit == "cm" or unit == "centimeter": - ifd[RESOLUTION_UNIT] = 3 - else: - ifd[RESOLUTION_UNIT] = 1 - if "software" in im.encoderinfo: - ifd[SOFTWARE] = im.encoderinfo["software"] - if "date time" in im.encoderinfo: - ifd[DATE_TIME] = im.encoderinfo["date time"] - if "artist" in im.encoderinfo: - ifd[ARTIST] = im.encoderinfo["artist"] - if "copyright" in im.encoderinfo: - ifd[COPYRIGHT] = im.encoderinfo["copyright"] + for key, name, cvt in [ + (IMAGEDESCRIPTION, "description", lambda x: x), + (X_RESOLUTION, "resolution", _cvt_res), + (Y_RESOLUTION, "resolution", _cvt_res), + (X_RESOLUTION, "x_resolution", _cvt_res), + (Y_RESOLUTION, "y_resolution", _cvt_res), + (RESOLUTION_UNIT, "resolution_unit", + lambda x: {"inch": 2, "cm": 3, "centimeter": 3}.get(x, 1)), + (SOFTWARE, "software", lambda x: x), + (DATE_TIME, "date_time", lambda x: x), + (ARTIST, "artist", lambda x: x), + (COPYRIGHT, "copyright", lambda x: x)]: + name_with_spaces = name.replace("_", " ") + if "_" in name and name_with_spaces in im.encoderinfo: + warnings.warn("%r is deprecated; use %r instead" % + (name_with_spaces, name), DeprecationWarning) + ifd[key] = cvt(im.encoderinfo[name.replace("_", " ")]) + if name in im.encoderinfo: + ifd[key] = cvt(im.encoderinfo[name]) dpi = im.encoderinfo.get("dpi") if dpi: diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index f9216818d..c9172f85f 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -470,21 +470,21 @@ These arguments to set the tiff header fields are an alternative to using the ge **software** -**date time** +**date_time** **artist** **copyright** Strings -**resolution unit** +**resolution_unit** A string of "inch", "centimeter" or "cm" **resolution** -**x resolution** +**x_resolution** -**y resolution** +**y_resolution** **dpi** Either a Float, Integer, or 2 tuple of (numerator, From 385ad47a9be0c10d2d67b313de69b8646e74f9ee Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 11 Dec 2014 13:06:53 +0200 Subject: [PATCH 180/532] Test PSDraw --- Tests/test_psdraw.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 Tests/test_psdraw.py diff --git a/Tests/test_psdraw.py b/Tests/test_psdraw.py new file mode 100644 index 000000000..04c32f23e --- /dev/null +++ b/Tests/test_psdraw.py @@ -0,0 +1,42 @@ +from helper import unittest, PillowTestCase, hopper + + +class TestPsDraw(PillowTestCase): + + def test_draw_postscript(self): + + # Taken from Pillow tutorial: + # http://pillow.readthedocs.org/en/latest/handbook/tutorial.html + + # Arrange + from PIL import Image + from PIL import PSDraw + tempfile = self.tempfile('temp.ps') + + im = Image.open("Tests/images/hopper.ppm") + title = "hopper" + box = (1*72, 2*72, 7*72, 10*72) # in points + + # Act + ps = PSDraw.PSDraw(tempfile) + ps.begin_document(title) + + # draw the image (75 dpi) + ps.image(box, im, 75) + ps.rectangle(box) + + # draw centered title + ps.setfont("HelveticaNarrow-Bold", 36) + w, h, b = ps.textsize(title) + ps.text((4*72-w/2, 1*72-h), title) + + ps.end_document() + + # Assert + # TODO + + +if __name__ == '__main__': + unittest.main() + +# End of file From 6da05b40269ee919d666160881b88bd12caaecb2 Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 11 Dec 2014 13:20:11 +0200 Subject: [PATCH 181/532] Use fp instead of filename --- Tests/test_psdraw.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/test_psdraw.py b/Tests/test_psdraw.py index 04c32f23e..e59acc0e4 100644 --- a/Tests/test_psdraw.py +++ b/Tests/test_psdraw.py @@ -12,13 +12,14 @@ class TestPsDraw(PillowTestCase): from PIL import Image from PIL import PSDraw tempfile = self.tempfile('temp.ps') + fp = open(tempfile, "wb") im = Image.open("Tests/images/hopper.ppm") title = "hopper" box = (1*72, 2*72, 7*72, 10*72) # in points # Act - ps = PSDraw.PSDraw(tempfile) + ps = PSDraw.PSDraw(fp) ps.begin_document(title) # draw the image (75 dpi) @@ -31,6 +32,7 @@ class TestPsDraw(PillowTestCase): ps.text((4*72-w/2, 1*72-h), title) ps.end_document() + fp.close() # Assert # TODO From 8fb8d2ec3a7637edf99dd7c6ebff75ed4c8a04e8 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Mon, 15 Dec 2014 14:44:12 -0800 Subject: [PATCH 182/532] Fix msvc compiler error --- libImaging/BoxBlur.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libImaging/BoxBlur.c b/libImaging/BoxBlur.c index 8b6ebcf7e..0fe3b7c35 100644 --- a/libImaging/BoxBlur.c +++ b/libImaging/BoxBlur.c @@ -237,6 +237,7 @@ Imaging ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n) { int i; + Imaging imTransposed; if (n < 1) { return ImagingError_ValueError( @@ -262,7 +263,7 @@ ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n) strcmp(imIn->mode, "LA") == 0)) return ImagingError_ModeError(); - Imaging imTransposed = ImagingNew(imIn->mode, imIn->ysize, imIn->xsize); + imTransposed = ImagingNew(imIn->mode, imIn->ysize, imIn->xsize); if (!imTransposed) return NULL; From 750f8a2a853794a73706cfd7a259300d9aeea54c Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 16 Dec 2014 15:11:54 +0200 Subject: [PATCH 183/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 715d39896..61967e9fd 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,8 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Fix compiler error: MSVC needs varaibles defined at the start of the block #1048 + - The GIF Palette optimization algorithm is only applicable to mode='P' or 'L' #993 [moriyoshi] From 99d66ff0cc7656413bbdc930ef426f5da572febb Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Fri, 19 Dec 2014 00:40:27 -0800 Subject: [PATCH 184/532] Do not quit Python if numpy is not installed --- Tests/large_memory_numpy_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/large_memory_numpy_test.py b/Tests/large_memory_numpy_test.py index 159d767d6..5e5a58441 100644 --- a/Tests/large_memory_numpy_test.py +++ b/Tests/large_memory_numpy_test.py @@ -14,7 +14,7 @@ from PIL import Image try: import numpy as np except: - sys.exit("Skipping: Numpy not installed") + raise unittest.SkipTest("numpy not installed") YDIM = 32769 XDIM = 48000 From b8fafdef69091c9ad8b5a7d47133c425e24bb577 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Fri, 19 Dec 2014 01:28:21 -0800 Subject: [PATCH 185/532] Use Py_ssize_t instead of ssize_t --- libImaging/Incremental.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libImaging/Incremental.c b/libImaging/Incremental.c index 206c8130b..84e20acf6 100644 --- a/libImaging/Incremental.c +++ b/libImaging/Incremental.c @@ -413,7 +413,7 @@ ImagingIncrementalCodecBytesInBuffer(ImagingIncrementalCodec codec) return codec->stream.ptr - codec->stream.buffer; } -ssize_t +Py_ssize_t ImagingIncrementalCodecRead(ImagingIncrementalCodec codec, void *buffer, size_t bytes) { @@ -428,7 +428,7 @@ ImagingIncrementalCodecRead(ImagingIncrementalCodec codec, DEBUG("reading (want %llu bytes)\n", (unsigned long long)bytes); if (codec->stream.fd >= 0) { - ssize_t ret = read(codec->stream.fd, buffer, bytes); + Py_ssize_t ret = read(codec->stream.fd, buffer, bytes); DEBUG("read %lld bytes from fd\n", (long long)ret); return ret; } @@ -497,7 +497,7 @@ ImagingIncrementalCodecSkip(ImagingIncrementalCodec codec, off_t done = 0; while (bytes) { size_t todo = (size_t)(bytes > 256 ? 256 : bytes); - ssize_t written = ImagingIncrementalCodecWrite(codec, zeroes, todo); + Py_ssize_t written = ImagingIncrementalCodecWrite(codec, zeroes, todo); if (written <= 0) break; done += written; @@ -554,7 +554,7 @@ ImagingIncrementalCodecSkip(ImagingIncrementalCodec codec, return done; } -ssize_t +Py_ssize_t ImagingIncrementalCodecWrite(ImagingIncrementalCodec codec, const void *buffer, size_t bytes) { From 9b8202203aa5bd85ec89152c3d596ec8d8a56684 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Fri, 19 Dec 2014 01:30:16 -0800 Subject: [PATCH 186/532] Use Py_ssize_t instead of ssize_t --- libImaging/Imaging.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index 4a2c650ed..c341ac84e 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -528,9 +528,9 @@ enum { extern ImagingIncrementalCodec ImagingIncrementalCodecCreate(ImagingIncrementalCodecEntry codec_entry, Imaging im, ImagingCodecState state, int read_or_write, int seekable, int fd); extern void ImagingIncrementalCodecDestroy(ImagingIncrementalCodec codec); extern int ImagingIncrementalCodecPushBuffer(ImagingIncrementalCodec codec, UINT8 *buf, int bytes); -extern ssize_t ImagingIncrementalCodecRead(ImagingIncrementalCodec codec, void *buffer, size_t bytes); +extern Py_ssize_t ImagingIncrementalCodecRead(ImagingIncrementalCodec codec, void *buffer, size_t bytes); extern off_t ImagingIncrementalCodecSkip(ImagingIncrementalCodec codec, off_t bytes); -extern ssize_t ImagingIncrementalCodecWrite(ImagingIncrementalCodec codec, const void *buffer, size_t bytes); +extern Py_ssize_t ImagingIncrementalCodecWrite(ImagingIncrementalCodec codec, const void *buffer, size_t bytes); extern off_t ImagingIncrementalCodecSeek(ImagingIncrementalCodec codec, off_t bytes); extern size_t ImagingIncrementalCodecBytesInBuffer(ImagingIncrementalCodec codec); From 707b43f14def8275fb000dad4c6978793dcf7ecb Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 19 Dec 2014 12:31:00 +0200 Subject: [PATCH 187/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 61967e9fd..cf780fd85 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,11 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Fix MSVC compiler error: Use Py_ssize_t instead of ssize_t #1051 + [cgohlke] + - Fix compiler error: MSVC needs varaibles defined at the start of the block #1048 + [cgohlke] - The GIF Palette optimization algorithm is only applicable to mode='P' or 'L' #993 [moriyoshi] From 4d2dd3ee7bffcbb264912d7e01add8c099024cae Mon Sep 17 00:00:00 2001 From: Charles Law Date: Fri, 26 Dec 2014 15:12:21 -0800 Subject: [PATCH 188/532] Partial Fix #370: look for osx fonts in common places --- PIL/ImageFont.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index bd52ea938..e59f6a46d 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -239,6 +239,10 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): try: return FreeTypeFont(font, size, index, encoding) except IOError: + if font.endswith(".ttf"): + ttf_filename = font + else: + ttf_filename = "%s.ttf" % font if sys.platform == "win32": # check the windows font repository # NOTE: must use uppercase WINDIR, to work around bugs in @@ -247,6 +251,12 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): if windir: filename = os.path.join(windir, "fonts", font) return FreeTypeFont(filename, size, index, encoding) + elif sys.platform == 'darwin': + macdirs = ['/Library/Fonts/', '/System/Library/Fonts/', os.path.expanduser('~/Library/Fonts/')] + for macdir in macdirs: + filepath = os.path.join(macdir, ttf_filename) + if os.path.exists(filepath): + return FreeTypeFont(filepath, size, index, encoding) raise From 17d720aebc82f9d0b99ad88d7bb1d12023a44a50 Mon Sep 17 00:00:00 2001 From: Charles Law Date: Fri, 26 Dec 2014 15:10:52 -0800 Subject: [PATCH 189/532] Partial Fix #370: look for linux fonts in common places --- PIL/ImageFont.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index e59f6a46d..5b4770f54 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -251,6 +251,14 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): if windir: filename = os.path.join(windir, "fonts", font) return FreeTypeFont(filename, size, index, encoding) + elif sys.platform in ('linux', 'linux2'): + lindirs = os.environ.get("XDG_DATA_DIRS", "").split(":") + for lindir in lindirs: + parentpath = os.path.join(lindir, "fonts") + for walkroot, walkdir, walkfilenames in os.walk(parentpath): + if ttf_filename in walkfilenames: + filepath = os.path.join(walkroot, ttf_filename) + return FreeTypeFont(filepath, size, index, encoding) elif sys.platform == 'darwin': macdirs = ['/Library/Fonts/', '/System/Library/Fonts/', os.path.expanduser('~/Library/Fonts/')] for macdir in macdirs: From 31859521c9d24d4608c4fece12a6951defdd8392 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 27 Dec 2014 22:04:34 +0200 Subject: [PATCH 190/532] Update test as textsize() isn't implemented --- Tests/test_psdraw.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Tests/test_psdraw.py b/Tests/test_psdraw.py index e59acc0e4..cd0731c01 100644 --- a/Tests/test_psdraw.py +++ b/Tests/test_psdraw.py @@ -1,11 +1,11 @@ -from helper import unittest, PillowTestCase, hopper +from helper import unittest, PillowTestCase class TestPsDraw(PillowTestCase): def test_draw_postscript(self): - # Taken from Pillow tutorial: + # Based on Pillow tutorial, but there is no textsize: # http://pillow.readthedocs.org/en/latest/handbook/tutorial.html # Arrange @@ -16,7 +16,7 @@ class TestPsDraw(PillowTestCase): im = Image.open("Tests/images/hopper.ppm") title = "hopper" - box = (1*72, 2*72, 7*72, 10*72) # in points + box = (1*72, 2*72, 7*72, 10*72) # in points # Act ps = PSDraw.PSDraw(fp) @@ -26,16 +26,18 @@ class TestPsDraw(PillowTestCase): ps.image(box, im, 75) ps.rectangle(box) - # draw centered title - ps.setfont("HelveticaNarrow-Bold", 36) - w, h, b = ps.textsize(title) - ps.text((4*72-w/2, 1*72-h), title) + # draw title + ps.setfont("Courier", 36) + ps.text((3*72, 4*72), title) ps.end_document() fp.close() # Assert - # TODO + # Check non-zero file was created + import os + self.assertTrue(os.path.isfile(tempfile)) + self.assertGreater(os.path.getsize(tempfile), 0) if __name__ == '__main__': From 8eb117dc9e71f43fd9240e2b7dd25246eeaeb82f Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 27 Dec 2014 22:26:54 +0200 Subject: [PATCH 191/532] Fix for Python 3 --- PIL/PSDraw.py | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/PIL/PSDraw.py b/PIL/PSDraw.py index 5a24441a8..fc59c3158 100644 --- a/PIL/PSDraw.py +++ b/PIL/PSDraw.py @@ -35,23 +35,29 @@ class PSDraw: fp = sys.stdout self.fp = fp + def _fp_write(self, to_write): + if bytes is str: + self.fp.write(to_write) + else: + self.fp.write(bytes(to_write, 'UTF-8')) + def begin_document(self, id=None): """Set up printing of a document. (Write Postscript DSC header.)""" # FIXME: incomplete - self.fp.write("%!PS-Adobe-3.0\n" + self._fp_write("%!PS-Adobe-3.0\n" "save\n" "/showpage { } def\n" "%%EndComments\n" "%%BeginDocument\n") - # self.fp.write(ERROR_PS) # debugging! - self.fp.write(EDROFF_PS) - self.fp.write(VDI_PS) - self.fp.write("%%EndProlog\n") + # self.fp_write(ERROR_PS) # debugging! + self._fp_write(EDROFF_PS) + self._fp_write(VDI_PS) + self._fp_write("%%EndProlog\n") self.isofont = {} def end_document(self): """Ends printing. (Write Postscript DSC footer.)""" - self.fp.write("%%EndDocument\n" + self._fp_write("%%EndDocument\n" "restore showpage\n" "%%End\n") if hasattr(self.fp, "flush"): @@ -66,11 +72,11 @@ class PSDraw: """ if font not in self.isofont: # reencode font - self.fp.write("/PSDraw-%s ISOLatin1Encoding /%s E\n" % + self._fp_write("/PSDraw-%s ISOLatin1Encoding /%s E\n" % (font, font)) self.isofont[font] = 1 # rough - self.fp.write("/F0 %d /PSDraw-%s F\n" % (size, font)) + self._fp_write("/F0 %d /PSDraw-%s F\n" % (size, font)) def setink(self, ink): """ @@ -86,7 +92,7 @@ class PSDraw: left corner of the page). """ xy = xy0 + xy1 - self.fp.write("%d %d %d %d Vl\n" % xy) + self._fp_write("%d %d %d %d Vl\n" % xy) def rectangle(self, box): """ @@ -101,7 +107,7 @@ class PSDraw: %d %d M %d %d 0 Vr\n """ - self.fp.write("%d %d M %d %d 0 Vr\n" % box) + self._fp_write("%d %d M %d %d 0 Vr\n" % box) def text(self, xy, text): """ @@ -111,7 +117,7 @@ class PSDraw: text = "\\(".join(text.split("(")) text = "\\)".join(text.split(")")) xy = xy + (text,) - self.fp.write("%d %d M (%s) S\n" % xy) + self._fp_write("%d %d M (%s) S\n" % xy) def image(self, box, im, dpi=None): """Draw a PIL image, centered in the given box.""" @@ -135,14 +141,14 @@ class PSDraw: y = ymax dx = (xmax - x) / 2 + box[0] dy = (ymax - y) / 2 + box[1] - self.fp.write("gsave\n%f %f translate\n" % (dx, dy)) + self._fp_write("gsave\n%f %f translate\n" % (dx, dy)) if (x, y) != im.size: # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) sx = x / im.size[0] sy = y / im.size[1] - self.fp.write("%f %f scale\n" % (sx, sy)) + self._fp_write("%f %f scale\n" % (sx, sy)) EpsImagePlugin._save(im, self.fp, None, 0) - self.fp.write("\ngrestore\n") + self._fp_write("\ngrestore\n") # -------------------------------------------------------------------- # Postscript driver From c2f433e5ac24029910b503e91d55c11d1b00b638 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 27 Dec 2014 22:41:56 +0200 Subject: [PATCH 192/532] Remove unimplemented setink() --- PIL/PSDraw.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/PIL/PSDraw.py b/PIL/PSDraw.py index fc59c3158..9a6b4655c 100644 --- a/PIL/PSDraw.py +++ b/PIL/PSDraw.py @@ -78,13 +78,6 @@ class PSDraw: # rough self._fp_write("/F0 %d /PSDraw-%s F\n" % (size, font)) - def setink(self, ink): - """ - .. warning:: This has been in the PIL API for ages but was never implemented. - - """ - print("*** NOT YET IMPLEMENTED ***") - def line(self, xy0, xy1): """ Draws a line between the two points. Coordinates are given in From 7f057ed962f13b03efadd8c627c596640576f819 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 27 Dec 2014 22:50:17 +0200 Subject: [PATCH 193/532] Test drawing diagonal lines --- Tests/test_psdraw.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/test_psdraw.py b/Tests/test_psdraw.py index cd0731c01..9606a4392 100644 --- a/Tests/test_psdraw.py +++ b/Tests/test_psdraw.py @@ -22,6 +22,10 @@ class TestPsDraw(PillowTestCase): ps = PSDraw.PSDraw(fp) ps.begin_document(title) + # draw diagonal lines in a cross + ps.line((1*72, 2*72), (7*72, 10*72)) + ps.line((7*72, 2*72), (1*72, 10*72)) + # draw the image (75 dpi) ps.image(box, im, 75) ps.rectangle(box) From 1b8ba191e95ed6f234c1b107194e355befce24d2 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 27 Dec 2014 23:05:34 +0200 Subject: [PATCH 194/532] Update docs to remove reference to textsize() --- docs/handbook/tutorial.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/handbook/tutorial.rst b/docs/handbook/tutorial.rst index c6d2bf9e4..365c8e7a8 100644 --- a/docs/handbook/tutorial.rst +++ b/docs/handbook/tutorial.rst @@ -445,10 +445,9 @@ Drawing Postscript ps.image(box, im, 75) ps.rectangle(box) - # draw centered title + # draw title ps.setfont("HelveticaNarrow-Bold", 36) - w, h, b = ps.textsize(title) - ps.text((4*72-w/2, 1*72-h), title) + ps.text((3*72, 4*72), title) ps.end_document() From c4d9bb6eaa8b123fd8c941736cdf2cc79f834298 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 27 Dec 2014 23:07:41 +0200 Subject: [PATCH 195/532] flake8 --- PIL/PSDraw.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/PIL/PSDraw.py b/PIL/PSDraw.py index 9a6b4655c..6187e40ad 100644 --- a/PIL/PSDraw.py +++ b/PIL/PSDraw.py @@ -45,10 +45,10 @@ class PSDraw: """Set up printing of a document. (Write Postscript DSC header.)""" # FIXME: incomplete self._fp_write("%!PS-Adobe-3.0\n" - "save\n" - "/showpage { } def\n" - "%%EndComments\n" - "%%BeginDocument\n") + "save\n" + "/showpage { } def\n" + "%%EndComments\n" + "%%BeginDocument\n") # self.fp_write(ERROR_PS) # debugging! self._fp_write(EDROFF_PS) self._fp_write(VDI_PS) @@ -58,8 +58,8 @@ class PSDraw: def end_document(self): """Ends printing. (Write Postscript DSC footer.)""" self._fp_write("%%EndDocument\n" - "restore showpage\n" - "%%End\n") + "restore showpage\n" + "%%End\n") if hasattr(self.fp, "flush"): self.fp.flush() @@ -73,7 +73,7 @@ class PSDraw: if font not in self.isofont: # reencode font self._fp_write("/PSDraw-%s ISOLatin1Encoding /%s E\n" % - (font, font)) + (font, font)) self.isofont[font] = 1 # rough self._fp_write("/F0 %d /PSDraw-%s F\n" % (size, font)) From 095aa00f7a37c7a86dcca8d7d97eb557706c37fd Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 28 Dec 2014 05:42:24 +0300 Subject: [PATCH 196/532] do not import local Pillow for building docs --- docs/conf.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index b25ea6056..ecc7f6722 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,8 +1,4 @@ # -*- coding: utf-8 -*- -import os -import sys - -sys.path.insert(0, os.path.abspath('../')) import PIL ### general configuration ### From 6a1b33f415967cdff3fb5f7eec9efdc918d9a486 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 28 Dec 2014 16:30:12 +0200 Subject: [PATCH 197/532] Test deprecated tags --- Tests/test_file_tiff.py | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index fd8090196..ee3e678eb 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -306,7 +306,6 @@ class TestFileTiff(PillowTestCase): self.assertEqual(im.mode, "L") self.assert_image_similar(im, original, 7.3) - def test_page_number_x_0(self): # Issue 973 # Test TIFF with tag 297 (Page Number) having value of 0 0. @@ -326,7 +325,40 @@ class TestFileTiff(PillowTestCase): # Should not divide by zero im.save(outfile) - + def test_with_underscores(self): + # Arrange: use underscores + kwargs = {'resolution_unit': 'inch', + 'x_resolution': 72, + 'y_resolution': 36} + filename = self.tempfile("temp.tif") + + # Act + hopper("RGB").save(filename, **kwargs) + + # Assert + from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION + im = Image.open(filename) + self.assertEqual(im.tag.tags[X_RESOLUTION][0][0], 72) + self.assertEqual(im.tag.tags[Y_RESOLUTION][0][0], 36) + + def test_deprecation_warning_with_spaces(self): + # Arrange: use spaces + kwargs = {'resolution unit': 'inch', + 'x resolution': 36, + 'y resolution': 72} + filename = self.tempfile("temp.tif") + + # Act + self.assert_warning(DeprecationWarning, + lambda: hopper("RGB").save(filename, **kwargs)) + + # Assert + from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION + im = Image.open(filename) + self.assertEqual(im.tag.tags[X_RESOLUTION][0][0], 36) + self.assertEqual(im.tag.tags[Y_RESOLUTION][0][0], 72) + + if __name__ == '__main__': unittest.main() From 967247d45c6781b0319a1436defac6f9508efc5a Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 28 Dec 2014 21:17:51 +0200 Subject: [PATCH 198/532] Caps [CI skip] --- docs/about.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/about.rst b/docs/about.rst index 919b2918c..90da5a609 100644 --- a/docs/about.rst +++ b/docs/about.rst @@ -17,7 +17,7 @@ The fork authors' goal is to foster active development of PIL through: License ------- -like PIL itself, Pillow is licensed under the MIT-like `PIL Software License `:: +Like PIL itself, Pillow is licensed under the MIT-like `PIL Software License `:: Software License From 44286ba3c9bfa6ed565d11bd61460d8ec215e1ea Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 30 Nov 2014 23:31:29 -0800 Subject: [PATCH 199/532] Fix for zlib.decompression bomb in iTXt,zTXt, and iCCP chunks --- PIL/PngImagePlugin.py | 13 ++++++++++--- Tests/check_png_dos.py | 24 ++++++++++++++++++++++++ Tests/images/png_decompression_dos.png | Bin 0 -> 6289 bytes 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 Tests/check_png_dos.py create mode 100644 Tests/images/png_decompression_dos.png diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index 8403461be..514b76f14 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -72,6 +72,13 @@ _MODES = { _simple_palette = re.compile(b'^\xff+\x00\xff*$') +def _safe_zlib_decompress(s): + dobj = zlib.decompressobj() + plaintext = dobj.decompress(s, ImageFile.SAFEBLOCK) + if dobj.unconsumed_tail: + raise ValueError("Decompressed Data Too Large") + return plaintext + # -------------------------------------------------------------------- # Support classes. Suitable for PNG and related formats like MNG etc. @@ -278,7 +285,7 @@ class PngStream(ChunkStream): raise SyntaxError("Unknown compression method %s in iCCP chunk" % comp_method) try: - icc_profile = zlib.decompress(s[i+2:]) + icc_profile = _safe_zlib_decompress(s[i+2:]) except zlib.error: icc_profile = None # FIXME self.im_info["icc_profile"] = icc_profile @@ -391,7 +398,7 @@ class PngStream(ChunkStream): raise SyntaxError("Unknown compression method %s in zTXt chunk" % comp_method) try: - v = zlib.decompress(v[1:]) + v = _safe_zlib_decompress(v[1:]) except zlib.error: v = b"" @@ -421,7 +428,7 @@ class PngStream(ChunkStream): if cf != 0: if cm == 0: try: - v = zlib.decompress(v) + v = _safe_zlib_decompress(v) except zlib.error: return s else: diff --git a/Tests/check_png_dos.py b/Tests/check_png_dos.py new file mode 100644 index 000000000..4e9b76537 --- /dev/null +++ b/Tests/check_png_dos.py @@ -0,0 +1,24 @@ +from helper import unittest, PillowTestCase +import sys +from PIL import Image +from io import BytesIO + +test_file = "Tests/images/png_decompression_dos.png" + +@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") +class TestPngDos(PillowTestCase): + + def test_dos_text(self): + + try: + im = Image.open(test_file) + im.load() + except ValueError as msg: + self.assert_(msg, "Decompressed Data Too Large") + return + + for s in im.text.values(): + self.assert_(len(s) < 1024*1024, "Text chunk larger than 1M") + +if __name__ == '__main__': + unittest.main() diff --git a/Tests/images/png_decompression_dos.png b/Tests/images/png_decompression_dos.png new file mode 100644 index 0000000000000000000000000000000000000000..986561b2e78e76e92e0a8b07886dc26f6444257b GIT binary patch literal 6289 zcmeAS@N?(olHy`uVBq!ia0vp^j3CSbBp9sfW`{B`aPU=yM3f|DrW-OaRLpsM&=92H z&;qa5^Uq1xIe<8$U^E0qLtr!nMnhmU1V%$(c!xj@@8mO4jE~Ov%|>b&7>%|JhIg!w z`ffA?MnhmU1V%$(Gz4&k0HkHWQYFiY)G{z0Z5iMSuTk;Q5Eu=C(GVC7fzc2c-XQ>K p8N9c+xC7`9Q7kcv6U2|zXz1Ea_KC51p1gQu&X%Q~loCIE&GIWYhL literal 0 HcmV?d00001 From b73c4b9e8b4f7bee3ca64ea5524fbf233ac42617 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 28 Dec 2014 22:34:13 -0800 Subject: [PATCH 200/532] Test change -- different representation for invalid compressed object --- Tests/test_file_png.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 7a43414eb..b556199f5 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -153,7 +153,7 @@ class TestFilePng(PillowTestCase): im = load(HEAD + chunk(b'iTXt', b'spam\0\1\0en\0Spam\0' + zlib.compress(b"egg")[:1]) + TAIL) - self.assertEqual(im.info, {}) + self.assertEqual(im.info, {'spam':''}) im = load(HEAD + chunk(b'iTXt', b'spam\0\1\1en\0Spam\0' + zlib.compress(b"egg")) + TAIL) From ee7b15c9240f0226e3dfc144c7e8c8aa7bb17009 Mon Sep 17 00:00:00 2001 From: Charles Law Date: Mon, 29 Dec 2014 10:09:37 -0800 Subject: [PATCH 201/532] Add tests for finding fonts in linux and osx --- Tests/test_imagefont.py | 61 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index ed2439e7c..291736e4b 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -4,6 +4,8 @@ from PIL import Image from PIL import ImageDraw from io import BytesIO import os +import sys +import copy FONT_PATH = "Tests/fonts/FreeMono.ttf" FONT_SIZE = 20 @@ -13,6 +15,29 @@ try: from PIL import ImageFont ImageFont.core.getfont # check if freetype is available + class SimplePatcher(): + def __init__(self, parent_obj, attr_name, value): + self._parent_obj = parent_obj + self._attr_name = attr_name + self._saved = None + self._is_saved = False + self._value = value + def __enter__(self): + # Patch the attr on the object + if hasattr(self._parent_obj, self._attr_name): + self._saved = getattr(self._parent_obj, self._attr_name) + setattr(self._parent_obj, self._attr_name, self._value) + self._is_saved = True + else: + setattr(self._parent_obj, self._attr_name, self._value) + self._is_saved = False + def __exit__(self, type, value, traceback): + # Restore the original value + if self._is_saved: + setattr(self._parent_obj, self._attr_name, self._saved) + else: + delattr(self._parent_obj, self._attr_name) + class TestImageFont(PillowTestCase): def test_sanity(self): @@ -192,6 +217,42 @@ try: # Assert self.assert_image_equal(im, target_img) + def _test_fake_loading_font(self, path_to_fake): + #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): + if filepath == path_to_fake: + return ImageFont._FreeTypeFont(FONT_PATH, size, index, encoding) + return ImageFont._FreeTypeFont(filepath, size, index, encoding) + with SimplePatcher(ImageFont, 'FreeTypeFont', loadable_font): + font = ImageFont.truetype('Arial') + #Make sure it's loaded + name = font.getname() + self.assertEqual(('FreeMono', 'Regular'), name) + + def test_find_linux_font(self): + #A lot of mocking here - this is more for hitting code and catching + #syntax like errors + with SimplePatcher(sys, 'platform', 'linux'): + patched_env = copy.deepcopy(os.environ) + patched_env['XDG_DATA_DIRS'] = '/usr/share/:/usr/local/share/' + with SimplePatcher(os, 'environ', patched_env): + def fake_walker(path): + if path == '/usr/local/share/fonts': + return [(path, [], ['Arial.ttf'], )] + return [(path, [], ['some_random_font.ttf'], )] + with SimplePatcher(os, 'walk', fake_walker): + self._test_fake_loading_font('/usr/local/share/fonts/Arial.ttf') + + def test_find_osx_font(self): + #Like the linux test, more cover hitting code rather than testing + #correctness. + with SimplePatcher(sys, 'platform', 'darwin'): + fake_font_path = '/System/Library/Fonts/Arial.ttf' + with SimplePatcher(os.path, 'exists', lambda x: x == fake_font_path): + self._test_fake_loading_font(fake_font_path) + except ImportError: class TestImageFont(PillowTestCase): From ad5eaaaa7053021f6b7553e3850b88afe374cecf Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 29 Dec 2014 15:20:09 -0800 Subject: [PATCH 202/532] Updated Changes.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index cf780fd85..658a726b6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Update PSDraw for Python3, add tests. #1055 + [hugovk] + +- Use Bicubic filtering by default for thumbnails. Don't use Jpeg Draft mode for thumbnails. #1029 + [homm] + - Fix MSVC compiler error: Use Py_ssize_t instead of ssize_t #1051 [cgohlke] From cdfddc8d1a2d42963bf9825f8b3612388c43dc8c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 29 Dec 2014 15:24:31 -0800 Subject: [PATCH 203/532] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 658a726b6..01dcca6cc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Use underscores, not spaces, in TIFF tag kwargs. #1044, #1058 + [anntzer, hugovk] + - Update PSDraw for Python3, add tests. #1055 [hugovk] From 1c6a89e4c2c3a27d7dcd4d5a3662b1d3008d1ad3 Mon Sep 17 00:00:00 2001 From: Charles Law Date: Mon, 29 Dec 2014 17:03:39 -0800 Subject: [PATCH 204/532] default to using /usr/share when XDG_DATA_DIRS is empty or unset --- PIL/ImageFont.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 5b4770f54..afbae372f 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -252,7 +252,12 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): filename = os.path.join(windir, "fonts", font) return FreeTypeFont(filename, size, index, encoding) elif sys.platform in ('linux', 'linux2'): - lindirs = os.environ.get("XDG_DATA_DIRS", "").split(":") + lindirs = os.environ.get("XDG_DATA_DIRS", "") + if not lindirs: + #According to the freedesktop spec, XDG_DATA_DIRS should + #default to /usr/share + lindirs = '/usr/share' + lindirs = lindirs.split(":") for lindir in lindirs: parentpath = os.path.join(lindir, "fonts") for walkroot, walkdir, walkfilenames in os.walk(parentpath): From 0b75526ffe41a4697231beb8b5740617c98f290b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 29 Dec 2014 17:10:27 -0800 Subject: [PATCH 205/532] Limit total text chunk size to 64k --- PIL/PngImagePlugin.py | 23 +++++++++++++++++++++-- Tests/check_png_dos.py | 30 +++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index 514b76f14..7a9becd3b 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -72,9 +72,15 @@ _MODES = { _simple_palette = re.compile(b'^\xff+\x00\xff*$') +# Maximum decompressed size for a iTXt or zTXt chunk. +# Eliminates decompression bombs where compressed chunks can expand 1000x +MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK +# Set the maximum total text chunk size. +MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK + def _safe_zlib_decompress(s): dobj = zlib.decompressobj() - plaintext = dobj.decompress(s, ImageFile.SAFEBLOCK) + plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) if dobj.unconsumed_tail: raise ValueError("Decompressed Data Too Large") return plaintext @@ -267,6 +273,14 @@ class PngStream(ChunkStream): self.im_tile = None self.im_palette = None + self.text_memory = 0 + + 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) + def chunk_iCCP(self, pos, length): # ICC profile @@ -379,6 +393,8 @@ class PngStream(ChunkStream): v = v.decode('latin-1', 'replace') self.im_info[k] = self.im_text[k] = v + self.check_text_memory(len(v)) + return s def chunk_zTXt(self, pos, length): @@ -408,6 +424,8 @@ class PngStream(ChunkStream): v = v.decode('latin-1', 'replace') self.im_info[k] = self.im_text[k] = v + self.check_text_memory(len(v)) + return s def chunk_iTXt(self, pos, length): @@ -443,7 +461,8 @@ class PngStream(ChunkStream): return s self.im_info[k] = self.im_text[k] = iTXt(v, lang, tk) - + self.check_text_memory(len(v)) + return s diff --git a/Tests/check_png_dos.py b/Tests/check_png_dos.py index 4e9b76537..8f974d293 100644 --- a/Tests/check_png_dos.py +++ b/Tests/check_png_dos.py @@ -1,13 +1,12 @@ from helper import unittest, PillowTestCase import sys -from PIL import Image +from PIL import Image, PngImagePlugin from io import BytesIO +import zlib test_file = "Tests/images/png_decompression_dos.png" -@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") class TestPngDos(PillowTestCase): - def test_dos_text(self): try: @@ -20,5 +19,30 @@ class TestPngDos(PillowTestCase): for s in im.text.values(): self.assert_(len(s) < 1024*1024, "Text chunk larger than 1M") + def test_dos_total_memory(self): + im = Image.new('L',(1,1)) + compressed_data = zlib.compress('a'*1024*1023) + + info = PngImagePlugin.PngInfo() + + for x in range(64): + info.add_text('t%s'%x, compressed_data, 1) + info.add_itxt('i%s'%x, compressed_data, zip=True) + + b = BytesIO() + im.save(b, 'PNG', pnginfo=info) + b.seek(0) + + try: + im2 = Image.open(b) + except ValueError as msg: + self.assert_("Too much memory" in msg) + return + + total_len = 0 + for txt in im2.text.values(): + total_len += len(txt) + self.assert_(total_len < 64*1024*1024) + if __name__ == '__main__': unittest.main() From 6696b780e3b38672106c12be12e82f195c93b71a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 30 Dec 2014 16:57:24 -0800 Subject: [PATCH 206/532] Test style cleanup --- Tests/check_png_dos.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Tests/check_png_dos.py b/Tests/check_png_dos.py index 8f974d293..c74990a8c 100644 --- a/Tests/check_png_dos.py +++ b/Tests/check_png_dos.py @@ -1,23 +1,22 @@ from helper import unittest, PillowTestCase -import sys from PIL import Image, PngImagePlugin from io import BytesIO import zlib -test_file = "Tests/images/png_decompression_dos.png" +TEST_FILE = "Tests/images/png_decompression_dos.png" class TestPngDos(PillowTestCase): def test_dos_text(self): try: - im = Image.open(test_file) + im = Image.open(TEST_FILE) im.load() except ValueError as msg: - self.assert_(msg, "Decompressed Data Too Large") + self.assertTrue(msg, "Decompressed Data Too Large") return for s in im.text.values(): - self.assert_(len(s) < 1024*1024, "Text chunk larger than 1M") + self.assertLess(len(s), 1024*1024, "Text chunk larger than 1M") def test_dos_total_memory(self): im = Image.new('L',(1,1)) @@ -36,13 +35,13 @@ class TestPngDos(PillowTestCase): try: im2 = Image.open(b) except ValueError as msg: - self.assert_("Too much memory" in msg) + self.assertIn("Too much memory", msg) return total_len = 0 for txt in im2.text.values(): total_len += len(txt) - self.assert_(total_len < 64*1024*1024) + self.assertLess(total_len, 64*1024*1024, "Total text chunks greater than 64M") if __name__ == '__main__': unittest.main() From a59eb3975f9efb1ca88a7e823011ac0968d7d6ea Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 30 Dec 2014 17:06:38 -0800 Subject: [PATCH 207/532] Documentation Update for PNG zlib DOS --- docs/handbook/image-file-formats.rst | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index f9216818d..f8db2660f 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -333,7 +333,12 @@ The :py:meth:`~PIL.Image.Image.open` method sets the following transparent palette image. ``Open`` also sets ``Image.text`` to a list of the values of the -``tEXt``, ``zTXt``, and ``iTXt`` chunks of the PNG image. +``tEXt``, ``zTXt``, and ``iTXt`` chunks of the PNG image. Individual +compressed chunks are limited to a decompressed size of +``PngImagePlugin.MAX_TEXT_CHUNK``, by default 1MB, to prevent +decompression bombs. Additionally, the total size of all of the text +chunks is limited to ``PngImagePlugin.MAX_TEXT_MEMORY``, defaulting to +64MB. The :py:meth:`~PIL.Image.Image.save` method supports the following options: From 3085a268969f6a739ce30656b8dd16dd1035df1a Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 31 Dec 2014 20:34:39 +0200 Subject: [PATCH 208/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 01dcca6cc..1eea075eb 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Fix potential PNG decompression DOS #1060 + [wiredfool] + - Use underscores, not spaces, in TIFF tag kwargs. #1044, #1058 [anntzer, hugovk] From 4889ae776ccbf27a7f955204067812f2aceefba3 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 31 Dec 2014 14:44:32 -0800 Subject: [PATCH 209/532] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 1eea075eb..7440ed8b5 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.7.0 (unreleased) ------------------ +- Look for OSX and Linux fonts in common places. #1054 + [charleslaw] + - Fix potential PNG decompression DOS #1060 [wiredfool] From 6a7a6fbdb8ff03257ebd30576e6268bcc25cac0f Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 31 Dec 2014 16:35:56 -0800 Subject: [PATCH 210/532] Fixed warning on docs building (url can't wrap), added parameters --- PIL/ImageFilter.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/PIL/ImageFilter.py b/PIL/ImageFilter.py index 1e0154d12..b46845807 100644 --- a/PIL/ImageFilter.py +++ b/PIL/ImageFilter.py @@ -162,8 +162,13 @@ class UnsharpMask(Filter): See Wikipedia's entry on `digital unsharp masking`_ for an explanation of the parameters. - .. _digital unsharp masking: - https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking + :param radius: Blur Radius + :param percent: Unsharp strength, in percent + :param threshold: Threshold controls the minimum brightness change that + will be sharpened + + .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking + """ name = "UnsharpMask" From 80c7dcbce47437e5fb3fdb05c1fbbdbae0b31e88 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 31 Dec 2014 16:36:24 -0800 Subject: [PATCH 211/532] Release notes for PNG dos, Tiff parameter change --- docs/releasenotes/2.7.0.rst | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/releasenotes/2.7.0.rst b/docs/releasenotes/2.7.0.rst index bf3f163f2..abb717587 100644 --- a/docs/releasenotes/2.7.0.rst +++ b/docs/releasenotes/2.7.0.rst @@ -1,6 +1,21 @@ Pillow 2.7.0 ============ +Png text chunk size limits +-------------------------- + +To prevent potential denial of service attacks using compressed text +chunks, there are now limits to the decompressed size of text chunks +decoded from PNG images. If the limits are exceeded when opening a PNG +image a ``ValueError`` will be raised. + +Individual text chunks are limited to +:py:attr:`PIL.PngImagePlugin.MAX_TEXT_CHUNK`, set to 1MB by +default. The total decompressed size of all text chunks is limited to +:py:attr:`PIL.PngImagePlugin.MAX_TEXT_MEMORY`, which defaults to +64MB. These values can be changed prior to opening PNG images if you +know that there are large text blocks that are desired. + Image resizing filters ---------------------- @@ -141,3 +156,13 @@ The previous implementation takes into account only source pixels within so the quality was worse compared to other Gaussian blur software. The new implementation does not have this drawback. + +TFF Parameter Changes +---------------------- + +Several kwarg parameters for saving TIFF images were previously +specified as strings with included spaces (e.g. 'x resolution'). This +was difficult to use as kwargs without constructing and passing a +dictionary. These parameters now use the underscore character instead +of space. (e.g. 'x_resolution') + From ca4ec0cea28878791fa95ed92656f2e8445383a4 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 31 Dec 2014 17:17:42 -0800 Subject: [PATCH 212/532] Fixed array parameters to reflect new image resizing behavior --- Tests/test_scipy.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Tests/test_scipy.py b/Tests/test_scipy.py index e3d1d97cd..926bbb186 100644 --- a/Tests/test_scipy.py +++ b/Tests/test_scipy.py @@ -11,7 +11,10 @@ except: class Test_scipy_resize(PillowTestCase): - """ Tests for scipy regression in 2.6.0 """ + """ Tests for scipy regression in 2.6.0 + + Tests from https://github.com/scipy/scipy/blob/master/scipy/misc/pilutil.py + """ def setUp(self): if not HAS_SCIPY: @@ -27,10 +30,10 @@ class Test_scipy_resize(PillowTestCase): def test_imresize4(self): im = np.array([[1,2], [3,4]]) - res = np.array([[ 1. , 1. , 1.5, 2. ], - [ 1. , 1. , 1.5, 2. ], - [ 2. , 2. , 2.5, 3. ], - [ 3. , 3. , 3.5, 4. ]], dtype=np.float32) + 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 From 96c06de6955a24874d4b0a8a6850ba648f54e9a8 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 31 Dec 2014 19:59:50 -0800 Subject: [PATCH 213/532] Restrict tests to linux/osx --- Tests/test_imagefont.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 291736e4b..1f935088c 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -231,6 +231,8 @@ try: name = font.getname() self.assertEqual(('FreeMono', 'Regular'), name) + + @unittest.skipIf(sys.platform.startswith('win32'), "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 @@ -245,6 +247,7 @@ try: with SimplePatcher(os, 'walk', fake_walker): self._test_fake_loading_font('/usr/local/share/fonts/Arial.ttf') + @unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") def test_find_osx_font(self): #Like the linux test, more cover hitting code rather than testing #correctness. From 0f05eb287a223ce106848cd048cfcb45e9faa565 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 31 Dec 2014 20:34:36 -0800 Subject: [PATCH 214/532] Version Bump --2.7.0 --- CHANGES.rst | 11 ++++++++++- PIL/__init__.py | 2 +- _imaging.c | 2 +- setup.py | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 7440ed8b5..9db9a6645 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,7 +1,7 @@ Changelog (Pillow) ================== -2.7.0 (unreleased) +2.7.0 (2015-01-01) ------------------ - Look for OSX and Linux fonts in common places. #1054 @@ -79,6 +79,15 @@ Changelog (Pillow) - Fixes for things rpmlint complains about #942 [manisandro] +2.6.2 (2015-01-01) +------------------ + +- Fix potential PNG decompression DOS #1060 + [wiredfool] + +- Fix Regression in PyPy 2.4 in streamio #958 + [wiredfool] + 2.6.1 (2014-10-11) ------------------ diff --git a/PIL/__init__.py b/PIL/__init__.py index 1bb1250c8..4d5d7b35b 100644 --- a/PIL/__init__.py +++ b/PIL/__init__.py @@ -12,7 +12,7 @@ # ;-) VERSION = '1.1.7' # PIL version -PILLOW_VERSION = '2.6.0' # Pillow +PILLOW_VERSION = '2.7.0' # Pillow _plugins = ['BmpImagePlugin', 'BufrStubImagePlugin', diff --git a/_imaging.c b/_imaging.c index e11605be4..6ae120688 100644 --- a/_imaging.c +++ b/_imaging.c @@ -71,7 +71,7 @@ * See the README file for information on usage and redistribution. */ -#define PILLOW_VERSION "2.6.0" +#define PILLOW_VERSION "2.7.0" #include "Python.h" diff --git a/setup.py b/setup.py index b1f917f26..90687d51f 100644 --- a/setup.py +++ b/setup.py @@ -90,7 +90,7 @@ except (ImportError, OSError): NAME = 'Pillow' -PILLOW_VERSION = '2.6.0' +PILLOW_VERSION = '2.7.0' TCL_ROOT = None JPEG_ROOT = None JPEG2K_ROOT = None From c5ce6e04052517d8cef3fe5c2f39885ab602df1e Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 1 Jan 2015 13:06:39 -0800 Subject: [PATCH 215/532] Update Release Notes (typo) [ci skip] --- docs/releasenotes/2.7.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/2.7.0.rst b/docs/releasenotes/2.7.0.rst index abb717587..dcf866bd4 100644 --- a/docs/releasenotes/2.7.0.rst +++ b/docs/releasenotes/2.7.0.rst @@ -157,7 +157,7 @@ so the quality was worse compared to other Gaussian blur software. The new implementation does not have this drawback. -TFF Parameter Changes +TIFF Parameter Changes ---------------------- Several kwarg parameters for saving TIFF images were previously From 7a7ccee5ed9b0565ce70a09338e3d4cfe34ccaaf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Jan 2015 09:13:57 +1100 Subject: [PATCH 216/532] Update Release Notes (typo) [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 9db9a6645..1f2d89bd4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -28,7 +28,7 @@ Changelog (Pillow) - The GIF Palette optimization algorithm is only applicable to mode='P' or 'L' #993 [moriyoshi] -- Use PySide as an alernative to PyQt4/5. +- Use PySide as an alternative to PyQt4/5. [holg] - Replace affine-based im.resize implementation with convolution-based im.stretch #997 From 2500ded15da333ad1db7d392f17c1ffd719fd23b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 2 Jan 2015 14:46:35 -0800 Subject: [PATCH 217/532] Update 2.7.0.rst [ci skip] --- docs/releasenotes/2.7.0.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/releasenotes/2.7.0.rst b/docs/releasenotes/2.7.0.rst index dcf866bd4..8359bd7aa 100644 --- a/docs/releasenotes/2.7.0.rst +++ b/docs/releasenotes/2.7.0.rst @@ -1,6 +1,13 @@ Pillow 2.7.0 ============ +Sane Plugin +----------- + +The Sane plugin has now been split into its own repo: +https://github.com/python-pillow/Sane . + + Png text chunk size limits -------------------------- From 2f1f73a76813be874073a982d3b40da2b1a248bb Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 2 Jan 2015 14:49:15 -0800 Subject: [PATCH 218/532] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 1f2d89bd4..585362201 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.7.0 (2015-01-01) ------------------ +- Split Sane into a separate repo: https://github.com/python-pillow/Sane + [hugovk] + - Look for OSX and Linux fonts in common places. #1054 [charleslaw] From 832c42da74e6067578e603e3bbbde1b96cf00118 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 4 Jan 2015 10:16:20 +0200 Subject: [PATCH 219/532] After success, trigger a build at hugovk/pillow-wheels/latest --- .travis.yml | 7 +++++++ build_children.sh | 6 ++++++ 2 files changed, 13 insertions(+) create mode 100755 build_children.sh diff --git a/.travis.yml b/.travis.yml index 0b6263480..670feb158 100644 --- a/.travis.yml +++ b/.travis.yml @@ -62,6 +62,8 @@ after_success: - pyflakes PIL/*.py | tee >(wc -l) - pyflakes Tests/*.py | tee >(wc -l) + # Trigger an OS X build at the pillow-wheels repo + - ./build_children.sh # Coverage and quality reports on just the latest diff. # (Installation is very slow on Py3, so just do it for Py2.) @@ -69,3 +71,8 @@ after_success: - if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then Scripts/diffcover-run.sh; fi matrix: fast_finish: true + +env: + global: + # travis encrypt AUTH_TOKEN= + secure: yC1RcYF932ICXcw8hR3MHKfw9G9030+w8SgGXhhH2htgsCvKrGtb7kA4pqN7eGS31QsGatj6NmYVOdut3jIqbtP+5Pd3xceGoeo3HMWfS5RPmgbrGmiVYeDH9ZZDDZMH85oRnMU/vfI3T8SdYdyYM3hXAPzXeU6jWxQA48ft4D4= diff --git a/build_children.sh b/build_children.sh new file mode 100755 index 000000000..ed8e15415 --- /dev/null +++ b/build_children.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# Get last child project build number +BUILD_NUM=$(curl -s 'https://api.travis-ci.org/repos/hugovk/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 76f8a26c4783431e4f3542e2ad6df9afbecf3b0f Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 4 Jan 2015 10:47:35 +0200 Subject: [PATCH 220/532] Use travis_after_all to ensure OS X build only triggered after all Linux jobs pass --- .travis.yml | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 670feb158..52242682a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,6 +33,7 @@ install: - pushd depends && ./install_openjpeg.sh && popd script: + - curl -Lo travis_after_all.py https://raw.github.com/dmakhno/travis_after_all/master/travis_after_all.py - coverage erase - python setup.py clean - CFLAGS="-coverage" python setup.py build_ext --inplace @@ -62,13 +63,40 @@ after_success: - pyflakes PIL/*.py | tee >(wc -l) - pyflakes Tests/*.py | tee >(wc -l) - # Trigger an OS X build at the pillow-wheels repo - - ./build_children.sh + # after_all + - 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 succeded! Triggering OS X build..." + # Trigger an OS X build at the pillow-wheels repo + ./build_children.sh + else + echo "Some jobs failed" + fi + fi # Coverage and quality reports on just the latest diff. # (Installation is very slow on Py3, so just do it for Py2.) - if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then Scripts/diffcover-install.sh; fi - if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then Scripts/diffcover-run.sh; fi + +after_failure: + - 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 + +after_script: + - echo leader=$BUILD_LEADER status=$BUILD_AGGREGATE_STATUS + matrix: fast_finish: true From ba743398996bbdb1c320efca318cb53f7af98c97 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 4 Jan 2015 11:12:36 +0200 Subject: [PATCH 221/532] Move after_all to end of after_success --- .travis.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 52242682a..16241dd30 100644 --- a/.travis.yml +++ b/.travis.yml @@ -55,7 +55,6 @@ after_success: - travis_retry pip install coveralls-merge - coveralls-merge coverage.c.json - - travis_retry pip install pep8 pyflakes - pep8 --statistics --count PIL/*.py - pep8 --statistics --count Tests/*.py @@ -63,6 +62,11 @@ after_success: - pyflakes PIL/*.py | tee >(wc -l) - pyflakes Tests/*.py | tee >(wc -l) + # Coverage and quality reports on just the latest diff. + # (Installation is very slow on Py3, so just do it for Py2.) + - if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then Scripts/diffcover-install.sh; fi + - if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then Scripts/diffcover-run.sh; fi + # after_all - python travis_after_all.py - export $(cat .to_export_back) @@ -77,11 +81,6 @@ after_success: fi fi - # Coverage and quality reports on just the latest diff. - # (Installation is very slow on Py3, so just do it for Py2.) - - if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then Scripts/diffcover-install.sh; fi - - if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then Scripts/diffcover-run.sh; fi - after_failure: - python travis_after_all.py - export $(cat .to_export_back) From b65ca089e53b449eed77da754ccd02675fe25049 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 4 Jan 2015 11:29:02 +0200 Subject: [PATCH 222/532] Only do travis_after_all for hugovk/Pillow/master --- .travis.yml | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/.travis.yml b/.travis.yml index 16241dd30..c54a7773a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,7 +33,6 @@ install: - pushd depends && ./install_openjpeg.sh && popd script: - - curl -Lo travis_after_all.py https://raw.github.com/dmakhno/travis_after_all/master/travis_after_all.py - coverage erase - python setup.py clean - CFLAGS="-coverage" python setup.py build_ext --inplace @@ -68,33 +67,42 @@ after_success: - if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then Scripts/diffcover-run.sh; fi # after_all - - 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 succeded! Triggering OS X build..." - # Trigger an OS X build at the pillow-wheels repo - ./build_children.sh - else - echo "Some jobs failed" + if [ "$TRAVIS_REPO_SLUG" = "hugovk/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ]; 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 succeded! Triggering OS X build..." + # Trigger an OS X build at the pillow-wheels repo + ./build_children.sh + else + echo "Some jobs failed" + fi fi fi after_failure: - - 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" + if [ "$TRAVIS_REPO_SLUG" = "hugovk/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ]; 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: - - echo leader=$BUILD_LEADER status=$BUILD_AGGREGATE_STATUS + - | + if [ "$TRAVIS_REPO_SLUG" = "hugovk/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ]; then + echo leader=$BUILD_LEADER status=$BUILD_AGGREGATE_STATUS + fi matrix: fast_finish: true From b23b3f301561caa9b10614e7a68ad5a178998fe6 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 4 Jan 2015 11:55:06 +0200 Subject: [PATCH 223/532] hugovk -> python-pillow --- .travis.yml | 6 +++--- build_children.sh | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index c54a7773a..3e7f55b1c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -68,7 +68,7 @@ after_success: # after_all - | - if [ "$TRAVIS_REPO_SLUG" = "hugovk/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ]; then + if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ]; 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) @@ -85,7 +85,7 @@ after_success: after_failure: - | - if [ "$TRAVIS_REPO_SLUG" = "hugovk/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ]; then + if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ]; 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) @@ -100,7 +100,7 @@ after_failure: after_script: - | - if [ "$TRAVIS_REPO_SLUG" = "hugovk/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ]; then + if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ]; then echo leader=$BUILD_LEADER status=$BUILD_AGGREGATE_STATUS fi diff --git a/build_children.sh b/build_children.sh index ed8e15415..f30118f48 100755 --- a/build_children.sh +++ b/build_children.sh @@ -1,6 +1,7 @@ #!/bin/bash -# Get last child project build number -BUILD_NUM=$(curl -s 'https://api.travis-ci.org/repos/hugovk/pillow-wheels/branches/latest' | grep -o '^{"branch":{"id":[0-9]*,' | grep -o '[0-9]' | tr -d '\n') +# Get last child project build number from branch named "latest" +BUILD_NUM=$(curl -s 'https://api.travis-ci.org/repos/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 0cee278662befd2053ab9c823b5a1798342c39e3 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 4 Jan 2015 18:47:03 +0200 Subject: [PATCH 224/532] TRAVIS_BRANCH=master also for PRs submitted to master, so also make sure TRAVIS_PULL_REQUEST=false --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3e7f55b1c..13d8268a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -68,7 +68,7 @@ after_success: # after_all - | - if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ]; then + 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) @@ -85,7 +85,7 @@ after_success: after_failure: - | - if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ]; then + 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) @@ -100,7 +100,7 @@ after_failure: after_script: - | - if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ]; then + if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then echo leader=$BUILD_LEADER status=$BUILD_AGGREGATE_STATUS fi From 3330dbad67f03d0c66a05a9aa5362963d7250b4a Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 4 Jan 2015 20:19:56 +0200 Subject: [PATCH 225/532] Add missing ] --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 13d8268a5..b8b359ee0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -100,7 +100,7 @@ after_failure: after_script: - | - if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then + if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then echo leader=$BUILD_LEADER status=$BUILD_AGGREGATE_STATUS fi From 94bfd0aacd5504854f7d5e938a78f864734e2cb8 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 4 Jan 2015 21:30:50 +0200 Subject: [PATCH 226/532] Fix repo name in curl --- build_children.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_children.sh b/build_children.sh index f30118f48..c4ed4ebfa 100755 --- a/build_children.sh +++ b/build_children.sh @@ -1,7 +1,7 @@ #!/bin/bash # Get last child project build number from branch named "latest" -BUILD_NUM=$(curl -s 'https://api.travis-ci.org/repos/Pillow/pillow-wheels/branches/latest' | grep -o '^{"branch":{"id":[0-9]*,' | grep -o '[0-9]' | tr -d '\n') +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 7d3d0b18ed5a71f06d1f6639dbdadec2209956f8 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 4 Jan 2015 22:01:32 +0200 Subject: [PATCH 227/532] Re-encrypt AUTH-TOKEN inside python-pillow/Pillow Instead of inside the hugovk/Pillow repo. travis login --auto travis token travis encrypt AUTH_TOKEN= --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b8b359ee0..382f205d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -110,4 +110,4 @@ matrix: env: global: # travis encrypt AUTH_TOKEN= - secure: yC1RcYF932ICXcw8hR3MHKfw9G9030+w8SgGXhhH2htgsCvKrGtb7kA4pqN7eGS31QsGatj6NmYVOdut3jIqbtP+5Pd3xceGoeo3HMWfS5RPmgbrGmiVYeDH9ZZDDZMH85oRnMU/vfI3T8SdYdyYM3hXAPzXeU6jWxQA48ft4D4= + secure: "Vzm7aG1Qv0SDQcqiPzZMedNLn5ZmpL7IzF0DYnqcD+/l+zmKU22SnJBcX0uVXumo+r7eZfpsShpqfcdsZvMlvmQnwz+Y6AGKQru9tCKZbTMnuRjWKKXekC+tr8Xt9CKvRVtte5PyXW31paxUI3/e+fQGBwoFjEEC+6EpEOjeRfE=" From 5e9b770ddb2ee4e1bdde8c2ed93bcb520477a624 Mon Sep 17 00:00:00 2001 From: Mikhail Korobov Date: Wed, 7 Jan 2015 03:39:57 +0500 Subject: [PATCH 228/532] DOC add a missing header markup --- docs/handbook/writing-your-own-file-decoder.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/handbook/writing-your-own-file-decoder.rst b/docs/handbook/writing-your-own-file-decoder.rst index 10833a53e..f871ac521 100644 --- a/docs/handbook/writing-your-own-file-decoder.rst +++ b/docs/handbook/writing-your-own-file-decoder.rst @@ -116,7 +116,8 @@ The fields are used as follows: Note that the :py:attr:`tile` attribute contains a list of tile descriptors, not just a single descriptor. -The ``raw`` decoder +The raw decoder +--------------- The ``raw`` decoder is used to read uncompressed data from an image file. It can be used with most uncompressed file formats, such as PPM, BMP, uncompressed From 52cbd123a2674f4e82678b2a6050b20d7092d04d Mon Sep 17 00:00:00 2001 From: Mikhail Korobov Date: Wed, 7 Jan 2015 04:12:37 +0500 Subject: [PATCH 229/532] DOC fix "Write Your Own File Decoder" link in Image API docs --- PIL/Image.py | 2 +- docs/handbook/writing-your-own-file-decoder.rst | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 98e3644c0..66149e320 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -2024,7 +2024,7 @@ def frombytes(mode, size, data, decoder_name="raw", *args): You can also use any pixel decoder supported by PIL. For more information on available decoders, see the section - **Writing Your Own File Decoder**. + :ref:`Writing Your Own File Decoder `. Note that this function decodes pixel data only, not entire images. If you have an entire image in a string, wrap it in a diff --git a/docs/handbook/writing-your-own-file-decoder.rst b/docs/handbook/writing-your-own-file-decoder.rst index f871ac521..0af4007be 100644 --- a/docs/handbook/writing-your-own-file-decoder.rst +++ b/docs/handbook/writing-your-own-file-decoder.rst @@ -1,4 +1,6 @@ -Writing your own file decoder +.. _file-decoders: + +Writing Your Own File Decoder ============================= The Python Imaging Library uses a plug-in model which allows you to @@ -7,7 +9,7 @@ library itself. Such plug-ins usually have names like :file:`XxxImagePlugin.py`, where ``Xxx`` is a unique format name (usually an abbreviation). -.. warning:: Pillow >= 2.1.0 no longer automatically imports any file in the Python path with a name ending in :file:`ImagePlugin.py`. You will need to import your decoder manually. +.. warning:: Pillow >= 2.1.0 no longer automatically imports any file in the Python path with a name ending in :file:`ImagePlugin.py`. You will need to import your decoder manually. A decoder plug-in should contain a decoder class, based on the :py:class:`PIL.ImageFile.ImageFile` base class. This class should provide an @@ -68,7 +70,7 @@ true color. ] Image.register_open("SPAM", SpamImageFile) - + Image.register_extension("SPAM", ".spam") Image.register_extension("SPAM", ".spa") # dos version @@ -125,7 +127,7 @@ TIFF, and many others. To use the raw decoder with the :py:func:`PIL.Image.fromstring` function, use the following syntax:: image = Image.fromstring( - mode, size, data, "raw", + mode, size, data, "raw", raw mode, stride, orientation ) From 68504305d0919c76eb9030abf7844ef21b043483 Mon Sep 17 00:00:00 2001 From: Mikhail Korobov Date: Wed, 7 Jan 2015 04:17:22 +0500 Subject: [PATCH 230/532] DOC fix a Sphinx warning :keyword: is for function arguments, not for Python keywords. And True is not even a Python keyword. --- docs/reference/ImagePath.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/ImagePath.rst b/docs/reference/ImagePath.rst index 700464144..03aa39811 100644 --- a/docs/reference/ImagePath.rst +++ b/docs/reference/ImagePath.rst @@ -53,7 +53,7 @@ vector data. Path objects can be passed to the methods on the Converts the path to a Python list [(x, y), …]. :param flat: By default, this function returns a list of 2-tuples - [(x, y), ...]. If this argument is :keyword:`True`, it + [(x, y), ...]. If this argument is `True`, it returns a flat list [x, y, ...] instead. :return: A list of coordinates. See **flat**. From 192e445b6e72ff19407572e4c3b9d4c2d951f1c1 Mon Sep 17 00:00:00 2001 From: Arnie97 Date: Thu, 8 Jan 2015 13:09:45 +0800 Subject: [PATCH 231/532] Changes "import Image" to "from PIL import Image". --- docs/reference/ImageMath.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/ImageMath.rst b/docs/reference/ImageMath.rst index e3f9ed8d6..00249a601 100644 --- a/docs/reference/ImageMath.rst +++ b/docs/reference/ImageMath.rst @@ -13,7 +13,7 @@ Example: Using the :py:mod:`~PIL.ImageMath` module .. code-block:: python - import Image, ImageMath + from PIL import Image, ImageMath im1 = Image.open("image1.jpg") im2 = Image.open("image2.jpg") From 307726edc000283f3e3da64568e3177a9bf1611d Mon Sep 17 00:00:00 2001 From: Yifu Yu Date: Wed, 15 Oct 2014 03:23:52 +0800 Subject: [PATCH 232/532] Close #891: a dirty solution to embedded bitmap fonts. Since embedded bitmap font works incorrectly, we should avoid using them, until a final patch is available and tested. I've added `FT_LOAD_NO_BITMAP` to ALL(3) places in `_imagingft.c`, which did (not much) actually fixed the issue. A notice has also been added to `_imagingft.c`. --- _imagingft.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index eb6313704..cebc52eb3 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -18,6 +18,17 @@ * Copyright (c) 1998-2007 by Secret Labs AB */ +/* + * Notes: + * Currently, embedded bitmap fonts within truetype fonts do not work + * properly (see issue #891), truetype fonts are loaded with + * FT_LOAD_NO_BITMAP load flags, resulting in embedded bitmap fonts + * not being used. + * + * Yifu Yu + * 2014-10-15 + */ + #include "Python.h" #include "Imaging.h" @@ -243,7 +254,7 @@ font_getsize(FontObject* self, PyObject* args) &delta); x += delta.x; } - error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT); + error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP); if (error) return geterror(error); if (i == 0) @@ -316,7 +327,7 @@ font_getabc(FontObject* self, PyObject* args) int index, error; face = self->face; index = FT_Get_Char_Index(face, ch); - error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT); + 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; @@ -364,7 +375,7 @@ font_render(FontObject* self, PyObject* args) im = (Imaging) id; - load_flags = FT_LOAD_RENDER; + load_flags = FT_LOAD_RENDER|FT_LOAD_NO_BITMAP; if (mask) load_flags |= FT_LOAD_TARGET_MONO; From b2e10d25f686357a69e0d827f67dfbc1247fbd1c Mon Sep 17 00:00:00 2001 From: Yifu Yu Date: Fri, 7 Nov 2014 19:21:12 +0800 Subject: [PATCH 233/532] Testcase added. --- Tests/fonts/DejaVuSans-bitmap.ttf | Bin 0 -> 964028 bytes Tests/fonts/DejaVuSans.ttf | Bin 0 -> 725132 bytes Tests/test_imagefont_bitmap.py | 20 ++++++++++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 Tests/fonts/DejaVuSans-bitmap.ttf create mode 100644 Tests/fonts/DejaVuSans.ttf create mode 100644 Tests/test_imagefont_bitmap.py diff --git a/Tests/fonts/DejaVuSans-bitmap.ttf b/Tests/fonts/DejaVuSans-bitmap.ttf new file mode 100644 index 0000000000000000000000000000000000000000..702cce37de20debaeebda239d6dfb18b1a1879a4 GIT binary patch literal 964028 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�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

1=4$Acb&oWtJZ!NM> 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

D859UFp@8 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 z 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ϝ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%0D4@!@7q31(t~5S}<5@BRmXw0zya?6wp%ou6k(g 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

7ij9l7 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 ZY%*+TdHv6?nn>e{gSRE0= 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 literal 0 HcmV?d00001 diff --git a/Tests/test_imagefont_bitmap.py b/Tests/test_imagefont_bitmap.py new file mode 100644 index 000000000..2b2de18bd --- /dev/null +++ b/Tests/test_imagefont_bitmap.py @@ -0,0 +1,20 @@ +from helper import unittest, PillowTestCase +import StringIO + +from PIL import Image, ImageFont, ImageDraw + +class TestImageFontBitmap(PillowTestCase): + def test_similar(self): + text = 'EmbeddedBitmap' + font_outline = ImageFont.truetype(font='Tests/fonts/DejaVuSans.ttf', size=24) + font_bitmap = ImageFont.truetype(font='Tests/fonts/DejaVuSans-bitmap.ttf', size=24) + size_outline, size_bitmap = font_outline.getsize(text), font_bitmap.getsize(text) + 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, draw_outline = ImageDraw.Draw(im_bitmap), ImageDraw.Draw(im_outline) + # Don't know why, but bitmap version is always vertical 1 pixel longer than outline one. + draw_bitmap.text((0, 0), text, fill=(0, 0, 0), font=font_bitmap) + draw_outline.text((0, 1), text, fill=(0, 0, 0), font=font_outline) + self.assert_image_similar(im_bitmap, im_outline, 0.01) + From 152c8afcd3c0edb1d7eca0844ee8375be98c1c23 Mon Sep 17 00:00:00 2001 From: Yifu Yu Date: Fri, 7 Nov 2014 20:35:20 +0800 Subject: [PATCH 234/532] Change bitmap test suite. Strangely, the bitmap version of DejaVu Sans is always vertical one pixer longer. --- Tests/test_imagefont_bitmap.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Tests/test_imagefont_bitmap.py b/Tests/test_imagefont_bitmap.py index 2b2de18bd..c91908983 100644 --- a/Tests/test_imagefont_bitmap.py +++ b/Tests/test_imagefont_bitmap.py @@ -13,8 +13,9 @@ class TestImageFontBitmap(PillowTestCase): im_bitmap = Image.new('RGB', size_final, (255, 255, 255)) im_outline = im_bitmap.copy() draw_bitmap, draw_outline = ImageDraw.Draw(im_bitmap), ImageDraw.Draw(im_outline) - # Don't know why, but bitmap version is always vertical 1 pixel longer than outline one. + # Don't know why, but bitmap version is always vertical 1 pixel longer than outline one on my PC. + # Revert back to both 0, 0 draw_bitmap.text((0, 0), text, fill=(0, 0, 0), font=font_bitmap) - draw_outline.text((0, 1), text, fill=(0, 0, 0), font=font_outline) + draw_outline.text((0, 0), text, fill=(0, 0, 0), font=font_outline) self.assert_image_similar(im_bitmap, im_outline, 0.01) From 20642d67cc34c03b6a2985ee4c75b620e962f5cc Mon Sep 17 00:00:00 2001 From: Yifu Yu Date: Fri, 7 Nov 2014 20:39:18 +0800 Subject: [PATCH 235/532] Remove unused StringIO. StringIO does not exists on py3, which leads to failure of building. --- Tests/test_imagefont_bitmap.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Tests/test_imagefont_bitmap.py b/Tests/test_imagefont_bitmap.py index c91908983..d567b73f0 100644 --- a/Tests/test_imagefont_bitmap.py +++ b/Tests/test_imagefont_bitmap.py @@ -1,6 +1,4 @@ from helper import unittest, PillowTestCase -import StringIO - from PIL import Image, ImageFont, ImageDraw class TestImageFontBitmap(PillowTestCase): From 14a9bba962032d21e08dc0e5364d0e1e6a0168e6 Mon Sep 17 00:00:00 2001 From: Yifu Yu Date: Fri, 7 Nov 2014 22:13:58 +0800 Subject: [PATCH 236/532] Make bitmap test runnable as a standalone. --- Tests/test_imagefont_bitmap.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tests/test_imagefont_bitmap.py b/Tests/test_imagefont_bitmap.py index d567b73f0..90b97afd4 100644 --- a/Tests/test_imagefont_bitmap.py +++ b/Tests/test_imagefont_bitmap.py @@ -17,3 +17,5 @@ class TestImageFontBitmap(PillowTestCase): draw_outline.text((0, 0), text, fill=(0, 0, 0), font=font_outline) self.assert_image_similar(im_bitmap, im_outline, 0.01) +if __name__ == '__main__': + unittest.main() From 8cb58bbd727e50e29d83824f47fe7c7ccb17ddcc Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 7 Jan 2015 21:28:49 -0800 Subject: [PATCH 237/532] Fix bitmap tests to account for different metrics for bitmap and ttf fonts on some platforms --- Tests/test_imagefont_bitmap.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Tests/test_imagefont_bitmap.py b/Tests/test_imagefont_bitmap.py index 90b97afd4..9da3d1776 100644 --- a/Tests/test_imagefont_bitmap.py +++ b/Tests/test_imagefont_bitmap.py @@ -11,11 +11,14 @@ class TestImageFontBitmap(PillowTestCase): im_bitmap = Image.new('RGB', size_final, (255, 255, 255)) im_outline = im_bitmap.copy() draw_bitmap, draw_outline = ImageDraw.Draw(im_bitmap), ImageDraw.Draw(im_outline) - # Don't know why, but bitmap version is always vertical 1 pixel longer than outline one on my PC. - # Revert back to both 0, 0 - draw_bitmap.text((0, 0), text, fill=(0, 0, 0), font=font_bitmap) - draw_outline.text((0, 0), text, fill=(0, 0, 0), font=font_outline) - self.assert_image_similar(im_bitmap, im_outline, 0.01) + + # Metrics are different on the bitmap and ttf fonts, more so on some platforms + # and versions of freetype than others. Mac has a 1px difference, linux doesn't. + draw_bitmap.text((0, size_final[1] - size_bitmap[1]), + text, fill=(0, 0, 0), font=font_bitmap) + draw_outline.text((0, size_final[1] - size_outline[1]), + text, fill=(0, 0, 0), font=font_outline) + self.assert_image_similar(im_bitmap, im_outline, 20) if __name__ == '__main__': unittest.main() From 8b7b297abac4ec3079fa28caf9b1caeb23c30694 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 7 Jan 2015 21:34:20 -0800 Subject: [PATCH 238/532] rearranged comments --- _imagingft.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index cebc52eb3..ad40ee425 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -18,17 +18,6 @@ * Copyright (c) 1998-2007 by Secret Labs AB */ -/* - * Notes: - * Currently, embedded bitmap fonts within truetype fonts do not work - * properly (see issue #891), truetype fonts are loaded with - * FT_LOAD_NO_BITMAP load flags, resulting in embedded bitmap fonts - * not being used. - * - * Yifu Yu - * 2014-10-15 - */ - #include "Python.h" #include "Imaging.h" @@ -254,6 +243,10 @@ font_getsize(FontObject* self, PyObject* args) &delta); x += delta.x; } + + /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 + * Yifu Yu, 2014-10-15 + */ error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP); if (error) return geterror(error); @@ -327,6 +320,7 @@ font_getabc(FontObject* self, PyObject* args) 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); @@ -374,7 +368,7 @@ font_render(FontObject* self, PyObject* args) } im = (Imaging) id; - + /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */ load_flags = FT_LOAD_RENDER|FT_LOAD_NO_BITMAP; if (mask) load_flags |= FT_LOAD_TARGET_MONO; From 264f5d0d96968174e7b4a815f12af6613314159a Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 8 Jan 2015 10:40:22 +0200 Subject: [PATCH 239/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 585362201..54849105b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,12 @@ Changelog (Pillow) ================== +2.8.0 (unreleased) +------------------ + +- Fix for corrupted bitmaps embedded in truetype fonts. #1072 + [jackyyf, wiredfool] + 2.7.0 (2015-01-01) ------------------ From 4713b41ed7f0ed92dad5dff50b6740baec904ff5 Mon Sep 17 00:00:00 2001 From: Mikhail Korobov Date: Thu, 15 Jan 2015 23:14:30 +0500 Subject: [PATCH 240/532] DOC document compress_level Image.save PNG option. --- docs/handbook/image-file-formats.rst | 38 ++++++++++++++++------------ 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index b440f7ac9..a85a917b8 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -125,7 +125,7 @@ The :py:meth:`~PIL.Image.Image.open` method may set the following not present. **jfif_version** - A tuple representing the jfif version, (major version, minor version). + A tuple representing the jfif version, (major version, minor version). **jfif_density** A tuple representing the pixel density of the image, in units specified @@ -139,8 +139,8 @@ The :py:meth:`~PIL.Image.Image.open` method may set the following * 2 - Pixels per Centimeter **dpi** - A tuple representing the reported pixel density in pixels per inch, if - the file is a jfif file and the units are in inches. + A tuple representing the reported pixel density in pixels per inch, if + the file is a jfif file and the units are in inches. **adobe** Adobe application marker found. If the file is not an Adobe JPEG file, this @@ -153,10 +153,10 @@ The :py:meth:`~PIL.Image.Image.open` method may set the following Indicates that this is a progressive JPEG file. **icc-profile** - The ICC color profile for the image. + The ICC color profile for the image. **exif** - Raw EXIF data from the image. + Raw EXIF data from the image. The :py:meth:`~PIL.Image.Image.save` method supports the following options: @@ -178,7 +178,7 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: **dpi** A tuple of integers representing the pixel density, ``(x,y)``. -**icc-profile** +**icc-profile** If present, the image is stored with the provided ICC profile. If this parameter is not provided, the image will be saved with no profile attached. To preserve the existing profile:: @@ -186,11 +186,11 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: im.save(filename, 'jpeg', icc_profile=im.info.get('icc_profile')) **exif** - If present, the image will be stored with the provided raw EXIF data. + If present, the image will be stored with the provided raw EXIF data. **subsampling** - If present, sets the subsampling for the encoder. - + If present, sets the subsampling for the encoder. + * ``keep``: Only valid for JPEG files, will retain the original image setting. * ``4:4:4``, ``4:2:2``, ``4:1:1``: Specific sampling values * ``-1``: equivalent to ``keep`` @@ -206,7 +206,7 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: * a string, naming a preset, e.g. ``keep``, ``web_low``, or ``web_high`` * a list, tuple, or dictionary (with integer keys = range(len(keys))) of lists of 64 integers. There must be - between 2 and 4 tables. + between 2 and 4 tables. .. versionadded:: 2.5.0 @@ -347,16 +347,22 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: possible. This includes extra processing in order to find optimal encoder settings. -**transparency** +**transparency** For ``P``, ``L``, and ``RGB`` images, this option controls what color image to mark as transparent. **dpi** - A tuple of two numbers corresponding to the desired dpi in each direction. + A tuple of two numbers corresponding to the desired dpi in each direction. **pnginfo** A :py:class:`PIL.PngImagePlugin.PngInfo` instance containing text tags. +**compress_level** + ZLIB compression level, a number between 0 and 9: 1 gives best speed, + 9 gives best compression, 0 gives no compression at all. Default is 6. + When ``optimize`` option is True ``compress_level`` has no effect + (it is set to 9 regardless of a value passed). + **bits (experimental)** For ``P`` images, this option controls how many bits to store. If omitted, the PNG writer uses 8 bits (256 colors). @@ -450,7 +456,7 @@ Saving Tiff Images The :py:meth:`~PIL.Image.Image.save` method can take the following keyword arguments: -**tiffinfo** +**tiffinfo** A :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory` object or dict object containing tiff tags and values. The TIFF field type is autodetected for Numeric and string values, any other types @@ -459,7 +465,7 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum :py:attr:`~PIL.TiffImagePlugin.ImageFileDirectory.tagtype` with the appropriate numerical value from ``TiffTags.TYPES``. - + .. versionadded:: 2.3.0 **compression** @@ -471,7 +477,7 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum These arguments to set the tiff header fields are an alternative to using the general tags available through tiffinfo. -**description** +**description** **software** @@ -483,7 +489,7 @@ These arguments to set the tiff header fields are an alternative to using the ge Strings **resolution_unit** - A string of "inch", "centimeter" or "cm" + A string of "inch", "centimeter" or "cm" **resolution** From 1e040feb1b3c1147294a272b4c49fc6234494a47 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 18 Jan 2015 10:56:29 -0800 Subject: [PATCH 241/532] Adjust buffer size when quality=keep, fixes #148 (again) --- PIL/JpegImagePlugin.py | 3 ++- Tests/test_file_jpeg.py | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 9dd79d5e6..8c20f5863 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -684,7 +684,8 @@ def _save(im, fp, filename): # https://github.com/jdriscoll/django-imagekit/issues/50 bufsize = 0 if "optimize" in info or "progressive" in info or "progression" in info: - if quality >= 95: + # keep sets quality to 0, but the actual value may be high. + if quality >= 95 or quality == 0: bufsize = 2 * im.size[0] * im.size[1] else: bufsize = im.size[0] * im.size[1] diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index b0f179d5f..64e8b74af 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -3,6 +3,7 @@ from helper import djpeg_available, cjpeg_available import random from io import BytesIO +import os from PIL import Image from PIL import ImageFile @@ -334,6 +335,24 @@ class TestFileJpeg(PillowTestCase): self.assertEqual(tag_ids['RelatedImageWidth'], 0x1001) self.assertEqual(tag_ids['RelatedImageLength'], 0x1002) + def test_MAXBLOCK_scaling(self): + def gen_random_image(size): + """ Generates a very hard to compress file + :param size: tuple + """ + return Image.frombytes('RGB',size, os.urandom(size[0]*size[1] *3)) + + im = gen_random_image((512,512)) + f = self.tempfile("temp.jpeg") + im.save(f, quality=100, optimize=True) + + reloaded = Image.open(f) + + # none of these should crash + reloaded.save(f, quality='keep') + reloaded.save(f, quality='keep', progressive=True) + reloaded.save(f, quality='keep', optimize=True) + if __name__ == '__main__': unittest.main() From 52734ebd003b592a7e2166e78787a3b2fb0733ca Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 19 Jan 2015 11:47:31 +0200 Subject: [PATCH 242/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 54849105b..7e67dc8bb 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Adjust buffer size when quality=keep, fixes #148 (again) + [wiredfool] + - Fix for corrupted bitmaps embedded in truetype fonts. #1072 [jackyyf, wiredfool] From 5061f7bdde6495848f96a3823f3c5be8b3b7b500 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Tue, 20 Jan 2015 15:00:58 -0800 Subject: [PATCH 243/532] Turn off zip-safe flag for debug builds --- setup.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 90687d51f..7262db39e 100644 --- a/setup.py +++ b/setup.py @@ -722,6 +722,9 @@ class pil_build_ext(build_ext): os.unlink(tmpfile) +def debug_build(): + return hasattr(sys, 'gettotalrefcount') + setup( name=NAME, version=PILLOW_VERSION, @@ -754,6 +757,6 @@ setup( test_suite='PIL.tests', keywords=["Imaging", ], license='Standard PIL License', - zip_safe=True, + zip_safe= not debug_build(), ) # End of file From 77b020b374631d66fd73a1f94f26b7d87b776d68 Mon Sep 17 00:00:00 2001 From: Benjamin Gilbert Date: Sat, 24 Jan 2015 01:13:58 -0500 Subject: [PATCH 244/532] Special-case opaque pixels in RGBa unpacker Avoid the expensive multiply and divide when the pixel is opaque. On my system, this change gives a 5.76x speedup loading an opaque image with this call: PIL.Image.frombuffer('RGBA', (1000, 1000), buf, 'raw', 'RGBa', 0, 1) --- libImaging/Unpack.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libImaging/Unpack.c b/libImaging/Unpack.c index 7c453dbfd..bc8ed3213 100644 --- a/libImaging/Unpack.c +++ b/libImaging/Unpack.c @@ -638,7 +638,12 @@ unpackRGBa(UINT8* out, const UINT8* in, int pixels) int a = in[3]; if (!a) out[R] = out[G] = out[B] = out[A] = 0; - else { + else if (a == 255) { + out[R] = in[0]; + out[G] = in[1]; + out[B] = in[2]; + out[A] = a; + } else { out[R] = CLIP(in[0] * 255 / a); out[G] = CLIP(in[1] * 255 / a); out[B] = CLIP(in[2] * 255 / a); From bc0a54b12d11a76cf1a0d6e1bec2109b9fddf6d3 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 26 Jan 2015 09:02:27 -0800 Subject: [PATCH 245/532] Updated Changes.rst (cve number) [ci skip] --- CHANGES.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 7e67dc8bb..05f3a41f1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -19,7 +19,7 @@ Changelog (Pillow) - Look for OSX and Linux fonts in common places. #1054 [charleslaw] -- Fix potential PNG decompression DOS #1060 +- Fix CVE-2014-9601, potential PNG decompression DOS #1060 [wiredfool] - Use underscores, not spaces, in TIFF tag kwargs. #1044, #1058 @@ -94,7 +94,7 @@ Changelog (Pillow) 2.6.2 (2015-01-01) ------------------ -- Fix potential PNG decompression DOS #1060 +- Fix CVE-2014-9601, potential PNG decompression DOS #1060 [wiredfool] - Fix Regression in PyPy 2.4 in streamio #958 From 05fe86654cb079b5b77d077e053bf5ee6d2b6f5b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 28 Jan 2015 09:35:31 -0800 Subject: [PATCH 246/532] Added _repr_png method for ipython display hooks --- PIL/Image.py | 10 ++++++++++ Tests/test_file_png.py | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/PIL/Image.py b/PIL/Image.py index 66149e320..7c17a1682 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -598,6 +598,16 @@ class Image: id(self) ) + def _repr_png(self): + """ iPython display hook support + + :returns: png version of the image as bytes + """ + from io import BytesIO + b = BytesIO() + self.save(b, 'PNG') + return b.getvalue() + def __getattr__(self, name): if name == "__array_interface__": # numpy array interface support diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index b556199f5..da5f73a0e 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -374,6 +374,14 @@ class TestFilePng(PillowTestCase): im = roundtrip(im) self.assertEqual(im.info['icc_profile'], expected_icc) + def test_repr_png(self): + im = hopper() + + repr_png = Image.open(BytesIO(im._repr_png())) + self.assertEqual(repr_png.format, 'PNG') + self.assert_image_equal(im, repr_png) + + if __name__ == '__main__': unittest.main() From 8c2a7502a459bbffe6246339e44b7a401d18b073 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 28 Jan 2015 10:02:04 -0800 Subject: [PATCH 247/532] Correct the name --- PIL/Image.py | 2 +- Tests/test_file_png.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 7c17a1682..f6aeb7c3c 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -598,7 +598,7 @@ class Image: id(self) ) - def _repr_png(self): + def _repr_png_(self): """ iPython display hook support :returns: png version of the image as bytes diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index da5f73a0e..4cd5dc703 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -377,7 +377,7 @@ class TestFilePng(PillowTestCase): def test_repr_png(self): im = hopper() - repr_png = Image.open(BytesIO(im._repr_png())) + repr_png = Image.open(BytesIO(im._repr_png_())) self.assertEqual(repr_png.format, 'PNG') self.assert_image_equal(im, repr_png) From 8ebdc5b64db8be731ffbaf1baffbe845f9339e3c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 28 Jan 2015 20:23:15 -0800 Subject: [PATCH 248/532] Comment typo [ci skip] --- PIL/IcoImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index db8cec0ca..b4817db27 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -273,7 +273,7 @@ class IcoImageFile(ImageFile.ImageFile): self.size = im.size def load_seek(self): - # Flage the ImageFile.Parser so that it + # Flag the ImageFile.Parser so that it # just does all the decode at the end. pass # From 7823197fdd7049f5629f5877122bbf6ec532cf11 Mon Sep 17 00:00:00 2001 From: hugovk Date: Fri, 30 Jan 2015 14:00:46 +0200 Subject: [PATCH 249/532] Failing tests to pickle L mode images --- Tests/test_pickle.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/Tests/test_pickle.py b/Tests/test_pickle.py index 59dfd5948..f1c594be9 100644 --- a/Tests/test_pickle.py +++ b/Tests/test_pickle.py @@ -5,10 +5,12 @@ from PIL import Image class TestPickle(PillowTestCase): - def helper_pickle_file(self, pickle, protocol=0): + def helper_pickle_file(self, pickle, protocol=0, mode=None): # Arrange im = Image.open('Tests/images/hopper.jpg') filename = self.tempfile('temp.pkl') + if mode: + im = im.convert(mode) # Act with open(filename, 'wb') as f: @@ -19,9 +21,11 @@ class TestPickle(PillowTestCase): # Assert self.assertEqual(im, loaded_im) - def helper_pickle_string( - self, pickle, protocol=0, file='Tests/images/hopper.jpg'): + def helper_pickle_string(self, pickle, protocol=0, + file='Tests/images/hopper.jpg', mode=None): im = Image.open(file) + if mode: + im = im.convert(mode) # Act dumped_string = pickle.dumps(im, protocol) @@ -67,6 +71,26 @@ class TestPickle(PillowTestCase): ]: self.helper_pickle_string(pickle, file=file) + def test_pickle_l_mode(self): + # Arrange + import pickle + + # Act / Assert + for protocol in range(0, pickle.HIGHEST_PROTOCOL + 1): + self.helper_pickle_string(pickle, protocol, mode="L") + self.helper_pickle_file(pickle, protocol, mode="L") + + def test_cpickle_l_mode(self): + # Arrange + try: + import cPickle + except ImportError: + return + + # Act / Assert + for protocol in range(0, cPickle.HIGHEST_PROTOCOL + 1): + self.helper_pickle_string(cPickle, protocol, mode="L") + self.helper_pickle_file(cPickle, protocol, mode="L") if __name__ == '__main__': unittest.main() From 0f8932221642efc325e5155eee857c0b057c9d31 Mon Sep 17 00:00:00 2001 From: hugovk Date: Fri, 30 Jan 2015 14:04:35 +0200 Subject: [PATCH 250/532] When unpickling, only put palette if there is one --- PIL/Image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/Image.py b/PIL/Image.py index 66149e320..63ef2cd96 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -625,7 +625,7 @@ class Image: self.mode = mode self.size = size self.im = core.new(mode, size) - if mode in ("L", "P"): + if mode in ("L", "P") and palette: self.putpalette(palette) self.frombytes(data) From 70e1db9c9c33d0eb668152895814da0b1a279aed Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 30 Jan 2015 14:38:13 +0200 Subject: [PATCH 251/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 05f3a41f1..3c277b3d9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- iPython display hook #1091 + [wiredfool] + - Adjust buffer size when quality=keep, fixes #148 (again) [wiredfool] From 5fa52f8891f60d5a3000ebb802dea8a21bf7914a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 30 Jan 2015 11:41:22 -0800 Subject: [PATCH 252/532] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3c277b3d9..b47f5ad50 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Fix pickling L mode images with no palette, #1095 + [hugovk] + - iPython display hook #1091 [wiredfool] From d41fed67327f9fc0f6aa14122dfdec8329aa7393 Mon Sep 17 00:00:00 2001 From: immerrr Date: Mon, 2 Feb 2015 11:53:16 +0300 Subject: [PATCH 253/532] Enable basic support for 'RGBa' raw encoding/decoding --- Tests/test_lib_pack.py | 9 +++++++++ libImaging/Pack.c | 5 +++++ libImaging/Unpack.c | 6 ++++++ 3 files changed, 20 insertions(+) diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 102835b58..4d40b4100 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -48,6 +48,10 @@ class TestLibPack(PillowTestCase): self.assertEqual(pack("RGBA", "RGBA"), [1, 2, 3, 4]) + self.assertEqual(pack("RGBa", "RGBa"), [1, 2, 3, 4]) + self.assertEqual(pack("RGBa", "BGRa"), [3, 2, 1, 4]) + self.assertEqual(pack("RGBa", "aBGR"), [4, 3, 2, 1]) + self.assertEqual(pack("CMYK", "CMYK"), [1, 2, 3, 4]) self.assertEqual(pack("YCbCr", "YCbCr"), [1, 2, 3]) @@ -125,6 +129,11 @@ class TestLibPack(PillowTestCase): self.assertEqual(unpack("RGBA", "BGRA;15", 2), (0, 131, 8, 0)) self.assertEqual(unpack("RGBA", "RGBA;4B", 2), (17, 0, 34, 0)) + self.assertEqual(unpack("RGBa", "RGBa", 4), (1, 2, 3, 4)) + self.assertEqual(unpack("RGBa", "BGRa", 4), (3, 2, 1, 4)) + self.assertEqual(unpack("RGBa", "aRGB", 4), (2, 3, 4, 1)) + self.assertEqual(unpack("RGBa", "aBGR", 4), (4, 3, 2, 1)) + self.assertEqual(unpack("RGBX", "RGBX", 4), (1, 2, 3, 4)) # 4->255? self.assertEqual(unpack("RGBX", "BGRX", 4), (3, 2, 1, 255)) self.assertEqual(unpack("RGBX", "XRGB", 4), (2, 3, 4, 255)) diff --git a/libImaging/Pack.c b/libImaging/Pack.c index fecafbde4..d174d7d0d 100644 --- a/libImaging/Pack.c +++ b/libImaging/Pack.c @@ -530,6 +530,11 @@ static struct { {"RGBA", "B", 8, band2}, {"RGBA", "A", 8, band3}, + /* true colour w. alpha premultiplied */ + {"RGBa", "RGBa", 32, copy4}, + {"RGBa", "BGRa", 32, ImagingPackBGRA}, + {"RGBa", "aBGR", 32, ImagingPackABGR}, + /* true colour w. padding */ {"RGBX", "RGBX", 32, copy4}, {"RGBX", "RGBX;L", 32, packRGBXL}, diff --git a/libImaging/Unpack.c b/libImaging/Unpack.c index 7c453dbfd..6486ac595 100644 --- a/libImaging/Unpack.c +++ b/libImaging/Unpack.c @@ -1114,6 +1114,12 @@ static struct { {"RGBA", "B", 8, band2}, {"RGBA", "A", 8, band3}, + /* true colour w. alpha premultiplied */ + {"RGBa", "RGBa", 32, copy4}, + {"RGBa", "BGRa", 32, unpackBGRA}, + {"RGBa", "aRGB", 32, unpackARGB}, + {"RGBa", "aBGR", 32, unpackABGR}, + /* true colour w. padding */ {"RGBX", "RGB", 24, ImagingUnpackRGB}, {"RGBX", "RGB;L", 24, unpackRGBL}, From cfbb2b36184cb6d337776a39e1f4a89d1b291cae Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 5 Feb 2015 22:29:48 -0800 Subject: [PATCH 254/532] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index b47f5ad50..752d7e180 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Enable basic support for 'RGBa' raw encoding/decoding + [immerrr] + - Fix pickling L mode images with no palette, #1095 [hugovk] From 8c88a4d8d3c15463285ebaaec2f2f8b0d65c5fd0 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 5 Feb 2015 22:34:13 -0800 Subject: [PATCH 255/532] Update CHANGES.rst [ci skip] --- CHANGES.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 752d7e180..ee48c66f7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,10 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ -- Enable basic support for 'RGBa' raw encoding/decoding +- Fast path for opaque pixels in RGBa unpacker #1088 + [bgilbert] + +- Enable basic support for 'RGBa' raw encoding/decoding #1096 [immerrr] - Fix pickling L mode images with no palette, #1095 From d12acfee849a77bfb4d07c49f3fedc3358f64883 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 8 Feb 2015 19:09:39 +0200 Subject: [PATCH 256/532] Test as_dict() directly instead of as string. Fix for PyPy. --- Tests/test_file_tiff.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index ee3e678eb..32aef075e 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -176,12 +176,23 @@ class TestFileTiff(PillowTestCase): # Assert self.assertIsInstance(ret, str) + + def test_as_dict(self): + # Arrange + filename = "Tests/images/pil136.tiff" + im = Image.open(filename) + + # Act + ret = im.ifd.as_dict() + + # Assert + self.assertIsInstance(ret, dict) + self.assertEqual( - ret, - '{256: (55,), 257: (43,), 258: (8, 8, 8, 8), 259: (1,), ' - '262: (2,), 296: (2,), 273: (8,), 338: (1,), 277: (4,), ' - '279: (9460,), 282: ((720000, 10000),), ' - '283: ((720000, 10000),), 284: (1,)}') + ret, {256: (55,), 257: (43,), 258: (8, 8, 8, 8), 259: (1,), + 262: (2,), 296: (2,), 273: (8,), 338: (1,), 277: (4,), + 279: (9460,), 282: ((720000, 10000),), + 283: ((720000, 10000),), 284: (1,)}) def test__delitem__(self): # Arrange From 5ec6fcdeaaab22aac76d61e540c0be825c2d2ccd Mon Sep 17 00:00:00 2001 From: Chris Adams Date: Tue, 10 Feb 2015 13:15:47 -0500 Subject: [PATCH 257/532] Tidy docs for DecompressionBombWarning * Fix formatting to display simplefilter examples as code blocks rather than italics * Wrap text so it's not one incredibly long line --- docs/reference/Image.rst | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index 2617bc2bf..974d84a6e 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -49,7 +49,14 @@ Functions .. autofunction:: open - .. warning:: To protect against potential DOS attacks caused by "`decompression bombs`_" (i.e. malicious files which decompress into a huge amount of data and are designed to crash or cause disruption by using up a lot of memory), Pillow will issue a `DecompressionBombWarning` if the image is over a certain limit. If desired, the warning can be turned into an error with `warnings.simplefilter('error', Image.DecompressionBombWarning)` or suppressed entirely with `warnings.simplefilter('ignore', Image.DecompressionBombWarning)`. See also `the logging documentation`_ to have warnings output to the logging facility instead of stderr. + .. warning:: + To protect against potential DOS attacks caused by "`decompression bombs`_" (i.e. malicious files + which decompress into a huge amount of data and are designed to crash or cause disruption by using up + a lot of memory), Pillow will issue a `DecompressionBombWarning` if the image is over a certain + limit. If desired, the warning can be turned into an error with + ``warnings.simplefilter('error', Image.DecompressionBombWarning)`` or suppressed entirely with + ``warnings.simplefilter('ignore', Image.DecompressionBombWarning)``. See also `the logging + 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 @@ -193,6 +200,6 @@ Instances of the :py:class:`Image` class have the following attributes: operation affects the dictionary. If you need the information later on, keep a reference to the info dictionary returned from the open method. - Unless noted elsewhere, this dictionary does not affect saving files. + Unless noted elsewhere, this dictionary does not affect saving files. :type: :py:class:`dict` From be30160d578e3c3cdd2849fc25c051c47f05487c Mon Sep 17 00:00:00 2001 From: Hans-Peter Jansen Date: Fri, 6 Feb 2015 09:04:23 +0100 Subject: [PATCH 258/532] early versions of webp are known to produce higher deviations: deal with it --- Tests/test_file_webp_alpha.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_webp_alpha.py b/Tests/test_file_webp_alpha.py index 22c5c0922..f316b71e1 100644 --- a/Tests/test_file_webp_alpha.py +++ b/Tests/test_file_webp_alpha.py @@ -83,7 +83,11 @@ class TestFileWebpAlpha(PillowTestCase): image.load() image.getdata() - self.assert_image_similar(image, pil_image, 1.0) + # early versions of webp are known to produce higher deviations: deal with it + if _webp.WebPDecoderVersion(self) <= 0x201: + self.assert_image_similar(image, pil_image, 3.0) + else: + self.assert_image_similar(image, pil_image, 1.0) if __name__ == '__main__': From 61fb1c5bd4215a2cff2ec80578f901f71d073919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Pedersen?= Date: Mon, 23 Feb 2015 09:46:35 +0100 Subject: [PATCH 259/532] Tiff: allow writing floating poitn tag values Use the inverse logic used for loading floating point tag values to also write them out again. --- PIL/TiffImagePlugin.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index a533c27ea..d7291e87c 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -517,6 +517,15 @@ class ImageFileDirectory(collections.MutableMapping): elif typ == 7: # untyped data data = value = b"".join(value) + elif typ in (11, 12): + # float value + tmap = {11: 'f', 12: 'd'} + if not isinstance(value, tuple): + value = (value,) + a = array.array(tmap[typ], value) + if self.prefix != native_prefix: + a.byteswap() + data = a.tostring() elif isStringType(value[0]): # string data if isinstance(value, tuple): From 31be9f12ad096e4655a4415c2cfd2511229cd15b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Pedersen?= Date: Mon, 23 Feb 2015 10:51:42 +0100 Subject: [PATCH 260/532] Add tests for tiff float tag values Add tests for writing of float/double values in tiff file tags. --- Tests/test_file_tiff_metadata.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index 314590006..1cc5721e4 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -16,10 +16,18 @@ class TestFileTiffMetadata(PillowTestCase): img = hopper() textdata = "This is some arbitrary metadata for a text field" + floatdata = 12.345 + doubledata = 67.89 + info = TiffImagePlugin.ImageFileDirectory() info[tag_ids['ImageJMetaDataByteCounts']] = len(textdata) info[tag_ids['ImageJMetaData']] = textdata + info[tag_ids['RollAngle']] = floatdata + info.tagtype[tag_ids['RollAngle']] = 11 + + info[tag_ids['YawAngle'] = doubledata + info.tagtype[tag_ids['YawAngle']] = 12 f = self.tempfile("temp.tif") @@ -29,6 +37,8 @@ class TestFileTiffMetadata(PillowTestCase): self.assertEqual(loaded.tag[50838], (len(textdata),)) self.assertEqual(loaded.tag[50839], textdata) + self.assertEqual(loaded.tag[tag_ids['RollAngle']], floatdata) + self.assertEqual(loaded.tag[tag_ids['YawAngle']], doubledata) def test_read_metadata(self): img = Image.open('Tests/images/hopper_g4.tif') From 1f11fc7be5dce094275f0efc78cf7fe6f57fcff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Pedersen?= Date: Mon, 23 Feb 2015 11:09:01 +0100 Subject: [PATCH 261/532] Fix typo in test --- 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 1cc5721e4..eb596f658 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -26,7 +26,7 @@ class TestFileTiffMetadata(PillowTestCase): info[tag_ids['RollAngle']] = floatdata info.tagtype[tag_ids['RollAngle']] = 11 - info[tag_ids['YawAngle'] = doubledata + info[tag_ids['YawAngle']] = doubledata info.tagtype[tag_ids['YawAngle']] = 12 f = self.tempfile("temp.tif") From 4af381c6ba856611c75de2437e8f57b18ed1c37a Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Mon, 23 Feb 2015 10:24:33 +0100 Subject: [PATCH 262/532] webp: add memory leak test --- Tests/check_webp_leaks.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Tests/check_webp_leaks.py diff --git a/Tests/check_webp_leaks.py b/Tests/check_webp_leaks.py new file mode 100644 index 000000000..b5875c8ab --- /dev/null +++ b/Tests/check_webp_leaks.py @@ -0,0 +1,37 @@ +from helper import unittest, PillowTestCase +import sys +from PIL import Image +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.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 + + def test_leak_load(self): + with open(test_file, 'rb') as f: + im_data = f.read() + start_mem = self._get_mem_usage() + for count in range(iterations): + 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') + +if __name__ == '__main__': + unittest.main() From 3d5dd3b4fc2efddb8be36b402373e1308dad1cfb Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Mon, 23 Feb 2015 05:59:40 +0100 Subject: [PATCH 263/532] webp: minor cleanup --- _webp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_webp.c b/_webp.c index c201813d7..96826dde5 100644 --- a/_webp.c +++ b/_webp.c @@ -136,7 +136,7 @@ PyObject* WebPEncode_wrapper(PyObject* self, PyObject* args) PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) { PyBytesObject *webp_string; - uint8_t *webp; + const uint8_t *webp; Py_ssize_t size; PyObject *ret, *bytes, *pymode, *icc_profile = Py_None, *exif = Py_None; WebPDecoderConfig config; @@ -174,7 +174,7 @@ PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) WebPMux* mux = WebPMuxCreate(&data, copy_data); WebPMuxGetFrame(mux, 1, &image); - webp = (uint8_t*)image.bitstream.bytes; + webp = image.bitstream.bytes; size = image.bitstream.size; vp8_status_code = WebPDecode(webp, size, &config); From 4930b66aa90c4e835bcc8b2875fca5471884dc7b Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Mon, 23 Feb 2015 06:00:41 +0100 Subject: [PATCH 264/532] webp: fix memory leak The "S" format specifier for Py_BuildValue *increases* the object reference count. --- _webp.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/_webp.c b/_webp.c index 96826dde5..70532726c 100644 --- a/_webp.c +++ b/_webp.c @@ -138,7 +138,7 @@ PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) PyBytesObject *webp_string; const uint8_t *webp; Py_ssize_t size; - PyObject *ret, *bytes, *pymode, *icc_profile = Py_None, *exif = Py_None; + PyObject *ret = Py_None, *bytes = NULL, *pymode = NULL, *icc_profile = NULL, *exif = NULL; WebPDecoderConfig config; VP8StatusCode vp8_status_code = VP8_STATUS_OK; char* mode = "RGB"; @@ -194,10 +194,8 @@ PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) #endif } - if (vp8_status_code != VP8_STATUS_OK) { - WebPFreeDecBuffer(&config.output); - Py_RETURN_NONE; - } + if (vp8_status_code != VP8_STATUS_OK) + goto end; if (config.output.colorspace < MODE_YUV) { bytes = PyBytes_FromStringAndSize((char *)config.output.u.RGBA.rgba, @@ -215,8 +213,21 @@ PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) pymode = PyString_FromString(mode); #endif ret = Py_BuildValue("SiiSSS", bytes, config.output.width, - config.output.height, pymode, icc_profile, exif); + config.output.height, pymode, + NULL == icc_profile ? Py_None : icc_profile, + NULL == exif ? Py_None : exif); + +end: WebPFreeDecBuffer(&config.output); + + Py_XDECREF(bytes); + Py_XDECREF(pymode); + Py_XDECREF(icc_profile); + Py_XDECREF(exif); + + if (Py_None == ret) + Py_RETURN_NONE; + return ret; } From fef9c7001ded489439c8978288556fc9fc54a5ee Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Mon, 23 Feb 2015 06:04:09 +0100 Subject: [PATCH 265/532] webp: fix memory leak when using Mux API --- _webp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/_webp.c b/_webp.c index 70532726c..c6e71d229 100644 --- a/_webp.c +++ b/_webp.c @@ -189,6 +189,7 @@ PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) exif = PyBytes_FromStringAndSize((const char*)exif_data.bytes, exif_data.size); } + WebPDataClear(&image.bitstream); WebPMuxDelete(mux); } #endif From 76bafe20a618205354664a9b29b1423536b658ce Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Mon, 23 Feb 2015 06:04:32 +0100 Subject: [PATCH 266/532] webp: better error checking when using Mux API --- _webp.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/_webp.c b/_webp.c index c6e71d229..a8c6d40af 100644 --- a/_webp.c +++ b/_webp.c @@ -173,21 +173,25 @@ PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) WebPData exif_data = {0}; WebPMux* mux = WebPMuxCreate(&data, copy_data); - WebPMuxGetFrame(mux, 1, &image); + if (NULL == mux) + goto end; + + if (WEBP_MUX_OK != WebPMuxGetFrame(mux, 1, &image)) + { + WebPMuxDelete(mux); + goto end; + } + webp = image.bitstream.bytes; size = image.bitstream.size; vp8_status_code = WebPDecode(webp, size, &config); - WebPMuxGetChunk(mux, "ICCP", &icc_profile_data); - if (icc_profile_data.size > 0) { + if (WEBP_MUX_OK == WebPMuxGetChunk(mux, "ICCP", &icc_profile_data)) icc_profile = PyBytes_FromStringAndSize((const char*)icc_profile_data.bytes, icc_profile_data.size); - } - WebPMuxGetChunk(mux, "EXIF", &exif_data); - if (exif_data.size > 0) { + if (WEBP_MUX_OK == WebPMuxGetChunk(mux, "EXIF", &exif_data)) exif = PyBytes_FromStringAndSize((const char*)exif_data.bytes, exif_data.size); - } WebPDataClear(&image.bitstream); WebPMuxDelete(mux); From 0238a80e249ac0786f9933b78180311825daa973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Pedersen?= Date: Mon, 23 Feb 2015 11:19:32 +0100 Subject: [PATCH 267/532] Fix test failure on float due to rounding, the values are just 'almost' equal. --- 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 eb596f658..12689ba1c 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -37,8 +37,8 @@ class TestFileTiffMetadata(PillowTestCase): self.assertEqual(loaded.tag[50838], (len(textdata),)) self.assertEqual(loaded.tag[50839], textdata) - self.assertEqual(loaded.tag[tag_ids['RollAngle']], floatdata) - self.assertEqual(loaded.tag[tag_ids['YawAngle']], doubledata) + self.assertAlmostEqual(loaded.tag[tag_ids['RollAngle']], floatdata) + self.assertAlmostEqual(loaded.tag[tag_ids['YawAngle']], doubledata) def test_read_metadata(self): img = Image.open('Tests/images/hopper_g4.tif') From e8553e1dae56a4e5acc19c9df348a55b5fdbe5c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Pedersen?= Date: Mon, 23 Feb 2015 12:06:29 +0100 Subject: [PATCH 268/532] Tiff float tags: Use first val in tuple --- 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 12689ba1c..4642780c2 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -37,8 +37,8 @@ class TestFileTiffMetadata(PillowTestCase): self.assertEqual(loaded.tag[50838], (len(textdata),)) self.assertEqual(loaded.tag[50839], textdata) - self.assertAlmostEqual(loaded.tag[tag_ids['RollAngle']], floatdata) - self.assertAlmostEqual(loaded.tag[tag_ids['YawAngle']], doubledata) + self.assertAlmostEqual(loaded.tag[tag_ids['RollAngle']][0], floatdata) + self.assertAlmostEqual(loaded.tag[tag_ids['YawAngle']][0], doubledata) def test_read_metadata(self): img = Image.open('Tests/images/hopper_g4.tif') From 47f5c9e650bf73dcc5a096d8bc931e74bd0b8060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Pedersen?= Date: Mon, 23 Feb 2015 12:11:20 +0100 Subject: [PATCH 269/532] Fix float precission --- Tests/test_file_tiff_metadata.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index 4642780c2..2954c0879 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -37,7 +37,8 @@ class TestFileTiffMetadata(PillowTestCase): self.assertEqual(loaded.tag[50838], (len(textdata),)) self.assertEqual(loaded.tag[50839], textdata) - self.assertAlmostEqual(loaded.tag[tag_ids['RollAngle']][0], floatdata) + self.assertAlmostEqual(loaded.tag[tag_ids['RollAngle']][0], floatdata, + places=5) self.assertAlmostEqual(loaded.tag[tag_ids['YawAngle']][0], doubledata) def test_read_metadata(self): From 066faeb21134fa531ab0a49876ea9ed6fa560402 Mon Sep 17 00:00:00 2001 From: Robin Lewis Date: Mon, 23 Feb 2015 12:00:52 +0000 Subject: [PATCH 270/532] Reference non-deprecated argument in truetype documentation --- PIL/ImageFont.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index afbae372f..37a3fd175 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -214,7 +214,7 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): This function requires the _imagingft service. - :param filename: A truetype font file. Under Windows, if the file + :param font: A truetype font file. Under Windows, if the file is not found in this filename, the loader also looks in Windows :file:`fonts/` directory. :param size: The requested size, in points. From 7fafd09bf5a51886033d9e3c1332c3d6b159c2a7 Mon Sep 17 00:00:00 2001 From: Robin Lewis Date: Mon, 23 Feb 2015 12:23:01 +0000 Subject: [PATCH 271/532] Document filename parameter as deprecated in truetype() --- PIL/ImageFont.py | 1 + 1 file changed, 1 insertion(+) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 37a3fd175..cf1922c9e 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -224,6 +224,7 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): Symbol), "ADOB" (Adobe Standard), "ADBE" (Adobe Expert), and "armn" (Apple Roman). See the FreeType documentation for more information. + :param filename: Deprecated. Please use font instead. :return: A font object. :exception IOError: If the file could not be read. """ From 9eefe4a7baa17d69dffe2b60e90577289c5d537c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 25 Feb 2015 10:09:32 -0800 Subject: [PATCH 272/532] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index ee48c66f7..d1adce2d6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Fix webp decode memory leak #1114 + [benoit-pierre] + - Fast path for opaque pixels in RGBa unpacker #1088 [bgilbert] From aeb1e61aa753beacf442763f0df23af8fb9c781c Mon Sep 17 00:00:00 2001 From: amoibos Date: Sun, 11 Jan 2015 23:29:47 +0100 Subject: [PATCH 273/532] let python do the endian stuff --- PIL/_binary.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/PIL/_binary.py b/PIL/_binary.py index 51ce45a79..89a05a46f 100644 --- a/PIL/_binary.py +++ b/PIL/_binary.py @@ -11,6 +11,8 @@ # See the README file for information on usage and redistribution. # +from struct import unpack, pack + if bytes is str: def i8(c): return ord(c) @@ -34,7 +36,7 @@ def i16le(c, o=0): c: string containing bytes to convert o: offset of bytes to convert in string """ - return i8(c[o]) | (i8(c[o+1]) << 8) + return unpack("H", c[o:o+2]) def i32be(c, o=0): - return ((i8(c[o]) << 24) | (i8(c[o+1]) << 16) | - (i8(c[o+2]) << 8) | i8(c[o+3])) + return unpack(">I", c[o:o+4]) # Output, le = little endian, be = big endian def o16le(i): - return o8(i) + o8(i >> 8) + return pack("> 8) + o8(i >> 16) + o8(i >> 24) + return pack("> 8) + o8(i) + return pack(">H", i) def o32be(i): - return o8(i >> 24) + o8(i >> 16) + o8(i >> 8) + o8(i) + return pack(">I", i) # End of file From ef6f30b67402b637aa8fd39c915603815d82fb9b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 2 Mar 2015 09:28:24 +1100 Subject: [PATCH 274/532] Fixed typo in Tests README.rst --- Tests/README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/README.rst b/Tests/README.rst index 6fd770f55..e3f160b09 100644 --- a/Tests/README.rst +++ b/Tests/README.rst @@ -3,7 +3,7 @@ Pillow Tests Test scripts are named ``test_xxx.py`` and use the ``unittest`` module. A base class and helper functions can be found in ``helper.py``. -Depedencies +Dependencies ----------- Install:: From f644adbb05d615a9902ef3643714d5fe8049cea3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 2 Mar 2015 09:56:47 +1100 Subject: [PATCH 275/532] Fixed binary conversion bug, and added corresponding tests --- PIL/_binary.py | 8 ++++---- Tests/test_binary.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 Tests/test_binary.py diff --git a/PIL/_binary.py b/PIL/_binary.py index 89a05a46f..2f5e8ffd4 100644 --- a/PIL/_binary.py +++ b/PIL/_binary.py @@ -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]) + return unpack(">H", c[o:o+2])[0] def i32be(c, o=0): - return unpack(">I", c[o:o+4]) + return unpack(">I", c[o:o+4])[0] # Output, le = little endian, be = big endian diff --git a/Tests/test_binary.py b/Tests/test_binary.py new file mode 100644 index 000000000..4d3fb5914 --- /dev/null +++ b/Tests/test_binary.py @@ -0,0 +1,28 @@ +from helper import unittest, PillowTestCase + +from PIL import _binary + +class TestBinary(PillowTestCase): + + def test_standard(self): + self.assertEqual(_binary.i8(b'*'), 42) + self.assertEqual(_binary.o8(42), b'*') + + def test_little_endian(self): + self.assertEqual(_binary.i16le(b'\xff\xff\x00\x00'), 65535) + self.assertEqual(_binary.i32le(b'\xff\xff\x00\x00'), 65535) + + self.assertEqual(_binary.o16le(65535), b'\xff\xff') + self.assertEqual(_binary.o32le(65535), b'\xff\xff\x00\x00') + + def test_big_endian(self): + self.assertEqual(_binary.i16be(b'\x00\x00\xff\xff'), 0) + self.assertEqual(_binary.i32be(b'\x00\x00\xff\xff'), 65535) + + self.assertEqual(_binary.o16be(65535), b'\xff\xff') + self.assertEqual(_binary.o32be(65535), b'\x00\x00\xff\xff') + +if __name__ == '__main__': + unittest.main() + +# End of file \ No newline at end of file From 2c70c9e5e9ca0389601303aea418eef5bdcf2353 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 2 Mar 2015 10:45:33 +0200 Subject: [PATCH 276/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index d1adce2d6..74d1b6b82 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Let Python do the endian stuff + tests #1121 + [amoibos, radarhere] + - Fix webp decode memory leak #1114 [benoit-pierre] From 7a798f8724a3f519dfa7db3cf2245082d0c2f2e3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 4 Mar 2015 00:00:18 +1100 Subject: [PATCH 277/532] Added copy method font_variant() and accessible properties to truetype() --- PIL/ImageFont.py | 11 +++++++++++ Tests/test_imagefont.py | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index cf1922c9e..5d08abfa5 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -133,6 +133,11 @@ class FreeTypeFont: DeprecationWarning) font = file + self.path = font + self.size = size + self.index = index + self.encoding = encoding + if isPath(font): self.font = core.getfont(font, size, index, encoding) else: @@ -162,6 +167,12 @@ class FreeTypeFont: self.font.render(text, im.id, mode == "1") return im, offset + def font_variant(self, font=None, size=None, index=None, encoding=None): + return FreeTypeFont(font = self.path if font == None else font, + size = self.size if size == None else size, + index = self.index if index == None else index, + encoding = self.encoding if encoding == None else encoding) + ## # Wrapper that creates a transposed font from any existing font # object. diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 1f935088c..1b03ed13b 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -44,6 +44,22 @@ try: self.assertRegexpMatches( ImageFont.core.freetype2_version, "\d+\.\d+\.\d+$") + def test_font_properties(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + self.assertEqual(ttf.path, FONT_PATH) + self.assertEqual(ttf.size, FONT_SIZE) + + ttf_copy = ttf.font_variant() + self.assertEqual(ttf_copy.path, FONT_PATH) + self.assertEqual(ttf_copy.size, FONT_SIZE) + + ttf_copy = ttf.font_variant(size=FONT_SIZE+1) + self.assertEqual(ttf_copy.size, FONT_SIZE+1) + + second_font_path = "Tests/fonts/DejaVuSans.ttf" + ttf_copy = ttf.font_variant(font=second_font_path) + self.assertEqual(ttf_copy.path, second_font_path) + def test_font_with_name(self): ImageFont.truetype(FONT_PATH, FONT_SIZE) self._render(FONT_PATH) From 456bd96565abd71c28df98fd593f8f253c389c70 Mon Sep 17 00:00:00 2001 From: artscoop Date: Wed, 4 Mar 2015 18:15:56 +0100 Subject: [PATCH 278/532] Fix 32-bit BMP loading (RGBA or RGBX) PIL choked on perfectly valid BMP files (32 bits with Alpha). It could not handle valid RGBA masks to determine the raw format. To clarify things, I: - Rewrote the `BmpImagePlugin.BmpImageFile` class to be far more readable - Made error messages more explicit (e.g. say that RLE bitmaps are unsupported) - Made a readable dict to contain BMP header information - Kept the existing security checks - Instead of reading palette info by chunks of 3/4 bytes, read the whole palette info at once and parse the data. - Now works with BMPv4/5 with Alpha (and can be exported to alpha PNG for example) - Tested load and save with RGB24, RGB8, RGB8L, RGB32 and RGBA32. - Tested with one bogus file. File not accepted, as expected. I wanted to test more BMP formats, but I could not find that many images. But for all the types I tested, it worked flawlessly. --- PIL/BmpImagePlugin.py | 238 +++++++++++++++++++++--------------------- 1 file changed, 119 insertions(+), 119 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 917d43b9c..28551c041 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -16,6 +16,7 @@ # 2002-12-30 fl Fixed load of 1-bit palette images # 2003-04-21 fl Fixed load of 1-bit monochrome images # 2003-04-23 fl Added limited support for BI_BITFIELDS compression +# 2015-03-04 sk Added support for 32-bit images + alpha channel # # Copyright (c) 1997-2003 by Secret Labs AB # Copyright (c) 1995-2003 by Fredrik Lundh @@ -23,13 +24,12 @@ # See the README file for information on usage and redistribution. # - __version__ = "0.7" - from PIL import Image, ImageFile, ImagePalette, _binary import math + i8 = _binary.i8 i16 = _binary.i16le i32 = _binary.i32le @@ -56,131 +56,127 @@ def _accept(prefix): return prefix[:2] == b"BM" -## +#=============================================================================== # Image plugin for the Windows BMP format. - +#=============================================================================== class BmpImageFile(ImageFile.ImageFile): - - format = "BMP" + """ Image plugin for the Windows Bitmap format (BMP) """ + + #--------------------------------------------------------------- Description format_description = "Windows Bitmap" - - def _bitmap(self, header=0, offset=0): - if header: - self.fp.seek(header) - - read = self.fp.read - - # CORE/INFO - s = read(4) - s = s + ImageFile._safe_read(self.fp, i32(s)-4) - - if len(s) == 12: - - # OS/2 1.0 CORE - bits = i16(s[10:]) - self.size = i16(s[4:]), i16(s[6:]) - compression = 0 - lutsize = 3 - colors = 0 - direction = -1 - - elif len(s) in [40, 64, 108, 124]: - - # WIN 3.1 or OS/2 2.0 INFO - bits = i16(s[14:]) - self.size = i32(s[4:]), i32(s[8:]) - compression = i32(s[16:]) - pxperm = (i32(s[24:]), i32(s[28:])) # Pixels per meter - lutsize = 4 - colors = i32(s[32:]) - direction = -1 - if i8(s[11]) == 0xff: - # upside-down storage - self.size = self.size[0], 2**32 - self.size[1] - direction = 0 - - self.info["dpi"] = tuple(map(lambda x: math.ceil(x / 39.3701), - pxperm)) - - else: - raise IOError("Unsupported BMP header type (%d)" % len(s)) - - if (self.size[0]*self.size[1]) > 2**31: - # Prevent DOS for > 2gb images - raise IOError("Unsupported BMP Size: (%dx%d)" % self.size) - - if not colors: - colors = 1 << bits - - # MODE - try: - self.mode, rawmode = BIT2MODE[bits] - except KeyError: - raise IOError("Unsupported BMP pixel depth (%d)" % bits) - - if compression == 3: - # BI_BITFIELDS compression - mask = i32(read(4)), i32(read(4)), i32(read(4)) - if bits == 32 and mask == (0xff0000, 0x00ff00, 0x0000ff): - rawmode = "BGRX" - elif bits == 16 and mask == (0x00f800, 0x0007e0, 0x00001f): - rawmode = "BGR;16" - elif bits == 16 and mask == (0x007c00, 0x0003e0, 0x00001f): - rawmode = "BGR;15" - else: - # print bits, map(hex, mask) - raise IOError("Unsupported BMP bitfields layout") - elif compression != 0: - raise IOError("Unsupported BMP compression (%d)" % compression) - - # LUT - if self.mode == "P": - palette = [] - greyscale = 1 - if colors == 2: - indices = (0, 255) - elif colors > 2**16 or colors <= 0: # We're reading a i32. - raise IOError("Unsupported BMP Palette size (%d)" % colors) - else: - indices = list(range(colors)) - for i in indices: - rgb = read(lutsize)[:3] - if rgb != o8(i)*3: - greyscale = 0 - palette.append(rgb) - if greyscale: - if colors == 2: - self.mode = rawmode = "1" - else: - self.mode = rawmode = "L" - else: - self.mode = "P" - self.palette = ImagePalette.raw( - "BGR", b"".join(palette) - ) - - if not offset: - offset = self.fp.tell() - - self.tile = [("raw", - (0, 0) + self.size, - offset, - (rawmode, ((self.size[0]*bits+31) >> 3) & (~3), - direction))] - - self.info["compression"] = compression + format = "BMP" + #---------------------------------------------------- BMP Compression values + 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 _open(self): - - # HEAD - s = self.fp.read(14) - if s[:2] != b"BM": - raise SyntaxError("Not a BMP file") - offset = i32(s[10:]) - + """ Open file, check magic number and read header """ + # read 14 bytes: magic number, filesize, reserved, header final offset + head_data = self.fp.read(14) + # choke if the file does not have the required magic bytes + if head_data[0:2] != b"BM": + raise SyntaxError("Expected a BMP file.") + # read the start position of the BMP image data (u32) + offset = i32(head_data[10:14]) + # load bitmap information (offset=raster info) self._bitmap(offset=offset) + def _bitmap(self, header=0, offset=0): + """ Read relevant info about the BMP """ + read, seek = self.fp.read, self.fp.seek + seek(2) + file_info = dict() + file_info['filesize'] = i32(read(12)[0:4]) # file size @offset 2 (offsets 4, 12 are reserved for OS/2 Icons) + file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) + file_info['direction'] = -1 + header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) # read the rest of the bmp header, without its size + + #---------------------------------------------------- IBM OS/2 Bitmap v1 + #------- This format has different offsets because of width/height types + if file_info['header_size'] == 12: + file_info['width'] = i16(header_data[0:2]) + file_info['height'] = i16(header_data[2:4]) + file_info['planes'] = i16(header_data[4:6]) + file_info['bits'] = i16(header_data[6:8]) + file_info['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 + if file_info['header_size'] >= 64: + file_info['r_mask'] = i32(header_data[36:40]) + file_info['g_mask'] = i32(header_data[40:44]) + file_info['b_mask'] = i32(header_data[44:48]) + file_info['a_mask'] = i32(header_data[48:52]) + 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']) + if file_info['header_size'] >= 40: # v3 and OS/2 + file_info['y_flip'] = i8(header_data[7]) == 0xff + file_info['direction'] = 0 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['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])) + file_info['colors'] = i32(header_data[28:32]) + file_info['palette_padding'] = 4 + self.info["dpi"] = tuple(map(lambda x: math.ceil(x / 39.3701), file_info['pixels_per_meter'])) + else: + raise IOError("BMP images with a {0} byte header are not supported".format(file_info['header_size'])) + 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 file_info['width'] * file_info['height'] > 2**31: + raise IOError("BMP images with more than 2 billion pixels are not supported (here {0} pixels)".format(file_info['width'] * file_info['height'])) + + #------------------------ 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("BMP images with a {0}-bit pixel depth are not supported".format(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)], 24: [(0xff0000, 0xff00, 0xff, 0x0)], 16: [(0xf800, 0x7e0, 0x1f, 0x0), (0x7c00, 0x3e0, 0x1f, 0x0)]} + MASK_MODES = {(32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", (24, (0xff0000, 0xff00, 0xff)): "BGR", (16, (0xf800, 0x7e0, 0x1f)): "BGR;16", (16, (0x7c00, 0x3e0, 0x1f)): "BGR;15"} + if file_info['bits'] in SUPPORTED and file_info['rgba_mask'] in SUPPORTED[file_info['bits']]: + raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])] + if raw_mode in {"BGRA"}: + self.mode = "RGBA" + else: + raise IOError("BMP images with the provided bitfield information are not supported") + elif file_info['compression'] != self.RAW: + raise IOError("BMP files with RLE (1/2), JPEG (4) and PNG (5) compression are not supported") + + #----------------- 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("BMP palette must have between 1 and 256 colors") + else: + padding = file_info['palette_padding'] + palette = read(padding * file_info['colors']) + #------------------- Check if greyscale and ignore palette if so + greyscale = all([palette[ind] == palette[ind+1] == palette[ind+2] for ind in range(len(palette), padding)]) + #--------- 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 + else: + self.mode = "P" + self.palette = ImagePalette.raw("BGRX", b"".join(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']), self.fp.tell(), + (raw_mode, ((file_info['width'] * file_info['bits'] + 31) >> 3) & (~3), file_info['direction']) + )] + +#=============================================================================== +# Image plugin for the DIB format (BMP alias) +#=============================================================================== class DibImageFile(BmpImageFile): format = "DIB" @@ -189,6 +185,8 @@ class DibImageFile(BmpImageFile): def _open(self): self._bitmap() + + # # -------------------------------------------------------------------- # Write BMP file @@ -198,11 +196,13 @@ SAVE = { "L": ("L", 8, 256), "P": ("P", 8, 256), "RGB": ("BGR", 24, 0), + "RGBA": ("BGRA", 32, 0), } def _save(im, fp, filename, check=0): try: + print im.mode rawmode, bits, colors = SAVE[im.mode] except KeyError: raise IOError("cannot write mode %s as BMP" % im.mode) From c0ce8d0ae814797d78e72ba475b368765be845bb Mon Sep 17 00:00:00 2001 From: artscoop Date: Wed, 4 Mar 2015 18:29:28 +0100 Subject: [PATCH 279/532] Removed debug print Debug print left in _save. Removed. --- PIL/BmpImagePlugin.py | 1 - 1 file changed, 1 deletion(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 28551c041..c0e3e5afb 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -202,7 +202,6 @@ SAVE = { def _save(im, fp, filename, check=0): try: - print im.mode rawmode, bits, colors = SAVE[im.mode] except KeyError: raise IOError("cannot write mode %s as BMP" % im.mode) From 877c138e219257407c73e789eb1dfe2bcbf8add6 Mon Sep 17 00:00:00 2001 From: artscoop Date: Wed, 4 Mar 2015 19:26:15 +0100 Subject: [PATCH 280/532] 1bpp BMP fix It appears that {{{ The handling of 1bpp bitmaps is a little complicated. When reading 1bpp bitmaps, the palette is ignored. 1's are considered foreground, and they are considered black. 0's are considered background, and they are considered white. }}} so the raw mode has to be `1;I` --- PIL/BmpImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index c0e3e5afb..6f29fb767 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -162,7 +162,7 @@ class BmpImageFile(ImageFile.ImageFile): #--------- 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 + raw_mode = self.mode if self.mode != "1" else "1;I" # rule for 1bpp : 1=b, 0=w else: self.mode = "P" self.palette = ImagePalette.raw("BGRX", b"".join(palette)) From 497ddf9c68ac4794540dbe4bdf14ca53e7a38e21 Mon Sep 17 00:00:00 2001 From: artscoop Date: Wed, 4 Mar 2015 19:50:52 +0100 Subject: [PATCH 281/532] Remember correct image offset if bitfields+palette Use the provided image offset if there is palette data while the image is bitfielded. --- PIL/BmpImagePlugin.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 6f29fb767..b2a601cf1 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -85,8 +85,10 @@ class BmpImageFile(ImageFile.ImageFile): """ Read relevant info about the BMP """ read, seek = self.fp.read, self.fp.seek seek(2) + start_data = read(12) file_info = dict() - file_info['filesize'] = i32(read(12)[0:4]) # file size @offset 2 (offsets 4, 12 are reserved for OS/2 Icons) + file_info['filesize'] = i32(start_data[0:4]) # file size @offset 2 (offsets 4, 12 are reserved for OS/2 Icons) + file_info['image_offset'] = i32(start_data[8:12]) # file size @offset 2 (offsets 4, 12 are reserved for OS/2 Icons) file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) file_info['direction'] = -1 header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) # read the rest of the bmp header, without its size @@ -101,7 +103,7 @@ class BmpImageFile(ImageFile.ImageFile): 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 + elif file_info['header_size'] in (40, 64, 108, 124): # v3, OS/2 v2, v4, v5 if file_info['header_size'] >= 64: file_info['r_mask'] = i32(header_data[36:40]) file_info['g_mask'] = i32(header_data[40:44]) From c8551770eb13bf3fcc551ece62c075e01d4445d9 Mon Sep 17 00:00:00 2001 From: artscoop Date: Wed, 4 Mar 2015 19:55:08 +0100 Subject: [PATCH 282/532] Quickfix number 4 Until tests pass. --- PIL/BmpImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index b2a601cf1..8c34fe8a9 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -171,7 +171,7 @@ class BmpImageFile(ImageFile.ImageFile): #------------------------------ 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']), self.fp.tell(), + self.tile = [('raw', (0, 0, file_info['width'], file_info['height']), file_info['image_offset'], (raw_mode, ((file_info['width'] * file_info['bits'] + 31) >> 3) & (~3), file_info['direction']) )] From 7b657f688794aed84f4150f2389059d4507355cd Mon Sep 17 00:00:00 2001 From: artscoop Date: Wed, 4 Mar 2015 22:05:32 +0100 Subject: [PATCH 283/532] Fix for all good_tests Fixed loading of all types of provided images (+rgba). Added edge case where the header is reported as 40 bytes long with BITFIELDS (they start past the 40 bytes of the header). Loading fails for RLE, but IIRC, they're unsupported so it's normal. --- PIL/BmpImagePlugin.py | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 8c34fe8a9..d6457f1e2 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -16,7 +16,6 @@ # 2002-12-30 fl Fixed load of 1-bit palette images # 2003-04-21 fl Fixed load of 1-bit monochrome images # 2003-04-23 fl Added limited support for BI_BITFIELDS compression -# 2015-03-04 sk Added support for 32-bit images + alpha channel # # Copyright (c) 1997-2003 by Secret Labs AB # Copyright (c) 1995-2003 by Fredrik Lundh @@ -92,7 +91,6 @@ class BmpImageFile(ImageFile.ImageFile): file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) file_info['direction'] = -1 header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) # read the rest of the bmp header, without its size - #---------------------------------------------------- IBM OS/2 Bitmap v1 #------- This format has different offsets because of width/height types if file_info['header_size'] == 12: @@ -103,7 +101,7 @@ class BmpImageFile(ImageFile.ImageFile): 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 + elif file_info['header_size'] in {40, 64, 108, 124}: # v3, OS/2 v2, v4, v5 if file_info['header_size'] >= 64: file_info['r_mask'] = i32(header_data[36:40]) file_info['g_mask'] = i32(header_data[40:44]) @@ -113,7 +111,7 @@ class BmpImageFile(ImageFile.ImageFile): file_info['rgba_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask'], file_info['a_mask']) if file_info['header_size'] >= 40: # v3 and OS/2 file_info['y_flip'] = i8(header_data[7]) == 0xff - file_info['direction'] = 0 if file_info['y_flip'] else -1 + 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['planes'] = i16(header_data[8:10]) @@ -123,6 +121,16 @@ class BmpImageFile(ImageFile.ImageFile): 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 + #------------------- Special case : header is reported 40, which + #----------------------- is shorter than real size for bpp >= 16 + if file_info['header_size'] < 64 and file_info['bits'] >= 16: + file_info['r_mask'] = i32(read(4)) + file_info['g_mask'] = i32(read(4)) + file_info['b_mask'] = i32(read(4)) + file_info['a_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']) + self.info["dpi"] = tuple(map(lambda x: math.ceil(x / 39.3701), file_info['pixels_per_meter'])) else: raise IOError("BMP images with a {0} byte header are not supported".format(file_info['header_size'])) @@ -140,12 +148,16 @@ class BmpImageFile(ImageFile.ImageFile): #------------------ Process BMP with Bitfields compression (not palette) if file_info['compression'] == self.BITFIELDS: - SUPPORTED = {32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000)], 24: [(0xff0000, 0xff00, 0xff, 0x0)], 16: [(0xf800, 0x7e0, 0x1f, 0x0), (0x7c00, 0x3e0, 0x1f, 0x0)]} + SUPPORTED = {32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000)], 24: [(0xff0000, 0xff00, 0xff)], 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)]} MASK_MODES = {(32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", (24, (0xff0000, 0xff00, 0xff)): "BGR", (16, (0xf800, 0x7e0, 0x1f)): "BGR;16", (16, (0x7c00, 0x3e0, 0x1f)): "BGR;15"} - if file_info['bits'] in SUPPORTED and file_info['rgba_mask'] in SUPPORTED[file_info['bits']]: - raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])] - if raw_mode in {"BGRA"}: - self.mode = "RGBA" + 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'])] + 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'])] + else: + raise IOError("BMP images with the provided bitfield mask are not supported") else: raise IOError("BMP images with the provided bitfield information are not supported") elif file_info['compression'] != self.RAW: @@ -160,14 +172,14 @@ class BmpImageFile(ImageFile.ImageFile): padding = file_info['palette_padding'] palette = read(padding * file_info['colors']) #------------------- Check if greyscale and ignore palette if so - greyscale = all([palette[ind] == palette[ind+1] == palette[ind+2] for ind in range(len(palette), padding)]) + greyscale = all([palette[ind] == palette[ind+1] == palette[ind+2] == ind / padding for ind in range(0, len(palette), padding)]) #--------- 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 if self.mode != "1" else "1;I" # rule for 1bpp : 1=b, 0=w + raw_mode = self.mode else: self.mode = "P" - self.palette = ImagePalette.raw("BGRX", b"".join(palette)) + self.palette = ImagePalette.raw("BGRX" if padding == 4 else "BGR", b"".join(palette)) #------------------------------ Finally set the tile data for the plugin self.info['compression'] = file_info['compression'] From f953b982859c43add1e035ab6346c59b2a43cc5b Mon Sep 17 00:00:00 2001 From: artscoop Date: Wed, 4 Mar 2015 22:40:04 +0100 Subject: [PATCH 284/532] Try to fix tests Choked on roundtrip, where a P;1 image was returned instead of a 1 image. --- PIL/BmpImagePlugin.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index d6457f1e2..755cfb0fc 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -171,8 +171,13 @@ class BmpImageFile(ImageFile.ImageFile): 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'])) #------------------- Check if greyscale and ignore palette if so - greyscale = all([palette[ind] == palette[ind+1] == palette[ind+2] == ind / padding for ind in range(0, len(palette), padding)]) + for ind in indices: + rgb = palette[ind*padding:ind*padding + 3] + if rgb != o8(ind) * 3: + greyscale = False #--------- If all colors are grey, white or black, ditch palette if greyscale: self.mode = "1" if file_info['colors'] == 2 else "L" From 56439b728f891a7c63ab64ae95b18e673874880c Mon Sep 17 00:00:00 2001 From: artscoop Date: Wed, 4 Mar 2015 23:06:21 +0100 Subject: [PATCH 285/532] Test with original code ... --- PIL/BmpImagePlugin.py | 252 ++++++++++++++++++++---------------------- 1 file changed, 117 insertions(+), 135 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 755cfb0fc..917d43b9c 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -23,12 +23,13 @@ # See the README file for information on usage and redistribution. # + __version__ = "0.7" + from PIL import Image, ImageFile, ImagePalette, _binary import math - i8 = _binary.i8 i16 = _binary.i16le i32 = _binary.i32le @@ -55,147 +56,131 @@ 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 - format_description = "Windows Bitmap" - format = "BMP" - #---------------------------------------------------- BMP Compression values - 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 _open(self): - """ Open file, check magic number and read header """ - # read 14 bytes: magic number, filesize, reserved, header final offset - head_data = self.fp.read(14) - # choke if the file does not have the required magic bytes - if head_data[0:2] != b"BM": - raise SyntaxError("Expected a BMP file.") - # read the start position of the BMP image data (u32) - offset = i32(head_data[10:14]) - # load bitmap information (offset=raster info) - self._bitmap(offset=offset) +class BmpImageFile(ImageFile.ImageFile): + + format = "BMP" + format_description = "Windows Bitmap" def _bitmap(self, header=0, offset=0): - """ Read relevant info about the BMP """ - read, seek = self.fp.read, self.fp.seek - seek(2) - start_data = read(12) - file_info = dict() - file_info['filesize'] = i32(start_data[0:4]) # file size @offset 2 (offsets 4, 12 are reserved for OS/2 Icons) - file_info['image_offset'] = i32(start_data[8:12]) # file size @offset 2 (offsets 4, 12 are reserved for OS/2 Icons) - file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) - file_info['direction'] = -1 - header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) # read the rest of the bmp header, without its size - #---------------------------------------------------- IBM OS/2 Bitmap v1 - #------- This format has different offsets because of width/height types - if file_info['header_size'] == 12: - file_info['width'] = i16(header_data[0:2]) - file_info['height'] = i16(header_data[2:4]) - file_info['planes'] = i16(header_data[4:6]) - file_info['bits'] = i16(header_data[6:8]) - file_info['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 - if file_info['header_size'] >= 64: - file_info['r_mask'] = i32(header_data[36:40]) - file_info['g_mask'] = i32(header_data[40:44]) - file_info['b_mask'] = i32(header_data[44:48]) - file_info['a_mask'] = i32(header_data[48:52]) - 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']) - 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 - 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['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])) - file_info['colors'] = i32(header_data[28:32]) - file_info['palette_padding'] = 4 - #------------------- Special case : header is reported 40, which - #----------------------- is shorter than real size for bpp >= 16 - if file_info['header_size'] < 64 and file_info['bits'] >= 16: - file_info['r_mask'] = i32(read(4)) - file_info['g_mask'] = i32(read(4)) - file_info['b_mask'] = i32(read(4)) - file_info['a_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']) - - self.info["dpi"] = tuple(map(lambda x: math.ceil(x / 39.3701), file_info['pixels_per_meter'])) + if header: + self.fp.seek(header) + + read = self.fp.read + + # CORE/INFO + s = read(4) + s = s + ImageFile._safe_read(self.fp, i32(s)-4) + + if len(s) == 12: + + # OS/2 1.0 CORE + bits = i16(s[10:]) + self.size = i16(s[4:]), i16(s[6:]) + compression = 0 + lutsize = 3 + colors = 0 + direction = -1 + + elif len(s) in [40, 64, 108, 124]: + + # WIN 3.1 or OS/2 2.0 INFO + bits = i16(s[14:]) + self.size = i32(s[4:]), i32(s[8:]) + compression = i32(s[16:]) + pxperm = (i32(s[24:]), i32(s[28:])) # Pixels per meter + lutsize = 4 + colors = i32(s[32:]) + direction = -1 + if i8(s[11]) == 0xff: + # upside-down storage + self.size = self.size[0], 2**32 - self.size[1] + direction = 0 + + self.info["dpi"] = tuple(map(lambda x: math.ceil(x / 39.3701), + pxperm)) + else: - raise IOError("BMP images with a {0} byte header are not supported".format(file_info['header_size'])) - 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 file_info['width'] * file_info['height'] > 2**31: - raise IOError("BMP images with more than 2 billion pixels are not supported (here {0} pixels)".format(file_info['width'] * file_info['height'])) - - #------------------------ 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("BMP images with a {0}-bit pixel depth are not supported".format(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)], 24: [(0xff0000, 0xff00, 0xff)], 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)]} - MASK_MODES = {(32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", (24, (0xff0000, 0xff00, 0xff)): "BGR", (16, (0xf800, 0x7e0, 0x1f)): "BGR;16", (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']]: - 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'])] - else: - raise IOError("BMP images with the provided bitfield mask are not supported") + raise IOError("Unsupported BMP header type (%d)" % len(s)) + + if (self.size[0]*self.size[1]) > 2**31: + # Prevent DOS for > 2gb images + raise IOError("Unsupported BMP Size: (%dx%d)" % self.size) + + if not colors: + colors = 1 << bits + + # MODE + try: + self.mode, rawmode = BIT2MODE[bits] + except KeyError: + raise IOError("Unsupported BMP pixel depth (%d)" % bits) + + if compression == 3: + # BI_BITFIELDS compression + mask = i32(read(4)), i32(read(4)), i32(read(4)) + if bits == 32 and mask == (0xff0000, 0x00ff00, 0x0000ff): + rawmode = "BGRX" + elif bits == 16 and mask == (0x00f800, 0x0007e0, 0x00001f): + rawmode = "BGR;16" + elif bits == 16 and mask == (0x007c00, 0x0003e0, 0x00001f): + rawmode = "BGR;15" else: - raise IOError("BMP images with the provided bitfield information are not supported") - elif file_info['compression'] != self.RAW: - raise IOError("BMP files with RLE (1/2), JPEG (4) and PNG (5) compression are not supported") - - #----------------- 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("BMP palette must have between 1 and 256 colors") + # print bits, map(hex, mask) + raise IOError("Unsupported BMP bitfields layout") + elif compression != 0: + raise IOError("Unsupported BMP compression (%d)" % compression) + + # LUT + if self.mode == "P": + palette = [] + greyscale = 1 + if colors == 2: + indices = (0, 255) + elif colors > 2**16 or colors <= 0: # We're reading a i32. + raise IOError("Unsupported BMP Palette size (%d)" % 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'])) - #------------------- Check if greyscale and ignore palette if so - for ind in indices: - rgb = palette[ind*padding:ind*padding + 3] - if rgb != o8(ind) * 3: - greyscale = False - #--------- 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 + indices = list(range(colors)) + for i in indices: + rgb = read(lutsize)[:3] + if rgb != o8(i)*3: + greyscale = 0 + palette.append(rgb) + if greyscale: + if colors == 2: + self.mode = rawmode = "1" else: - self.mode = "P" - self.palette = ImagePalette.raw("BGRX" if padding == 4 else "BGR", b"".join(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']), file_info['image_offset'], - (raw_mode, ((file_info['width'] * file_info['bits'] + 31) >> 3) & (~3), file_info['direction']) - )] + self.mode = rawmode = "L" + else: + self.mode = "P" + self.palette = ImagePalette.raw( + "BGR", b"".join(palette) + ) + + if not offset: + offset = self.fp.tell() + + self.tile = [("raw", + (0, 0) + self.size, + offset, + (rawmode, ((self.size[0]*bits+31) >> 3) & (~3), + direction))] + + self.info["compression"] = compression + + def _open(self): + + # HEAD + s = self.fp.read(14) + if s[:2] != b"BM": + raise SyntaxError("Not a BMP file") + offset = i32(s[10:]) + + self._bitmap(offset=offset) -#=============================================================================== -# Image plugin for the DIB format (BMP alias) -#=============================================================================== class DibImageFile(BmpImageFile): format = "DIB" @@ -204,8 +189,6 @@ class DibImageFile(BmpImageFile): def _open(self): self._bitmap() - - # # -------------------------------------------------------------------- # Write BMP file @@ -215,7 +198,6 @@ SAVE = { "L": ("L", 8, 256), "P": ("P", 8, 256), "RGB": ("BGR", 24, 0), - "RGBA": ("BGRA", 32, 0), } From 934651427d6c27da0998b9a4095d682bb5c2b419 Mon Sep 17 00:00:00 2001 From: artscoop Date: Thu, 5 Mar 2015 08:19:14 +0100 Subject: [PATCH 286/532] Use 1 and not P for basic 1bpp BMP Readapted some original code. --- PIL/BmpImagePlugin.py | 256 ++++++++++++++++++++++-------------------- 1 file changed, 137 insertions(+), 119 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 917d43b9c..8fe537586 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -23,13 +23,12 @@ # See the README file for information on usage and redistribution. # - __version__ = "0.7" - from PIL import Image, ImageFile, ImagePalette, _binary import math + i8 = _binary.i8 i16 = _binary.i16le i32 = _binary.i32le @@ -56,131 +55,147 @@ def _accept(prefix): return prefix[:2] == b"BM" -## +#=============================================================================== # Image plugin for the Windows BMP format. - +#=============================================================================== class BmpImageFile(ImageFile.ImageFile): - - format = "BMP" + """ Image plugin for the Windows Bitmap format (BMP) """ + + #--------------------------------------------------------------- Description format_description = "Windows Bitmap" - - def _bitmap(self, header=0, offset=0): - if header: - self.fp.seek(header) - - read = self.fp.read - - # CORE/INFO - s = read(4) - s = s + ImageFile._safe_read(self.fp, i32(s)-4) - - if len(s) == 12: - - # OS/2 1.0 CORE - bits = i16(s[10:]) - self.size = i16(s[4:]), i16(s[6:]) - compression = 0 - lutsize = 3 - colors = 0 - direction = -1 - - elif len(s) in [40, 64, 108, 124]: - - # WIN 3.1 or OS/2 2.0 INFO - bits = i16(s[14:]) - self.size = i32(s[4:]), i32(s[8:]) - compression = i32(s[16:]) - pxperm = (i32(s[24:]), i32(s[28:])) # Pixels per meter - lutsize = 4 - colors = i32(s[32:]) - direction = -1 - if i8(s[11]) == 0xff: - # upside-down storage - self.size = self.size[0], 2**32 - self.size[1] - direction = 0 - - self.info["dpi"] = tuple(map(lambda x: math.ceil(x / 39.3701), - pxperm)) - - else: - raise IOError("Unsupported BMP header type (%d)" % len(s)) - - if (self.size[0]*self.size[1]) > 2**31: - # Prevent DOS for > 2gb images - raise IOError("Unsupported BMP Size: (%dx%d)" % self.size) - - if not colors: - colors = 1 << bits - - # MODE - try: - self.mode, rawmode = BIT2MODE[bits] - except KeyError: - raise IOError("Unsupported BMP pixel depth (%d)" % bits) - - if compression == 3: - # BI_BITFIELDS compression - mask = i32(read(4)), i32(read(4)), i32(read(4)) - if bits == 32 and mask == (0xff0000, 0x00ff00, 0x0000ff): - rawmode = "BGRX" - elif bits == 16 and mask == (0x00f800, 0x0007e0, 0x00001f): - rawmode = "BGR;16" - elif bits == 16 and mask == (0x007c00, 0x0003e0, 0x00001f): - rawmode = "BGR;15" - else: - # print bits, map(hex, mask) - raise IOError("Unsupported BMP bitfields layout") - elif compression != 0: - raise IOError("Unsupported BMP compression (%d)" % compression) - - # LUT - if self.mode == "P": - palette = [] - greyscale = 1 - if colors == 2: - indices = (0, 255) - elif colors > 2**16 or colors <= 0: # We're reading a i32. - raise IOError("Unsupported BMP Palette size (%d)" % colors) - else: - indices = list(range(colors)) - for i in indices: - rgb = read(lutsize)[:3] - if rgb != o8(i)*3: - greyscale = 0 - palette.append(rgb) - if greyscale: - if colors == 2: - self.mode = rawmode = "1" - else: - self.mode = rawmode = "L" - else: - self.mode = "P" - self.palette = ImagePalette.raw( - "BGR", b"".join(palette) - ) - - if not offset: - offset = self.fp.tell() - - self.tile = [("raw", - (0, 0) + self.size, - offset, - (rawmode, ((self.size[0]*bits+31) >> 3) & (~3), - direction))] - - self.info["compression"] = compression + format = "BMP" + #---------------------------------------------------- BMP Compression values + 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 _open(self): - - # HEAD - s = self.fp.read(14) - if s[:2] != b"BM": - raise SyntaxError("Not a BMP file") - offset = i32(s[10:]) - + """ Open file, check magic number and read header """ + # read 14 bytes: magic number, filesize, reserved, header final offset + head_data = self.fp.read(14) + # choke if the file does not have the required magic bytes + if head_data[0:2] != b"BM": + raise SyntaxError("Expected a BMP file.") + # read the start position of the BMP image data (u32) + offset = i32(head_data[10:14]) + # load bitmap information (offset=raster info) self._bitmap(offset=offset) + def _bitmap(self, header=0, offset=0): + """ Read relevant info about the BMP """ + read, seek = self.fp.read, self.fp.seek + seek(2) + start_data = read(12) + file_info = dict() + file_info['filesize'] = i32(start_data[0:4]) # file size @offset 2 (offsets 4, 12 are reserved for OS/2 Icons) + file_info['image_offset'] = i32(start_data[8:12]) # file size @offset 2 (offsets 4, 12 are reserved for OS/2 Icons) + file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) + file_info['direction'] = -1 + header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) # read the rest of the bmp header, without its size + #---------------------------------------------------- IBM OS/2 Bitmap v1 + #------- This format has different offsets because of width/height types + if file_info['header_size'] == 12: + file_info['width'] = i16(header_data[0:2]) + file_info['height'] = i16(header_data[2:4]) + file_info['planes'] = i16(header_data[4:6]) + file_info['bits'] = i16(header_data[6:8]) + file_info['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 + if file_info['header_size'] >= 64: + file_info['r_mask'] = i32(header_data[36:40]) + file_info['g_mask'] = i32(header_data[40:44]) + file_info['b_mask'] = i32(header_data[44:48]) + file_info['a_mask'] = i32(header_data[48:52]) + 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']) + 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 + 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['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])) + file_info['colors'] = i32(header_data[28:32]) + file_info['palette_padding'] = 4 + #------------------- Special case : header is reported 40, which + #----------------------- is shorter than real size for bpp >= 16 + if file_info['header_size'] < 64 and file_info['bits'] >= 16: + file_info['r_mask'] = i32(read(4)) + file_info['g_mask'] = i32(read(4)) + file_info['b_mask'] = i32(read(4)) + file_info['a_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']) + + self.info["dpi"] = tuple(map(lambda x: math.ceil(x / 39.3701), file_info['pixels_per_meter'])) + else: + raise IOError("BMP images with a {0} byte header are not supported".format(file_info['header_size'])) + 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 file_info['width'] * file_info['height'] > 2**31: + raise IOError("BMP images with more than 2 billion pixels are not supported (here {0} pixels)".format(file_info['width'] * file_info['height'])) + + #------------------------ 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("BMP images with a {0}-bit pixel depth are not supported".format(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)], 24: [(0xff0000, 0xff00, 0xff)], 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)]} + MASK_MODES = {(32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", (24, (0xff0000, 0xff00, 0xff)): "BGR", (16, (0xf800, 0x7e0, 0x1f)): "BGR;16", (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']]: + 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'])] + else: + raise IOError("BMP images with the provided bitfield mask are not supported") + else: + raise IOError("BMP images with the provided bitfield information are not supported") + elif file_info['compression'] != self.RAW: + raise IOError("BMP files with RLE (1/2), JPEG (4) and PNG (5) compression are not supported") + + #----------------- 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("BMP palette must have between 1 and 256 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'])) + #------------------- 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 greyscale: + self.mode = "1" if file_info['colors'] == 2 else "L" + raw_mode = self.mode + else: + self.mode = "P" + self.palette = ImagePalette.raw("BGRX" if padding == 4 else "BGR", b"".join(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']), file_info['image_offset'], + (raw_mode, ((file_info['width'] * file_info['bits'] + 31) >> 3) & (~3), file_info['direction']) + )] + +#=============================================================================== +# Image plugin for the DIB format (BMP alias) +#=============================================================================== class DibImageFile(BmpImageFile): format = "DIB" @@ -189,6 +204,8 @@ class DibImageFile(BmpImageFile): def _open(self): self._bitmap() + + # # -------------------------------------------------------------------- # Write BMP file @@ -198,6 +215,7 @@ SAVE = { "L": ("L", 8, 256), "P": ("P", 8, 256), "RGB": ("BGR", 24, 0), + "RGBA": ("BGRA", 32, 0), } From c8fddb19f531445e0409f5ea5cec62c62c7d0c4c Mon Sep 17 00:00:00 2001 From: artscoop Date: Thu, 5 Mar 2015 08:34:01 +0100 Subject: [PATCH 287/532] Update BmpImagePlugin.py Getting bonkers but I need to know --- PIL/BmpImagePlugin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 8fe537586..a57fb145b 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -91,6 +91,7 @@ class BmpImageFile(ImageFile.ImageFile): file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) file_info['direction'] = -1 header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) # read the rest of the bmp header, without its size + file_info['header_size'] = len(header_data) + 4 #---------------------------------------------------- IBM OS/2 Bitmap v1 #------- This format has different offsets because of width/height types if file_info['header_size'] == 12: @@ -101,7 +102,7 @@ class BmpImageFile(ImageFile.ImageFile): 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 + elif file_info['header_size'] in (40, 64, 108, 124): # v3, OS/2 v2, v4, v5 if file_info['header_size'] >= 64: file_info['r_mask'] = i32(header_data[36:40]) file_info['g_mask'] = i32(header_data[40:44]) From 82aa9011c9e31645b02faf9015ac0d105e30027f Mon Sep 17 00:00:00 2001 From: artscoop Date: Thu, 5 Mar 2015 08:47:34 +0100 Subject: [PATCH 288/532] Restored original error messages I suspect the tests to check against an exact string when expecting an error --- PIL/BmpImagePlugin.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index a57fb145b..7162bd3ee 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -91,7 +91,6 @@ class BmpImageFile(ImageFile.ImageFile): file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) file_info['direction'] = -1 header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) # read the rest of the bmp header, without its size - file_info['header_size'] = len(header_data) + 4 #---------------------------------------------------- IBM OS/2 Bitmap v1 #------- This format has different offsets because of width/height types if file_info['header_size'] == 12: @@ -134,18 +133,18 @@ class BmpImageFile(ImageFile.ImageFile): self.info["dpi"] = tuple(map(lambda x: math.ceil(x / 39.3701), file_info['pixels_per_meter'])) else: - raise IOError("BMP images with a {0} byte header are not supported".format(file_info['header_size'])) + raise IOError("Unsupported BMP header type (%d)" % file_info['header_size']) 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 file_info['width'] * file_info['height'] > 2**31: - raise IOError("BMP images with more than 2 billion pixels are not supported (here {0} pixels)".format(file_info['width'] * file_info['height'])) + raise IOError("Unsupported BMP Size: (%dx%d)" % self.size) #------------------------ 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("BMP images with a {0}-bit pixel depth are not supported".format(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: @@ -158,17 +157,17 @@ class BmpImageFile(ImageFile.ImageFile): 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("BMP images with the provided bitfield mask are not supported") + raise IOError("Unsupported BMP bitfields layout") else: - raise IOError("BMP images with the provided bitfield information are not supported") + raise IOError("Unsupported BMP bitfields layout") elif file_info['compression'] != self.RAW: - raise IOError("BMP files with RLE (1/2), JPEG (4) and PNG (5) compression are not supported") + raise IOError("Unsupported BMP compression (%d)" % 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("BMP palette must have between 1 and 256 colors") + raise IOError("Unsupported BMP Palette size (%d)" % file_info['colors']) else: padding = file_info['palette_padding'] palette = read(padding * file_info['colors']) From d7a78f38138d93757991d0a12f755415a983db92 Mon Sep 17 00:00:00 2001 From: artscoop Date: Thu, 5 Mar 2015 09:02:09 +0100 Subject: [PATCH 289/532] Fixing .cur special header offset use offset provided --- PIL/BmpImagePlugin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 7162bd3ee..d7ef866fc 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -90,6 +90,9 @@ class BmpImageFile(ImageFile.ImageFile): file_info['image_offset'] = i32(start_data[8:12]) # file size @offset 2 (offsets 4, 12 are reserved for OS/2 Icons) file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) file_info['direction'] = -1 + #---------------------- If requested, read header at a specific position + if header: + seek(header) header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) # read the rest of the bmp header, without its size #---------------------------------------------------- IBM OS/2 Bitmap v1 #------- This format has different offsets because of width/height types From 9e3af5a161dff2d4db130834d7b1830b992cc341 Mon Sep 17 00:00:00 2001 From: artscoop Date: Thu, 5 Mar 2015 10:40:10 +0100 Subject: [PATCH 290/532] Fix .cur 32/rgba, offsets etc. Various fixes on code broken or not passing tests --- PIL/BmpImagePlugin.py | 52 ++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index d7ef866fc..06aa4e4a1 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -81,18 +81,15 @@ class BmpImageFile(ImageFile.ImageFile): self._bitmap(offset=offset) def _bitmap(self, header=0, offset=0): + print offset, header """ Read relevant info about the BMP """ read, seek = self.fp.read, self.fp.seek - seek(2) - start_data = read(12) + if header: + seek(header) file_info = dict() - file_info['filesize'] = i32(start_data[0:4]) # file size @offset 2 (offsets 4, 12 are reserved for OS/2 Icons) - file_info['image_offset'] = i32(start_data[8:12]) # file size @offset 2 (offsets 4, 12 are reserved for OS/2 Icons) file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) file_info['direction'] = -1 #---------------------- If requested, read header at a specific position - if header: - seek(header) header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) # read the rest of the bmp header, without its size #---------------------------------------------------- IBM OS/2 Bitmap v1 #------- This format has different offsets because of width/height types @@ -105,13 +102,6 @@ class BmpImageFile(ImageFile.ImageFile): 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 - if file_info['header_size'] >= 64: - file_info['r_mask'] = i32(header_data[36:40]) - file_info['g_mask'] = i32(header_data[40:44]) - file_info['b_mask'] = i32(header_data[44:48]) - file_info['a_mask'] = i32(header_data[48:52]) - 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']) 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 @@ -124,26 +114,25 @@ class BmpImageFile(ImageFile.ImageFile): 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 - #------------------- Special case : header is reported 40, which - #----------------------- is shorter than real size for bpp >= 16 - if file_info['header_size'] < 64 and file_info['bits'] >= 16: - file_info['r_mask'] = i32(read(4)) - file_info['g_mask'] = i32(read(4)) - file_info['b_mask'] = i32(read(4)) - file_info['a_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']) - self.info["dpi"] = tuple(map(lambda x: math.ceil(x / 39.3701), file_info['pixels_per_meter'])) 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 + if file_info['compression'] == self.BITFIELDS: + file_info['r_mask'] = i32(read(4)) + file_info['g_mask'] = i32(read(4)) + file_info['b_mask'] = i32(read(4)) + file_info['a_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']) + 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 file_info['width'] * file_info['height'] > 2**31: raise IOError("Unsupported BMP Size: (%dx%d)" % self.size) - #------------------------ Check bit depth for unusual unsupported values self.mode, raw_mode = BIT2MODE.get(file_info['bits'], (None, None)) if self.mode is None: @@ -151,8 +140,8 @@ class BmpImageFile(ImageFile.ImageFile): #------------------ Process BMP with Bitfields compression (not palette) if file_info['compression'] == self.BITFIELDS: - SUPPORTED = {32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000)], 24: [(0xff0000, 0xff00, 0xff)], 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)]} - MASK_MODES = {(32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", (24, (0xff0000, 0xff00, 0xff)): "BGR", (16, (0xf800, 0x7e0, 0x1f)): "BGR;16", (16, (0x7c00, 0x3e0, 0x1f)): "BGR;15"} + SUPPORTED = {32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000), (0x0, 0x0, 0x0, 0x0)], 24: [(0xff0000, 0xff00, 0xff)], 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)]} + MASK_MODES = {(32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", (24, (0xff0000, 0xff00, 0xff)): "BGR", (16, (0xf800, 0x7e0, 0x1f)): "BGR;16", (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']]: raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])] @@ -163,9 +152,11 @@ class BmpImageFile(ImageFile.ImageFile): raise IOError("Unsupported BMP bitfields layout") else: raise IOError("Unsupported BMP bitfields layout") - elif file_info['compression'] != self.RAW: - raise IOError("Unsupported BMP compression (%d)" % compression) - + elif file_info['compression'] == self.RAW: + 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']) #----------------- Once the header is processed, process the palette/LUT if self.mode == "P": # Paletted for 1, 4 and 8 bit images #------------------------------------------------------ 1-bit images @@ -189,9 +180,10 @@ class BmpImageFile(ImageFile.ImageFile): self.mode = "P" self.palette = ImagePalette.raw("BGRX" if padding == 4 else "BGR", b"".join(palette)) + print file_info, self.mode, raw_mode, self.fp.tell() #------------------------------ 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']), file_info['image_offset'], + 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']) )] From 613d22fc75455383d43f97965dabd9b199b2b0f0 Mon Sep 17 00:00:00 2001 From: artscoop Date: Thu, 5 Mar 2015 10:44:54 +0100 Subject: [PATCH 291/532] Removed debug print Again. --- PIL/BmpImagePlugin.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 06aa4e4a1..170d5ec98 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -81,7 +81,6 @@ class BmpImageFile(ImageFile.ImageFile): self._bitmap(offset=offset) def _bitmap(self, header=0, offset=0): - print offset, header """ Read relevant info about the BMP """ read, seek = self.fp.read, self.fp.seek if header: @@ -180,7 +179,6 @@ class BmpImageFile(ImageFile.ImageFile): self.mode = "P" self.palette = ImagePalette.raw("BGRX" if padding == 4 else "BGR", b"".join(palette)) - print file_info, self.mode, raw_mode, self.fp.tell() #------------------------------ 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(), From 514c55aa162e1258361401245a226a749856787c Mon Sep 17 00:00:00 2001 From: artscoop Date: Thu, 5 Mar 2015 10:55:32 +0100 Subject: [PATCH 292/532] Test fix for supported 32bit RGBA .cur file Some .cur file with alpha was loaded fully opaque with PIL. Fixed, and fixed the test to take that into account. --- Tests/test_file_cur.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_cur.py b/Tests/test_file_cur.py index 54bfe84fe..07bf3a750 100644 --- a/Tests/test_file_cur.py +++ b/Tests/test_file_cur.py @@ -16,9 +16,9 @@ class TestFileCur(PillowTestCase): self.assertEqual(im.size, (32, 32)) self.assertIsInstance(im, CurImagePlugin.CurImageFile) # Check some pixel colors to ensure image is loaded properly - self.assertEqual(im.getpixel((10, 1)), (0, 0, 0)) - self.assertEqual(im.getpixel((11, 1)), (253, 254, 254)) - self.assertEqual(im.getpixel((16, 16)), (84, 87, 86)) + self.assertEqual(im.getpixel((10, 1)), (0, 0, 0, 0)) + self.assertEqual(im.getpixel((11, 1)), (253, 254, 254, 1)) + self.assertEqual(im.getpixel((16, 16)), (84, 87, 86, 255)) if __name__ == '__main__': From 310684521ae0bc970022406a48a1c0afd0147b30 Mon Sep 17 00:00:00 2001 From: artscoop Date: Thu, 5 Mar 2015 11:32:03 +0100 Subject: [PATCH 293/532] Update BmpImagePlugin.py Fails on Python 3, tried some fixes before going the virtualenv3 route --- PIL/BmpImagePlugin.py | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 170d5ec98..88f940708 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -23,8 +23,10 @@ # See the README file for information on usage and redistribution. # + __version__ = "0.7" + from PIL import Image, ImageFile, ImagePalette, _binary import math @@ -47,7 +49,7 @@ BIT2MODE = { 8: ("P", "P"), 16: ("RGB", "BGR;15"), 24: ("RGB", "BGR"), - 32: ("RGB", "BGRX") + 32: ("RGB", "BGRX"), } @@ -68,28 +70,16 @@ class BmpImageFile(ImageFile.ImageFile): 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 _open(self): - """ Open file, check magic number and read header """ - # read 14 bytes: magic number, filesize, reserved, header final offset - head_data = self.fp.read(14) - # choke if the file does not have the required magic bytes - if head_data[0:2] != b"BM": - raise SyntaxError("Expected a BMP file.") - # read the start position of the BMP image data (u32) - offset = i32(head_data[10:14]) - # load bitmap information (offset=raster info) - self._bitmap(offset=offset) - def _bitmap(self, header=0, offset=0): """ Read relevant info about the BMP """ read, seek = self.fp.read, self.fp.seek if header: seek(header) file_info = dict() - file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) + file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) 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 + header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) # read the rest of the bmp header, without its size #---------------------------------------------------- IBM OS/2 Bitmap v1 #------- This format has different offsets because of width/height types if file_info['header_size'] == 12: @@ -185,6 +175,19 @@ class BmpImageFile(ImageFile.ImageFile): (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 """ + # read 14 bytes: magic number, filesize, reserved, header final offset + head_data = self.fp.read(14) + # choke if the file does not have the required magic bytes + if head_data[0:2] != b"BM": + raise SyntaxError("Not a BMP file") + # read the start position of the BMP image data (u32) + offset = i32(head_data[10:14]) + # load bitmap information (offset=raster info) + self._bitmap(offset=offset) + + #=============================================================================== # Image plugin for the DIB format (BMP alias) From 8c003e9b3f9b130f5b1e8d7fcbcf33851b82d6be Mon Sep 17 00:00:00 2001 From: artscoop Date: Thu, 5 Mar 2015 12:17:52 +0100 Subject: [PATCH 294/532] And finally ? Error happening in Python 3.x with P images: in original code, palette data was created from a list of bytestrings. Changed to a full bytestring. - `b"".join(list of bytestrings)` works in python 2.7 and 3.x - `b"".join(bytestring)` works in python 2.7 but fails in python 3.x No need to `join` anymore. Works in 3.x --- PIL/BmpImagePlugin.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 88f940708..99159d569 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -126,7 +126,6 @@ class BmpImageFile(ImageFile.ImageFile): 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) if file_info['compression'] == self.BITFIELDS: SUPPORTED = {32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000), (0x0, 0x0, 0x0, 0x0)], 24: [(0xff0000, 0xff00, 0xff)], 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)]} @@ -167,7 +166,7 @@ class BmpImageFile(ImageFile.ImageFile): raw_mode = self.mode else: self.mode = "P" - self.palette = ImagePalette.raw("BGRX" if padding == 4 else "BGR", b"".join(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'] From 0b79c6e24a4cc293ef48bad0a4ae72407d84b74a Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 5 Mar 2015 21:07:16 +0200 Subject: [PATCH 295/532] Remove unreachable code (if 0) --- PIL/PngImagePlugin.py | 14 +++++--------- libImaging/Dib.c | 13 ------------- libImaging/Geometry.c | 17 ----------------- libImaging/QuantHash.c | 19 ------------------- 4 files changed, 5 insertions(+), 58 deletions(-) diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index 7a9becd3b..d8593f90d 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -175,7 +175,7 @@ class iTXt(str): :param lang: language code :param tkey: UTF-8 version of the key name """ - + self = str.__new__(cls, text) self.lang = lang self.tkey = tkey @@ -198,7 +198,7 @@ class PngInfo: :param data: a byte string of the encoded data """ - + self.chunks.append((cid, data)) def add_itxt(self, key, value, lang="", tkey="", zip=False): @@ -211,7 +211,7 @@ class PngInfo: :param zip: compression flag """ - + if not isinstance(key, bytes): key = key.encode("latin-1", "strict") if not isinstance(value, bytes): @@ -235,7 +235,7 @@ class PngInfo: :param value: value for this key, text or an :py:class:`PIL.PngImagePlugin.iTXt` instance :param zip: compression flag - + """ if isinstance(value, iTXt): return self.add_itxt(key, value, value.lang, value.tkey, bool(zip)) @@ -462,7 +462,7 @@ class PngStream(ChunkStream): self.im_info[k] = self.im_text[k] = iTXt(v, lang, tk) self.check_text_memory(len(v)) - + return s @@ -729,10 +729,6 @@ def _save(im, fp, filename, chunk=putchunk, check=0): alpha_bytes = 2**bits chunk(fp, b"tRNS", alpha[:alpha_bytes]) - if 0: - # FIXME: to be supported some day - chunk(fp, b"gAMA", o32(int(gamma * 100000.0))) - dpi = im.encoderinfo.get("dpi") if dpi: chunk(fp, b"pHYs", diff --git a/libImaging/Dib.c b/libImaging/Dib.c index 8e138bd6b..55de7d9a5 100644 --- a/libImaging/Dib.c +++ b/libImaging/Dib.c @@ -204,19 +204,6 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) #endif -#if 0 - { - /* DEBUG: dump palette to file */ - FILE *err = fopen("dib.pal", "w"); - for (i = 0; i < 256; i++) - fprintf(err, "%d: %d/%d/%d\n", i, - pal->palPalEntry[i].peRed, - pal->palPalEntry[i].peGreen, - pal->palPalEntry[i].peBlue); - fclose(err); - } -#endif - dib->palette = CreatePalette(pal); } diff --git a/libImaging/Geometry.c b/libImaging/Geometry.c index f586974c3..97cbcf2ed 100644 --- a/libImaging/Geometry.c +++ b/libImaging/Geometry.c @@ -304,23 +304,6 @@ perspective_transform(double* xin, double* yin, int x, int y, void* data) return 1; } -#if 0 -static int -quadratic_transform(double* xin, double* yin, int x, int y, void* data) -{ - double* a = (double*) data; - - double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; double a3 = a[3]; - double a4 = a[4]; double a5 = a[5]; double a6 = a[6]; double a7 = a[7]; - double a8 = a[8]; double a9 = a[9]; double a10 = a[10]; double a11 = a[11]; - - xin[0] = a0 + a1*x + a2*y + a3*x*x + a4*x*y + a5*y*y; - yin[0] = a6 + a7*x + a8*y + a9*x*x + a10*x*y + a11*y*y; - - return 1; -} -#endif - static int quad_transform(double* xin, double* yin, int x, int y, void* data) { diff --git a/libImaging/QuantHash.c b/libImaging/QuantHash.c index a1f99ed3a..48b7a973e 100644 --- a/libImaging/QuantHash.c +++ b/libImaging/QuantHash.c @@ -44,9 +44,6 @@ struct _HashTable { #define RESIZE_FACTOR 3 static int _hashtable_insert_node(HashTable *,HashNode *,int,int,CollisionFunc); -#if 0 -static int _hashtable_test(HashTable *); -#endif HashTable *hashtable_new(HashFunc hf,HashCmpFunc cf) { HashTable *h; @@ -132,22 +129,6 @@ static void _hashtable_resize(HashTable *h) { } } -#if 0 -static int _hashtable_test(HashTable *h) { - uint32_t i; - int j; - HashNode *n; - for (i=0;ilength;i++) { - for (n=h->table[i];n&&n->next;n=n->next) { - j=h->cmpFunc(h,n->key,n->next->key); - printf ("%c",j?(j<0?'-':'+'):'='); - } - printf ("\n"); - } - return 0; -} -#endif - static int _hashtable_insert_node(HashTable *h,HashNode *node,int resize,int update,CollisionFunc cf) { uint32_t hash=h->hashFunc(h,node->key)%h->length; HashNode **n,*nv; From f1333617d5d5bd34fb5a3338a3e5d851e1ef6e2a Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 5 Mar 2015 23:14:36 +0200 Subject: [PATCH 296/532] Replace harcoded assumption of RAND_MAX with constant. It caused an infinite loop if RAND_MAX > 32767 --- libImaging/Effects.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libImaging/Effects.c b/libImaging/Effects.c index eb598d968..a3f5e7cd9 100644 --- a/libImaging/Effects.c +++ b/libImaging/Effects.c @@ -98,8 +98,8 @@ ImagingEffectNoise(int xsize, int ysize, float sigma) /* after numerical recipes */ double v1, v2, radius, factor; do { - v1 = rand()*(2.0/32767.0) - 1.0; - v2 = rand()*(2.0/32767.0) - 1.0; + v1 = rand()*(2.0/RAND_MAX) - 1.0; + v2 = rand()*(2.0/RAND_MAX) - 1.0; radius= v1*v1 + v2*v2; } while (radius >= 1.0); factor = sqrt(-2.0*log(radius)/radius); From 9bd38bfa06fd14fce3c998877f9dfe35e0cf7fb5 Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 5 Mar 2015 23:21:42 +0200 Subject: [PATCH 297/532] Run test_effect_noise() on non-Windows, don't be too strict --- Tests/test_image.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 26e45b10a..de43b010e 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -168,8 +168,6 @@ class TestImage(PillowTestCase): ValueError, lambda: Image.effect_mandelbrot(size, extent, quality)) - @unittest.skipUnless(sys.platform.startswith('win32'), - "Stalls on Travis CI, passes on Windows") def test_effect_noise(self): # Arrange size = (100, 100) @@ -180,8 +178,8 @@ class TestImage(PillowTestCase): # Assert self.assertEqual(im.size, (100, 100)) - self.assertEqual(im.getpixel((0, 0)), 60) - self.assertEqual(im.getpixel((0, 1)), 28) + self.assertEqual(im.mode, "L") + self.assertNotEqual(im.getpixel((0, 0)), im.getpixel((0, 1))) def test_effect_spread(self): # Arrange From 44bb45d3b372fba84d0b029e9f59c5b73a1eee53 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 6 Mar 2015 10:52:10 +0200 Subject: [PATCH 298/532] Add OS X build badge [CI skip] We have OS X builds in another repo. Show the badge here too, to help spot OS X build breaks sooner (for example, if might pass on Linux). --- README.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index dfd3e2c31..c6cf3e419 100644 --- a/README.rst +++ b/README.rst @@ -7,8 +7,12 @@ Pillow is the "friendly" PIL fork by `Alex Clark and Contributors Date: Fri, 6 Mar 2015 13:07:28 -0800 Subject: [PATCH 299/532] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 74d1b6b82..7afd47350 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Remove unreachable code + [hugovk] + - Let Python do the endian stuff + tests #1121 [amoibos, radarhere] From fb3fe4b8770941deb3e8da9f2f7ed85b0fef5d92 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 7 Mar 2015 18:38:17 +1100 Subject: [PATCH 300/532] Added documentation for font_variant() [ci skip] --- PIL/ImageFont.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 5d08abfa5..8f60ddb00 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -168,6 +168,15 @@ class FreeTypeFont: return im, offset def font_variant(self, font=None, size=None, index=None, encoding=None): + """ + Create a copy of this FreeTypeFont object, + using any specified arguments to override the settings. + + Parameters are identical to the parameters used to initialize this object, + minus the deprecated 'file' argument. + + :return: A FreeTypeFont object. + """ return FreeTypeFont(font = self.path if font == None else font, size = self.size if size == None else size, index = self.index if index == None else index, From 85977bc371c6b2fae775990059e90f0786d94571 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 8 Mar 2015 18:30:24 -0700 Subject: [PATCH 301/532] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 7afd47350..a995165c4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Fix ImagingEffectNoise #1128 + [hugovk] + - Remove unreachable code [hugovk] From 80d6b29b77fe5eba171dbeb517acbb1c7a17cddb Mon Sep 17 00:00:00 2001 From: artscoop Date: Tue, 10 Mar 2015 02:08:23 +0100 Subject: [PATCH 302/532] Fix bug with bitmasks on a 1x1 RGBA file Does not change testing on other files, but fixes a case which previously made PIL collapse. The Bitmap was a 1x1 RGBA and provoked an exception in PIL, but every Image viewer can load it. Fixed code with comparison of header size, compression type and loading type of masks and fixed it. --- PIL/BmpImagePlugin.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 99159d569..f8a755812 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -104,18 +104,19 @@ class BmpImageFile(ImageFile.ImageFile): file_info['colors'] = i32(header_data[28:32]) file_info['palette_padding'] = 4 self.info["dpi"] = tuple(map(lambda x: math.ceil(x / 39.3701), 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']): + file_info[mask] = i32(header_data[36+idx*4:40+idx*4]) + else: + for mask in ['r_mask', 'g_mask', 'b_mask', 'a_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']) 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 - if file_info['compression'] == self.BITFIELDS: - file_info['r_mask'] = i32(read(4)) - file_info['g_mask'] = i32(read(4)) - file_info['b_mask'] = i32(read(4)) - file_info['a_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']) - 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']) @@ -128,8 +129,14 @@ class BmpImageFile(ImageFile.ImageFile): 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)], 24: [(0xff0000, 0xff00, 0xff)], 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)]} - MASK_MODES = {(32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", (24, (0xff0000, 0xff00, 0xff)): "BGR", (16, (0xf800, 0x7e0, 0x1f)): "BGR;16", (16, (0x7c00, 0x3e0, 0x1f)): "BGR;15"} + SUPPORTED = { + 32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000), (0x0, 0x0, 0x0, 0x0)], + 24: [(0xff0000, 0xff00, 0xff)], + 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)]} + MASK_MODES = { + (32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", + (24, (0xff0000, 0xff00, 0xff)): "BGR", + (16, (0xf800, 0x7e0, 0x1f)): "BGR;16", (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']]: raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])] From 419ed13bb769b203084c9a68ae47275dcea50c02 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 10 Mar 2015 13:26:40 +1100 Subject: [PATCH 303/532] Fixed typos in CHANGES.rst [ci skip] --- CHANGES.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index a995165c4..451a6ba14 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -58,7 +58,7 @@ Changelog (Pillow) - Fix MSVC compiler error: Use Py_ssize_t instead of ssize_t #1051 [cgohlke] -- Fix compiler error: MSVC needs varaibles defined at the start of the block #1048 +- Fix compiler error: MSVC needs variables defined at the start of the block #1048 [cgohlke] - The GIF Palette optimization algorithm is only applicable to mode='P' or 'L' #993 @@ -1793,7 +1793,7 @@ Changelog (Pillow) (1.1.2c1 and 1.1.2 final released) + Adapted to Python 2.1. Among other things, all uses of the - "regex" module has been repleased with "re". + "regex" module have been replaced with "re". + Fixed attribute error when reading large PNG files (this bug was introduced in maintenance code released after the 1.1.1 @@ -2417,7 +2417,7 @@ Changelog (Pillow) the default value is 75. JPEG smooth smooth dithered images. value - is strengh (1-100). default is + is strength (1-100). default is off (0). PNG optimize minimize output file at the From 5a49375d4fb0ed2c7b9d37fab49aec7db21d76ad Mon Sep 17 00:00:00 2001 From: George Davaris Date: Wed, 11 Mar 2015 15:37:02 +0000 Subject: [PATCH 304/532] Fix UnboundLocalError in ImageFile --- PIL/ImageFile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 82691af92..f81ddf2a0 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -202,6 +202,7 @@ class ImageFile(Image.Image): try: d.setimage(self.im, e) except ValueError: + t = None continue b = prefix t = len(b) From ddf17df928bbb8aac044bfedad155c7947e1a64a Mon Sep 17 00:00:00 2001 From: Fahrzin Hemmati Date: Sat, 14 Mar 2015 02:41:14 -0700 Subject: [PATCH 305/532] Make gifmaker work with the current getheader GifImagePlugin.getheader was updated about 2 years ago and changed the API that gifmaker expects. --- Scripts/gifmaker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/gifmaker.py b/Scripts/gifmaker.py index 9fa5e71a4..bd4de99c1 100644 --- a/Scripts/gifmaker.py +++ b/Scripts/gifmaker.py @@ -78,7 +78,7 @@ def makedelta(fp, sequence): if not previous: # global header - for s in getheader(im) + getdata(im): + for s in getheader(im)[0] + getdata(im): fp.write(s) else: From b5475f2e1aee53075ed504a1f7193741fe44f7a5 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 18 Mar 2015 05:19:32 -0400 Subject: [PATCH 306/532] Nits [ci skip] - Mac OS X is now called just OS X - Capitalize headers --- docs/installation.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index cca94a135..3a9e8c50e 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -12,7 +12,7 @@ Installation .. note:: Pillow < 2.0.0 supports Python versions 2.4, 2.5, 2.6, 2.7. -Simple installation +Simple Installation ------------------- .. note:: @@ -121,7 +121,7 @@ Sample Usage:: $ MAX_CONCURRENCY=1 python setup.py build-ext --enable-[feature] install -Linux installation +Linux Installation ------------------ .. note:: @@ -160,8 +160,8 @@ Prerequisites are installed on **Fedora 20** with:: lcms2-devel libwebp-devel tcl-devel tk-devel -Mac OS X installation ---------------------- +OS X Installation +----------------- We provide binaries for OS X in the form of `Python Wheels `_. Alternatively you can compile Pillow with with XCode. @@ -173,7 +173,7 @@ Install Pillow with:: $ pip install Pillow -Windows installation +Windows Installation -------------------- We provide binaries for Windows in the form of Python Eggs and `Python Wheels @@ -208,8 +208,8 @@ to a specific version: $ pip install --use-wheel Pillow==2.6.1 -FreeBSD installation ---------------------- +FreeBSD Installation +-------------------- .. Note:: Only FreeBSD 10 tested From a37e022a0c50dcbff6b2f0d99f21444be8847207 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 18 Mar 2015 05:39:01 -0400 Subject: [PATCH 307/532] Wheels updates [ci skip] - No longer experimental - No longer need --use-wheels --- docs/installation.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 3a9e8c50e..d68f78238 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -194,11 +194,11 @@ Python Eggs Python Wheels ^^^^^^^^^^^^^ -.. Note:: Experimental. Requires setuptools >=0.8 and pip >=1.4.1 +.. Note:: requires setuptools >=0.8 and pip >=1.4.1. Some older versions of pip required the ``--use-wheel`` flag. :: - $ pip install --use-wheel Pillow + $ pip install Pillow If the above does not work, it's likely because we haven't uploaded a wheel for the latest version of Pillow. In that case, try pinning it @@ -206,7 +206,7 @@ to a specific version: :: - $ pip install --use-wheel Pillow==2.6.1 + $ pip install Pillow==2.6.1 FreeBSD Installation -------------------- From d0e720929af4686976541f3bd5ec893e82652dac Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 18 Mar 2015 05:46:54 -0400 Subject: [PATCH 308/532] Nits [ci skip] --- docs/installation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index d68f78238..d9027bda6 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -163,7 +163,7 @@ Prerequisites are installed on **Fedora 20** with:: OS X Installation ----------------- -We provide binaries for OS X in the form of `Python Wheels `_. Alternatively you can compile Pillow with with XCode. +We provide binaries for OS X in the form of `Python Wheels `_. Alternatively you can compile Pillow from soure with XCode. The easiest way to install external libraries is via `Homebrew `_. After you install Homebrew, run:: @@ -194,7 +194,7 @@ Python Eggs Python Wheels ^^^^^^^^^^^^^ -.. Note:: requires setuptools >=0.8 and pip >=1.4.1. Some older versions of pip required the ``--use-wheel`` flag. +.. Note:: Requires setuptools >=0.8 and pip >=1.4.1. Some older versions of pip required the ``--use-wheel`` flag. :: From f820c5184d3ba7f9aa8bd0ddb8813ab4cddf3e40 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 21 Mar 2015 10:16:55 +0200 Subject: [PATCH 309/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 451a6ba14..f8ec2d685 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Added copy method font_variant() and accessible properties to truetype() #1123 + [radarhere] + - Fix ImagingEffectNoise #1128 [hugovk] From b17384cfca954ec3d979a837a572f77a26b407d3 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 21 Mar 2015 10:32:26 +0200 Subject: [PATCH 310/532] Tabs to spaces and other flake8 fixes --- PIL/ImageFont.py | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 8f60ddb00..a9c50e560 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -168,19 +168,20 @@ class FreeTypeFont: return im, offset def font_variant(self, font=None, size=None, index=None, encoding=None): - """ - Create a copy of this FreeTypeFont object, - using any specified arguments to override the settings. - - Parameters are identical to the parameters used to initialize this object, - minus the deprecated 'file' argument. - - :return: A FreeTypeFont object. - """ - return FreeTypeFont(font = self.path if font == None else font, - size = self.size if size == None else size, - index = self.index if index == None else index, - encoding = self.encoding if encoding == None else encoding) + """ + Create a copy of this FreeTypeFont object, + using any specified arguments to override the settings. + + Parameters are identical to the parameters used to initialize this + object, minus the deprecated 'file' argument. + + :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) ## # Wrapper that creates a transposed font from any existing font @@ -275,8 +276,8 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): elif sys.platform in ('linux', 'linux2'): lindirs = os.environ.get("XDG_DATA_DIRS", "") if not lindirs: - #According to the freedesktop spec, XDG_DATA_DIRS should - #default to /usr/share + # According to the freedesktop spec, XDG_DATA_DIRS should + # default to /usr/share lindirs = '/usr/share' lindirs = lindirs.split(":") for lindir in lindirs: @@ -286,7 +287,8 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): filepath = os.path.join(walkroot, ttf_filename) return FreeTypeFont(filepath, size, index, encoding) elif sys.platform == 'darwin': - macdirs = ['/Library/Fonts/', '/System/Library/Fonts/', os.path.expanduser('~/Library/Fonts/')] + macdirs = ['/Library/Fonts/', '/System/Library/Fonts/', + os.path.expanduser('~/Library/Fonts/')] for macdir in macdirs: filepath = os.path.join(macdir, ttf_filename) if os.path.exists(filepath): From 84ec2af495a13076ca5d0bec2f9439e9ee639a3c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 27 Feb 2015 14:48:07 +1100 Subject: [PATCH 311/532] Allow truetype() to search for extensions other than .ttf --- PIL/ImageFont.py | 34 +++++++++++++++------------------- Tests/test_imagefont.py | 6 +++++- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index a9c50e560..61c552b1d 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -261,38 +261,34 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): try: return FreeTypeFont(font, size, index, encoding) except IOError: - if font.endswith(".ttf"): - ttf_filename = font - else: - ttf_filename = "%s.ttf" % font + ttf_filename = os.path.basename(font) + + dirs = [] if sys.platform == "win32": # check the windows font repository # NOTE: must use uppercase WINDIR, to work around bugs in # 1.5.2's os.environ.get() windir = os.environ.get("WINDIR") if windir: - filename = os.path.join(windir, "fonts", font) - return FreeTypeFont(filename, size, index, encoding) + dirs.append(os.path.join(windir, "fonts")) elif sys.platform in ('linux', 'linux2'): lindirs = os.environ.get("XDG_DATA_DIRS", "") if not lindirs: # According to the freedesktop spec, XDG_DATA_DIRS should # default to /usr/share lindirs = '/usr/share' - lindirs = lindirs.split(":") - for lindir in lindirs: - parentpath = os.path.join(lindir, "fonts") - for walkroot, walkdir, walkfilenames in os.walk(parentpath): - if ttf_filename in walkfilenames: - filepath = os.path.join(walkroot, ttf_filename) - return FreeTypeFont(filepath, size, index, encoding) + dirs += [os.path.join(lindir, "fonts") for lindir in lindirs.split(":")] elif sys.platform == 'darwin': - macdirs = ['/Library/Fonts/', '/System/Library/Fonts/', - os.path.expanduser('~/Library/Fonts/')] - for macdir in macdirs: - filepath = os.path.join(macdir, ttf_filename) - if os.path.exists(filepath): - return FreeTypeFont(filepath, size, index, encoding) + dirs += ['/Library/Fonts/', '/System/Library/Fonts/', + os.path.expanduser('~/Library/Fonts/')] + + ext = os.path.splitext(ttf_filename)[1] + for dir in dirs: + for walkroot, walkdir, walkfilenames in os.walk(dir): + for walkfilename in walkfilenames: + if (ext and walkfilename == ttf_filename) or (not ext and os.path.splitext(walkfilename)[0] == ttf_filename): + fontpath = os.path.join(walkroot, walkfilename) + return FreeTypeFont(fontpath, size, index, encoding) raise diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 1b03ed13b..a7d3e5ebb 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -269,7 +269,11 @@ try: #correctness. with SimplePatcher(sys, 'platform', 'darwin'): fake_font_path = '/System/Library/Fonts/Arial.ttf' - with SimplePatcher(os.path, 'exists', lambda x: x == fake_font_path): + def fake_walker(path): + if path == '/System/Library/Fonts/': + return [(path, [], ['Arial.ttf'], )] + return [(path, [], ['some_random_font.ttf'], )] + with SimplePatcher(os, 'walk', fake_walker): self._test_fake_loading_font(fake_font_path) From 3e9e95b00aa88226c8d4b2b6e600a98a751e1e5a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 27 Feb 2015 14:50:54 +1100 Subject: [PATCH 312/532] Changed truetype() to prefer .ttf extensions --- PIL/ImageFont.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 61c552b1d..92722a7fe 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -283,12 +283,21 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): os.path.expanduser('~/Library/Fonts/')] ext = os.path.splitext(ttf_filename)[1] + firstFontWithADifferentExtension = None for dir in dirs: for walkroot, walkdir, walkfilenames in os.walk(dir): for walkfilename in walkfilenames: - if (ext and walkfilename == ttf_filename) or (not ext and os.path.splitext(walkfilename)[0] == ttf_filename): + if ext and walkfilename == ttf_filename: fontpath = os.path.join(walkroot, walkfilename) return FreeTypeFont(fontpath, size, index, encoding) + 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) + if not ext and firstFontWithADifferentExtension == None: + firstFontWithADifferentExtension = fontpath + if firstFontWithADifferentExtension: + return FreeTypeFont(firstFontWithADifferentExtension, size, index, encoding) raise From 967d39d1d6aaeed712dc4f99fc9c402b82a5d254 Mon Sep 17 00:00:00 2001 From: Audrey Roy Date: Mon, 23 Mar 2015 21:16:53 -0700 Subject: [PATCH 313/532] Improve reference docs for PIL.ImageDraw.Draw.pieslice() --- docs/reference/ImageDraw.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index c24a9dd99..e6d5c36ee 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -184,8 +184,11 @@ Methods :param xy: Four points to define the bounding box. Sequence of ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``. - :param outline: Color to use for the outline. + :param start: Starting angle, in degrees. Angles are measured from + 3 o'clock, increasing clockwise. + :param end: Ending angle, in degrees. :param fill: Color to use for the fill. + :param outline: Color to use for the outline. .. py:method:: PIL.ImageDraw.Draw.point(xy, fill=None) From 36081f20158c164ca0395f9cceda068e9e12b06a Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 24 Mar 2015 09:02:59 +0200 Subject: [PATCH 314/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f8ec2d685..dea818960 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Improve reference docs for PIL.ImageDraw.Draw.pieslice() #1145 + [audreyr] + - Added copy method font_variant() and accessible properties to truetype() #1123 [radarhere] From f471544c9f4d289b85aec30771867c28b1a7d206 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Tue, 24 Mar 2015 18:00:08 -0400 Subject: [PATCH 315/532] Fix manifest [ci skip] --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index 8a8694ad1..b808ad17b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,6 +2,7 @@ include *.c include *.h include *.md include *.py +include *.sh include *.rst include *.txt include *.yaml From 3c221887f8b3af50c788f2516ff59ca0c125b1a9 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Tue, 24 Mar 2015 18:23:55 -0400 Subject: [PATCH 316/532] Jazz up README [ci skip] I've not liked the "plain" readme for the last few releases, so I've adjusted things hopefully for the better: - Rename/add section headers - Divide content into two sections - Provide bulleted list with most important links e.g. "install" --- README.rst | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index c6cf3e419..42c6507f6 100644 --- a/README.rst +++ b/README.rst @@ -1,9 +1,10 @@ Pillow ====== -*Python Imaging Library (Fork)* +Python Imaging Library (Fork) +----------------------------- -Pillow is the "friendly" PIL fork by `Alex Clark and Contributors `_. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. For more information, please `read the documentation `_, `check the changelog `_ and `find out how to contribute `_. +Pillow is the "friendly PIL fork" by `Alex Clark and Contributors `_. PIL is the **Python Imaging Library** by Fredrik Lundh and Contributors. .. image:: https://travis-ci.org/python-pillow/Pillow.svg?branch=master :target: https://travis-ci.org/python-pillow/Pillow @@ -28,3 +29,15 @@ Pillow is the "friendly" PIL fork by `Alex Clark and Contributors `_ +- `Contribute `_ +- `Documentation `_ + + - `About `_ + - `Guides `_ + - `Install `_ + - `Reference `_ From cbe38021abb39177abe553004dd5ca2c4419f731 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Tue, 24 Mar 2015 18:29:31 -0400 Subject: [PATCH 317/532] On second thought [ci skip] I don't like the bold afterall --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 42c6507f6..76b22b7e4 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ Pillow Python Imaging Library (Fork) ----------------------------- -Pillow is the "friendly PIL fork" by `Alex Clark and Contributors `_. PIL is the **Python Imaging Library** by Fredrik Lundh and Contributors. +Pillow is the "friendly PIL fork" by `Alex Clark and Contributors `_. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. .. image:: https://travis-ci.org/python-pillow/Pillow.svg?branch=master :target: https://travis-ci.org/python-pillow/Pillow From db94d48c4e2366b740af54b0d7981ce8b5947020 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Tue, 24 Mar 2015 18:30:42 -0400 Subject: [PATCH 318/532] Wording nit [ci skip] --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 76b22b7e4..ce1c707c3 100644 --- a/README.rst +++ b/README.rst @@ -39,5 +39,5 @@ More Information - `About `_ - `Guides `_ - - `Install `_ + - `Installation `_ - `Reference `_ From 6e36d5304d312d82b40518069231f62254933094 Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 26 Mar 2015 13:52:57 +0200 Subject: [PATCH 319/532] Move LICENSE from docs to make it more explicit [CI skip] --- docs/LICENSE => LICENSE | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/LICENSE => LICENSE (100%) diff --git a/docs/LICENSE b/LICENSE similarity index 100% rename from docs/LICENSE rename to LICENSE From 883858151d0a7f48e4c9acc444a65e21bc3cdbd9 Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 26 Mar 2015 14:05:17 +0200 Subject: [PATCH 320/532] Simple test for 1104 --- Tests/images/illu10_no_preview.eps | Bin 0 -> 392205 bytes Tests/images/illu10_preview.eps | Bin 0 -> 405470 bytes Tests/images/illuCS6_no_preview.eps | Bin 0 -> 411730 bytes Tests/images/illuCS6_preview.eps | Bin 0 -> 424558 bytes Tests/test_file_eps.py | 15 +++++++++++++++ 5 files changed, 15 insertions(+) create mode 100644 Tests/images/illu10_no_preview.eps create mode 100644 Tests/images/illu10_preview.eps create mode 100644 Tests/images/illuCS6_no_preview.eps create mode 100644 Tests/images/illuCS6_preview.eps diff --git a/Tests/images/illu10_no_preview.eps b/Tests/images/illu10_no_preview.eps new file mode 100644 index 0000000000000000000000000000000000000000..ffe8a537afd5ad941c1b8ce347846ae42aff138d GIT binary patch literal 392205 zcmeFa>vCI1vM%@=j_^BR&apeBIb$u}B{_V&n-|Gex8>G|>f3M>2oL}%v_OCx0A+C_ z^zQS0d8x`;YXPL(?lTj6wrr9>U9z&WGPAO>vZ}uR-(H=5b2yxxkG|P`wB3F7>hw82 zY<>B~*M}#6>Ybb(_nu7$v*CDp`EB>FwcGaJv#Mf`e%gN~5?szh}+1~0+ zXT9tB=)-vQ%cIftg89euQGYp`f7_J?x-U>}v79sM!Rv?J?E`7&>*p+yU`n0wY`WIx838(s6TytG+rVLq&ga1 zj;F_yG4fwb|1laY(S>ijUggJ8e>j?V|J&h;ZBJew~2F~39^9saTeB0fQg!*|j8jgk- zm)XsHz}%R5dUJgZa>eZH`E0NlEtOk(hd;dRy|@C{?)D>$HtYV6Zdv4bHk-V;y&m=c zyc|!)%iG?Yy`9e}{qpdS&;E4$95r@!?`Yt7HXn6&9_?62hlyd7cAXYc?brgNxn)?dG9W55ev&n3Z*1AWN{@{HakYmW^?8@_*bNuq}e+;QQ zey@KxYNU}_W>=IAh<*1z|G)oVbh3RI|EufmbotMn`d_2|pL=}Ud&fCIERU1XMgL|( z<^J{8e}R1mtK?5}nmTu52We;5rP zefh;g$_&SYWd*C_8q*>A)qOvm{Q~25HMp72(L+n_Eax|)ZZ7s|eDUQMHvlEo#k>`R zMW^`3`(37Yhd0;Va~g)->l@gK)%g&$R_8FIyTj4NC;xz)>2Ni@0hW@?Qq@N(JNh_y z7ZNAK3m8$W$*gY>r07tJqKQvvpd)o9Ww-myb{Djtu=$jC4NO)7*HWcS2 z|MG4$A2FqKJ-hDO559hqG(oNdB8(=B(U)I*0@{Ew7*3_#2*=1Mkn8rx2c^GP&=S@#~bSI zbT84_kiA=E?}lvD`JhHU0Icj|ckp5U2}aiS^=P>IW?Ohjp@Fe_mmjXsNu$^0WOm-4 zpt~4;Wa?MzI1Im3yqk()Mm*+|9Tz7e?*A?m_ft0ll*Gp1+T`-(R?z-A1msbvA=j%r_FHI zg@$dU_LWoCka2*GM-jqpzP#x*g3XhLmvRQox&; zkZt58xo#;S6fkja$^M7erxZ8yA;5s2g|}H^*zeXz3h_mqAq2Zw8nTMKD5uRbE}|%C zl3?Q5EDFg)sU(%n0u;y(A6cj-kj{-ugVOODALasaQ+h%T{) zuJqhxyxIJ_W%Z-U6+M7tLov6X!WK}oX?tsnpJ#KnCH9AD50}R#fLce|+L&Svhe06l zI$fDK8?{!Twm0JTUUvY0@jTC{ZfB@H-2lM>a}aDWTOGBc)E+2H&4F@JYh*D`)wSR&=N{yT#(#|Rp2G>JPfYm_fY!3;f zbyd|?hY1907)xHm%{|1{32i%0@wT8^zMD;kz03!MC+m`3eCR|rb3k79lN8`DF_M3* zi^?uULvodoJAvKmprn|xX{Y11D&YQA?5H0{TvvCmZYBn)^X45^21I-z%ZC-rwro?Y zvKNp#kO0)F$)z^vE5N|}qzYDC)qFU(nu^X>cDDK#mLfQsJSk16IA-yUYXAz_ z@ts>=bjC#!4%S2KjGLh@>ZFgY{j6Nz{o!YaaRw;38394b`mq^5-$(%>8JD)C8 zEnEM*oHnqP@M9A|0_G-GntiVHNk_U(@Ta0LfRh_Ozm-4bC`w1LxP)BMpMz3^59997 zSg0<#N=$NXmn+u=*0Ag~7aTv$X74fRLRcX{3DuyHH}-Um=OR&INKThxaS}W9C4XDX zMq3+rh%Tm1;1&6dg_J6aX)jxKJ@rD_NM8bN(xp<@lTs*2nG`itQLqZ!#yS`gqbXYg zA(&|7!pH7bbt%A!7yhl&ZNh>TbXfw{iG(gj!Nj+Qn2%9l&Q52$(t#pUGD7@d-BpBK znFur+19sC{42V_YK4WLdzLhx02nX)4jP0hLwFBF($UX#AblX|I9Ds}&DB6Y_d*yte zup*mR<4n^E^Sx)P2tY%tbhLip({T1%%6?42)Ojpo=nyvFJXMn1*yu?XRl?sz!< z;HyQc_X4^gIW}f+0drscRCboTsii6;k}Xs-RxJJ!4(#zYRCTJh2=&@>YXD5ghqhGd zhhi920S_&Zi)m+BN(AB(bci_*i^lunya;8q`uRZoKLHZK0LA6N)&Bg3E|jI z2AjJtCbLPl&mdBPbiqKeUUU+5;Nj0XK`gZyj*pIWrxU?2UA}YReOjY89NJ?oT2cWu z&zfvnhYiB6(P5Mbb-d>Z=R}OGpL?%PcZ5V4g~Yd=ZYQwOStb}2@3glVUH69IAq{Gv z^hrBL!A{jOI$aqYV@9Y|<)kyv^Q~7C!(B`r5Js&BC2NCrR^tUHEX;1!A!tju!gssV z83qkX!Tb3$B#X)x%OLG9XDQ>+#aW_%?tH1H+B&nA30Ij^ro2C`=;Y=eLH?v_T9I)h z(nQOck-pOpq6|1;E6Zpt^A+e9kc{N(a4HV0l)F-nW0RAt)rK0<(b}%mnp4xj?1--J zyks#C)WrCLJ^GVnV2@;@lsvM50cuKIUKZ&sm~{~)q@8AJbduW|9D8c`x0M={&gu29i8#99~1Y26CQd+h0=GDyv z5R~O@DbR{O+kjf;1k}(mNP{QQ^-0K<)fy~VsSK?vb6MPu0!-Q540Y7%7w;4@ebI}` z9Oru7PNO2`c$uDL;p=mq>{_s`0I#j8;Tgn9>ZDa8zcrXp*D1ogg`%|eRcbPzTGFMJ zEL;SH8YZ@}2dxANRW^_zQ#F^jzGwZxwqnok+3`@v?QWY{xqpvVa)BuOgUM{sl>KI# zQjV<9q78;4aEMsa?!KYN{$?Qy5ri!cZ(s<^+}X`>13$cc)wAVK4?dG$tbonpWNK`4 z!I5xPw55hj4vT#Wgbb5Gm0;#ct1N!7{QAZz;6zg}UoY zJ-H94C-lSK)!vis)ZY5$_V3f&{)Xm`xr3U?vT9{t|u{?w8AV zU1D?x@A~uWK6X$q#K+j>zER1FLuU8hP>Z2iRicCHx*&SF+-a0Ndsrl{N?y@n3DW%oW8JC{mZdvbItp$%M%a%rQ|N zGRgJ_w#yYU=MhA}zr*5+Ta&sl%rP6;r8HrfiG-kCUs+NipKYCQj&@II9S!b>Rjb4c>FjB53P8UUw~H zl~t1A9=)gUDh!#;?Cw>PuUlO>bJ0`uBlS&ut=u?rDv}zbkK?6vw$qV)O90;jEH6|P z_%xZ>C^;2TSC=W-Egwx^5mF(NlQWnbfh_l7r*(D~Nto6T5h+zP3# zaC+zBHtizG=B)X{HN?^PjAUKu{ifS)fB?(1oc6gwe0)2$O`yI2B7il3x@Lu$DST@o z6%)Z5i{f~GGnF$lY5}Pls2Z6B&apBZ(k6hgOB@Wm4w*p6*o4EV5W*=s1#Wf~9A=g- zlf(8Hs%h(?OtXPR80h@gUP$xz>c+-iuoD51IGY8uhQrJDefF{~5Lib}GVmANS6 z8JL+^(=0G--K7cFt*Woe$_DGzSy8sY#K3^RireZxGZdusktV=3SE>OQZ3eerhAz8o z+?y0`mnKLPiQBeaVSKNSPfw1p5-Sv$r-4bCPaB)@vz6|Hshx`Mx?baK?2e?M(NtZ; zOc2o`u+@p>G;+5u`ocw^wNu1&vpMy23KIOPGWLL#)3PS8kT&mlt!o;?12g^g_?n(_ zo57Nb7*Bh1&Cw`iv?`6VPtITba9?{eW6j!k40sy4fJJF{c3N0Ugf9)cEv1ZfY~IIA zP6%j%4@$~2=R;#C>rM&d^mDLJS=A$)3CHNX?r6w~|QyQ+4?31c2Zdtx#d6t>v(7{J1S3xaCq@+({G+J+Y)g zFi&GUF*b(K1f=*#g>ZS01prH!1+y!&dF*^|Uk;7vH2>iLo<1xyrLGTtvX7&>|41q- z8weU%z<=tWk8m_XR%nW0UyM#QIM0MwYE!6vT)jH{;n`1zN6&r=7;6=Di)o#+)th(Y z1l`tG~^?l(JfZ07s#iFAo-C$MPNjW)iMt0fU4s%{}qMsn5$f+O^ZS(imtViN57 z*MV?FvupPCzWtSDDE7$?99xOT#hOMXg#*S#kWfRqX*doSgr4mPJ+Wjny_XRTlAvHI zP%m%W12SOh2hghFunlZxJ3OURA;vN%iMIOs>u1w+{`+3X!^$((rlxQ_|BlmP+fSc9 z=IOA;^X9U@Bz`R$NcS+4hD7y<}cvxnaH zED|D3tWXT=0vyF!S@b_xgh!gn=Kbq;<3TfHfO%B>atZiVBjvV{^1hM6C^~q$V3X?N zp@g{@@Qlxy5mCS8P14jf*A#Vheg_&~V%d`7FQtb}6vlAm%zkOhk;v<|j2x5ap`>bB!aC%kD!M_-=En;OPNZp7X1tp%md(`u zhuL`8`)Nml7Fq~k6D1FR6bSHW4+DEfy?@Nk%Pif=Kn*ePYI$}dPga4n>(emi<8aNq z(e%T3KAZMt?@MT~lY4_c+=FBQx+6*kGR{e%?=i?CwTn%eW&dv_TuJ+TnKosJL_q?E zc`U9+gE3B^6d9vAPG!loyZ~#rBi2KqvX)^Bkh3LX1jhYEE573?&e!nLkJj7^z1Tt4 zA;&zRRkq>Tv+E6+jHWL7gIhq@=9}3oy&$5s}lODIYVj5au_P#|W>Je5$SWAlOA61{8OShDPii@-Gm7E*)vvzuk_2Kxkyf0ud& z#tu}vj@GYVesPB7*dfjv_J?E0btNg@A$@|f5Pu7CkcwVm6XMh(&pHj^LYc9&W_@z~@Sxo{}wLGNelW zMT?6C8tNpgp8z~sH7t$8M=_wxT{(rNzQXBE?me2BI+$Gdrq@fjD#1@<%!t=kb~FoF z{1P)+17~Xm99DzKvs$nzXc1vzThiCYaY_@3<%zYVzm$7A*tQ(V(HjYgMKPSXMxY8{ z*(8%2~=EYE^L?TW8t2+WV#bl zJi-Ws7{FfR+$XI{V+Lr<`}iCzV4no6fFrEEMZs^ZGh<_eE8v1@@Cnt3;oY?tkZ*dz()k zSXkVoV>;2i6wPT15T}}i*FL-C+T|0w8{vKnkk?`-`05qOcZyWdeKV z5N#ZHw3C;*pW-u1QM0J=cOg;sKLBIw$<#T{RE0Q4_OMiRmqj8YX9=DC6OHcbVwV9f z54sQeN4m>!0mscMo7pDfEM>eywQ_?0mWPo87Y~9+!y892Pl;_{JdHIz@){PBq<|Ak z6bGilq}cE}c_m)gW*Y#<>8^;y8Jan(P9Zyb5Wk{(-*!b<1Kwl&_X!4XQS5=-5BIQ9 zFmEx*+})`5cUc8D>Sdd9E7UV=&mLGUYxHfs)jgOjJf;(><_KK*&3TRX z_IzI*bRm$?Xu>xEFvM#ZX9)MH+>XVbZRiIGq0h(gPt-b`M=_x(rP{%7!J%k-g`tI7 z&Gz0YW$&!j-ma5oeRZd8ji%0`H59#cdu!{)PYILiw)WFRLffOHfY;yZR9^R?ibF5i zDW(!zcOfYAqRNBTtrgs~3nMCH_1$+6kR|RIJ%Sd)F?TU<%jKL{8`F_%)Ybw*q2Qw~=-cUh zC6y{H2IPZmQ+W?SeD%KYHZ7d{19y(-cQV7m55;|Q)<=CbK-b^L=aOUtX*)-pU!NygpAcsVrH0nbacr>tDDPAIA zkRmBP&xoC{J;&ieD^FXe)|X_Fm74@yGszHYyTX5ZI4i-;zTL8_I&Mi!t(zy)R71U< zE!8w5*R3IILcIPy8*MS6XyrHFWK*khVotT>6*Cy&7MKJ+duln%m3m>9;ifa$r7OEx zQwAopR`r3b?z*qwH$EL;Pkz~b)yJv$`9qZ%wqmP$_bmkzq}CC;^vby+xv`RdNZs)3 zu`H5N;p9<+VPrQ<6cm+m<>>+ZI(1LDA;>ulHtr1tbwXBuZI)y74Te_H6#@Fb;g#Pa^nJ(Um^T0)`xn24PEEX4lwga8q8aCY(N(|K57%%t|=+t#F{#@b^8yn=o)b0z3b5lg=Xu3h7zJVmF$Hhrs#eC@79JhjvB<- z=5StjuZjkE)^T1J9@+}oiBGQ#cJ`OpYJBjp4sjs&?+d0%sO+=yvBBoeY;uEbc_}r% z8et!L&>PHg^Awjmb%^s3_FKmv?pu7pM+M}v#`PetaXBOGrB%OG0B-3_>P$&shu*I>qr|!!8CtSY<9T95LfXg66Y}IH| zu`NNQvlvA!G$l%CPb2D`2|WBpZ}N4q&TTccF;NzGC|rE$U`c0JRjfy!(LYPaJZ%IV zfbzXVdNZ~NAo*&e9hlFokgW5|b75cGA^Idc)j9Ik6_j_YiMjVsBCul|pMydpaW)bA zqHLwemIaR2b>JZYNN+da>MpTmtl>8*q!PVT_vv310YY>TL`lVlCFaSIrn; z#EPtXuZlSUiG$bdyAHmLtgQyUOwms**4b7Luy0;6cFVFlh~NjW_zE+(96I7fJ95`u zEZo`C+F?PejF&7(2#n`QPC5>9u{<;Z+BLdWmXPwbr^i zz)p~N0(?$GF{<^!U;FbZVu8Nx{sB=~*l3p5dgKFdOTzt-*aYoQ;gx}6fJrSLeq68p z%NVC~XVY&O6V}BX@oqL;JnAyQHP!9o3UVy>Q3_y2T_Jl{nBo5r7m)oIx@@sbEIwfagT!D>4G7 zNqTLB^AQ0yosi1OLEVe%#T(2eq-)B>o|(Nk;)L@pr{rNt0?`sQ`lsoSjPb)Bz(N;V zE+Dyfs@@4sG|HJx$@!MaupgAdLBeJ}>-fS2A9I*TiUkji$^g2!6{TaLActjzkdZ&u zMnip8Dd^D2S+Iy)edIZL6nN;k1}()(dg(Rb0}#p>U8flmpE`qm02RW(iiM0P*`%JH zqbi(DY9%(a$r=>(_QW=N^$;SO9Dm-FP!4F0DJU>rl<|x!QfV`aURlTf1W&SD^?f>8 zG9=O1j`%9;eRloCQqH<-ARN<9*0@BvvQJ?}BKqz&`WIYu5^vXgu?|MU0aCrdTUM}U z*rS4Pshm79&m=((0%PYfa4|`lIm>k$bU0%zH41de=knxDu6!^@C5?9>w3W-GuSfSJ z%g`dR@H~SAnHr(x{FnIH#p*NrG}&r2=J1maezDMl!^tEc0`nmk9!?$16md3n(NgO9 zFpG=M2wI1f*13NT8p8gAed2UofFWHclrsnT zOvqPwz`Tx;p&29$v_hg6=QR=h4<|tEnHL79iiMw-lGdr5;I-RfmLrj6BZ@%^SyE7G zc5o)hvz)c%e2_HY-8zce+-fKI&6qZCQNp)*la_Zbuqfm_gt`?gG4qzhNMfi5SkGxV zX>`cD9=NNyqC%XHhoig=Zz_>fgSVXedS}(3iLy2Wwm<&+l(C%)2}V8zKG4VdfTG+d z!}p<`*l0D&~;-!FR8gmdoX%&y=mvQxe)%%;JdrglSJ$;`pOS!xI+_6{~^cW-yx~ay= znU7@)M#r}3rVp`BS%LW8)#}x|*>Z+ByX%u1e3*`Y!s+2`&KSt@=&;IwLy$hTaKUd) z6O#BhV1(JcAW&iimmhR)9S^C^&fXjIO}>#de={wot02;0w9rAg{+EY@|Y_Rvt28_QGj<#-gqm z%yaAJB>z(Ry30B_D>(`-H|*`!Bix9Gr?G{7Y?}X+uAG(hus3m3<2gNnr2L-23{=k?0fhsJT}Z~f^}W{$(kc*dg>QR z%PNjZS!}@{@;@P(5I7(ChXC5_z`oxXDEbS9}H`OS7Oj-%|@9kky z(H9o80Vegk8A1XPnLR-O2n}vc_M4*s@TP$A3B}CFuVcz$!DK+g;amI+i{A+%JpD;_ zSXHpHiwkCHI(#ZUaS}I3CN~KfHmcGRx?ZQ9Xsb4=DTMoz4M3W7b0Cp$DA=T2E*OZl zmUML*z2?(oqsZi9Y6`h@U|X(glea}^>`F10eF#Ox>5uYmS7;@pD9sq8^n;!Zz(W&6 zJz!?i6DtRSs@3ShT5ptvJOu|p0`x8 z0SyIMSAJ>G#iG#GTVOCM(=ruC7+xwzY+=fQbPm8~Na@%JaV9o-m<3SggUxW#%Rvq& zjkkbF?64WiUhEfjh?tm(w_SeWhEAb28$2hU=Q#PN{3fk#lQmuwj{~#;jJnw8FHEzp zE0vXdegc(;|8?DOtSQ>M)3K+8b1)yCX+crw?DYIX#}h=V5Xk}Wt<3F-msAwc_>?~M zToK!_weMQH$DJUDYU@L-8t$0)a7i!*Zq^h)wJPDXO)`FPp{5`xO^}6TZ#e+hH0z># z(M(KKex?cgT6)L{FM#bQ|Di|u0H1tpCpPEf;?z(?D#Ird6u#n&BzhrVLVxvepFCpX zZ(!h38H4XcNO0vqwZU-v3OJsz7g$5#96H@l$YFP2hJhydQo$uEi5ZoYheu>mF$Pw# zZZ1Zn&2WJWhSG+F2M?Ky*JS8=V1kv9)Yqe%MgM#{E?cF8a+hE}H<0zyK!IUY+g2?l>*7U5HvAk^MonM@# zPb){#2*aiVMMZe1*R#P@;cILe(bv*19(<}*8Z6-s#gQORieRhhR{ zC=4ahWCbkLY#DF|v2qWRvH|yTIeE$}go+@?%;;%+a!HxU8ip;-TcQ)dFC21=#*mFw zTa!PZRk{eM@S3OILsa$5D6e{IUl*t5K1E4P7$=}eZm8I(5JICjn!d@k?^aCC|67e zO0H#uoe&UAYm8h|{<8rnAlzRwogkLG&`z?NPNGV_*6d_0+tfAYTcD83DhKDI zpP7T5*1{U10>zhtUIpD|y>gMto)gRHKnZY{AhnrRelFLticF;u&DUDmWWOxDv!<}> zhqCPMnzDHjTP)PJ(lRYgx}+>!p4R)qSDElnYn<`r6rr#S7=t5enFdmm2(|gvz%=O# zMu|H@2@r8wuY;N+Xbm*vhTO!{@;pb%@vaaPVP{HH*Zf1HvJd`?#c^;mBsCi;3~xL< zyG_~8AhIqkT&qI)u)!0QSHMS1$IqIKoTb6lPAz;4lc4t+sb}GH2rCPz0Tof8AuH&I zkXpbjH8~_2b4Bn=0|WlsYauMBlJLG~Yyd97^zLU&-%ZntEQ9Q6`Z&*^t)_mDAXrgQ z;;)bqr(#T3fv!HxcSe;OST7$0I_|!sQ~(~;5`;o`@*G0Dps|@GOZFw~PZ!7sq1?p3 zQ3MiAungnUHhsU3D&fk;vEQsr@^;p`UZRieRvILHM{f+Bv6PkOQ!Y{w^oxHZlG@ zDPAMQ_mSa^BD_X|3jq%D>+E<>@%7?sr8f`Iuan)Nrq`@hFt$;?O%8l8bJv@*&xzhDe*nTGdA+tywK0NPCW- z&6>(7b3cjj((44mu`kwiYTg~cc*ds|hKE_@MvYmREX5s2y}@|ITlRx4 z#$|!urEM9V)c(=2k3*4u^6a^%TQiI}_7QUG7Lw2+yMZqq5c=$(nxQn%8WmdvygJx6RTV+?dZc z7g{Q#6V4SY&V~~;h$gUYJ6n>9K;&! zMR^()+)u|PN)i8Ue8Zjt_w*$susS-LeS~k8QQ_NftG}Htapm@Q^>_O#g{9-$)tfOc zKD?AKyWfAG23MZkNy`$Fyg}8x3=q}q{r_EgvfGeu9V%^2e|z7Zac6daIGavx z#ao9gKb%XX3r?0gB_BHrt>MqinFN*s;*{^a9kRRdDLaq7U64VJPK9X0^=BfL*~uHo%ee9cw|Jtp-q)c_-#Aa>2O*58%7$nl!N_22&EWh zUycu(;0NhTW$fIqs|Gz6oaq$yBMiN83KFj%;(y*;n{G*(j4Qja)~{F^eBfd8q7bZt zc%wYWQxTT4LeAodcaV7kM>PgZpU8bSRV+jcC)JnqNaIQog`RZT?|xSvf~bKp%(EtZ zJ%VF#FnY-YzC*EDg#{HVW2(i-7b7*h!fj>I{$#7vw@wF@%VQshe8=E$e!COp0t_D~ zd1*6S%*Db*K|4iJF>c97MPo!k6+V({(Qhm$x$I8qQM5U~<*-!hfz>59%Mm$8BBBvO zjoLtI>#i$B1=nXa!BJMPP&4f?3M!#IhPHV#b~IvKx!P?Y(gc3lv{}%ubj#wh`7}w0 zglC@{>f-?fk!?H$lWEcE7z-gYrq+>!_8UkvaVTWdnc&AEqD~3fY2IZ4h;Pb@pE*2s z4s|Hus0{wYV5e(yvswid(-!i`Ujk=5&sK=VdR8iV=_~=jy=X9Z1DLeO69%-%7D$P+ z$}D|^PqtcR!g5Q8`0-!tee-K8Jp!ht=)+jOEr=Dt2bIZ&^LQi_{DZ47F*Ir{ZoT{G zRSF^Ka{dLUH(X%Q@Smp1wsEvDi1miED2Y&ENGLXGwj~{W3YO1l@|KJcT3VKi#cE{D zO(hdM??WeqT&CCPZML4`7WVAYL%q?(LHJlj{O^QX;F=)VLcdo&;h2uZ)#oCw=UjsC z^q!lQ*dP9bC@L9DjUgm0T`Fbt(TMcf98bNmvs;gL^lEht43V$gBB#jQx5T)FX=pl@ zFaxw{AlS{fjHm3$IA^PUz;;vi;Dcr#c=WmTv$HXQ+oN`Eeg<_<+u{ixvfe&>0vXxD zC;Wc9`tG9k535e@9G95twquj#expvzNd^fo)hWPW{)z>)_pKmAtvT!YB$Wt9b355T zY@vjd^VG|^7LKt}F25000@Knh0nr=EtzW#YQUH^ zf?45)JUbJowk9&z{qb1SG@<6vgjm^75t5S;AK6}>AQBp7YrbO=;K^na4PJF`gO_tO zbb!)QQ=@%ampH_Y|MCin6SObSG%q4gQ(`pG0cCC&NG;qXQ)$=+LS$nfm3Y^6S}fr8 zFqpLVWHD?MK6sb?W@yNzp`~ELt%h3p72mX=fAGI9-F0y?HqB6~#q64km>ejgYnW>C z3zMmF^;rr}9(eMg4V+LQ>@uUT`Hq)YJ^SsOX zEwd=fo&gIdDk zCOr}fK0`K60E|`$S--+f9#`F+|Bm-)wzx3`nBBp^*#>~?1-JNejTOAQ@`6CAQ4l4) z;O(s!L}!`>x3<0D`}bbZWq~7PhR<=DpB92O6j5@6WsjwH75Z+=LAeFZ5hVz+gt;Kh z7_t$lIN-)TsBF3%oFF2BKT_S<3p3M{T%t47w8$F|aUOvF9QcMnlMq{@A9+}5~}=m zmnUDqVVLg7u0|Iq5)*#Uvl%cez4(++{E;tDyhI0a<92x9E9DF()0ATmLwOz^K0sgw z-uFrg7cT0+AhmcgA%-}i=EdfVc*Mg<=?n)6=)Fq;bMN|-3m%*|VI!fYBZiDOp4=6G zLCBZOBEfn^P4$%ItJ%WqzFJia)au&o!)8TEaJGa37~!gQ_cC&C_;cJw`K+=(@n+JZ zN+mlcdDaDYt}E+9a#Ur3mp&FMhW@pmZ?2Ac&?g-uQjG>|Wl}l?lnE~U5Z&cQ#F~j; z;G;|uVP9XI;%zM$2nh)8znk@k?o>{TF=>#VSBqOA@;Ny?1Um2&R{zf*$zd(U?Q5{AgGO9v24odWp6NlRX67x*-`}O8@r`L zje?|krr-mSm6x)Gy!hAYNC9=9%15(WPYE` z8f=AEyvHUmlTx>DW0gZi-MTse{YYl@>1f|bUk(GVkF9XCBpx|_D$g~1@~=CO^?RBk z-IlHv6I@mxl?g-+3jjD9;b)%DQvHI#RmfTaF+xk6vGzP7#5xGPB_0H&Z=*N@T6g;i z-r6JBG;p1kni{>^tVy>;t{LPujlREzM)C=rfQR@laBZ`!QDi_isR_{B4E% ztK`|f;$>C33Gknhzq-XW$cgtq#xJ)o^9jf5WB3w}t!fQsLOTd7sU{&TL|X?m)^LBK ztyr+(^l@d+MdGPZ$i^o;*b3v4pLBdpdtu0~##1i~-q=`{Q-;W5cB3~mNhc_bAY`kM zT+^8L7@!YK`F5a@G#p889kfn;)H>y`QSFfDR4#lwUxhCEpkt z$SE>JsH~3!VRY?6nXk=jBS8sc%S+&DM)n$_&nW|7>lr`~HP&VzyQraNuTnVq17!3h z1d@X|5jBBkZM=&?!;^0qHVm2#QioQweYQx1P>(87IV05*aq!CE0yLOh^|>Za?}8LpP1PaI#SqYLW{3lNzJ$*{_orEC1%{{1tJNysD`9%39Y?WoqQ+Z0t z74v+@Cb4aIy3MIk6^hI!&=d>wQZ(pbwrHT~v}aBJu-W)oIfb1QM3~(=Or#&{v1Fsb z>FG{J%azp~Xz3`kCVv#I{J90K219U&S+@-(Wk!FR6r@Z14=Vn&4I%zpW(jf;vG)Gi zM4d(!HFmUyGZh(4YiRTJ8c7;CXx3a-!W_y3vrGaiUr2;i_MNL^BM`;GPN<8O>aHol?`G#f;h$A4Hs|3QoT|3 zCDiFYmhm8@Eq>0ghV^eIOaGQYCP8e#qc9K(U~K*KP<+koe__k8MNr7sk=45~cDLOw z(=X^KQK+UjSJ&fgv*GIkv4;z;etm^&vQg0pdV!Vli|GLR#8WZ83oeDZjMei#mSd3V zA7e`@BLS@CQ@}VVCQc?w#7hyeVk!!{PsjKm4i=1t5$(3_4m+DfxIi>CsOmNWX2ZEo z?1n^Ac$RUR{i&q)ZkLm{+u&8Vq!AT6IdN^NIZNe$R}w`KJoOQ9ph7Kx7cZH7KWOFPg63-kr$}I|0N$A#BJDn1sw3ZG9O7V zf>qcESpEc;e61~0dTL)frKF5;jQeFeVI)_HUu^i~qWS3mL4OJq%dW!w1sxzA94I2} zOo0px#BEo|TW0u>*vK?$7R}Wy+h}w}aYGZ**YLK9?|Y$VzDq~<1dAy}%$_24n6S*e zHev|_gFV4~wH_y3?6Zu3NhTk8SuO&k>f)T}WigYUsONf20+))w@0HolS6D7M+yP>VV(PRx8t-<8u4C>Pcc8P~ha>AE%T z7IV{>_MFePrLzpuYWaLi+Q}V_=lHqBVqG^f(UzvP#$owvQ`*P&*ICku4Wcn!!$}#? z7yquigo?q4ly&P}mUL-IgLm#Qq+P>t#9Ga02Uu9qLEjR~&20T^Z0KKOLPxoXycm%U zpYf3r6&-2uv+XdJe{yyA|Nk)JV;N(NfRD%=&K?{{7XfOI3r_9lv(pM(p&TE zT<1wvvWt5MijRB4IVJeA|0OQ&76LaN+||d^WgkB3td^^f&#}8Ah%zD1Ir!{OY zfHX5!x7b3RhW&;(MdgKPSnT+mTC6nFk{I#J>(<1bgnDulhy)7$aJ|j@(*^c+H9R$i zdr1*NO8X_>Jy5qbGj=n3Eq)`n#c$-dz%hJ@;lMIp|27>L9rIGu-4q=x0O_@G--53} z!Vp=Bns>nq3cz3MU+5IW9@^aGU?`cQ@G#KJC8Own@3W7hI}<7hZauk0EP0|o=`w z8^u(4Qir%xH<6NwMoMUCAr7h1hK~=Q|BdRou(f>Cvi=tpZ7HuNmWDG{JS|Cl#2&M> zAwy?8|8gN=;`P(3DG-pC8h7QFT%(q%%@+i_xf(n=d=d!v^<%lOHS@_rJzL2jlsS+a zG1fJ|7TA`#xhmTdei90XvM}2u9Hp(5X5Pk%WgAuNyQNBQw*c5cI=N}FOA@ZhJtxpF z53>=rd6HQHVh&nMYdLUaZ%X;?Jbdb}m#^s2TbHa21OVgEC37)lFchC7>53E#if?K9 zkZX!5y>xDiC&_@IXC9xY01!yhJQUXU*mJT7c$^C)6)@+wJ?Vyzh(zW2VP9!$PA`_S z@t0r7NXrRPISa-Pgvc;lH7D6~W9j4x;M8>vC+Wpwuxh%ca&}wc8$05kI;~v>DPnk|HEc>`S0CUvpQ^+t&EBE|7azucbiLvJ2qwzd-mr|@K+b;J=~B6d!! zRZ|}AM-IJoLEFd&jKPy@s^deXA+d}&BepN)5!&jf{yA)6?f6bQRz$2Q2R{c8dQ)rk zt^P!FoO<5T^J#A9w6gHPaz~c1g99G?c52Gh+I-#=SmxJZKp-=<{5+D7L5$r@P z-GLFxIyfEuI`-;D3dPrhPE%3XgVXjTsLu{?#|C1$Ee;e5k~=x#{k%mQHgqdVWiiFo zbP-jqJYo6UvDps*+0v1ad}lx6oJ@o%2ciWPOD;P!o(|ol!Z?v|OS_kc(or7SVc@tu zlf-K-xl@yF2PmTKvFqhQ|3p^~!Pd2RpqMdcy@X0_rhii_iXzg!m{8VFqq2)hEp@1Z z*~dzNoQ1=Pgx1>XXy}7o_>m9&QAbH=h96G=?q0ag?Z+;mdNpoR6veb zu=3m1c@y`&*gY}Q0B>3-<;iO?+dOkBrx|16z#5~m_$Db z2|>k|_rFPV)bF4kI@ZU7RCxNA0%Hg%C0X5-thbi$yXkJGFojns;#Cu({#K13Ozu={ ziEPH!$QjSZm#in9Xc=4YCI*=AI27h|k$H19RmJ}Xq}qJ#weBfMo9_;El;uauQW9t}wEn#&zssVG``a|0xD##RFE0FEcLD-O*=|6@xCHePFa{sX5oR1cGV0(*>b6U z2^slg{sfeGDhfnZ1!OCb!v2AkIi}f&`}f4k03&p&fQ<0+Vc0m8L*0PDNz=L^iUM9rE#)cqoC1Fc{L3fXuZTsnB}r6~yCVVOhoY zg8!L)NFsDb=<@B2d#D9nmn@UkER2Qf4JYx{8=!*7#po1IOS~V2313Z32785lhib~z zt{!-{%|B7B9@6GdY*8I8y0I|V%q^OiecP}Uu0voqv-&}0ZAcdf;&n*(eCc{X3>9iE zYee~p=d{wY0Jpp2IwQL^sn6B8x;fOR5#O*Svovk*WHLN1X$77R#7bKvG_f@USj*&R z6eNXgm1C~l3TL8a3FD+>4G~-4F_99waC*aco7NYURX}e52T6g6(hp6OuT)w%cVGD} zNt&cr8v43HmQTm@HQJI*=|u?m$LhW`;CJ?+1w-9vh)~Q`gDNs~tefT#5-nJ>MT3nN z?`kp`#ks}YWN!2G;GU^3?1nD|_^-F^4dewqdKkadhg)fsyoYMSkWCWYDi3S^WFaaz za4kdPL=>*0(2}w`SnUmxJ985xeKCFo@jq*{3oubQiazDBaLgMcv5BYd7>LYUf%0(_ z3aO1qmSm-d@2e{)QyxnIJxGg#1$CuTY&2Dqn`I9VzRhoYl<7u))Kfv?nnu{!KY+hR z?_;*KPbre#4@!yNe)b5b(o*tUX?HQxF*+w@;yJ9DPNE5VR;9D)sp@X zQ{B6ZS-Qaj^$y1_iz+aH7*YKc`O=M$PDx-s&Ht2d+Lk5?M3nX0;!y5=V z`kAZa2BhexdGki6+!r{pE;^BmEg$|W=EC)#I^=_pw45c_A5~BKglj(wGYTZETLKO%3@?+{A)X@c4F8f2h&fkLu|3Gj$;)LV8d!AhgGQ%`M<+il zN(W17DQV_TCqE>daswh_GUkkXq0xp1rZdFFNB2&^CKzkfrJ49R{v`L>no+!l{7_|T zV#)fL%*KB*1ZzA>K_;|tmJ#`0e%+5~S9*P)Eznpx(ULsdWc=1H(9xw2&vT(Fyl+I# zUGcRmUOM6178Ma}q3qMt`;$wsAo(S4G zsCFo5%_e(^a|wN~I~gRM6qOG^x$xL%ZqjGLS;Y|r1znXEzCK0Jg8=gWzlvk)VjVQ$ zc&yaGzNaRJ1HEo7Lfgu?I*+(c7BeCFf*Wr_SBD>F<6#4u+j{!G?r8XL<@vBRD^*Vh zYnIyCC$rYZOjr4RISifXvv>YdT-deBv!Yr?Sf+M(SAnRrYc%IQCIQrwx zpG;Arvu!rsTC;gpj9MH9Tju8^s%7CR=bOBHsH~qF-ntHHhR|VVP*=6HNZDfp-%Q4^gE$CNfMSyPQ8_Y_x1dWBvm|_u$FsBhGEU&iAbI^%?Al{0F4}lkZ7^W0#Cu%63?r44A*V|L65SGpD6|>67BYMLuzIo zwpDc1s>uQeoMr1`;gSYKRVYPXAbA=$&NWsyAR6og5AmS&Yy~qhQT-F6oS-k<+Bbg)2ko zLCZ$&{hEp6<}8!C6&es|Hb!UmH%OncQWV}hc-dfp*eNie+oCHBFxOS4dm$RW0Mp$a z!#U%4%10n)&!HE;US$C4tK3|S}8=XcE)h76*r7@&Ml zq}nKwrakIYn0X--PosUXk5q|^2#qwl5C>eWQ|;S2MvPR7pWV%$Cm~yy3AoaS)zrc| z`{K;CM*f)yx@8NPDGXh}Io;bBQ_&BRgzZs;P02l)D(XJUc3g;*-UM#gNAE%qyHzx{2{o1zS0mRdTe(-A&~rgkZ!VJS5tA(E zkUGq53^aU-yD7mRb>zWlQVoMDa5g>uj+#} z98EG>GRj$>x(QBGDqt&<0nvq(gx$N@`KSlA)H_D}cng}GcSLu?2aZen@^-z+uQ$?J z`C%<77%&fY*mRBg9H5aI&E@{o5Vy*l;AN%6>?xddzB5Ktc$qmCWS%seE9bl3&E%Ip zp*2GXf3!pNvN_F}=!z@g#~a}7Xjo#0&&3D>qUX$nr`U`iMpT!X9J@HbxxiwN4|lT{ zSi0UI?uY|I6H3-ghLw1%Qk5wVf+oa5EfP*FBLL%PXFhz@#Vl@rmWM3S1h@mfcLOgB zo7>>B6lj|))STxge7L^@$AcIH4=*Ig1sf61k){fOH(|n*uU_M!N~H4YcPXm^TwUwc zw0>IOQgvi|i}8QpC9?y*hhQ0e?h>TB0F+opKU*O~>vA$X$NE8>ve1V16$G#*K?kwZ zlvLX!vJp@zlj?9he)_-uYRKc8@EJRS&q7^W$7Cn0^S*MVHOPjnq*_pElJn4^#DS34 z(7jLcegbV4>onT^M3kQ4rGw$fC~Uo7X{1shcc2+RDqx~6v=aj4;oVYB!ae)IMwFDP`AMl;ppRmHq|HAcGp{s|;!^m?Y%?3*Xbn-2Dc zs%Y0A^D3SW6X3gg6@ongP2J_wgk;;z*1A;28>v`)a6=Y9j-3P0m!m%qfT1Wsz`PS& zl}t-7I3k^dS+ZTijqv(_wd1MZfNk}0@os!!Gi12HD%=pShyA3Ob7ru#W|e6uE(ZprsLz34--2U^;%y;wk_AhfCLj!wZb+BobsLTY@?axK*5rW(R%R~xiX3EeQ73rK74_r$a2SD zHfr&>QsDwXQ+YvN;HWdU{YJ4QRvF1$Q-j1Qa1OqNrodo%WYEdTI{+kw&}#&UvT2JNsch@g*1NaXrG?=6ZS4pWLUi+nb-K)W@=PC|cLX-`|h=0q)oSXybwh$CZ=IBFG*R${_Y$1%9NVpMgldJ^(ST8T4ER)cP!H<@WdlPqBYn#L+x3)=S)->nsr3N=h zOlYVfHS549__+aZ0qc7cog|a!zX?A{Q5UYYZRAE`b#SSTcp+khoCTust;jNSMsKJV zH6FOZyk!!W6KbivauE^|wO7=N$^P&ON;X~7p2e&G^L0?>X&bIth?8CN253KbSF2CZ z*1qzyyB9QaMoJjQHQWkBUiP8%KW@SzmuNv@`w^E!-KQ|O=*i{fyPLi%-t|Iv0BNt( z4n)f`erUtbCfb;vtz&1PjXSedore>fPk!1A=8p5fXDa#{g-8yhfz4 z4Aase<@9>F3^<+HXI0wUup*fq-M*l2;f zv8k8KfbYQOt=X+mJBh>3wjMosy1(81X6w=8{ViNR{b+0V$y5B_2%TIBf48Jbn83>DE)$;+KQRyH9s=6K48JB!%-Wbdd0m8@tJb z^qY=QKo*ly(5z7!;S!ZXcK0dDcQs_g&-UsdR3Z_fWxYf-Pv6-x)%V|0POV_8*}=9_ z#7%*^^~?N}v3)Z%Lc5)I>ssdlQU}0%e<+&IVyO#L(&Jc(^T>RULQ_3yWSH32hHge` zw)~E${rT9GyX3$_iv*s@_~GU8pI$%fS<#!pJRsDOB^gG9p4YjVS$OBAuQ%*O@JB!B z)M0TLtLo^7CiL^mHsBI%c{zedTCSE5{Ip~8JMaatJBOo)!yb(ME+@xsy(j0FvQh*R zuW-@KXm~T1MH+p;83{tMUevJQ%#qekwY;*vEj8M)0LGt(MuXA?B8}XHN~Th24XdwWNxxl!hu{ZX!bdWaJo#Z@G6#$FePHXVVX(dAuxc{Z@q* zeKQjVTJQ+9zH+>FZ=+s;^9r;Ga1%%$KT#Vl%(GRXntSOe9gJfzWbQMx>k6m6&HBpen?uft4a!F&J#^3 z>|23i*|pTE0f749eM$zyzv&#neg!z33FTr#3D58K=Wt!#O8Hlfvx)dQM8hSA6v6+TY~nXSO_w? z-M0(8$Xvy+6}C1FV7?>RR*Fw~w54-rWNe{e1kqY1^*wKtpln;woowC;`qxGSdD#}N#W4F`I6ifw7)&i#JnFnT= z?jnXp^CT74c(eL%fPiW_+gj~ow+ijo8%{L3XM1^KN?qqRa0;)L<+kY6_VE@P$R=GL zCua-+WHT+SKM%a{zq&U~kAUu-Py>=fNL5MWW-UM2%<8meO12;+YROK$>y&BJIiUFo zrBvMR7Rf3`snp7sSu$8=(Z_C4;oKJhf}Hy;kp!?>8k+h)jk&@2#_yeB#nyYOndG z=7CSFQNp;s@g{U#o7lN=pR2i^)}GP=6^c7ZWto;pC}xV>iJ|Pay0duo9CH}Ld5&jc z3xEUP#4NqcjjcTRYDXVUNK_-ri_CU0Y=IB6h2g=j@)y@3y-)g7QoxAlmYBPC_acNr zLK(m;EX_O5t+i0Lfa(S+*Lu=x>VK}E3kLgadWZ~BB^&bIOuKBkOgjN;@lDd%h+J$I3_`=&{6p2-(OLizQwuw+I0Z3%LWv>{=nzCxq1< z^#;qU_Pt;yoArt&bJ3^TUVgQ>9%6j3Pj)%dLkGG;s7r}5X9Z60U80NFu|+lR4BA(1 z3=g)=c$M<%tI>QuoAdG>`CtKJj+yN*einHsW8%ev^@L5>?~?lU+7Ze))&3M1QykZRbGmMt`!SZgbytbLuO$Fl0;ffkW_9UOJ! zh=iJnkOvW`Vzh-<*lDyq#w3%&@nVVRtq2Z+o5LUPf`Ts96@QxOGluMVQXC?&g=ERJ zY-**``R={Q{G+| z|B?|+_Td@n#BzH44COj@%ps)JFG+}X0g&@ipiLYkZFpun^$D0Z;2qT5-n=c$uB)F z@@S87q1NLb{(L-?iKMz32J_gII?|He$e23Zr;9)`r35f7lUAl^u)lP5`WN)}<~k<< zjqvSyG0Iuji}U;i`{TGf^xf{hi)zwmL}Q6TAJGVq8S9x*{FO1vUvWN`QP-ivCPMWRPKQX;TGvHJoq}uY z8;S2{wl3lStFeu{18Xtg)ZNf4_$bOa>w+#4FwM?8t2T*XqJp^b!TUCW!7Zt; zV5KZhc*~@TGBjvXH6qnD9DI&&ZX#O}XOEB5L$~%#;~wsSP%zz^4H4<*=fKfexH~vp z3t>rz<=AJpur1xbqXjJ#TF^oAXoNd@R1opg~m;CnaV94YHrv&HgM<_ONF^C!s1!KP;JXS!i!I^*zGHgExj1TAwa)83xfnP}xGU`-LWh^hOO0%%Ee~C9~-_ zgwRFg*}K_r(QFL{B4&0wNT;o~w1n5ute`fEbq3ILXflg(P0~YGdhg)UNv~~a0`0AL z{mI1=?|7J+^3oRwS_|b}xR^Xe%sgxIv(}P^LYNdXfyaAV%%Xk(C?^TSef{;b>F~9k z3HkDiufIMTUE;oKOZc{n9iaiLbd?{EXS2y0Y)s1G4(=n%<0)T%eLTCqg>~|7`7QR1 z>|=KuJICMbY;7HAhYIR+ccvEifcA%^8Ot1h}|6~}RrNId>BnlEtU z{I{utrnTEW# z^xt7X^mxe~&%GpU*v4kq)Qmt678#ud8_{@dJ*Nv^dan!hdYeWuC7Aa7C*D@E^KZZ~ zFvSGNM{h9Gi(TM-)PP&+_ZVhZ7A4Az3#Jw6&&gX0lq}K#KYqiIorQ=?7K(r-%f04q zm9o;MOhwYZ)Q}JoJ8j?)ot5h#ExiHr^j&{G8a{_MI2ltNQGGcnN4G-k z?yk8)WQcPa%}j?_eowBxyK*X3R@ZZGp^qgAoI*;G^%VHwFE2@cySmw#WF51o(oMpw z#YA}_WUmAM(`TWQN^eA^8Z3K%d3gdtzq)bur;r*m*K~q+?~|F~Nm+PfP{hwy#CO0cfBx3x4b>QV6mc zExCb?>kj4jJf}#N#39;^vD6!bLfBQc-uR}%we`29!~b@^@V@e)B+R$U68- z5=*`ajY%B`#sSF~&?>NC9y?9htv#?DO2n3If&nhR!!3iACsbMSdz@)eNV=h8==k~( zjO3IG28HHjC6LEO_t|Ju*nQ8AO6mgVec6mtBG_K8Q9$?H1Z_1Q^l&!!_JnY*sYrE2 z*Lnvkdhf&%=-9o(W?{frXZ4fL3)l-fk}vM?79@n5;Y%<0rCWY0tpsiW)B0b?)^DQ6 znstNpIOpkVK@x2^s(NPqd(nCljzS2u6G0FmeQ*kJL*~~Ape>#h*E%U=S61x9Bx6EW zUuBi$T`rP%8yn4mosLG_<+YI%#ezE zyOgZdvHocjgOW95lb9(ZeF2x@{v(oK_G1_lL6PFOAk$t4|P&|q>O5d8XxAhb!yn8cUA zFhkn)Fj_Eb3MpD_qO~2O6wpjau8t|l6TT}=eLBT$3hN*#d6R>Ky>^30KXWscwcbvA#0DDOyM9DO>iE2wIK zeJgC^{=_>;xd=Li%(=Yl0P0xFZ=!}D`CJT(O=2JGt?dFw9+$D$J5E2zccH#aSJ(A=gkMb!@w$;$Nvo<+!hm1%h`D!@`bvl+!4&Gf? z12{J%*ez^q;rfza7Vq$DJY2pL-%gRqyfs;UR%_N!XArQRXl1JuY-4^Cx{ zoU)d9dn@@}!bAH_Q1ff7Kw;U`DE??#J%T2ubHkR!Hg^@8q{Z>Ec9V47<{4)5*6lM2 z0r{zJF=Cf=_*Wr*?RAyv_&9A5VAB#~C-dY)HY}IlPE*H|(l66Bm33d6pkHqg^t7W{gPV4rTnp6l(Wf)K$ZU5Vzg_yNzRfsKdjr5lpulV&yzZxm1r8(y~!1>UxS{%OYctQv>bcn7Oh8Q zCYaRd0!DNpRv!okTk)P__?{`o%u6j=SPCalRjU%sLH0%|9|G?wJK|~B+m}lcWrd(2 zzcGdMlA>so)nqSIiV?lE=4Mu`rhue`;LH3l$~8WUAs;9S<5sXwosp%Z^_V1+$LOV- zPCS*jb@fmM#By4tse%yL9O*3Mfx92CZ#@+`rFQhC5Hh@3-AOJ?6wX_A_#9U@%FwAZ zHgBTZksEi?a&OSQZ#rCgY}j!$=bUQIR?lDXE?UV*+#;NUf<~so=#ac@SOgRmxHB3| zVO9@oO{ZD0kYptrOyF1aKFTeL>4!);Y9%$TYs6&@70rjOUT^{f4B>=zs*(povdw|g zjaG>{6FY5+%AMtTt-9J&43dEZSJUO|5#saFE~1sBrVd12`(+umr4!p{#T@n0(sFx& zJK7}Vdv>k!PxP%5Iv0AU-OC(9LZojPXJRMB_wKrU*U5-pvaE{B$EO~pn%OiJ~ z5%o=F{qiv(nj9@v3rzso0tCI5uf}yrk`v*joRUD`pad&;&wUJ-*4*r4DkI);PrtO{ zwjDd=qv&c;!p>O=>VtpKkW3NQpdct16nX$9@o1#p4aHjPMxt8`whn|iq*|1R03o2O z{zp?Hwv%l7H7i&Tsz@r<2_rhz2f#Qn(+AElk35bl7oV-yIvkn(0bi4{7Vgy9-e)De5At`idQiGEPzREe&b8I)6BMEaFB!ag~wZ;Yt z8I_*{>eW})#261z1qDvfI%&iLLQ=_UG4CYZ*C}a3H?xvd&R-?6$N4JsgB+D7Qw7?R z68d0eK!ED27dYDz`XRtlI;D?$9L8jzzg4xd1NV4ui$E$su`14{$;8ZK=w-Z!(c5oB z(k9|SF9sJL=XS4gEjUsT4@Qz0l#1j^F0o{R#9!#wLQm||?f`X}i!?}vTB0dwjCI!w zo@xz4hP-7pX&XzUAf5j!rBgO!~x#k~?GY&`)Y>uZVtY zKML$R5j|0CxS#80KE`20pEQg&*f2i|A8z6SA3hm~G*&Wvc}@OR8auV4tz47w#tU^E z{AoJ5H8n!zLix!VS%{pW!wwn|XYuDJqwBv&1adBpRY*w2sIThnQHA=&=+S02)>6QS z`5hp(2BiS7n)q2Tb(JC@vN)(X=kGcQCaO_Jp~6p>x44cUifV!RRu+3eFfIJCem@3Prv!=?l(_%uRnbA`j4l7 z_~u8M_>#jjc)AHCO`%0~6)DY6Emp@bPB`#+`@o%lHJAZOo1YVm5=)2p>yfKo-`-rI z$3OARM8G-^l5`^Htk%@1RdCJC+Vw1x5CM!)=ua2zBk{-n`-^pT4{u&8C-sn3-~OFhC{@ z&5wWoVTLo9gO)-yrpfG+XO{LJtwa2Wqr0#^eRB$wRrcHQJ$(aRxg3ACa=K z-yGlLpHJ^X_~jq_;}+5-T2(KBZcBmR2v;$GWjM?PTNQ2;jbBPDb8*%)!ux188NSB7 zOH;9k8Dv0r5#>;q0>5zUEqM*(Y9?7a;96r@fba`F27t^hI4O?GxCa5hYZfL?o^CbT z5hqP-jCUy5rZHgn{Zrb3v_;E(+Vk@nmv1PJOYQiN!Ov6t9OCB)Kgakv!Ot`NJg)}ZsK1T+ z+aL~p1Hv{SYy-kJAZ!D|HXv*R!Zsjm1Hv{SYy-kJAZ!D|4j}9R!VWOlLH!-n-+@aI zzX4$f5Ox4z2M~4uVFwU)0AU9Zb^u`q5Ox7!7Z7#hFT8_zeiV zfUpY)yMV9@2)lr=3kZ9Fum=cxfUpM$dw{S92z!9A2MBw>U=Q{8P=D`;(Dndf4-obM zVGj`Y0bw5y_5ooZ5cUB95BCoC0bw5y_5ooZ5cUCK9~kVT{yysOKO?k#KsW$|13)+c zgabf00E7cTH~@qLKsW$|13)+cgabf00E7cTH~K~&1;US?N0>U9690I~2ARGe15g;4^ z!Vw@G0m2a=909@+ARGb05g;4^!VxeyLj5DuKRO|_BS1I;gkwNB283fkI0l4cKsW}3 zV?a0tgkwNB283fkI0l4cKsW{l$Ebgd`X^9e_zegrfN%l`CxCDQ2q%DW0thF7Z~_P? zfN%l`CxCDQ2q%DW0tnB5!86oRG!>z; zX&hdJc9V&M(~VHde6()P#C7e^)!hbQnn33b)cM?M&j~vWuTxEfAzkMK{ zC%Z<3wf{8Nm#iLmM?&5yE+UzX@pQmHo7lgo+yf-TQU+xM4KzB_09%#^oQDmpB59vpsxUK|6g$vaM<3M-$&H+4K&hh$yEUUU) zKyG!}q*@q|3caxsm)cWTWpkl{M?8uXdMC~342kJGZBK(TY5pS8t%##g;uwT76+DBX zeTD0&^ub8Tsp@`sPCm0YY@<^RZ?3Lx&q>aJIj zc+!EFRTF}Y3z6q&1$`?Gw{~027#9`Y>nf*av{{?118WJTP8v1_yQ#wJGi;n{lP)|X zq_@F%Q37Ryt!U}DfH*7NowWh*5y0^Q-8SM-hZ&UUWjT&?R>48H??vQlZ4b|rxma|4 z9i9b`D{5JX0$cyGM%>9RuF>*GeDd8}e6*%j<->E4;&9m0HIX%_25X5lNnGn{)L2y5 z`mgk{s7~Sjex={Z#r#J@2sH?J$QUWpv04a3i4m7?(z>CFh2^MU-2>aBbqF|Hv zxe`eB14~NzG`&eSML%QjT;ObrBe}dhd^CR!)+Wd{=JlKA?3(Klj`Pg>xUw*X&a-I_ zlU_UKoYx54z)={^s)-8}Tl;#y;8y2dR;|7Yq>t8%@t{z{m1|@pXQiN#!xUtsVGFT< z(>!V4T{mK-8waMu>+Q&Qp$m&iUxidjOJ>#=d^a(vNrLu$!N3xYXlbzIe01rHd0!~F zffZoTyM*|w1ja1=bmxU~Q!F9W2SZ7Zp$|fE%U7XI$!>)B8FPAdT@=Prb`hR2lka@h zxFuD`c(jKnyA-HGV9b>-VNgQ@{@D*fvZICg{lPc&pe~DGWJ3l)`k$*{vVo&!WH%y& z$S#G=5XDf~Rxs#5m_BQPY+BLA2y43>Qt8S%vx}t|S*?z{m}|;+tasR&$%=Ej zXlhx6dTg1k9!rx&1wCnE5F(i{5@a^O>QyGnFb4obG??n(bFiS0obHwM<1&b*4B8N? zX=h(OS~3%=rxj4#&gNm{q&w9i$)VGWCe%cY+{Vs#_y&ej$JfjJ>j8IypJXfTOole9 zLoOu|qF1rj&lo}d-8sirw8J9f6lu>51`8YKolXas;ZGLU3+a3lfVAo7H znuoXN-+_wvLu0(e?a2eUHL=dzId}xVw&kzPYC0kf+_5rdG&e)7(^*EpWh1V$1s_gR zyMKmun#+yR{||d_wjNcIcZt?Go*yPYD3GNQzjJz`xI4;aCj^WCO+?5aCXK=%K3RA(~QfY0|W#p<+Rs2d{)udraIC8%k?MyAQ?0T`I{(+$y9AdF-j z5H0}1{r2O$l*xgr++G-+4p!j}1q$f`7i2snWrd+~o27~7DzQu=P0?aF_epR_Ln7WR zlyGX)!Hdq4cCez>r+}%^ZcwHJLWmSi(-aq1GB;(* zu4S;!91^A*2MW*Ao4+8vu?c19FG*;g{vO?oKK`+GL#!=Drv7=UTmr z9cw%#(}Sy%cYZB3R%%8C>|}9Ex!2Pz(>bjd(C|?VMxRU3vdZ9-5aHK6J{B1Qk!~ z5)A#>Ub)K~_J~Gsd&}qIHGYDd%}TpAV&d3^IS&+2M=k)=gtCb+J}inGmn#RLKXvE zZfdIv0Om%woF7!V{d|3o7Hb38>{WS$T}Dl>AMFaTq?!Tp%l#AN?u=NyrdgN=bc?}Woi zgW)00A*LnM;i^<>BA{||2t$y?IQyLtEKjfC+c<9dmeY0tJU zsN8;rcaTDR-)1~6uZN#D7pzrzWx|Pa7LMB%IGnziJ2=}n?80DlrMF|H$rFjXnDwxW zP7$N+OFKHu(>)E)UU6zT@|Ht={>U((rOakzC_+W(SM|)yUwnL62GNfE1HaEgy4I!2 zZHQ|@Y$_W%!y1M}d#(x3IoA@4O>!9}F(44S6mYKUiRliXB!E|!#f_||qGz;5KX#nC zVA5jf9MJ?KGZqFqCimkdsPJuT1Z4%c$_SkkQ5gq7{%L%gr zTkp~mu*VYe3%%fqVKGLEWuyU#zW5~%lQ}S{1oz>NoZ-BqDR7(Ht5gNvm^ zzMNUOlnj;GyMu#`Z9Mjd+ec;1m%~PM9fiS$Ea>s_kd*c$Yd9*mUp`-fFU-L@=!XGH zoCi78?2a>Asmusd(R0rql4EYk5#&%4Y$)drx@pmH`ZO(_IrW*GOG~0-6+QCxq2O2- zl9Cf#X+<2lDwQ#LaObMMQ!N4fo^)+iFR zgRCu$WE3IhI8xX~!n$DPp+d&u;4#rfUARw=W~sbFu?aAte1^5j#yPhukS5z4;*1qJ z&Z#qNHRNFtQZ+JQk8fQaq4{bueUAW>aEe3Pm9SK^fcc?X_lHtn$!vJF_1bOs?g*lZ zM^We|cqbvK97eO15Z$lbCf2y%eTepj^4F>8I=w1F+#&g}UI!YI1lVRQ8ozC;d1gzR zH@k^;muw5Ut&4`mX62sSEpAt9$4fpyC?&0ymP>+YwUqvoaH`?V6NIpa&%-euM3fEe zB!;=Mjf&`HPem)bXxx>68KWix`b7YP^GGG7ya?a~@Q%N}G#pwMH8&oYqXvh;o0hAo zob}(^Z%Yfuu@T}{$JQZEw~9F1VDcSAC)QS}=BS3jP6bOCWO?irXoM*3ywIhn+@wA_ zghRDp&r~iz@Q??o5c(C6(XLSeZ}Wpy^iMHt8MvScSGk=u%mq=)t;mwP2QYMPQIw*> zvTmuFss=86_!v2p65lx;wm9tyr)6c~&I^u1&a1nrdiI=m?226=X0(bgk~7}sSrr

Qtu?uX*zB>OD52f4RsVgy29&y^AO#!-meYa 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 KLG2D`g8u=|++QF7 literal 0 HcmV?d00001 diff --git a/Tests/images/illu10_preview.eps b/Tests/images/illu10_preview.eps new file mode 100644 index 0000000000000000000000000000000000000000..74d2fec9353217fb17926548bfa1fdae328ae7b6 GIT binary patch literal 405470 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�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

-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≤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

Ub0eJb?Y?_#+Zr-#1yt+9LqS~Ih8 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 F^$&Tk?Na~% literal 0 HcmV?d00001 diff --git a/Tests/images/illuCS6_no_preview.eps b/Tests/images/illuCS6_no_preview.eps new file mode 100644 index 0000000000000000000000000000000000000000..4be1ea9a8ce10acd1e02c9788c5e663f3bd2b0a6 GIT binary patch literal 411730 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�qGJ;Lf?>KW9SiR&Zf#LN_<_VMnWj}K(Wx7)(8ChB!xT@$C z3oRN2xZvUThX3gkEn|YF7ZRi? zH&YESu)|PhUo9?Hy!1tKfG+la|IhTS*UHZ;FY9zHn;g8m zt_E;!NU&Sj*uwQCzbxM2*Lb*mC%&B`lX+{h`mENhq0S`U69hj|0ZY9@ya%X}qaK{f z964nz@%C2oyM%}Ko1o^`Sb@T_sZspVw0ZIG)ar&W9=sCy3I4p=B?Xj z6aw;7-D1Qp>F}>Y{Mzd()$wuKBEY64#!l`z+bK31Xw{inTG*=P9$YS@t0~`kKsxOr zsKAX|c(GU=z>BHvTOHksQu6&MqcUz12hWa1h{nDi>t5%gTPtHD5ydtzcQy2#t7rwa z2rJYq=_~8LHbKAMAn0jFvj#WqKDidC<)=*~&u`n(^}N_Axpt6Kg?7IAI~Kl~QX){8 z6*g~_qkt;?wZ&-Ha+91TZGKp{B`HAy(Vr)EIxEpMs(X_wT)zfAf0y2!%4s?F$Sqor z$V@P)(FKg?LaaUz47TDu$M8Kc?PusPCM#shahUf+5ua!T#!OCe- zXKda?wIes~q~+eAdEa!n^4PHBXwEs+nysF{;9azmk+?-T1qF>vh0!5-*{}#GDsX2s zn8K_c)|yVUVj;;&HkiP#=zWx164MWna@0y{TGxon8Y-F(TfN`}1{lH#>r^EVhGd%q zr5mjhb0&7$6qP&6^ICPasTd>!2d<{e*CWK|qg_NRNlhJyy!Oj7YD*`!&x$$frKRQe z0(Z1Y$oK48=bz|XCv-0KPP>;mhJ;ApFwVqIi0|EX`L2@@y<}Mz6S9azmxjxKrKfU1 z2*p)M4y9OF1Qhz(EOC@Sgh^Fs-@S$5ckV-WGvWfMQjgO_Pb4$I#1o5u>-? zhNMlzfnE$QJkIT2<63Z}ARde)F(?(um0V)U0*SxSuZ5o2r`-YSG8bu(47Eg4(irQm z7d+Q24OlHR%Opu>qO1qM0$Okwa*>38WI_`+h0fh6{RHBtjbezCmUpshL;6jzb}VgZ z3N7~g)3Dh?K%vU zIQY|aa%*aY%7yZiGqMmlLx&wSBF^H^Pe#{&kqG2m9IKF!j8R|J+oKBgi_xRaY^|THP=Jg*> z|M1O^GVvvcXYh0rN}588>MBy2pIWSrUz~8@^Y(!||7tJ;k~Tjl7$uet@z*0)y}rG< zLXUsqnTddP9wg~R&RMOgQLEsZo3-m%CLsbCqtKr&+DGD#{r5LN%)a^S{;wX41R>)e zIKZj*TZ~6)$${Q?NK(a!V)erehoS~YM@Qeh#PQRctB_fvX3kk{s8y?U|Ism-=+9*& z_I~w9ymSZ|-+$3aq?SH+BvQpz6rmsfa5LTB+E!7ymukqmAyy6Gv8r|MkE!<`tz0YU zjL%2Z=bEBshTV>44a;1-ma&Q1s@Dh(8YUtXR*~t46FrvP6&>N`iRR@d1236gFVs|7 zEvuY{#FPaCO&?r9aW4w`L|J%P)8HN7?ahjtG)~tp3I2N7qiJ}WwgvdmIZR~jjKZyd zw{(>xD0(+dvun>PRrerrXv!lAoLW8^{}G#T{k4;^&bQT%e?NVBJDN=||1dM<=3szK z7@8md{=*DsFb6G#YD|;aC(kVHJz9tO4@Y-lefs7UD68zZ<9qrBx^g-G=Jn|EX40R> zLcck_$3LImh49Ni_Qx%xOSGz90^ODZzY(rt{>pHe3AQTSC>p<%R_5ZYXN33BY%+X} zdzYqS5i`hu?jp*eE(Lz!)?4x#$kj};bilR7vH;;1dJF)WTX0ewm2nROe%CBao;=-Z zv?ETM*ck6nuuWsY@cXB<18Iwv`?TlhGcMmy9GBYhgGETA3ZGYb^yG=85;eZCrq>MZ zupmSqe>Ncb5>F;=-;JulvIhCy3vOzD@&w81H^7J76Qaoq`Sxy!^J(o;i8E>yr2KL8 z(ZlY){Nk({Y;ECZ8$Ubv*~QNue)jQmfS;S?JAnX9b4j}9T!Y&}}0>UmJ>;l3rFxW-?UDV$NRq-1T zb^&1*5Ox7!7Z7#@1g$Q5uxn?!X6;( z0m2?2>;u9+AnXIeJ|OG^0v_%i>;u9+AnXIeJ|OG^!agwANBw=&-+xAE`+#r&2nT?0 z00;+wZ~zDgfN%f^2Y_$@2nT?000;+wZ~zDgfN%f|4p9Fw>OTgT;5Q&V2873e@E8yt z1HxlKcnk=S0pT$qJO+fvfbbX)9s|N-KzITOPk_M_)PI8dPxc7y2_QTHgeQRT1Q4D8 z!V^Gv0tin4;Rzr-0fZ-j@Dvc90>V>3cnSzlfx%PMe~S7~9~0VBKzIrWPXXa6AUp+x zr-1Mj5S{|UAs`$A!XY3W0>U9690I~2ARGdNL)1S+{lh~-I|PJ7KsW@1LqIqLgd;#W z0)!(#I0A$tKsW+~BS1I;gd;#W0)!)AaD@6tsDE@qXh(o>1PI4~a102?fN%^5$AEAQ z2*-eM3<$@7a102?fN%^5$AEAQ431I%81+w}!0;OoP5|Kq5KaK$1Q1RD;RFy)0O14> zP5|Kq5KaK$1Q1RD;RFz#0fT3#{|xn??GoBEKzIfS&j8^WAUp$vXMpew5S{_TGeCF- z2+siF86Z3dgy(?p91xxZgXgIK9QB_c5ZZGrGJ%Id#rz@xKAZRK= zWz#sk2<;{l1*aRwt~Lo3F)qFH0Vat0K~g{pXOi60AhT2IRj1QCN4IH9a*E<#qQGPY zNgu}+ycy-Ss3^b;D;m+&q+J{^xxTf0)$jzWnGCw|My%~w*|^rIl{N=pQ1mb@OYbkO zDKskd4*?9kCVOU`G}ksJa1!=Job)e-xCvyuy#3}!J93*7G*YhN6%jk!>|~%x%UF`Q z!lUOoMI+MD=e2{cXuEdXpB;%G;3`b^x=T2xvW5R*dNCu%!S5u7Kpr`m)ws$6<9_=< zJWqCw2y6dot}j_V@Q#GMQ(Qzc8Ohxz$z>>XGpKNWyop0G>p)sw~bQVB05d;Pbr|4M1phep#YX56AjjR=XQ2|}3dwXdG zaSTn!X@vw7BHAW|ZIC*7sy|Q1xGxBSDS2;H_P^W}0)XzA_C3&`3(1i(%HAAChpkcF z;}3~v`!Q4{NO47idR_&oXSqsn-Xl>k=NRO9kh^FMPDZX>%kSGOEx2%68_1i2c3x1W z&nF!5El3+ImS$qZK1DLv!6bFym{bZI`VJ4_D0P^u%b2(1HGGTP5i$#^n3YqA%rZ5) zzC@@k*MS^GrK%7Dy*$00;#R079HYoiTOZPoKyh6OiV7F13&w%&@|^>Cx}4+n0a;dc zxq#g2vPrctAQgIJB`&q6uFB>@1CMwVC-hF5(HRocciNr?Wzzgbq+1b3p~Nu=Wh!_E zL;DKXQR#z`kWRZ`eks8s1!8-JX-20d;1{$kY(m%_q=E^eY*X*gr*hqB`!N zkMX1fFRLa585bhY(F*!j8gA{jnlUaay4O`s&1kbWSqIh8yf-Zr_W@)!H7OCv&mr z`Z_!d9#_<|4h6RUWsSI#U0kE(kND)fxAPz}}+X_C0s)u^$k zu=QW*V^N*L{ryV6lgD}IddrRE9b68|E5%&V^LBN%g@c54$sa_(%h09=tgwSU?(S@D z^KCB~L)2R3^G!x7ks{`#*(SMwQl*?#`iQK6)0}7pNhCGObx*Jf#9T@C0Gda|sFOe8 zdpY-&Bd|FoK)0CmE<_+Lmp( zD+CgIVgxo?SyRb=vdA|NTt%olqc|`ZSO-BF9q&TW^1S1jXf#au90})RvkfH4^esPU zaykdJjHV`q@s)&RI)h@iU`m#DvX#mUFa8ZiAtUAv3WK!zHxx$?*u^_SBvRDWbMEEX zp$zna{ja{_uuBY#%XZ2c&Q5U*j8Ru*9i;?h5CBr>#vN#Ug@6}}-4ZO=b`kceLq)+R z?{g)P><5;V@@aaLY>Ixy-nqcp7DsY|M$Sq>BZn!-NW&Il z0jGJ=zPoP3N;eKniPzha??M+AlfDY6l9tS@FZga^Qj-Mj`+|Wb8qv~V$@%Eg7xTVQ za04sApmz!JR|$++`svOK<)&Cds1Jsc9z!35;FhmKo08oK@iXT1>bfY5rR*X+VOox=!N`UTg7iOE!DItR&B$&< z2$5Y1n<0v!u&rRwfiQj60@<{pjS<#%Ii%8+b!Hb!F|t}6XTPGZk}%hl?^y4!HIo(R zbkWqZ2=&-9TRoO0iwb(u#2`d6VI;_GfYqx^lwl44hG;O=!RKH>AvxVE>BnUdO&PQy zRMXDBdbDIFR8K3QxSh?z$VqpqLy|+M7fq;%8o7;~@9+%_rH-$c`PT#P1V71E+L;V( zREJzj5VQ=74GO;}Yt!_ts!)XNOraH@U7hPGwO6yrcyJ4uB>{tGC!WdPEq#} zj}iC2iOwPn%$Ms&6_?ueC4C8y`%6t9neXot~YJ4}`Rr=nS&e21fH^0Y--+ zurnXFb@hYFI+tRnab0#9m?$+g{4~ZdN-{2ahAE@WX!CJuKql)(joSR$Qnx(}Qoyd6 zZZr>X&%Xl|?}x^CiQAJ0aBE_nxpVLcd~M5LnbmYe8n|O+%xG?gTBoy&e#=H&XA3@@ zrgr}f?KJ;?*n6|>sFGxD@H%oW-XRVJwV)^z^Tf#{D>Q*1g#;4wp;RF$G@#HxgalHm zd6s^VzUYg7pniq^Y;rf>dxr#B)cMc9x~NKs?Sr|wO>S;J@r}{SqTnK+Osdgr+A?Y# zDrtZ+d?&1?=3eR=NHnZSg`CLjgVwiWU5^9GIP=OrCrQ39jC`HMD75GYa~nz9L`U5} z?_r3>aB)(LNNglUM=E+rgwrVqh}#};-S#g1gxH z@OLZO1+17>&Jziz)Cyl79Hf_$Fr;KioGd6&5&Y3{i+^XtCWlT*aCZo24+YGB^{_Sh{5Z;-dT)b&@j@G9t^Qxkd{WldZw1V5LjJ0E9HkD{ml%0R*Y+XM*;5 z`69ckBVv@XtL``f+5cNnoyk}OKHs+#tJ8v^Zj2zj!h)HWpr-vAnI@|TU|`ZuH$+>3 zFp_aVxBv+E+mG{7CI_l=>(TIZunuo1P)HZJAmbq^D-4xeEKM|5iDeRLiWbAUPl7`l z67goCgj1sqUUZhUgB7(t1x$^0gEAcuLZoP#rntD0xhY#FZ@M+|1$_q)Z8ssw zFrSm_S_bRPAz`|4pzu7s`3uq;n^1=Sl7!~z@6pZZ;~#4`#M)AHN{JilTlJ(UUEbQp zEdl1O`m91K!OM*fKeLwN!P_f(3??0!67EMCLGpBN#`PVi zv;Ji);-0UvqpP%=)hI7krpW=CW`d^L4 z+^-*8|7bRod2&&^m*S041PgrQ!G%xGp$MlA#qf~ZkOvdj&N+77l@HJ4p?PWHeW%<= zQ1P@b!O)+L%3a>DM>K-lTRs=B@w1Fe`GKGcX3!Cp&+yiE?R9B~1bb@LqKsHGz9Fr2 zfSWnOCJNeD=s{(L!QUbmYF^G@aajrM2?x%B90e53a~%;JJfsnyI}5OBA0`&fJWjp| zSqyZ!sjVsim>b=4eo*Ds%I1g`YXjKqRe6M6Moq6D?F!s@GBHJ~2-^FprZLmD`o?M> z0@i@yT!1SExMWb4v-cE{^nh5Vrh3{*NzWcgz_ih=Kn60#EMokvMmY;0bU&HPC*e>b zH3btgcqe^gRM;yIAo1o34WXQv8$QwRkeP5XZG@iEpt)3f&$I>J^5#L3uuk@M1l>BGh|MB{`ys7~$^Ll%9FdWut${x8 zgu_XL?PHunOiQN2RjJfOKxKRkLy*Nd`<)OhPp{zHIBxlt({=$oKNX$g8zb08H_W66 z0-R5%+0J!l)=*$yl8}3|_Kf;uhO)YXJu2#84n^lXW+{A!BjynCPM|+^0vgR9>Oj0hmxe!`fuyoZA&hlWh)h z#)=&0)S0y!@~{Z08X2(1x2}%Rd^MTAM}SE<#UbrVSgKjT{7|j?L#eN1HoV$;?Y4V& z1kuE!D0CCNlMqx6quE-B?pJORYh3U?MEgSd>r`};UKJtkkbGFL0}V+6Y%>;(-?r5} zvn9=&-9)=fwuRi*MZ;pVa?kA+x2v_|B_AM^l2%L0B|)@WO8-eX)o|tsLRiD+;TR7h z$_924!`#?LMf9?#q7_{@rz1aJy?$6sF>4lRqC8;{FTgTvrW z%hgoQ`tR+xrG?|z2yv@p>ky|~MVxIg`3|BJYpYaqRKsAWf+Y;HJoXASLX>u1=u%W} zS|1(4p<1wKDi;jT+oE8+)f(if~e(IWJ%ov7`nD7 zN>O21x718k0~g+Zh@44@@0<=>oOXrNva)dJ1;-)h)!kG*d(Jy{#V!ytTE!R18E^Bf z3JplCLv8XdzX@FvlM4h(9G>r=<$TaDk^#htYueIi+FRY2kyvDwbM%g0MTuxInG?ud zjwGKq45e;w&hK+I)2Vz0pHMF2>cu(At;8aS@{UW~<#>HKiAd}RJ!GBO1vXb!}rx8sIbu z&$O$E@p-H3F10ZbS+f<=Gn2}oQ>jOTDVEzkMEgJ4K6rNy9XEeRuOy4Uua8mSAdb6j zUy5RP4R3u6t$XG6mAziz+B!7Jqb|7xx%MfjUwAp1afFp66X?i>Itm|M;q|^ni0(x1 z*M{y!)NPTdc%1V+i`V%PDy4!^3aNopR3x$KAb|?rLZj zMNzLD1qgm>?kOeJPD*hDG<~HQ{YYFQ>8YLX>}%ZbT{z?s#Dd-ybvM)B>j;w1_i~vv zsR?lNcdiYxBt#EPwI7adzG=@WD3u)RG*h2-j52(sfhHrP1R{F!+_pCxAg{D=^-L>& zX(e;U4I<8er7Yj0gbXFO>kf9q5rM{IIPMY+^66=POwVLDC)U^~Zj_YF6pdvwQ~`!; zzP3K^Cz!&WjJGdx7v-yU-*TjzIvNtqjweX#iB0Jtv#T$9ReANH;WQN)-(Qf(R=k(bsjbNFnnkKaXBf znM@B7TX1EQ1;A2R0n}As@=!dGT&~N^=DDoPO2(_jOeNkOoa1FtjNdlrlkfz{;YU!B z@Z*1~t2>?c-$|q}^(ml7!U|qYwZ&n#h??0uMN^atE>hNsTJ{}_%n3rHywTg$G)=Os z>@uI_XJX`}m+6}up&%Jb@*!!*L^gcF(UXu#^J)TQ7Wv3#T_iS_m7`-`BS>fR39&N! z074(&xZFC%J9j%kgJA6Nxi~xBmH0SmK?}eV;lE*G6=fSlRu!}T zG|DZA!9$UeN~4N4cf%wt8&`<1cs5By&4{i)$4BI)KU6HmpYp2 zqatRf@Nx+@y$O3v-l(`Az2QI)Z9|mS5S(%T`XJzRES=89Bj@{=7hVTBBbc zm!x!@$)+a~faM+9peAQ`=p^zOJMXZq@~?OWi=IHgn=7C1fNzx@&!{}mkFS?^&W#=tTD~HIzMD`t*U#vRapQMp{_7}@h6mv!*BK}DEgZLXrL)bstb*d1(vHE|7?Hy9 z6|A)WTVMe7I-_knEu<_gC>h@W5o#-|i$@(FUcoAz9FB?6jUXm20&o5$DO7e(*wHY= zQlTBrqSHwulbvC~$z5|IlRe!w z36AmYRyHxrC_~s2PlK?Fk%bWbt$7Rp;0JYt`(gIo7Tbb~Iu)+CT7nfxq&b4mp36|YR8#Opfj_9Wk}^9HpxRS5h%u_1e)UwC-7glZ!a8e zztHEQZ~Ual=v5v(!=s(a9FM&5)9u@{Sgby>;t$FvxSJ38<%~eR#36iKCAYEMf4ZeJ!&4As^< z*B%6b?tZ(Xl>wMu5F&HOt%PkuuZY57fzIeFied*wW&01Vi#Q(9R)!7jUiMt833FZ| z>#})`#hNyZaGOY^1pJm(h55yl1dhhw%HM`G^IAK_B@Lvw#OdoxqlFxQ>$Hx^n8?S5^Jfi(Mb z3v+Ybx%zygHwVa_xn8qfZPez`c6+YTZ_hUS)n0$T-dm`3+nxSH(T2+3#>1`S-J|{A z!%cGTyeM5GVithaQ7h3E9wTfb{S{ZvbsOzktK06uJI0+QM}rX)TLgeYmUA!8j%4Ct zMnsJ4uqem1M~h2vt+~aRjJ{rqQgAcO8(XI;)E(wBYEf5UNY_rcv10{S1rpH`u<)>S z7>gSti)EsKW`(9C_^@~G;G)gDtxh?S9XJ%_Dri@(4IzNeh)>2CGPTaE2%xxL-P3sL}K#RXDt z3wPYrw>#zDAl7NR#;iEnY?nLD9Yn%v&1QMC*4Qj}I^X&}w|PftSXN1j`)cCL<<{Oe zQ&%l5Q6RIum0Y~c33P+b@|usC#@Fi2ijdW?xm|QDlh%pVGNWXYSp)TGpqkJ zMw6l8Kkfz^`VJ4+WAb3pHH(TF=F{ksnji6(+}TZQ(!YJKX=Yu4z*k8!S^q%zk;NlrN}Pbt9~Q`V#5 zX>uPLQII7r#F(@GzcN^6N7(Sgo)(h?jH2rKCXr^1;wMQQ$8#)x;e1;ab`>mwrtp9# zRR8pBLdP*QodB_^4X$|5mEh{gySWU;B-H6bfDolNKA}M5G18i3;MoLe9B9cvOQ7+g z4OZq5>cWsOqQy5WN`9D3ij(W*8!#!LTil$JJ8H)8NOi(er@=`|Yhf0ow0pjo-kzFl z;7Fy~~qwTer>fY?ANuqP>{(Zsj~$E@RyA18tDd zE1ufko}6yTu1M6T6X|-&UFNG55=Ke7b61eUL+%qfLpb?0*~dWik|L3gm(j6f0~mOZ zB1z9k1S7go4a?;hyyOUu$m!Kirie1N753RAOQR`Rl4%njsTqV`uM@nYvQz*BR)4lB zM11<8mp4JYO}9ub>AyI2;gLfpIy8Wo>CmZ+tII(^Eor4_>cp%j2iEEeM&w^zkG<82 zlbnK3hSEliVB8oN6kZyXQh~Ll(mhVMsZ~Wjzk_=MHl6%r<_S_nFQE>C1EN(v9}0RZ zt)W+li88^sa1Q0lt+duRNtqyl27{DKN@W*mDf$7MTT>2C8b%D^*UMWnyy#^~r9ex{ z$%YrZ@N!?Q8oMm}X~7St9RL~SM`?>SV8 z(6y+S_2Ml?ba{c&Mx3D%z2H0^G6=EuTc6MMTEq$i;SB<)e}``ve4q=ij65p9gZyN}=nefo$R%-$E6pb)cR!8O9~hohELw z_rM+9Tx@wiE88!SqN98@qT$WWf*Ou{Eb19)(jnLTE^tl>ipmeTZ%f9Eob> z;gMy_Ya_8NFmUWJYAVVIZ0{@k!dxWI3xkWPK#k_H%iPygXiK#9J&V=%_JRU5CN9dW zE4$$^@@#kf%dT_>no~2{KUX|RB}~AjPY-i)G7f=(_5vW845WLi#voGSyp~E9^tLc` znyunKI<|d4L=yc^nCEB;B?}6dqkeEmy=8z zdau;WZoCAuts9V;NO9}4$xSc}#)ZpNMl?PzZDBkLkv5D28taL~EtW7|wYCicP$1<{ zO5N-VGih4o(eMawz;DF{^4xO@9)eP;LD*@yq{6z6$XJE)IYbsXX+2=!imhNM!R9if z17R)@gY?N~P6pBaq5!Rw)?QPS-|!|H0swkvq!Uj5X-|0x{nxH}77bTR*xAI)yJ*O< z#cLI4Yww2{+4*b>HJ&MkZ#O=}WU;39o1gY37Lo?gELhs}{U|AqnkjUDF>ws0qA4?=JsmARr+k*(>6=$4SqQS<*E|Sht zINom`mhC$ie7b9>{T&3#jhvN~WU|IGyL75#5!L6h{|CWxK*FTes9$ip&S>u(3xKr=Bz}gvF%3iwF*XEX%&_vR8hpVA9jS439cOKqlc+|_i;kit)W985zN1M{+ z)s>=g#t#Nr$%l?W=H%>9F8nH1T!$wZKB6`5(` zcB4eO#avO|hzK_Ygg53CGrfx?4kSiHYxx>X>8{zWAy((H$sgxL6)KIH(lXNVY` zC8`7q8=0rD!!QhIRm~L%fr%IZ5K-5i)IpBDloE0@FTG<9!(L>u^ zVzk$BG&=vmp12ZDN7+CteGvAOtqjzlal)#>U*UywM+{GUk`nDVWW%uXrqf|Y*f|VK zC7wljYZkC}mN9dL_FEdUPK2utZ155%_`;MHpnoJWPM*g zw1kIE`>fzJ@8#!TcmuuO--<--3}=lc6!rSglWg~wuOU!XHG?-zj@R>RtN|X~? z#AGur)tPR3_qZ+TdNL%GVmt}qxY;Qjt+BpXJJI(7xTJ$@gdEB3Iz9_Bhzw^;tW~0Z zn*4ehyvn}=0!l|i&ez0iwd4KIn2yqpfLMT}9}d|V6a1B(9Rxo7ZVaN3QvkPU%{k~W zRh^XSZ(PEO7p`=~4dkM7Tqd^2-=VooIz#bk^RpMHLw^SZDBwe$ib#}8Bsgn9;pa^M zc;@GtpeZXCksjo-D{F#7IhPX@25m+)!iP=G1v!?AwRv`e*JNyRVu3PJ;N|QKagnbs zvfN+YSXo?LTaZyNMpd}60IIMd61KJ2P9kHdo)9sPrlFQ=n$xUHV9BG*;*<0oldx>T zxQZ5vh=Fi;@oJjqP>LCEhSuCqEOFsAqQTRK~^ z=GU-BC|4gQ=%y_vS((9{Q7xjuBrIe}Z>~TXf^RN}`Z4UVIA4)Lcri~e3(Z}3(43J>w!p9i$Nl6Jm;Arg1*q!3bq6i~{q0wGoWsl`M87 z(fv3V;u(-ESZggqIdy=Xp<-U6G1F(7>eHopK%Sz=oGtp93oN5#8bc7d@ps?hj%0x| zXVFDLadLb%-ol-O6s!?UJvY=IB!o3U0Zu+r4}7La$HlE7SKRmsBAA7*f zlSjHn<#GaQJr0`W*p|aAEc64`OIhI%&L-x=IWp)2DU6yQmw|1S$D704u{i2lXk;Go zY42kA>b(18dxth1%u(#eyd7;xvl&7*i*VW>PjD9@JQ%d+pg8kQ77Zn3B)4b4VLaHE zjy|$!qYS+{G~93_26-Q6)xg{f8a-gP*-H9oB((sBDp$x@1?QdkE5XNDKm z)qoLCJwS&Nl{bQs$Hxv5N}CW7NIV8swj2=E_L?K0dDk+Ul@eH3R7M>oWADf%U z=L}URg8Vy~0MTTSQ{l^R5h~mK3{+ifC0KaO`CO%;PnL%(n4z$FvknPa)Oq%LUnZmX z4FL|p(_S#b1RaSzEjdcqc(0J-!4Ga9Jk@_K?h3=?w>E=yTA)ZTNh{TEBY-lH`*581 z5!BRm$QYdP-4b;ZFn2}Me7Ss2Gkn+Hx;mZ*v{2eu!?TBEA=fyxzB)Xg_q;Rb)~|8~EhTK4twz zH{&ED6u1^fw&V&OY9ic7ADn%Nt{wU(gDjMFbS3p!ARHqGfsaB3gD1)9SWOO<++70AnHn5EJHb{X z+Tcv>#8m-f5d)r5ne)D>1A?Ai&SeDBg&FGuW5E07+R$OTPScPGlPY2#E>KuPOwW0` zmzIVu7;F$ zhDi;qfzF&*CG#V++RG$30AIme4V`dUFk#xiY2WDGLed}#T)+z4nO&?_!vR@f7tDMZ zoNG-UYnV>4C#;54n1&+TWaL!yy)2FJp8f0we;G{aQSS2l`}G#QPWr26e|-q>!VBO) z%%5h8Ev^n=92t%1YG(&B9{{oL$KJ_ETGTro?f;v462u~z_&V`RH*tU>a%qX`ru-AR z;@(~7DMTV&HlAnP!n6gQIQub+>g8Pef?CO#Ci_zZ%NVR5f1>Ku7A~jZw_rVYciyYc|SAgIg4H5_NE3et> zW7tMd$uOH2yjQ6oWh~kcm?x|xu~EU~Qw5KPE@$5S@Ri8|VSGu$MS72Df`g(?2-?WW zN2#*8BM~R_hg}Hj6!$G)Zw9T>`qc?y0cGr-vS*8*$*q9Fqn56hsHjX`NC;wch!fcz zR0NTXX7yIfidtg6xRH=nWQQlOIO-LeGn_}Ka4!&aBaAcaeK{GogrEgH z7oz!>_RL8|*k_($d`aVx%nlxk982MP<+6>fTsFhh82GVjVa2`}YRD$2;bSV)tVwWF zGoyu$=jFzos(+DF2;%u`1Rs6^!NF=fsUL$Pj!T4*NsDd{um-0RKORD+DIc2SP01n5 z%AF+9qlL2|8uAb_>m2TcavN93c4>ejZe3Pg@(ZMS61fFa3rW=4+8OJFQLT=NB3NPJ zMeMu60yKnvN^xUUG6Qzop%lNMG3bLItYHLr>P6FdUT@?%#LK(@Bs?t$-xg1qw4^OTEBC%pvA{t=# z^aZ#}>V*(PH^#|<2UIFrMT{#MDb~>jeZz`iX5)ySco8Ikjh93Hiicm2AC8{{wjYcM`b>6v3hQO7d0x|o zqmz>n&+@Y?Hg4|7&DjYd#1$x$MtdoZ%>LTwYA zY)MKB=Z;V&NZu6jV>||UaLh2r zld8K1U}hn26jGBAdG^f)A=-fWO9|)6bB#4HTQ5ERv6jHOxOf#|u+6t3sk%Abd0x|kHd_^?QsvhYEpk~5!`{%CZ(#Z!wlY&scGHq{QG%9rH7F%juzOTNB9 z*QIIZKN#Wuk8-%6%tIy%B#6(_t=iuxl-&I z0A#yGGjAlDILc@s_C=cKzqR#>bXPhXx7EtG22P$=>_gb z!Ui04J0WuYhvLC0aG|) ztav91RTiDYV}LldObfDnh*mSk|TGfQou$wH&6!t#Jy_r?Eqd@aN)}5^RMO03by0RkFD?n zE~)y)2xECyR7Ux zY}ZH&6Hf5~Sgp&7W25Om$5E`+U0WInJ<$@(iO5GGU!=l@48C&Hl2sQ0Xvs3YoYeU$wUY@>r6hIzRZ zOJ;RSFf^Bh&FOJW+A7m4F`v`46C{p~CqptnR#d1)%x80RbL{zdAsTq!385OPkgLB<;a<%!uk+GB2v%|hcL zIKYLIG0YOJCEc9O^2tLVBn z;ii_xvAwnRrS+HV3$y*TPzU`D4j$W6m=EpRlwO2a6y)ipHH?qT%cM2DcX-LC23)CW z0gtz}0v^pqHDX)q)iNK}*JjIgyxAc#Dn)9&X8a&Jwt!x}*#hP9Aa}FN|7y2@9}=70 zX1UdEaKBm&CGr;gNy1L%7qktc;@WTg_u+~BMQH%ergPimY@-xEx(N=CZ@Pq#2YK;!M0d^`3v=~0Pb0m^L z0ixEZf&%!L0XDjjL44pju5yb&;Qb}~Psr1S%vl3XL;WH#Eel$QuVA%va+f<+A z+F&%m4Ekt*_e6ktk7{b`BnF!+Cut6S<0luH%xoy7rW38+qoq4cSHAlRgSg^89p`1 zo`4IFRM6Pc@}rGE?=#(KeJmtx9gpzvZ$6!q4hNHivM+wPdA4&$w%Qtmi+s{SK4}Z% z6r*L;4zmdt*@S~^!YS^Z@W?QVvbuspey&q4qc$z0J}sj$Eu%Rtqm^WA!O8K+?9gH5 zB!x-d$Dv7I>=-fd@jgy__{1YRne7vZA!~dzIZ56bolW-SzOad8>>mLh?x-fl;8aVz_WyHXvFe)x@Ja!27~fBQWA-bS#PWKQ&*1UjmElDx#?#j=fb zlK_=Qr(cXMPpDW_G9_6Uv!ywareIpbiSw5|oGKvvY!^*vI2OWlQ9=Ai+q6Sdwvw?E zOw&RruZZnQuCv9x+S(GDWAEtXbb@o2XYgMST{Dapjm^5vhn;K8ww-dX96dh9eaCA< zOjfx#m5#+F1i@)vxqrUy($S0klWbMnQAD1uyW3A|%cV&SkGdbW_a?ukp-@@#s2^W9 znQ)`w=i#W%#VSS8NALwmlouwUv4zxI?|;*2-!=mVX(ai*=GIt5^n+vbw%cBKg$l(& z9#L4qiIV~56%}Tdm^qP^*c!Gq8(ftNdkN?(uQQdd=_a-&vWHLm6LpM`*v$~n({FE| z;3VmU4lY?DVfW1);BZv!d*McoqT{>LdBobt%8T@4h$F?Pf5djAxoQe3^lwqVSO?Gr z2c(DFMI|=2PU*Y_-h1VUt($zZY|t2p6(YJT&vvbGd8Es|=lq59P(;}Z4Y|W@ju%@x z-Y3O-g(7EkRWlP+Hg8LdVIfdRT{*$@i;8<)-pri9ft;tqF- z;!rYX7y!V#4&$B^`FKbxFqOx-s*k5tUAC%>vP7gS%enf?)9TO8 z8Gu>5TCqCBT@HAR@CciGD#*(A9Z6FKevZ+6a#FcjZ|y7a*hD0j!{8MM&!S z{v`6?$XH1-v}IK1hQwdCti(28nv4yVlLHe4a+8LW38$46E2+xW%<>>)>*u(d7ww97Y}E|O$#EGau0`5= zn;2x_foO_2qjcR$366)f%POkFhnI_R-*SR$js)4kqx^mF7zc3L{CM}%%TCZ(4rN@1 zPsPpr5Lm2<$Y;qNJhrer+VYMQO=9^isSUmpBXJ5s9&=W#N$_iEqDz_;#tr1a>;JsJ zHGDK4ATVUZ3C&=D;oQoLg^kS-{6A?aoZ1URj8vXme)}|5CK=(H`;(2W!;6CrxVfRG zHy?p?B89S)PcA3ZRz;KWSb4lgK=zLg&`Md~4-eiF+$%jz7 zje!ENM!GI)`d-kXy&ekeXt*0bJ{Yx1iH-KX%;~JpR8x_oL3A;Qs$VZ@@7{;vt~)al zr_U5_vDq_O5seJ_UOJ7Z=&DIcCK>cavmw@DHdv(3I40vuiRLQIFk;TvWK;_P*y_vF z@tek#bhu(}dknEKIypNWGSqDd5*6Sq5dfACli1nd>QYb4mHe5Zn0}!u=EKO z1Gq!vxqFlpq-Sj-YhiA6@!PZ41(S*yO?U+<78Wsvw7J|NXvE~=X^%0;+R{Z3RW=J; zR{pB^D*m@_tI(6?S|bVvCt%d`&8wwzNq*!M5WMN65d8$RxE)4Y7Pq7TjY2*5Ov>mr zfk?XHg`e`Gqs6UdzFpPpTFy7@DvQVkQe|67kVrE9hr!EvzCmu{tloJ|-dbGi`<9l- zE?(vQ`e=17(j7QK9#WPfhJTn*?vihaB_5|ue%#>tG7QNShdJcgnX}BP0l`jR^%(yQ z<4Uas4)_s75Y0E_TT09C9%1Na^lUuy!b88yb`~`&VxFO~ft>&0*kA^hg?6qW%m(7zfpp8R)0tS_zApwG9|%13Y}XW364Hb=y)Kt5j>NJY@ zZZyd)cY`(vYaDfRfC#x%DuC^?r-deDJ|poJqYSe&sa$%WsNR`BJaoLy7HGR z#golzOYv^`YfClAe=9CUJ|&YLB`_WyY><%3c3_9shb*Fz{ani79qyM5`s5)eG*J;T zM^)QPL3`=)mBp^*RN)YpG<0}VSy%2GQ5T=mn|y_X2jYP{(Pcz1!ee5@bH{S^PVs|H zS2->AkIN$(PAqCg4*fF*pd5ntReW#ahBR3EBzb zd9HKw#CkV1NM>S?M9flc0k=ZQ$g6_c7~o8ukRi|4%{Y#E zVNLCms~ThkaTVS%l8A|2uMl?6CeFQfGEPU!VMY-Hc7ABIHa5<%rZ|ar=Ol!8^vMXe z?}X3tzl+0{o*<4jl@Je=s8aY;ea(kQeH;{%e!uw5F_3bJSJfj)Hdq8qws$cihRELB zS|4HdlZ~wj#X4;Ms!b=WuBCkF#Px!v$l1t=a5%(F*f}&L2A_}d5Xx_Lidt-NP(pZA zIAr18EFL`l(1i_!oM=NBa|}A7sHdA_xM|#7a5CJc4vPyU0RoNNk}i`*xGq)PA_=pG z$}ps7n7-e^%sNfLraqq*gjz;H@eZj8BLVbk`)mta{D=nFG9>{DDxrZTmm8$cycvR_(ld2@aE^qDSaA-2n0FJR zNnXY0VqeqN$dTiBtvT~bhG@%<2f?)y$N_T-r4|*V2_)QPy0uGcIMpQ%@)a8toOc_i zxS;!H-ch1jtLeN`bcA*IU|U|QxV=^uLuG##r(59P9c`S@jhq|2Ai}UPnww zriS!fY$r25C2=3_ek4EXAX)hh3bP2&5I+(%q2u+k^AT?OR9q>A zkm@6aQ~fBzjJ7y3w-Z3&993dtH^AdsM9Wric;uE3;=NTjW@eq7fR2qv9vg?fUpwGM z3OT!@?U$@}I+|JI!Jhf>g-B+!LvDInX3G{0S&(CNC?nZKBNij;;L;=tUw>7CxO22E z0w&X%WM?aW#CbWBKk~#C`9mt?@g_v4$XGNGLH20U!2_p9npvA9L;@4|Qt_n5^&)x) zA(26ZuRq$&FjoNI@pgg0rv=9PbD>5oHQ} zFfj=P=0QIxGlfgJn!b_^``k!I1trbtlD8KcrZc2dZn!$Gv7oXUY1OvzkFz2^42Yam zV1h+qTSDW%YbGx%A;n{Bzl)T}hbga>P9|ZP^t!I+$z^S35u)B%o&pG7IFDJuuJGD* z(R3;oJ-Y%CcEW_}o~}hLJGwd?b(tlxOgT$x9YSGuUQd~=M3XO%YSs^CTm@8)YSAH~ z0%>;W*dK8r(A5O9sM+fKMpK=Hv~w1ue5I2h0VOs8SC8@23~)5If^MX0{FURX_AO#I z#ho`P`NmPodD}qd4^f?4+UITYlau4qjlBUa^5I;Ixb|rP!lQR58FGad-jn-Cn**crg51Z3wp8CnV{PxvH@z(%~10&h0gtx&%1XOLCe_e5fv z5xJcFq==C4#BhZ%U}D~bsRyPz6>{t8-z4H5vdc$tDYycc9VOpaXhjM?Xtq?rbp-f_ zFw*4@KZlY?0QyTyIMU<62(No&dz|eut!I;qR+bJ|a4u^%#|fWV6c~1Ob8}Ibr;~P{ zk|lU$djig5MP+}tprK1jpO1Bf6<;rFDwG;v_R;hykcf(68kxnV9NHSS=LR#|BKi7o zisQ>jup9`iC>Dm36*VgwY4q1dhubnGEWXNFD2oN0Iw*LdNPSwX$Z3t%KQ zjM4}3f0r>Z_`c+lBLVQKaS6m-99Gu!`g^*K?HaH14hxEfE+H(qtYZ9p_bVtlZLBAF&Hc}S8kNE z*yT3wggU};4@@3;mhjE-OTF{lOgs9E?pG$`E#}DSc=A4qffcfdVH)i8qiW$sZH@?D z7MZKaeceJHO;!9wY!R+VP%kUkbT5wx$iCwsn~-*^h4a*SwLk<}c5H(&U*#2v=v0=z zhW8PpCaJg)P%uNIr!c^$N}{r(mPUY7+tfhFs)kVylQUXWN{RPFBgL4CX2PUGH;zZ} zzApK`dLHCPhxhN9qEHLRDW!kTPWlnPfZ4jgm?d(M4kP!n%+b&f~NIXC%I2ZJHsZbFz_pWOIAO0G&*E@Fa z$-3fA)S81Wa4}Ty5Bt~AJm=7=+iNj_OjL~=@S@#%Dj_8b{)2k7+Oe^DA>qz~*@G4L zv2!DM>7QTv|L+&OQuCjcvr>Ve8A-l(uR@_1<(5osC5Uz^yOmTI(&9%=!yv)f&^&sI z_((uTXX1gwCP)~Bk8z6q42xJN^b2Q7S%PJ4%6e+0-STjNR46R}3rq~IHNQs6Up$(n zU~?mmMt@K`j4Zf1F>i)K=C`pMh=~-zJ(-mq#I?wjp}ZKsG|+Q2=WC1Ns0Vv-wK8$7FW&oW1_Q3%*%A*944Ot1y)i1q(u!lM`qX)&SL`SS;NHCy2L@ zGW`r+Tv83AhwBK;?S={-@RY+}v8;pmPeq`TIFv(eBaOCEKU|aXiF(m6HD*GFhR6Vgv_aS@aBLbG9oXQbdgUw%qLl#C+^xW+I?-SMbF-It2Qs9 z`*dJcDsvZuBQPP!qpNi&Zy8(h@aAVWn=aa+?6*T)r~W0IOSkS&E}t(6nICk3r+pd4 zCrxz9p?KL>0H6tqntf%n6*bMi$Yv{Untc$mEnsa73mfpvThT#GBIDn(Z-tia^vDV; zs?axX-&JxLQ_!#?Rmhi^J&iT7#1!tt0>um}m1rrE|9DnenxRLPp$XMMx(JsVrYw$X z7334@oNq6s7nGsia~Zp47G(q}LqyI(M{L0i%~H#REiBl#LKAJP!ck|MrdR@ILOkV` zKmx-zkwE(pUMo0lfrF;-aiM|+Ra#kf`z$EbOEDeL0;^8JUSuD2{xkMzGEj=Bo<4@bQr7b^cNQCD^S!KnXBFiypc1~$7Q z70qb}RJ+n`J)Gx-&X1~m@?Ryj@GM()@FQqZ$^6pfw;f50C+Va-WB1C#I9?9v*M+?_6MsaI|xZb9x)+J3~3#V(z40T;g|I zvS-u0Kc^OQ3b|zbRclSB+zSU*M=z=HFC|#sTKo?pnEEr{K{2iIFC|&tO8pNa8M%kw zK`$yUR%LCNc6N~^#@WpHGyM9>6YiqB&SXK`V)5pBrNQ`k zl?vz$7t_s4_!|yQ!QnTvLg9Wp^0pXPx{OXPUE@g2v;`WtOce@5$vTPD#4C~#n#u-Y zCEKWjyAL>yi%6|zct0jgzVqAr^RXOqjV!vX=&Q56F)s)1&4v4>U<|F(Cg+m5cWmb) z&NSQOD>2<^@#C?yLoU9NkA;9Xfbk}HrBI-O@hNndVhx6DsbHEfJGiX3)R5zJ(F_zN z+O4F+Whqr`X9P4Jo<*^nDWVl)MPlqB0er-rc)S5fr`;f zZgh`&Yo?03YNGP z`RcMI7W!V$f}HD*yhzFtyqY(0G^r5zeyvElDhfXSu<&dKU;%Gor^nyJ{JUX%)49JQ71bGDwokJs^6p;yy zlXC?Zq-&$uvqjv6II(B8>6s$6e*7pEd0jFj%9Dn8K+8*Jsq)*q*Zkle9de_K1S+rT z_Mk=nEh1Ust!cAoJBT~L2(;~xmn`n#q2s}}6em?umH`%DB3!+5d*Nt%8AudgOh8pC zecY0|)NN@%T+rZ*7iUMm4UcwD_p({iGzeKL#pXHmp=i3jEM&5%pzjx(F%B(7^GZ%L zE=WHW3uPOkd@Y`+Y0sD|N@(7}Js9l|^uo%@;ot-wJ;iVx?`b?>jEUa`W&=WucQq2` zAW05&d3`2n&lwX=%o!6-&FKZ(3eNJzgcF=G;qQWF;q;aVHK}2E3>wANRjvJf^9ASk z+@_6qw=WYeUI;Pm@=#)I5IUwEr!aSLHE7BKWa+)|9wTnacoXljV`AFk87n)zj&QEm zzk2}rE)fnt|IC>1WRFH{+WQv3G|B6geE7NMSJFb3IElQC3-65X9dB3G&Nguy`_}3H zXV$0^=kb}gp~MCO95Z^+r;TqfYN`b=RFP0{$R3fWO0K+GIrZw?Mwu!{1v=1hM+ z&CY509eCVQNkD-Du0Hi2yKLhN3VHTxG`E0o_Ugk_3d*wwv|TCFq$-*}Y;rYmNy320 z5KqSjmm8Q9m-y6!*{&lT>4&kxMhR>#lqiut7;Q>@IKX?i=jL9@7r>Ailf_F~Uqk4O z=Z-w_!X9%tfXz%0Of2W9uVB-*1+VY@N?GVMHH!__Fi zN;*acOTI{xi4JrCT%I<-Y=sh33#91f4tBwg%heg)6aDpaYq*bh2yx{m60o+RwvF3y zb*1(1th*nuFlBTS3{)A33+E*80 z+>48dGYD|hzDJpFw9o`@!Y435P7qTD1I&oSh|m-jZXzIFI&fd@gFuB30`rwOO=EIT zB;-Mo_x}h_Ns<5w;CM>H*=ZOiBTdmy5X+5TX>3Avda`lQ6ua&O7LiUTG6KAd4Q5^W zs{gPu(Ef!nb{)`>l>IU-9ZJ+o44An)rEh*6CiUuE*O+)Z97?|#wJEC$&gDrL7&4?t zJ8c~+72OuX2!N%b5LvEoyI3TQ#0n#$lctEYearT5VT{^7-W+Z~TI7j2DN66&&DB3rf=?rL{Q!SjH`vysf-6q;kH=Sri*JXUl}|HMsb)`?P-k7QVI(cz*S`KB@-bU}6fow+j{+v@bWJz^ zd8)^y8K`>nr!yZeBRV3mpV14UkfSZQvPwpe_S)#_v>|)?SUhEfOoq`ZWs*^JN||I3 zol+(lL(QAZ8Fd+BEIT(;q}jOvD9z3dYn*Lf$#SC&X}63N8(n+b(TTpt(J}<=KZ1&GK+u(RrY@TOpNwTRQgzbupAR;QJOF!v%|p z#pM2F#y{R^B3o4cm=iB+)Ytm&WhsaC!tWT>9WjJAIzDIm;1@{4?xE6U5oTFGMl9=GTyxP)Z8!7Rts13R8B z9{_*qfH>Xr2$EphU+6&UQ>WK(sqsg-bdA?=IUVpdtoh@BOQos&xCZDSVS+Q^i5rr7 z9XfrRXp*>n`d(hfyX47Fm!o6%@^pVRq0q-A8u(hK zeOX)&i*BRiUHX_E?(QG04NoZ`nXRXSQ!m%6*ai}F`BK;INqHAnG)d~*@$raOcKL~N zT&&@iY+|(~+9AT3sP}#NDuTCfuL8saNE!A$NJsDuZ~71?@eqsD?oc7C(Vt)8F3yei zQD*7r;}GkQ$43v!p-_44bTB?G-|R2dY747tHvtAe>l-hY=Qh^q{s}w^H9Xq7cu<}l zjBo|)@Rv@j`~q(e562+?FO6!IVuZwsUuvytd3|_(`b!l+$Hxc5UutDEe1d;gR)4A9 zAkgzG;M@0L6A38XRIbEiW(O`)j_iQ^ZgAns7S`|2#>0)RlWmuuvWu#Q6}AXg*rjj@ z@9XG@et9ZlWl^tUpFj#nc)AdeYaQB?>pbjCDS>IzcsP#--e2iA^Ox+KN@N+;leC zqx}(O59BLf<4pU*zTUW^-IMJdK2-OeZB|xau9vlLY^fZ2`d)Th)3tG{z^rOXIPZ-o8{FqKNEh+@0Je7fBy5`8??^92-+oEU8Jc(a^Lv**K-BJvi-}=|M&m; zzi(nc-!C^`x0b8RCv(HS{l~wLhikt-Ti^QqV5_%%^Vf$z{e1r5{P2W&T0TD<9Zepb z|8jFc0p-7js zy?!4h?oTdoM)>^x(d178#Nf;iCtG;Hj%-nx;0`vA&rW~2d6OCnf23dATcMqkv+;;q z+1{!Qad#k@y-IDSRtdmS_vh`c2e_{c%i9mJ5qY$abwzs8?gUTuNt-`cVu{!uRXg23 z9Sym&0SE4Ne{`CrQZt11XrHL@0CsWrmz(GJA%6qB=X~?w{P=9^;OB}INvld~3Xw5N z8kbUzN(O|Rb?Mhp4>A(ScQlz{37OeCKCGM%PC&Y9rHJIH^l0f2T~huQR@}vb^4*m3 zsQ19k3GRCsK7>%U?pN#gtDSWSRkit`-o96@J*ZZHuH?!(R&X94mis0sv1A6u98~?3 zp4Pq=6IZeb#_@O^L;OQgqoondBVrDxSWuf=YnSi5M#SLw%jB+fia}|G46OCNv%}4! z0h|(Jr^wm0LPmmw@nga-rv7r%{2nj%QDT*Q55CZf^TTG7(IS3oN<=DOXOEw?e~8V2 zv6iM?RZaEn$?C$RSWgqLs>crg!%FXCrP=R4UpsjBx;9`*B8#eY(6@lY&|~j?u7roEIgk5 zvh{4fUww-f-aguU`C{?KG3PVDP|#QU#^04LI{JJUo$gQiUlv|Sm-|aE`p=hNplb{L z0r&oKpL+LvLAuO;KVR&BS$YJrJf7&o*?isl z{I>C;hP}oyN+--rK?B{iVaF`^}4IACK?N9kkY7jZTJd58pAsPn$cgYf(~l=lUmu>d_fI~3I-86K?a#+A`u!zze`$X9ImG4p+l4s@#3s>pZ()9RZeeZt z<-+327ti*VcHf=vzFW9pfXADUzbr04e$iZeHn;fd$^O>oh2NjdznI_M8?3#&c)kC& z^V{5PV|DG>@X5mN`S#0$FT333Cm-J}KHA?t*j{|u=zd!H{maGf2?MO&Tm60S$=bo` z^7_lx>Wk6#+t;s7Hs37PhHq*wM(+-{j|Z<$#+#37XPfowy3YXb&5xeEem!dKzdJlR z+d6vJ-Z}WRa&R&j9DRCv_~}#o;&lA!-sj4o-~R$J>CY{Yh|PEVy~W|n%F~x`M(wAq zSDS}x?P2?X0sc0req3Ab&vh^uU9{>_2%2P*Kdx#jGM#po66hn+2hTR=l34Zu5C6>59*8alULkS_=_>jr2SK$ z3^0KIr$7l521w-jQ9v2s4}>>nfIk4goh8_@-w%FoF~CpV>fqhIciqwWQd~fyhDs~1gE)PHLbo*5y0;7x3>yJC#^V(_UV)$n9O?&z6E2_Hk>P_XK)>^&y_EEjU7&fzY zD^Fhyo>hK-{JK%;&lT0}_77)IKi_*cnfv^>D-yE)=HjSwF=BxEc7NMxjVhxt{#yS0 z`E6?B=k2R;`^D;MwY|GL`(%*;E^keC z?rptZT{$~`^!)Xs&-dPRCg(4EZ>qnY4c~lxeY)~yuJP(74Q{C#zH^Wx3s#o6rg;lCW1C{bTpdZy(Q3KEFP^_iX&Sw_52P{1TlK@i?+R$@jSG@i(z(%KGI@yQ%44|p+dBp$lb@?UKOE!y!1m(! z_>iZ5*Ut)mX1RE_v5LWoE86PX`13FrAeDshW-`oDV zlB7kH(S-Z~^PuHLV$qyyEwtzA{rTDXxrIip)?JwE&bH?kYxDEnMzu9-u$@FrhyP`7 zctl}<=KX5xeyzP;t39ao9@K01s&x(n2o_vwI*`fn&gmC~q5E{@-1W0?ftgmC4t#45 z(VOA+!;1CG60%i_2MJKqLP7rvdDg;Av)Nu~cjp#r#Is%|AxRGhd&FRn4(G z+db-t!PsUFNGRx2Z$>Li5hVda|owD7_i>r?`HXbxXq|piWbRem$GJu&INy55?ZQDg zoc>(7qJ%2e59;-y98BaF+Fii1%=DFq#Zm0H&3Q2$18LmhubnQ$Zz#^3a~q zlK0!i|NU22B9{t)VYv^^Ma-(MVz zH?fgmdv}Z{5JWtExkz1Uo0^ZHD3zY#u#u$p!dlVBj9l;X~Rjlg1ri^?MZ;5B!?8w1u>Gq%+TR=xaK%Xt76YSw zQc88M7-31p79Z>`s)X%D)|Wulf60%j#^6V`_U}f%i<>$12$GCl<76Oj=}(Yd%hi@UAH=h3t>)WTGd`xhzxne zcLTR)hi`2M`xuzOEVC$s*;z}=07iSJ+eLdUc-BsPrqcpEP9t2}Gwq(hXwML?{@eQF z)2Po8Mtg>665DALYZSL?RoXGy)*v<1uF*c>57klDwZZ%bUVB1O{1Vn7t<&wbLmF|v z-2^+qHY?Z0)#5cM4S$1#_-^1nPyVb4R!Hj9as4>b>NB7&zI*i+a~DFLeAg(SuySQ; zGwn9j>7reNfr%a0=~Nr~U29mKR=v$suFiBB6&&YhPC)?xqY2LR7`N(7OL1$?wChbq zA8Dx5oM}{>Rt85t8o;&95`lc^BjFZF#c52In8xIzG@@)9J!}IP;LXZHhAO57)kCw@ z8c=lFh@@VvOTFPzAOJW?h~N|ILImn4UPkBkOsmy4+&gq!rHf{%ZJhc*|NXboIi``l zq%xf<*e|@|I!)|2qVL8G>>>9bveay-SO{-AFt<_$7z4F>t;T((Zb==`zAd;R4P}}T zwQOsl)X)UT|Q1RX5hP&V$%L={~*Iox_p)3vkY1bNBrVT>&pkF+$ zLY|C}paGPQ>NI8`;viYCDNC|hrH=b)n?0x3Jvnr$ABC5_-=OB|ZOH|!<8q1Gh$_!hxJQn$)9 zL{ghdbQ>5XxCD%O@(uZ8?)fsk9+wdiP2A!Mj)zw84KdR?iV4!7&M4DVIRc{@vw8~y z3)sTnTBq9VGCQRVC*u|j7b*vqvRk??X3k-UP%>%kexcYDFk58jM2N*(< z&`cy+zywJ`*J`V#_7cQI?-JfnZ%jBaq_qTTW+$^Pra=b9@#!F~*=3sxCIWGMH^jcy zaaAgPs`Ehd#N@(YSeMZxh!~P^mpJPO#ue5xnD%yqZ6C3q+`)L+68Q(xUHa}d>nxRM zM`ff9Ffy(HGISGmybjd{T+pTrkG9b?+oU#uOd4~J3v@A>SpnFR4lEZM6}*50V^2C} zwg|YQOs@s+1Z_0$Mq)2AsTdrw7*vyr2q@6aNj%D~jyO1YJTywT?7g zl!m%Ow^$53;y%rLe$)qyu!W#xk1BLVI}U1Xf%Z?1!J zwJsi>lp%hIhX=JH_FxtuorGt?H9}IvKMGVxQ~B#+bZ!`(L3@(FF4Pq628#)jNK9gq z$&#yBkOZGc>cOdM3m2fXjci(|3ESHe=`KiO!DK8Vw4$^Y32>$y$W<$MF>Y2xh~ci* z`MV>`f+&kKhBDZS$MOQ_m&-J(VvgaKG^h@oK2{$7CQ>7<+m(S!%3xUO**Ao?3%8{q zLI5_3Dj=;{l``N(UGPP{t_T881*ol_C?&i3_%?;%Z*H4tAtaMBHMq0E*#rJ?RYfwO zo!Z43%&!w?$4+U8b%*%mBOAV>Cd~hTNzgpetuF9rbkrMyH;?ajP3Aac*t%r> z1qb?M`eB#>P(p)}(06qOAm>f`?5QDx_=z)ww00Xq6RRJ*Y$aj6F2)U_K<(H_$3}tL zZ3wx7;Q(qF$ayrBGF?cz&;uX<0|u-P?~7sUn%@*_maADl5JikC0(ltm#-Go+z&VjU3dvhv{Zb3>C{cz9Bf=4f4yF zmp#lNWtd|35ucqJrjSe>6mj1)SX&h<1M0M>Ot&dLg^ED{yv2aEA*_+s=m{6lGb+-p zo3Mizz+6Qz*dZkKI!0qE0*ROD8|Vp}i0_UnKJ1|=Hqv@^32VRwKr?NKw(uIW>Yo3O zy@_QoWdinqp%Vt4x!}7EFGVP#4mQ#n8ViHm0WME1bzmgIXP9GrLpr7jI-L=B7NCOL z0CHniUK6uYCv59I_H;3nigqIjYNTT$+)#W&$e5$xHFwy)eFrTKXfqMoG66@=y95H4 zCaBzMD->UlVFA{INnb*p*lY#*M*NyE3Mr0+|3a4q%vy9mYsjei~Xx?r_E@TCS8I#wJ7u zd$24Wu_WwWuzH0w@`%-lVO~YgHIy%;s2iA*l4NF*5YJVqy*TF0~>x?HO^XVi^nU8e7r1WAG}Q(8x+{;bRNjlqw) z$GYskU3Wqm)@6nv_LX&+zMB%{VQWVWr?i?l;jGJys|9R8@+^ByNGM%2kH$cf4}ydd zoiL;%`fNi?h==$9eZ?U#U8W?JR|o(uRl+w$BH?P1(WhT6Pf);Bp_fPm0w3&E{fmP~23`q=hGQ*)?`nI7>)tUCybcKwp&h*_D zQ^)G;zFluZ8CGX1gD^EyfZJ>sUsRo`-L6a!S)B>brUbc!;+`eOC}?x73MH0cXV7Ms z7NS-zP2~l}2_1}zqzoXSc_ca#NSYcLQGZGjSqHN0>2QkB0%|RDty&en3Wg{KjxN!6 z!^UP96#8yK136#gR+QG|DL4cSaB5Ww^e_zRJ^~&RJD^VyZUj7pQ&yrQjp9=PXgnI< z;;Io)jW~d~61bwYj!l^1bkMhgMH!+DS{C1jzpd$-G_7SYBQ{5rO$!_*^E3iA;aJHe zngdr%Byn;$a7EubUm*uVyBN}#w`5s~;GW;!+SWii8;T$jthhCdMLdXNECf~XS(EXN zy*v7@+ssNA1}Lp5>d%V@{4JQX=azg!ikTu*$I3uL91PK_*bdOw-XTqKfp$urstjPF zz0@7ih^W0t)6iom(+ZOjf`Mt2jQFk{Xtabo6c>C;M3Wa(s809}{c&j^DVGr#N|VqI zc``}^3`#s+iswvq+A_{6?Nj!c5>q*48+awFbwod58z<4Hk_tZ{q>-H9pXvkBlx<|; zgayJ9@*dJ}QwXYKW#DK!wqX#VZU^yz&<0K`D)4(nqLgd+7D_4C_*E>kE)AZhW13PVG~=iin5L8sOjF9I%rU0H^1_C-;gXj}UuX$- zgh!`O1C$@6G;`lHcZe9)WU$il^S8(WjX#^%Mw5%!%UBi_o3Y%WG+c!AhGl_r}4!dq$C zhtiTKEa^owf6@4Rx*n1L_W?Qd^ck9&r+Yc2nHnL+N!l_li$0;3T(EjSM9BMZSU%@| zV;Celz;UDgTbiu2qfi}%dT@_w>q25pbIn<4M54(>G|8jZZ99aeSy4>; zC4@~~SHL{mB?n*9;90?Whw&kjV1x|cN;c}cr4eZx2uC**hOw!k?btWhq0k*>c9zya zycQt`W+lVWZ>9;@!*wjpa8Vcm*GzvLTMPw9FP2oR!O|@uW8gep? z$8ak!`Ui6JL`2f8DD#Yp;ze!*3m9rhLx4wvr$9icLC#Vgb2b@4Vj9?pDOiJhPYx(% zco?Omi&RIxg)`)O#5Ca)aaUn5cj;T&kvhb2PD5qDWo{A-$NIH-=WhnO&Abi2-9Lak%@qgpbp86q>1&3OpM==i7t(Ci7*7$ z*p7TVhQzE$<(MX-t5ha3MXp6cN}3j$ejhA$iP71)x#Oc#oV)QC!p5st2S<3K7JI@@ zP!O-u@%v&2N5@}|%9nK2E4}sjl`n|JlPKZ-)9G8(rZ*X16^_47cE@~GFky)kgE-zf z7SPl0x7A|#n}Xk07M8PH>HIydc+n-@$v3?d4xNH_Xlohy6z?&1f54lj^fe#8K46>Q zNJe))xb2?UIys$w?=P|n?){bPgr%C_IT#@q-YOkP8O!N~&-rH3`-ivl1?U1}#v{qY zj>DBjqTo_*gHPn*ojlxaIRO7}{B+}|C|^_nH(zdV;Muv%Q_uW>VJNA0DOU#jy^YDi z{>jERz{%60bcHW21Ls#B{Pnk4*q8iRGhWvm;;LR;bb@1q{8k}XHkzvWhLJlt@{`t=!_q20QRySuNf6|@5nN8-&{+K58m^>I3yB1||FEhiF z2^V2_IJ!)?n?5MlE1e2mwpzxmD$VlhGUGNl`iwhB9V-rv3T_rJW|csslH>-LA* z` z)EzB$_jVsW`O};Gf4_D2@6Esd*NgFS_06j%_kO_mk4^}ol z9#uQ9|FN}K`;YmZpF2B$yT9}6fBt>_>2JT(28+$7J0CZnEuTJqynlD{^yv1R`-kI~ zGczqTgBCh_d)3--{OhCIn-6<;ew+Kpuba<1e_81)5B~P|Cx5=V|M!*Fhoebr{NaAJ z|Karb$?f)ETjSx$z51`4@8)jT$FqNZwYBnQJiqYt#e>IxIXGEe9*?WbkA8i5@5z%V zpZ+wnhGzcWzdwBXALD=g_4VG}{mO$+e|mrS>HYQo?!!U%zv|0Jzm1k}?ymIDPX4~~ z@a@c_&YSMv=FdL7y8Y?5{^G*={D0kjH2-dG=jQS4*Z;Uvne6WMmzukyzYN!BKHVO_ z8nx$NjQ{i95}J8*@Zsj%{=%#JUq+SRM)S|+{$us;t<{H(U+X)=JHLGV+eW2(xb>I$ z<>7ICd9-r+^3P8X2Y*}q_2bg^Nv-nf;N{zo)x(VkM-S)M|1s&_e%tu_vx7Uw!~fd7 zzj^TZ=l3r^o!$F@8RG5d&+i=`K3v=Gz4~-8et2`z?yuGMj#l3E9yI%RU;o$Hv(EjU z)|1)a9vwVB{qx^n3}*i^T&gv9=bs!u+~0jSGpKy{$L$YWYwwnR{r@<+)^63HDEeDS zsZ^9w>4ik3D2h-*LJ7V8|8?${GsZdNj4{3T-fPV{*IK2c*jU>cRQ>Yh<=on(USvJa z%N0@jduY>7R}jYDxzGM28_j3UrI`gHX3XeXv-wt&m%de7OFEug3p5BXY408$Xs0Ke znr(CC%Fn2+=L2gp+JfM)!Ft&wb2b?~GI$Z=ZB;2|B#8 zA1I?I=QV8>*HM#Rz^=(fbKmgJ#Cc^3H;6y0g<_0`3eg@+O3607XTym9v?ep`$MLfBK)NX+F@;Y3HXFYt2ysd)T-lvbhtwu*a7xU!w!Ia8b@{1; zHw*uJhEnHAC}gf5?R0}4*TYnfGWksV&&hH*ug^Y&+glbe?_4aGCPaBNeZL!EH&(H8 z~C9-RTVt&r})9R9V*R)A#-h1WtaeATOW-pByen=Po1=!meuoh zeU-7-L%vnO(a)ry{DZ=jxidurs-rLpUc(&$7z(GJMp& z4}YGGmh^5bn^|0`__3J!+O2dCy)E@O3d6e0%hQbdPV)ZzpkeIlp6qPLFszqxDG$?& zawYEJ`T#Bnp(NQ=u~qX+*5_26nyu4O?i$+g!pzO*%#@(eO3@B!o}kpYbi@e^PG7`h z4}bavOnAYsjj7oEVs-gO+&k}jvv-AIcEK>?wzwT0*$q?n8q+tifevZ-i+_%h?A3a` zH>glBDY|+$dkh7K{#0*`b>E)UzKN0~0KB?QI;E**?;7(0=5_0N`};Fwze*PWR#VV? zI?69+=9iV@H6DUlPvkz-Da~szGPny2isD@A-ev+Gdyn30XEMM%I)f7ix?xJHuv;S7JBT|G-+%pN;A zUJptk=`E6V3PoL%P7beg*=|nT0DgJYog#872hV~NU4MkQT!zJST|XhK8C}-zRcu%+ zr~FV2sDOh~>onmH4~+>|<-1)2$T$y6EnMue+})1YS(lZj?r^w^Pr~%AlUusDF7fbP z%$-|OE$F!Nx^FcW60eX#6EQ1q<+`*9kM?UIHXe@Z_)AodY`{}FjyRi0xi1a~{zlj0 z{d?>6__4Be=Ggty-0jcFr)@>)>Y?b3qEGUqksbtVi1F8%`v>DQCcnQm?yF^S!{2NR z<3Tcak*u^K8W}>jkoHLHjnln4NI3!dRgCAbWjnmlh_s)+^15~!f;rJlrd{D(^|eI7?>h3XK!S_vl+leFcvm1 zV>*mSPE@b>f<{D5{BjzZW1&Y#0c2uf=eJ)ZJFkS^jCPMY;VBbUTO{bR2|Dc*duab! zBhg;)w{CdG?i>8jd6c%WM=ravmr;1u+bS4|)yvVr>hRHFhj4358gBxLttQbUYaTk; zHCY$N@2KSOU-REpq~)c39_X4d4isV$z28knwARSf=4*f9;B|fTgW&Y4w~tq?wWq-3 z0-P?51-(O*uzrV2Noj>&zIZE5WaqYF^`m_7XYV_2PO>s61lAiWo=#4+jbVfD=G=>3 zj5zclmyihYkB^&TpOgZoYmQ1M#q^Ec?AY4&?!Do2vrhHb;*EOLnd@2)&GPJ#H$ywC zhKtCK_TrMWpMBeq&Q(#;3^0Tz!ZFV|jsLFOKuI~(`MJo^}oTSnVUpMe2W?`6b< z+!&^*#~^VYQ(e@rFzPm!7P4EH_t zvWK}ZV1m!;!5vaY8{Ll;sU2tKT_x>G8XXVWk2|~E4Z{X_IOftyN#)aYjs4^xX#i@JQ&E8o1xn9+(yVx3}>+R{%393Q)dI^AZNZU)}@7=(0 zc{dNGUeH>SxxgJhBDAX^SiOc9Ltcv41V8w=_PXfrmPohmQ-^FX*s8x-2Si!g<=^ze zBQ|rH9_CGUzkP|^Z#{`Grrq7nM4-fXAlUd@o;@=hBc%l}>AS<_+d`pg6$jx-pl1Fg z9aV1R29?+(S`5C2E!Vy-<75eap<6Sc#$`g7JH)0UPoAT+cyP&bmsE40>LJg?x>MaY z39_G>j565QeONhG9P}?#zm=`Nl>}6F36H~BzEm1a(--CGt(g)Z%!9zrFCxjA8Vxz` zIdfBmQ4#NC^U_ye+ok2T=Ck4+2uaEd1^PS~4OUAE)uVRcX7w-qo3|x|FJRQEgD>XO z%kvp6+F+Bh75}N0R>BnS>%p&;6y(^#Gd49n2*T!GO zJa3oq8PAAWV@mFBYGc^jw9t=7z4=GQw)66+TN;2(|3ofdbFWXHjW^P%qIiP3z@b%> z>r|oQQl2*qasQ&=N9)+fe@d6xxj-YuVw-FKxHSP6;0@fZ22k6q3^ zIrqh*T%TM;Vu&(%-&Cw#W4PthYVOJO;Hm9#-L+lQ>s|RlVj=Dz{_!6hUB-zuxzF%ysT7y(}Z4Jve+uHgy4a5j& zVfw*Ox8=vYq?{h61%n53cm=HUpWPfYJ+5cU$<5Cu>!{5&`upGFaxuxf{;8q$uAHmA1fmBMM_(Sk7+t^kk3GWu zEIEBn3K$uy7X5eAHI|>qW;KRORxl-z=K2o`ua%vnxIrp1om(_`-9$wcNbx2hLUgU`91jS?lM~=dil^U8mtr zE8ZB<0b?dyI8S`i^7nb^b}UTKJ5+69HJP}%WC$7G8T&iaa{un|70}OR(Y}tJQHc{) zuU}?=9jM;-^9S&L zW^eWGGcS7ZZs$vn#SOC`PIw+Jf_%^XG#(nNjT2qhCdg@Zseph~LicP}{{Wp^vq4`? zqxAUAAas*NZ{o1uKuA}GXYRKgbXG*VjQWqV${(P)DK!4vYV%5=UHLvcm_F=1c#m86)1*uj)uTA2?_G!6fawg?KOQ@0- z%u<;h1`4!YLat{OFd+rV{Tlc#g@RwXx1;eMclM0cSoKbErn`HG0^5y6NRj z?4w98Z1ifcd5moju(VEstFx-sDi%XHN$6yT!mqzya$(R_*wf|=P;lqv=DM#Q25SYu zEg|3g$p>Wm!2sq_Ir)0$S6$ z^N6pS(*8Y|lRw$=QbDo$yYR4cM)%Q*t`-z>17WzAjSL@1mHx%hD{IRJi-gz07r`-q zA9PbH?qb2Hjg1J^6m5Q}xzR(zg<;MgM+c(2d`R(rYmgj}f1GSgvXJ_bM4A#P`twWcc zz=toP)-IzP-kpCc1&n+cU9L$sK23G4R$UJjE8Zcs?Ie@L?G7B29`f-ikQ}9v;AB^R zO@D{HKRImCxRWm;Wh%CmePl*$2)=iWzHvDfOplY?hnsP9Zsx#}--6emfQjU*R!`M~ zgFBp>UGBAF7yP9$92R7mc?S{Xobr6LjapoBSm~Ge6AP zhblhZ55>#Z_;QT)ldClJO(1&OE(m#}Ue< zcvZl7-m0}@s?M5PH17owIlkEIC2LNp&J@oIPERa4eOspeE$XVfhoTtp_oignxGf-aF--KfL9N{RsQHvFxo{z%;$pm$N%aw{yf66_?YipF@H*Q3efZ^IZd>vRwZy*jhI#!5~Y% zH=p%M(#=}_g!)FE-_}_@BfJG>+amsx?Li`qV5%kTj`_K*H4^jidwH|9t0#CwuJXdD+FP;{A*WbQ!x0>{XONz;;9z@Pg!r`1h z{+L@Lv1#kr)E^IJL($X zcGNkmFAn;g^WA49_6KiH&W`WCS(zdTJLakj%IGz?`RYo`?5$IztA8*^CB+{R+oZd7 zo4GfsYlq~DwSDR?OXA?fHF#fd5O5+6&I>-e8miHGe`+w*6)>+vNCKNFoE3Os#aPg* z1MmevZDDjXqg+|TsiiX7Rh9q96#v8iz}-?jn{RcrMkB;L^|?aSS+UneikpL_^)^=P z{QQiJ*VqC9LCrOZ1>&^I5l_l!ec!oG7hCNHn4l!G1N=|Y<)4L4WN*!8_3wk8 z%HJdRfl}utmLGs#BZsfY6B<8!1hHGq8fttXK2BSL;bK!pT8Buo>@6=7dzJM1H-Evb z_iKAX$KMaboRr1`>Ze79`vP11ObQo4>2X?Wf3d(O0=F-&ROn}=)#uX*ltb{D-)Q;~ z?Z$wJmbXZCoqBEPqVb3?bqr&$Y=9jK9~r|g7mrIV=kOYa%Z_a(N4iCB-TA$~GMRES zqKqP;tA7K5E@1Y@anD)I$G@R8C>QEmTakM>IDfwV(c-(`jx<}IHk+c_HQwIwSW#o? zj(;?2Jg&$Xu2#o-#Ra;Mk;~8h&1miBZ&%L*JY0C~f;O@1=;ucL9n$Fcbhdi%gsWJp zgq?)2Gw5T*^p3CnY;m-`;e=AKXb#*hXx^Zy0gNc2sd(bw-%8%5V@BQp+hHe`B7_kP5jsv9#z+iy~ZxMrvjyK#@b=eu9>+#?){0> zlF)D!sQk&;oodAG-WSUpth~2NyAYtJ6}U?84(6&|Gp=6}Zxj_<;?s{s9a+>~?ad3` z)Z@LUK8n##MlU$u0q#w;beX$Z3E13JiG!H7AijV(l*Tj5=;X69Y+pV>$b9N7cW#a5 zhv4*C6D2U*=k18c%rXmihvwrWn{-1)YHDW@K2>Q6#)~+JE}PzMQmXP42sUtja-Dpb z;&9NFV0Tu}f0XJzC5dYOs}-yuvuZJ^G$nyx_9hXv1Ulo(i!wAj^6ZjYT}*O7=IRbw zODk3+4uBEn4}(fkg&DDJp3<=4L)a+ugT6&xmn$DUrv*7l8jX3YfH|I%dT9^NI!yj_ z1iAdx!mi6cfZBo;p~~HdLbWIdx>mZoPjo+Ty2zzv_xKtW_7Z0tr!Y>L#tVJnYok}5 zSIg@q2!A`lDeQ6QtFOPde!2g5tbsnas`&drIZ{&zd)(hAq0SKS{e$$AfuiqYloB^j zYt}7BdJ;QzvIHYM`M{kAxE!E#Oki* zTfyBDNU~k5E=7P)Y5gQCSe=jK4ng1XX}ZM2pUnOp1R;fx_NVPXYuY}XJ+b&MMAV(y z5X$ztf0epi(0ixlN0Bmtg_gQ%yVcE7Kyhbps0+;hmPa-2l_)v=i2)b{9UDyWU_|23E}M(2sNEipFbhv!SQRe0@JF zyBfcFuGfTVH@3ZQwN+v^vqCCw%|_m*(NM3H`j7})DD5s#1-C-Gl>faO6=7)5ra!QW zKow@yUb`#zc-wixB1Lb7t-uK;RHVt^tGSnpQtnWU`b5;_on=#>uL1tr+AeDi_;A|P zw`&id>hfc#KH3AXURvgHs~Fh!O#d%-+A(Y0LNFcG7L(fn-OK_EC$R^dCizfO(nO7~W^ z!>xC8e)rd#_*x=XDz}wEL(j|&Nt737x}2Be@oRLWFRlM6?wRjnXHYuX@J1iJ8i6w% z>DZLb&#x*S=9;N6zpGT)(Xx2nY;Qq&|&$lMC zj?3IkyFWY=o1Dx=ru~35jy9j&)po~8h8-UrSw)RV8QcVg&7fs4JvCw)qi)^HcEa#sBxwa3 z9fb-$>kHRgP+Omu=zMBJ@WNr@?eZFoZyn+nyqM}OKE_%hvUG>z@cv2Om$!9luBObf z^qVZ-xFP>VHbWtk+b6sh=Xd&cpnJmwAGg}sIhyJKoVQW{7#U z%O(Ee;IMa^E({Qd4~4g%!_=)&6$Qzx4Jcwlpft)VQHKss>2DXv-dS_YPVRHd?erZo zsGR0PdIvW#-;Ih#PE%ypzT3UBYc-Aj0H_q_U_Ow;mKatGpXC^CZ+w^!nP|6fU-vGk z40-Twp^b{Ps|#uk=Aqx|kM6Fw#IsM2j)%Pt&SJ07Bh7vZ#N;|(_G0DO@}HNgpp4IU zFHozADmA_b6CSRM5Es0-hrvMiz%g-$O^SX@O)V^mc<+QZJ33MEenEXg&RW)=oAy;seAw%*18g5o=)dZ*kBloL_1>aC>eCwhxM~~O z?$Sf=6_bB^+TyrZ<=5{~zPgL@M?AkumGhwa3kRjwbk^S%_CLw#sfs*t(dVTXA+NVM zrn13P+Ky3n^}9@4)-;L5(mA3lnf3-|py(#xDJxQ854Rethkkwb2^E zAe4Zt?=pkth;^+)>18BKqxs)KFuE$BQ4FCKy}TF*Ei@?wc;T%Ems(QALXtifh@@MC zTfpq&2}XZ=&*$94KuePrbJ#qZ*hQ+hp9Aq!kToK1{a%=<8)wBHKTPD-4CGWq@ zrWT94!IF&vT_+03D&v0}>Qw0(@(j@WN3AwE9dkQd=9_9aKVRWjF$M%hgk#sa4rB-b z45Hf9@?T0n9D6n?3#;=O>v{K>JKbdpR%5f&{F@qtnlkyR|41Y zr1>&>GJlZ){vK{sY4LXIFW6Rgw|(3$?J^OxPK#q1=!Z;WeJ$9a>a3UVzGJRwvdo$P zjAsy+D+M_)MgF9SUR0~1`H}PrftT(~VsX>+8xWF?chI(Jp^)3$b9w!M9MWERfksY! zUk|!{WeHTX*62qT$(#h#Yj9`%GL-db4dfZQTG_a|xxOR%eY&bWA1Pq=^*)Nuba57~?c zUGY@rLyck<6X^9MUu7H?*jpCw*0Ht@G1Tv1%{jExo2JniA3!>f}&5@Tsxs;u60y=_0?d<@yWp#i{%fQ!>Iy|G)lh%)`V7Xp<^ zJi)(jb&s_mAh^+#bIDO{U)6v`$+X3HR+|iiM~u$8(y5a9V{M>5xM2aam@dWJtZ`_# zi|TX5BF^yWTrVD}Kj8D!&H}P#&w4^yI$j)UZk`sjBn zPxuPfdscuUw^{vcv1$&gbKy~cHi{a|vWIxRPhE72xSlHnh$QXuIr?lV{4{{D#|#G> zexYY>?R_CyK<=GDSRDT7h!lTZzgIQv_ufEx1hyS*C~#({Qe_#v z$O2|nOoD{e(Hr-r#q3lV6h>E4(Au!&df&IZ+avQ}@4jy0cz)Oa(kQ*WRStC%;9DQM z-JN5t>#TL3ArJ2*UMo&)fXZruWKlXgHs(YN(3xxRkM4fL*(fLOEu^a?FRFM^fv}Lb zKjD(z_e{4GUmTv=KICWT{pW{XtQmp0&K8qOW$IPieZO`w0X7$e<>xdX5$a`g zn&Bw&*#h-v2g@eQ^TV31&(J`gL1>>OMpO?l@5Xwmi?)0Vf*dW(QJS!_0lsfh!tv-6jGO2*m0>By^;m1A~Lw>uPB zD&3>tRUZo45&ZQY=_(xb;v`hT8!yZKC3J$cymT{X{+>K-4p^lyLHObHZU?Tz7pCfG zv__xQZC)bC*X>dbN`Imk)H`KuVDS#SI%^|RdMT;lTUd-1n;Y&iK&LQtBU3)Io{#%R zTRFu2mN-XIb$`JL>NJ&Mvj~*7t)||;$tT|$UAwdSgEPOX3`>{3vPO)n_?LV3_tb&7 zHHHXMTh>i{@vNWFM!+tQ9C0_<(c=J&-FdUib9hyJkazqrsj92~xE8pD7=k+5$ChRd zXc%8n_kJ36QuG&z!m>Ue6gG?p-GJ*8?$2kF-6oYF(~sY~)A8pzH5DdmAFOBP?c-ax zqE88g9qXU{5Kw-j6Fk}ewk}&RkhP)~B?^(E7NAKt3O@(%a4F_=#onS#q#wQ4DK@lK zo1u6m;r^^vRHekv3lB`Q+N~TiEcCx&8$H3V%g$kz46u<`#-^psTC{Z3^Xkj16(UOM zI~HbzAtc3TpYQol`_UJmJErgL+GI19%$xb_~cK&0Z?gJc!*lRD*e?< zl_T+;{^)%E9FOYCm{MwzT*~upysW7(-n{}%c$0Q_lD7PYj}s7{qsz2v-`c&HBeLcj zJxl>02Tsez6b0**LjqPLXZ4rgfb-tQyZ7@#CQWGO+Zf-VIay1Vg)4pCWEaS%anP$m z`#h;yjQqL=MvSAA*~^>LfLc~I$#a#Nq}b2Hei5WJE(1VJoZo_$>$Tfjpc3vV$$z=$ zbk^c+jyR1!tV#cO4NY2VkK5()mn*18 zH$?g}rhG19Y2b<%dq1j~^B|^Wks--3jSR?Jneo!8KY&V1dih&7^X8C2TGG(N57oU_ zbAMDv+nI%@QWhWlP2hWUtKzQDC2LxLZ-94~Mqg-1xcyTShOlVQ>2R)=)6=ATxk=!C zGo^XQ=i-yA}<|JivEHCaC5TUQHXp|a3q2+HCpR=w?1t(@`l%|HIa<{G<{ z8wcf~>Qxv*O{CqB2dWN|EJ*`<-~g<97OG-HO$BFxyqvj}c2Tl5_k*#^OoRHVfPo&_ zB*&(5rL22z4p}K_^Kha%$!qDZ8t^?_vSdw>+?ft8+$mkgFU8KdXd0v5@Jwb=f}vGf zog6hSDy*+N?sbC~5f{cE|5RA033EW_%3&RZcjuYq7@xKYT0a099I3`yBNi+U;kL z5Akoe{7Z55#&H8ZI2=CAn8muV!MD98+Ii2>vf+Oa2S!|kA5;<%_w*5)h(ru_WU~f>K*)Y460+&0~Xc!rfFI4KDb8JzeAeX9g4Yy^$$K&zE(S+c4X0Z>7v@p-KU{;t0Z*;n8(0w zy-Ia&j*m@yfvEtyz!!=C8Y<*(uw*E|Rgmud$C%mBB`!2|p;(^4@L4g6ZHO`xgQ^GABGVQ`8!1x!K}ZZe`p+y{I}LHPvf~eJb^sG6^b~v~sp>c@%jp&l$^( zn$~b!6Lq(fhU`n$_%yqnw>4s0K^d3&;`8_UPrq?G>TcMnGfsRe_<`j< zOU?_(b2l1x-*x82t6r|#RNi|?&*L~k@*lJX<^vsl-lZi}+HDHYqI0ibUeRQ}?J4ti zH^rj!OKv9@Ra*}IM~{!RzgS?A1lp%ugzqo2TDqM2iE-Qx0PNR-Q1xwStIhL!#ph>> zC};O?o0yJodV^t)UfrJzVX^Uost#N4Jm&q1M5~n^;DAzPFd*qMEdW~#`JlM|R}~@T z{XH3!du9Ceo>m%MgSHz~^1}e)x6u$fa-xMm_H@D~r6d5!)@wmz!WOF%t&Bgca|`g? zrC3_2*T$(7u}0Wk=V-Ok;@;wDfgg4fwZH!H0-8(j40N>b*7rA%CqW_vAFJTyP3qSB znU0TO^|Ly4V_>G{Otd*J;4a)8ol_}zr+EAGlXn;tV>Lb9H%;=l->k=-Z7wo%g?ql1R@9E4z?m~vkB(3@ohje8gXwgq`OVLy_ko!BvM88P7$>NXpdEPd&{#1I5zw8s{nQNFZNvdg3{;-k$7jY6z3+X@m`?a`PCBy?Lbn?v=1p zA`mDy=BKdyFfL|VOz{+pDgZ-R7~~k;NG0Wu<$#Y$wTi8jU(4t&)YFasy~M`e+)R0| zS?|5111>@PU8`syi_XGVY1am@#C@=*W?A6KLqoL#Y1?i$%4r&or}r1Fc7E6BimpE& z{l^xiLie8V_X(7&r&}g0BP^=N?E}@XHodmFjR6XIL*3(ZxXES+?9~Ta_^us~Zph$# zuqHS}rw_q+St0vRa6C#hUEX`*51g8h+NA<*5ROF|ktn6!XGQ&mgW1YbfYEUhKv`3t z&fK5;6}fI95T(28AWOHnsO5Iu=^x3*Y$Hs_V7UdN&!EY$k7E6CRD z#@&x@t0i75bx4;T%I#xCr&@op0A$f1{We^Jtv^e_X<;0R4YNS6*T(g%Ub@YCvpNsD z+~@Hf%4{!B7ccE8&3@Hh&phq$$tK<(-Vjlx>d=Kc!3cvs-ysoS`{tlvJa$n9de{G8 zmg#mri{EwWU{uX|nU+TU@)9*Y zPkqnqR|pN;zh7{xTr%+1XO}f_uH!(3C+@S+;MQM8u+uLm%qpb6c2OVXQXv>s#PN7u z6_7~_$#gTn*M{kL6Q91}33UAKcw3y&HY!UyLqZ}HZ!L;EcRPm*^UU;<5lCrOlJ7Mz zjK@Sd{(vL`I7@C2>f$-N9}!Epr0rX@6Vit!b2j^k_-; z5;*A4aB;<6BMMiQ*Mmfx*|e7-`tVZ~JY|r?G72_?$A-X1g(HgFkB3{`t@iN67Iz94 z{i|?GyQQrx%Oz3n({JveASiBl`|Pkj zYFZ1->8uMEYrcgogQor47Pc2fXba%4V-R=V7eygPsMLFR`=C$sOxFJB^TgR>=&k#} z3Yg_&&{PtWrJ6;G$%g1)xwH~f0?_*n1_kujk5?tSRb}jjpB84^K}&57ouo3IxO{uo zO@7*_-&7`?OfE;z8e>mG45Pnuj>U$$*^%6f;l)4!BTDfZyZ#ox!uPry7g~NWfz}%y z+P*X-*+*DVJ>dDQ=%sUnTJB&z%UUzuwm|$=yEoRof!^wsTQ>p%zu*k- zCSKI4bm*iSw*FdlmHQCEO})Z+D=D{q>y6LuWOOb#To2X~yA5mnVFOnLWzri&jSU-O z!|~qGlr7r6?S8y>t{}DWyc=Z9r*mF2x5=VQCT1lr6z)0B#qixc98(%sxcU}nZkr`H1bp|>waquwa$P&z1-VIdMf3zah|%ucZB-EY&W>r zru4UUqAor3pVJzD+4GliZIF|9?=hNRV{a8=v2y2y;r8~O_0h9dzZVmtr6xdJ?C)^8 zCg!!)RxVo-^p@|TuV#$c(SfU=4BL14xJe7S`-=uYG_C*L&6jx=fwKzRlvM(Wbu#sj zhR_WRX-p)ney&9MD&QWN)az%Z#b=J;x5xhJ?SE@~2;saSrZQ3@nZh@AZlFa!g?Nw; z+N<1rj+k~YkXmD1{!=`5d4CgE94PAMC#&r>c(9f}CVK^2X-&oZy6V5{ZXB!o zBTmSEKb3^jJxbu)Wz7`wi0H8k|LsFR21}-&s_&ycub>GN9cWm+@@^-zvV3Wlqhn{=bqCtS%O2C<9gl3zBZW@ zUeFdXf%POHuE9X4dqj08|MMA~8wu^HAT6Q|j2b1NF zK)WG~&G{|ubf(ng;I4}jx-38Nz)2>-t}9HsyMkGsm2Ym*MYh_mA%0FAH%WETlIN}I zsHi_HU|Ox{P#J^yX?-cTWPSmgQkj~#ZlhVa`0d$wMnOFvW> zi4|mMw^lwF-|uJs>SX^*7eiRMWbKpw^xE`WuY(_JZ%w|6!XVWEJPdmdny#f_{MOmV z+PxJ#e}l0q4_T+uSAgW!lp^r-g4+*n`;ZwO`Akz4ymxO0an3=G=xX0o_~UHgpkV38 zMWNvDI9{A*)w@i!Q#$GU}t}aXK$FM$s)MkzO<6@UqoV9g$$QEDC z8Sm=ON^dzsV^c)M+k?r;H+TpfSl9g)K|lfH;vvgs*z)C83-^<^1ahvZ{mV}+;v)^O zjRx6S>x`-A4rvOz#>843uoJlLG3gC?tWQ++fDF8D@qUBN3U;n3ewGY(e{`@fB@fL+ zt$yWJ(a5ZP9g_9r9Lq30qF{jWb`~$57;_TDile0&9y!$YL~ZIz_tp3QwI8Lf+^Z9 z_}6C(q^im5^l5AeY#lu!-u)B3YU8S&-aR6wiasLun)F^4|0rG)3dgy&cshk?^^(SS z>4hi9-S8&>=fPJhc(6^Ys3Fm@RmV%B=+x;G6C9ad@ACfIc7Kqci-cw+=)Gv-oec^Y z{vT1-*{mqAZGQ{NfT98hFe`$nh=3wyL=h#4>HPn@nOpb04>MI$XFM%*_l|3=U4G*< z;?Dd$-Un7qcW*(Tj1j~4Gq&!Qc+%Wg@|h+rT^m2>a3^=xcrDQI+u9Yid?O8bAZ(r37dEVU}e4Eyyk*6+~&2#PSv>K5wUOlQC?w+k)^|J+*{mU)KaYdSs6y|a)sriiug zmZ)rQ@hQ~@BXM-C`)IyF3#-@sUC*o^FKxh&AjmrKn+Vx>@3$LG|2%m%9%@GAD(Dq0 zLzNy2RH>mI9b&;lWs?1ePpfpk&&sRC%I#ZlaYLfqyATh*q7HlGT8FVqtv7Yee~o&HVrgk`$P{Z2&*QbIP>&@pIoz1gVepEMZu z5=AoBgP=A)GV^S^GciGZp)g)<7CDg-{>)1f{R(!{ejPRiU>c}O#nkw@X<$+xDYuAw z_(>XjGHxwISf*r_8;nyYyX&r%^tAV^qQt!e>VBls;@0FI!*ZC10L@!Mjy^MEL! zR&4cHu3W$;^$}s$EnG@ifN{B+@yT<5uC2+?FLS!Onk&YfI~ROdrm6vTGB>Lu`~VuY zU+(}X@XCuwK<~B1P0P+s^Pr69XzkK0uiLfLi8a0ZI+^dEfm8zE&uUKmxI`vzue#AZ zvt7IwMX$iLZ)>XKL6iiyKkX6t+x1s#ag&Sx%pg!8slgmH&w6+6nOz@~`0|K33NMmf zP8$bkaaPXj$+-w63Z_%yK{)7%&XCgm?=X<{{A1t0foj!Sx^+*-QAZfeW~dg0H7#`n z$E&#b>x_ARx|{y0>M6n+C_5Jja@$cF65~?GFl->FdTZ&q``Z`~qz2O);v{i(ixTn_ z&iO1~i^~`JrxiL6ajRt4%<|sh#m9C3E|c`&FZ$BJ1rv=#>$6J1@VYG4x9g!`?o)XXtfy<}!8n zGK}sk>zBz*&rSI?Ka-8qtCB~fo6+YCjRgM1bQJ7(@qOE`DnP2S#dTV?%i#wW=NhXk z8jI(qGxfaSffr-|^J)!X+Ar|0HC-g5W4Tt!APAKJt+xw!LFlB!pL$qqg)z7GECbyg zEADR+K7xw$M|^S}FZU6{Rb`4@m?u_PbnbiZ|y0P=mc7^(n>7 zZ2xO7k{gcfN6<0sAo{3cDV2v&i&+FsxHXPix0~Bbmx+w}^0BCM+5Niyz2Nt$(){hi zUOdZ>Yp$z(UYoz&GUy63Z+3dMvSRn7MA|hJL1d*Ju{<vM-V3<0}*h8=3r6ZSuS(Q$hxy=Xw-rlwn^zppB_c?+; z-UPWw_mLSr6WW4G_%F6cQDPx17$;a}_ijHyXYDEz=S@j_mq3Kb&GqIztUTFLdEfP% zaZ!xg2tS-|inrg5W=O5I`{2^mEGYeMeRab=;p0%l|C+aJ+@C&x`JR+^=mndK=8P7f z+%|z_W(LUcKrZdb`HOFq>SwOj7al8(o?djgB)RTiaqCLs0r*BxqfchBT-%KGr@y;w zCgpzU*b96Uj}J0^+~!f16lToCnC33!%p`Fq$XH2KEtLY>R~mc0;|=Cn z^z^LY*QqP`<4R`+h>CpYap$JmptY#Bek_wO{aI6h^tBeoFYi5>GToakT5~o0J7(-_ zGR;rBm$QXPK6J4v*e)ghQ_nY4T%CHqeJYmrZ+jE|-j%ZzQxX@=GDp!5S~TpY8YEUy zo{fyoM)avHrMYA+H}xY(9|6#@SS%?<ad3=#xzIy=O#J!HurP}m>QZf~&E#+Z*sanqAB8B8H$(sDA;<4W znD*J`)tFtoo99EVvDbz@TTPt( z^d3au2I=$tz@D3w%D7b0qmKhZJ8cC-=|cOtH1mzSuw~i_MgV z^rGFBjY_;fve#|%^$fPP!;U`)oA0R~%GvCA?W82xpplF+&wM8EStuCML%^!HvcSdR zSJf*C!UA)((t0dI2F*2^Wvr5V(PbHx3p=9R z{+%zy_K#8@7Nx^7JM4ICkoEZ3yaw_4La9I7?uS*V1<65B8&(2ox*Q8gGqgUg=-=u3 zatfjvj4kGgP5B^Z3b}KyKVSWA%!BweO<$enVs8Y?7!7ZW<$~g4 z-$ni&t68x%Ml+i7{BA%?kMB-Vr+t+GH6Td0(xn?{T_k<;6oN5J&CO zFx0_)a%><Z{ISGwzdH)u@%n*q>sDnl_1k|8HDTtvj~zHqobPm6 zWy43z;p_3Vb~UKbm}I3D)Ky>NX0vXo-G5C%sVy2c>d(?StwZl=rVlzhIH}%W<90_Z zLKve{3T~*Xtl8Okk5qC|#@zSvA5m}yxt$hdY!bh0zO{a1&0!hjj8ioFX-5;zk?EOr zqhEkgKtAr0Kj}8If3PWncv#i%8?$U1$#&lEi7$Cw9%yx~tMsW4a#Bno>VdTAj3UU{ zWt#;`=Dx4Cnq~&}o2!`5{k;Mufm^1UVOy^LdS-Zba*K<%Qa}L?qZsouCrP7DGmq_! z>Ekgs3(gOuleoS2=X8HtyYH2>&UGM3k+697s(@H1mh%9s`sRiY*8C`s`CHDYt@il! z(Y4R)+0BEfWw(62G8?vefQ~tO`Fw>uOaMy#&9vFPj-RJo(eF;?@451NJp_(3Pp^As z7)mvx(ou+wV4qyAV$IzI~6`|RD_tb`KwFlm&eq{=pSwixT`7}9^2hJDqsiH4p zQ6taWQ9eaIrK{H&Rvy}48lC83Q*w_Z*I-TLb4ZocucZv?B0;73 zO@Iymiaff<58_T=<8o=PWXPIO=^hPiq4np@5g!!@u21Gxyo8pvvR)gRmc>`wP1AWz zz9YI81pdRVUAWAk+E5wsHm-72kS(~e;(QZJXEKG40)L~i-fg|V@cB@5Obawh8gB+A zg3En3oyN+f7Strlp66p*&(XwoS}I<*Z)>ggXy_&uGqcKry58Vm*QUj>#838^(Y@Rb zIXl^zLvn{9?b#2O!52tQD_TNTbAOCOn1wf6H>8QadozF*ABLo`y@0F}Xry+UB zo+@^Bwf1GV$t|_RU!Ihj&;8BV6;kh6zr3GDwt6mez3^Lka-H$p$=~PWmJ-Ef-H9s* zX?6W_SG@YQ165roGa)$x4@1&whh}NPA;;d+y|_m0Fz#rBt3xNn+Cvg{LYp0X8s=rU z`4r3X%?`I?R>|$PtlPVj?rhz3>bKRPF63O`%zYI%Bd)JykdY>KE#fRkjc%~czWXA+ zErl=cZ!zBKv*}c74Xb2!Ut#1ic01+rBjf(upKH|yLXl}wxEohW`DmbYvCVpk(C6a7<5cu#>H zHPO+L+zBVAMOgW%_9zkueI<9UVSaYlgxayi_$Iy>Mk1>hvfLpXmABUBP<=1lY9T~2 zx;XE33S6|3R=Lj8rz>h7$>KR^(1C#SFugYda_YXTE?3gT@?gBLIUj3{)Yqjm8aD8L zuJLx7#vfp8o;jtWC2@3GC&Ob7rT&^cXMfG*JU=ji|bIyB=0ORdt3fZwG(_3!d~ zu5mck$^l*H>#H+{>w_LlYSZ%T$GFktruu4M3+C$XOtqat-vINdhQF@B5Q_>)kAp4`yMvNLBdLtVy@5sWB+A<(}s4PlyceAdh$*`4aoL?bj5xJQFXo zxsxLCn43m6wpN`pOA@e&h>)p+f^>Adh$~>7UP!7xJ)8j}_T2AcEZdhl%Js)$MAAaS zMehAoisO2x)fC1N5VIMkU$?NhUh4?;Q;d`yYfP16aRC(UY9~fstWNrJau#-|n zb+4<+klb$Ny|8Oo(s)_2Z7SLwCA6hd5UgA>AY^N=m-) zU(VkqtUCNy-(`o8Ptvm`G7FSTiX!mpwI-S=m#?v1fl$FZ*fn93$u z?N2zs3uc;0rk*Sj%o=Sr@jAQc8U&#WSh2ThB7b#eo$FO-6zPpnybd7MM|PK^p8f4* z)EU|PB9N=vuQb1r8uKTq`NjI+(fm6GwD`r9%EzGV*ma&PXEXKNVu)j@%)a7HMyL-L z?FlD){wd1VPdG%sgXAEmzf%hUb4>|e(#i#Pq_r_p~vEso2y>m}_@D_da_AICXQ6xAU;UN({< zE!|+5!i1|64)3&FtO=Obb;rzS2i5IoLifF^&u%Mz$?L@>BUmVBPMSoU0g4W8PKc;b0kN4=sscPablKa=b#TN4XE zD|2mKj=(G0CU?(P2B}+9Z?|BDl9Y{M^DgBgi}GMl+ng&4&S6*MUToW5wOh#~dvD6u zA7qD6$;o9Qt;rx$n5~j}MM2~luY#D#6TXDQV6CH5Uz2`D(&!8*_wuD#3K_xj(vk=& zo6vU%4mPn-?C49rVsFac(V?VjZlg=lj6wRkc-X^PX+8LjXT7(A478>{PtMm$uei$<6TDe`PrDnb@wWk0zbJ2>rbDDDH(MP~%uStsRlv5d zc?~o??hc>7aTyd^2Sl}9=^4@LR3oz_SI>jW&r_+72Ldef#s^ZD^4d3yJ3~4NT`AD_ zXzE_owW7u6;+$`U@pCC{Hq6!9WPcRq052}RRZ!EX!|A+halk&dj;joLnU3P-Oa#+$ z9&~dst-@xn6xb&^y*E_cs9oS!HdJZEyG&BPkiDQ3TcSVj)>itUh7$F&-g~w1DT;=P zBaJAVS&v$+Mf1x*-KLj!K|wpnH@oBTV=sHep=9NY_wq$4OfSemjns15lZKzkUEX}L zAAZ^&)yQF}lM%lDbF~?0{Yd~cRi_=s?5xZOw_cy=qPGnQx-GSOws6blpew>5$&r2BMjLXb@8=QDbYe<3 zmUG+r<+G3JJ$Ai#bTjQ&6W~5QLch39|E7x#mP%U@t8!Gn&X0!)^Pw80cd^&&`wtKc}`0@e{|ApmlEPn>=f4$uQ=E|B@di{*x`5Z$^ z$)-a_xJ7_0jNV+iD|LCEzOufr{jXi%G)mR0{9GHPj4 zwSqj@7u}hmixS~ zHe?4iJy5GL|Foz}+0DkZx><9U%AJf0ECWd$Ut|U!3kTsk({gS0{?|p(Et1;@Ynx!RQ1x+ltL0@*N0?ntzh4bMtsvs5xU( zv^0iZ^5x21AF40SF1tTK-1@e%`&!9;I_z>(~Tgwun@k^ z{$r&aKnrIOf?@Ao;icUkuxb9H+wHS(K_#YGz&`(gW5IHgi^Ap$)zTdiBz@R;OuEAR zW*)bQ6IF7xIm=%@Y?I1pWRuE{7q6&5Qwe{|-=%7?n+yOPIn2}_-HvN-8%;RwxepUo zzfon4RBxp6uBDI>`NT*4+=8^du;op!A;`j=kb#0<#Z#wOlBDfBAiKD51)ri%eGm-| zS^gy5mOQIVPJau!s(PEMBvl5Fz+r4(Agw+;Pid?8$P8WRXpB#KS{EQCVDdWnX4YUI zax3K4=a&o*zUc3~lHJG*-q}CDF1;*En1c{zgPoV9X@ zFGN_>w~>R}Ct$V;%qD4kwV1x1j=8(KS9+c9Y0dkD)la@_w8L&wR}+?%xu$|CiupyU z*_McE-%dl0VgzC9KMzc*@uB2e$?%Oov!Mfy^OC?jU(3!;tZy3y)Okes;yZ*hr<(Bb z6O2!CPIgjUl($l~6fGbscn&I8A9#smXE$MYu`q-kt*&611O_3P@3`35)DI5daF>mH zk=sX$qBe`)CjojTWnCXs7Dl0fJ5uk7EWrmdv3mcpBG`j+H1JoMInUQt7c2-LA;fd_ zd$&mz)_9I}TU47w)9PSVX|REJrE?0_H9F8b8lHu)9c?F4Z|8O(l;SOxzvWbWi~4VJ z)_&Ka$a$Ml9{Q&?se%mBsmYI8&FH`4tb)&2fPd^2%F8NAvw2D~@C(A!5$MDDP4uYN z=A22sErOT>JQ;Qg_%&GMA{w7~$J z;p?2XILmu^oAyti^Hh3{*6M+Jq>g~n&1XVXhu>AL^taPj-A$_{w*&!!SPNkGy!)BL zsS0dE-&$?d$rj-ma)T{=JFn}PjMj4NGlP8^EM~#^zhodj>~4jzp6{)`f9)5kw35^j zn5UV2&3Q;+FC8w(F;ixwzSK5Vg4#%TSFLo;g-{~qqvx#l9xM9HbRZTmtK89a2XGh$ z>1!E1!Cl{9N?k16)0fc5Go9{y!=YI7@W!|RmJ#E7RvnNPV|mL0?lFw+_mmv(Xg+50dqH|`PPlX*#bNT5ol7$|Q%8N4#BO1@Xc zo0PbqpVj0Q|H(RHwEnJ3o`Iq*T3ZOy!7T*D5Ptu&_!s$wc73+NnmIS=1|X}cCb3PK z?)+h-?^;TXk7Upj#04L;;>WNIILXt_pYkIPT;ub`UaggGehfJy&QV=VZ>Bw#ELWdT zeCTfCpJ)4J$Q^?Q9r8G0yIM{ful5iD(Nc6SI=rIzMYdTTl?4?72UI(tgq{{t*5Adc zNlJxIwMms}8ti>fYHRP&jBPT0L>xAh%AH@G!WdwMz#{9j57+AGC~f|nv91(d>-z*TuQpwS;ag*6SlRYfkOIjYQV%=A#H2>i1u?E=zVbT! z)4aE9{+~yf8x4Wmf_re{xnhKWoqB|;e?_g^T%i{r1Y)xlR0#yR3A~#i3q$q#+xGQ& zTCJ!(JIVOexkdL`-tomWBcec)b$O8V)c`-;-Bz07aud97vzODdJ?)LTj5o{BMCt=p zQA^Z`HQE&BtMWDbbMBxy4F9~Jt>=0%*nZD1%yg$nz_}{Eg%EZ4Zan`AZCaW-Yvu2& zZPXLkH%Ky(dHT}64wSlupWmw@f4Guex+{W>SjW%K*&rGDhqPotxC$C+`(gp>bVI8Y}7 z%2!)q-C-;=1Rl{rG-d^Umx1D+PsJmB$&Zbdk*6FXy83_3Pj^^72S5p#2ot+AS!BrFy}CFIsE04kYN;R zu*~w8UZVMAG=(4#8oGIDK7ToG?I9X+3v%k;sd{3Dvb~J!SSKjG=%l@W(FNA}fF1^w zR|=)q`u*X~e-rEuS?u-Jpl6xtO!%Sjnuh~0ahn$`Q!8~Bdw)5ePT6?N6qes2&1#bZ zW=N8p^y5BAIQKculRFY~7F_E!m($dyb~xXL9J{~xckXDs^8TD3F5k=A;aaWwvSI>B z_zMx>LV$QmPovJU_c;vs%DltumbJ^;z1_wPW%H-PV8bnX;DLvkzTRGEzyrrnYPV&E zX$}84a%R3OtS?t`+;J&LkmrKjb*6fqcv{lvrcv(|f*)oL%NXf04}iiV(-IKxJ-IFl z#4cMK&Ib3u;~ccw_;+Mcd$`}UP)M`Pdk9_SId=yhzP0BHH}Oam4pcT9<;i+3C?%Qs zD=U&(K|_7}zn;v!>{A5sKlcU&k=xb$&{a6MS#sLNh+<7e-nnjVt@K9VnjTw-K*o1N z=hycC3NpPpk4e=am{+@51KXdzQN}qI;mUMd2eqwD^k&|2SwHv(iRX@5SSmJ$_$x7F z46#FTxUV3StO@DS>s1~RaZS+%)gCv!tY1)N$%0f{cY;7AMU+n$CI2!{s=i2LLh&wb zuFr@!XSmdRh~#p1IK7rCy-P!Nu$7>MjsHaqyGy*DG;QF|{Nne7m<;0*c#xZ&1}jNx zALd`%>9$Lu+xK_^<|-GkvT7M#H{Ul_fgu**&ebyDW%NG&L^58yBfVX+c>5{Hf=&9` zkKG?w+1z+OPEP0HmRsBNDr5vo;K;4L{J%(Sx5UQKxPxE?AH(Tyb9(l%T56$*eei;CZbyEi%)>;EkGIyfkBm zm-4TfmYf#uEDsdLqjkpIW7rVW!ss@&-?foQMXl@73*sFNt7voUgHT{i3RfYXEoNXD z5O`i|C``F>%}>RKSGDkw*~+WSQUiZG|74WRHWA^m*3SNr7G&OoBat)pJwE6t zvWn--KlKo@Fux}a<=RcQGvWI{Uh__2a;v9D03sW|XaHos^qK?QY-JCAH);BfXXyo? z|t*Uv*>Rn#=pDF{^oE;HTXbc_nggMHwuW!&b_vc%I}i-VJ1t+)qmfr zI0)4L73)UAAiF=`b}ojV5VTo+Pb<1KQC@ain|-%fns~4_*8|WM%zN|at^5~i1~mX! z(WR4JR0~^pE^`Rag^kmf@l@hd{npXfgFWn0XX+|GPKR-Ao|Sr&F9Akh)ziKH$z1QX ztpCvj905E|aW-tZ>XsVYGhKk<&oL*Jk@*G8|8X>lv{`AS@_AKeWPuqqDW^E8=7kWV zFSpmnFSd1_DGw(zIe%f#>E>bO6z%oJ)B5wYb;yv(fG`{J&{Xe)eV@SI)X z{0*6_B-#50z>DAIWs7Xuy>EV-ZSMDj-nMakz84ilzL{p924yz2zeI-8@=_d}W^(RY zAV6F^-V4(WeoXr}xo>ywW%%UHNR!6sXG@QuI>h=Qm1Kt?oSyHM=a6Ix9q1(t!XZm! zch7~kR%#mCv050m*e;}CwKBV} zv`1;Jq)1Bid&+rvRo{p;xh;1rKgB>zu=N$}X=cXj8246-B+26GVc;&Ey)I5hOY_@j z0?0b!Etk=;`W|M#HAhDKxZ$k4yburX3o}`BAMA34-7gN6`eq=xR%RF0SH6e4>dZ^~ zo}IX^B-K+``8GgcFLL{0?j@<7d4eA>O#8U*KeT5KhI;q`rz-WmyXp_tV;l~dv*`?P zV9||Y6?+uR{!;$zfN+}?YyPEjx0U7Uw!Ly6qLm(jEZcy=IYaLv29rviKT6B(S{fIc z6uUbkEvV5yWP~bs2;7x{ek|R4E|~)h}h(tRvTzfQTTU0 zOm++#uj z>taWynV?T~BD+F?5&+sEx1L|o0tsS$K5 z&2PGtmY<6RP{khf^)g{^HalUryC&T}9*o@SsOLeY;UNB&&ZeH7@wSYxGo^7}4$0Hk zwJ`3|9~iP8|D8i=yZ>%#{ng`3Linz<74zf=gM!vfP3IbjUxOVLeyGmTFc3W|e|S7s z{TwJkh}LZ7mW4r>@8jBaPwc4VdyL41jqjQJo6{LCtUth$`J?IfZrqCRD!tcNtDI^) z=nZN}tuNXRKj(2;wxgv49c^c=-a+-&jN`&Yuf5SbaK7R|;b4529(Sa!cL#8^HxD?L zrIlGjU&6U>bb2GHsmyc!rsyQ)if6%psV8CqQ$q;u%`!PI1NdKTpy~Bowe@QWw=~xDx1%~jV4*JaBGP+pQ%IGBQ!C%1x-e&CTLwD--2O9Gjbb)9BQ_W%0 zbx)18o!@Y($|9TCoR<@}a4a`zx%(dN1NQ&k>W;+AHJRl`$<>|j?c^<1yFT~HB@;N` z9ps%nb{=5YOCe!3=EF7iqbu;bfm5*P!%(1WhIZgfs3UfPf13HJy0dU2b4aTktbHKw zyGi-NfDIb|00qCKufSARFlBbiLK%Pcz5mJd(4nh&2cEStRq9r~RYM1x2Gr9|gK4A2 zt;NFF_1R!TWw(xUZBl08YNIes^b3CJmYy`CdY0!XYO(uKeJw>$uusVIcaCr1WZvR0 z)0j6}rS>7l2;qca3|kX@Je%vWTihk!RM!Ou{NAa8o6|0eQQlu3=A>*hW&DOoQ?`o@ zqSHUR0+e)|`P@CrjdBLt0(L0equAE&3_jHQIkTf`?oAGAjs!iZ!eU1SdAGWh4+dU5 z_7mtJ6cCr}HjX`q^3JHc%jsZotYn}cXyed7Vo721@Y1R}_sQIPgRLLmytcTng4p}6 z15aOU*N(3Pmo0RdgZ9ii_!|3&8`r(Q_W%87wtv9f*^1f6tEo4F0X$cEtFHsztMpg4 z)UF(6z^_ikjaZ$fjFo$}t19_fVm}7C;pM=i6#&r0^^&+mSJ6EncII~>l77U(^xPHL zYDf_7i-RZsz{Us_NFKqacK+hr6*|?zySD%byLpo2T$S2AWL(aF{FV&Mz^t-Djr&vL zkO!G3d(LhO`(ysAg982q)JkH*e#5GWMa>th^RoX&1J^c}!A9gcnCf1#lhW3y&S)g+ z8tV1dErOj%mg$BY^eCw0knS@~TX;mvr|;!a6#PZBw+DB16d3Tu1hnAyw+4vPa=XhG zdp`KjM`ne#1<87_cou+_+NXD}dMdzA`)zd=QTO8R^r+T1N3Y6b{xOD2-UudV^pd`` z&I%LwbyjF5YfkyTz2Od5Pp-X@E1 z;IkR5po7p9CQ0Lv&vJnYcO$6Ne0SwonfJd?z2L))^{6C>pJ8kAGxUvq+VI*_XxF{y zw9%gE4~DBA>S5*i`!WcfiM?4Rx6CQJHCwSqvi}FC`j!`Hr)lcDQ@1~E)L|eVd2Gn- zkQWdxdYS*~0$d=$6lF$oq_@=hwjn7hEa~CuulLiL%Vr;=4fi+$VbuN%U@EH(9l4$H z2PH|5NYscwtP`*OWnRN$>+W*r{6n}cKifTMuw$%K>BBf@E=XTmp&OJw~q`t^rAwDbKg2+Bj{xT8N{?ANyA(W~PS5!FP8-&e*Wf*FkR`1bvfQ zS^ewdf182cdlrAC?|aPX(pvX*?za@{s8?$Xo0FenZqI+yV|-vZRxi(5Ft$zdw(~yT z0b$Ahcq4Q{l+Wf%K4u)JjRlcQoWWZMv7Y30#>873HdZ$cxm{cLjZ|;JC_M>n+Ap(V zGaG4G$xa{{pYES&t+Pwfxq8?p`uQP8-LPXpwkAM&7+;d&_D<>+^OsrR?g@%XVP7$U*{3~ySpwO;&8@_FQS7sCweGD|L+h@nsFYAdyAZMbmbY0^o9iRb4w-g)w+(0< zPir>aqA@zJIA4(R@^c+LCLH>ih&kKLc{BgqgzWyn9hJm+AujlLNiuR#h z-M2cQeBeo=+j=YKd)-s-x2?*fDs=vt@pO$9Fmf^B{ z=$b{_on4KKwv4x-e_Ht2?vD$E=RqE%xo5sI;E{=i?i_m;K7k^6_q&GK5q|B=167G$ zYgaG$ze<(NyX&I9>Saj{HgU}U9cgwUmh7eAk9Hj38Uc}r&+>0zRSJPwQ#x~$9a>Z~ zyI|5n*T~y9x5W;+isfu*^dEp3f1|JSkJXBQXW6ZN?G{xGhz$sp~*VUZ^RsOC`ZG`_8DR_DBR0R zW@of258SUun_yDS?$B>}uQt?99kP#&mtPIIXQ^W}&7L9lq7QK^<^9r{fsxYPW9K&a zmjE|qVN&i!>R$7EwzO5!zGtyLa*wajmN^wPX2(aXKQ9qRy(4y}uge|mX7gCGF*VyR z+TTLE_~<=4*+J>*cWU?=5Qwt^2}(=j&r_6h^0HvEBWjJ8eAD3m^0_$SoZ?YV3C!q$ zCe)HUydez_6o1=KL>8|~47{(Ep#atZfSgD-mXYb|yd|%_Z}v4B0%Z=`4f5s=dW^-O z&W6(indC;D=Fod=bD3UNM6!t}g7{d~?avx1g1D6{x1%g3s@+_O2>d3LZ4!Fjt~Vct z1Qis@5=^81BhHTAyFSaGcyf105x;l&+U1*^(i$3q9K5CMS$P>YZueLC%GALE4i%ieS0?# z#4DQ#O5qut&~vb_qUsBjqRC-@6O6Pv);H$6T5~ysAxbp65`>@{o|nfv{}Oo6>8zTI z^Ss(hdcR-ALv_+2t`K3@⩔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≪}3P~(;nMr*}@}EYo^2!eU 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

$^9S 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ℑ&) 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

+zzY6M5hLDLpk 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 XsQkSLkN5O{8}9wVp?rS3;6v~qadTke literal 0 HcmV?d00001 diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index 71c40116b..861cf264a 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -223,6 +223,21 @@ class TestFileEps(PillowTestCase): self._test_readline_file_psfile(s, ending) + def test_open_eps(self): + # https://github.com/python-pillow/Pillow/issues/1104 + # Arrange + FILES = ["Tests/images/illu10_no_preview.eps", + "Tests/images/illu10_preview.eps", + "Tests/images/illuCS6_no_preview.eps", + "Tests/images/illuCS6_preview.eps"] + + # Act + for filename in FILES: + img = Image.open(filename) + + # Assert + self.assertEqual(img.mode, "RGB") + if __name__ == '__main__': unittest.main() From b885c04388e27aea85f2385d7a948fff25618618 Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 26 Mar 2015 14:06:54 +0200 Subject: [PATCH 321/532] EPS parser: don't index blank lines --- PIL/EpsImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/EpsImagePlugin.py b/PIL/EpsImagePlugin.py index d077ca1ab..83024b63f 100644 --- a/PIL/EpsImagePlugin.py +++ b/PIL/EpsImagePlugin.py @@ -275,13 +275,13 @@ class EpsImageFile(ImageFile.ImageFile): s = fp.readline().strip('\r\n') - if s[0] != "%": + if s[:1] != "%": break # # Scan for an "ImageData" descriptor - while s[0] == "%": + while s[:1] == "%": if len(s) > 255: raise SyntaxError("not an EPS file") From 735d34260814f9180b773723fd741a7da73047ed Mon Sep 17 00:00:00 2001 From: Martin Fitzpatrick Date: Thu, 26 Mar 2015 13:25:26 +0100 Subject: [PATCH 322/532] Add support for HTTP response objects to Image.open() HTTP response objects returned from `urllib2.urlopen(url)` or `requests.get(url, stream=True).raw` are 'file-like' but do not support `.seek()` operations. As a result PIL is unable to open them as images, requiring a wrap in `cStringIO` or `BytesIO`. This commit adds this functionality to `Image.open()` by way of an `.seek(0)` check and catch on exception `AttributeError` or `io.UnsupportedOperation`. If this is caught we attempt to wrap the object using `io.BytesIO` (which will only work on buffer-file-like objects). This allows opening of files using both `urllib2` and `requests`, e.g. Image.open(urllib2.urlopen(url)) Image.open(requests.get(url, stream=True).raw) --- PIL/Image.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/PIL/Image.py b/PIL/Image.py index 2f304a9a8..58944f891 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -109,6 +109,7 @@ from PIL._util import deferred_error import os import sys +import io # type stuff import collections @@ -2248,6 +2249,11 @@ def open(fp, mode="r"): else: filename = "" + try: + fp.seek(0) + except (AttributeError, io.UnsupportedOperation): + fp = io.BytesIO(fp.read()) + prefix = fp.read(16) preinit() From 508c8dbe002c4dac7356bf41456b2ab374689066 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 27 Mar 2015 06:56:34 -0400 Subject: [PATCH 323/532] Fix manifest [ci skip] --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index b808ad17b..4fb47c637 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -9,6 +9,7 @@ include *.yaml include .coveragerc include .gitattributes include .travis.yml +include LICENSE include Makefile include tox.ini recursive-include PIL *.md From 860a1dedf1e530ef21fc1052c8229ff8ae1492be Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 27 Mar 2015 07:02:02 -0400 Subject: [PATCH 324/532] Prep 2.8.0 No ci skip here because let's see CI run w/new version numbers. I'm starting to think (again) this bump should happen immediately after the release instead of right before the next? But I know @wiredfool had some objection to this at some point. As a compromise, maybe we could change to 2.9.0dev immediately following the release of 2.8.0. --- PIL/__init__.py | 2 +- _imaging.c | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PIL/__init__.py b/PIL/__init__.py index 4d5d7b35b..d1537769e 100644 --- a/PIL/__init__.py +++ b/PIL/__init__.py @@ -12,7 +12,7 @@ # ;-) VERSION = '1.1.7' # PIL version -PILLOW_VERSION = '2.7.0' # Pillow +PILLOW_VERSION = '2.8.0' # Pillow _plugins = ['BmpImagePlugin', 'BufrStubImagePlugin', diff --git a/_imaging.c b/_imaging.c index 6ae120688..c3be9beab 100644 --- a/_imaging.c +++ b/_imaging.c @@ -71,7 +71,7 @@ * See the README file for information on usage and redistribution. */ -#define PILLOW_VERSION "2.7.0" +#define PILLOW_VERSION "2.8.0" #include "Python.h" diff --git a/setup.py b/setup.py index 7262db39e..558c4aed1 100644 --- a/setup.py +++ b/setup.py @@ -90,7 +90,7 @@ except (ImportError, OSError): NAME = 'Pillow' -PILLOW_VERSION = '2.7.0' +PILLOW_VERSION = '2.8.0' TCL_ROOT = None JPEG_ROOT = None JPEG2K_ROOT = None From b3ea34fb88b4b7b5dbde2a988c5bc99df9f9179c Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 28 Mar 2015 07:22:14 -0400 Subject: [PATCH 325/532] Document #1151 [ci skip] --- docs/releasenotes/2.7.0.rst | 4 ++-- docs/releasenotes/2.8.0.rst | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 docs/releasenotes/2.8.0.rst diff --git a/docs/releasenotes/2.7.0.rst b/docs/releasenotes/2.7.0.rst index 8359bd7aa..65a8f2d11 100644 --- a/docs/releasenotes/2.7.0.rst +++ b/docs/releasenotes/2.7.0.rst @@ -1,5 +1,5 @@ -Pillow 2.7.0 -============ +2.7.0 +===== Sane Plugin ----------- diff --git a/docs/releasenotes/2.8.0.rst b/docs/releasenotes/2.8.0.rst new file mode 100644 index 000000000..5fe485875 --- /dev/null +++ b/docs/releasenotes/2.8.0.rst @@ -0,0 +1,14 @@ +2.8.0 +===== + +Open HTTP response objects with Image.open +------------------------------------------ + +HTTP response objects returned from `urllib2.urlopen(url)` or `requests.get(url, stream=True).raw` are 'file-like' but do not support `.seek()` operations. As a result PIL was unable to open them as images, requiring a wrap in `cStringIO` or `BytesIO`. + +Now new functionality has been added to `Image.open()` by way of an `.seek(0)` check and catch on exception `AttributeError` or `io.UnsupportedOperation`. If this is caught we attempt to wrap the object using `io.BytesIO` (which will only work on buffer-file-like objects). + +This allows opening of files using both `urllib2` and `requests`, e.g.:: + + Image.open(urllib2.urlopen(url)) + Image.open(requests.get(url, stream=True).raw) From 144e45cbb72c92ecaa3d47f4c04ac66492180a45 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 28 Mar 2015 07:27:45 -0400 Subject: [PATCH 326/532] Update CHANGES [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index dea818960..5fea75209 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Add support for HTTP response objects to Image.open() + [mfitzp] + - Improve reference docs for PIL.ImageDraw.Draw.pieslice() #1145 [audreyr] From 6151cfd411c0e0790f15825b93cbc028ef584f1b Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 28 Mar 2015 07:34:47 -0400 Subject: [PATCH 327/532] Add 2.8.0 release notes to index [ci skip] --- docs/releasenotes/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index c2f95f670..3ffb9c4f1 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -5,3 +5,4 @@ Release Notes :maxdepth: 2 2.7.0 + 2.8.0 From 174d9ac083327723c82274ee4af228dd7f9dfa33 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 29 Mar 2015 15:02:53 -0400 Subject: [PATCH 328/532] Add Image.open(url) tip from @mjpieters [ci skip] --- docs/releasenotes/2.8.0.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/releasenotes/2.8.0.rst b/docs/releasenotes/2.8.0.rst index 5fe485875..85235d72a 100644 --- a/docs/releasenotes/2.8.0.rst +++ b/docs/releasenotes/2.8.0.rst @@ -12,3 +12,11 @@ This allows opening of files using both `urllib2` and `requests`, e.g.:: Image.open(urllib2.urlopen(url)) Image.open(requests.get(url, stream=True).raw) + +If the response uses content-encoding (compression, either gzip or deflate) then this will fail as both the urllib2 and requests raw file object will produce compressed data in that case. Using Content-Encoding on images is rather non-sensical as most images are already compressed, but it can still happen. + +For requests the work-around is to set the decode_content attribute on the raw object to True:: + + response = requests.get(url, stream=True) + response.raw.decode_content = True + image = Image.open(response.raw) From 75a760e5d6abe351e159fb1ce78a889d4a698d36 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 09:35:45 +1100 Subject: [PATCH 329/532] Fixed unused imports and removed or commented unused variables from FpximagePlugin --- PIL/FpxImagePlugin.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PIL/FpxImagePlugin.py b/PIL/FpxImagePlugin.py index 7e1d09dc8..e435cb447 100644 --- a/PIL/FpxImagePlugin.py +++ b/PIL/FpxImagePlugin.py @@ -20,7 +20,7 @@ __version__ = "0.1" from PIL import Image, ImageFile -from PIL.OleFileIO import * +from PIL.OleFileIO import i8, i32, MAGIC # we map from colour field tuples to (mode, rawmode) descriptors @@ -130,15 +130,15 @@ class FpxImageFile(ImageFile.ImageFile): fp = self.ole.openstream(stream) # skip prefix - p = fp.read(28) + fp.read(28) # header stream s = fp.read(36) size = i32(s, 4), i32(s, 8) - tilecount = i32(s, 12) + #tilecount = i32(s, 12) tilesize = i32(s, 16), i32(s, 20) - channels = i32(s, 24) + #channels = i32(s, 24) offset = i32(s, 28) length = i32(s, 32) From d88a7b778fcebee6afabf1d939a9fd9d48853e32 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 08:58:10 +1100 Subject: [PATCH 330/532] Added missing self argument in PyAccess --- PIL/PyAccess.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/PyAccess.py b/PIL/PyAccess.py index 28829051d..a3f1c3909 100644 --- a/PIL/PyAccess.py +++ b/PIL/PyAccess.py @@ -54,7 +54,7 @@ class PyAccess(object): print (vals) self._post_init() - def _post_init(): + def _post_init(self): pass def __setitem__(self, xy, color): From 0ca14909eddd9d158b692015f763c95782150a36 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 09:04:28 +1100 Subject: [PATCH 331/532] Fixed duplicate import in pilprint --- Scripts/pilprint.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Scripts/pilprint.py b/Scripts/pilprint.py index be42e0a75..efa2b9862 100644 --- a/Scripts/pilprint.py +++ b/Scripts/pilprint.py @@ -11,6 +11,7 @@ # 0.3 2003-05-06 fl Fixed a typo or two. # +import getopt, os, sys from __future__ import print_function VERSION = "pilprint 0.3/2003-05-05" @@ -21,15 +22,12 @@ from PIL import PSDraw letter = ( 1.0*72, 1.0*72, 7.5*72, 10.0*72 ) def description(file, image): - import os title = os.path.splitext(os.path.split(file)[1])[0] format = " (%dx%d " if image.format: format = " (" + image.format + " %dx%d " return title + format % image.size + image.mode + ")" -import getopt, os, sys - if len(sys.argv) == 1: print("PIL Print 0.2a1/96-10-04 -- print image files") print("Usage: pilprint files...") From 128280e5b85147c7c64ee1225b7f4f7e64bfec8e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 09:08:39 +1100 Subject: [PATCH 332/532] Fixed duplicate import in Tests helper --- Tests/helper.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/helper.py b/Tests/helper.py index 563f42060..d8f88656b 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -165,7 +165,6 @@ class PillowTestCase(unittest.TestCase): # helpers -import sys py3 = (sys.version_info >= (3, 0)) From 192fa39fb72ee88ad5039f8f217b769502f0ac0d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 09:10:12 +1100 Subject: [PATCH 333/532] Fixed duplicate import in test_imagecms --- Tests/test_imagecms.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index d669b4de5..93bdda44c 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -240,7 +240,6 @@ class TestImageCms(PillowTestCase): self.assert_image_similar(hopper(), out, 2) def test_profile_tobytes(self): - from io import BytesIO i = Image.open("Tests/images/rgb.jpg") p = ImageCms.getOpenProfile(BytesIO(i.info["icc_profile"])) From 444d9d5731d622019f5c1ad51a792dce976e8412 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 10:29:26 +1100 Subject: [PATCH 334/532] Changed variable name foo since it has been blacklisted in health --- Tests/test_image_transform.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index 4306e9b43..26ff8822c 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -128,13 +128,13 @@ class TestImageTransform(PillowTestCase): # Running by default, but I'd totally understand not doing it in # the future - foo = [ + pattern = [ Image.new('RGBA', (1024, 1024), (a, a, a, a)) for a in range(1, 65) ] # Yeah. Watch some JIT optimize this out. - foo = None + pattern = None self.test_mesh() From d3cab99d318ccc7ea4effabaf49b583b093ef843 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 10:33:44 +1100 Subject: [PATCH 335/532] Removed unused import in pilconvert script --- Scripts/pilconvert.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Scripts/pilconvert.py b/Scripts/pilconvert.py index 934167351..0341994c9 100644 --- a/Scripts/pilconvert.py +++ b/Scripts/pilconvert.py @@ -15,7 +15,6 @@ from __future__ import print_function -import site import getopt, string, sys from PIL import Image From 5114425f6bfb96cadea2cb0dc237ee637eaa9c69 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Tue, 31 Mar 2015 20:13:37 -0400 Subject: [PATCH 336/532] Update CHANGES [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 5fea75209..263ae86b6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Various code health fixes + [radarhere] + - Add support for HTTP response objects to Image.open() [mfitzp] From 120982574a0f9a255fbe18f78d4017b5dee8d95c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 11:11:49 +1100 Subject: [PATCH 337/532] Moved __future__ import to the top of pilprint script --- Scripts/pilprint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/pilprint.py b/Scripts/pilprint.py index efa2b9862..889944de7 100644 --- a/Scripts/pilprint.py +++ b/Scripts/pilprint.py @@ -11,8 +11,8 @@ # 0.3 2003-05-06 fl Fixed a typo or two. # -import getopt, os, sys from __future__ import print_function +import getopt, os, sys VERSION = "pilprint 0.3/2003-05-05" From 440022e59f41a47318986d9dd6a3470a059d7033 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 11:14:27 +1100 Subject: [PATCH 338/532] Added missing import in FpxImagePlugin --- PIL/FpxImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/FpxImagePlugin.py b/PIL/FpxImagePlugin.py index e435cb447..e92ee89eb 100644 --- a/PIL/FpxImagePlugin.py +++ b/PIL/FpxImagePlugin.py @@ -19,7 +19,7 @@ __version__ = "0.1" -from PIL import Image, ImageFile +from PIL import Image, ImageFile, OleFileIO from PIL.OleFileIO import i8, i32, MAGIC From 0d64171481c29ec5355ccc29032ff1477815bf98 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Tue, 31 Mar 2015 20:22:09 -0400 Subject: [PATCH 339/532] Configure setuptools to run nosetests, fixes #729 http://nose.readthedocs.org/en/latest/setuptools_integration.html --- CHANGES.rst | 3 +++ setup.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 263ae86b6..cafc92077 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Configure setuptools to run nosetests, fixes #729 + [aclark] + - Various code health fixes [radarhere] diff --git a/setup.py b/setup.py index 558c4aed1..f0d2e9399 100644 --- a/setup.py +++ b/setup.py @@ -754,7 +754,7 @@ setup( include_package_data=True, packages=find_packages(), scripts=glob.glob("Scripts/pil*.py"), - test_suite='PIL.tests', + test_suite='nose.collector', keywords=["Imaging", ], license='Standard PIL License', zip_safe= not debug_build(), From b1517e717624f9638fd8a0f22e3ad68d4862b4df Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Tue, 31 Mar 2015 21:14:32 -0400 Subject: [PATCH 340/532] Update CHANGES [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index cafc92077..40e727870 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Fix: Cannot identify EPS images, fixes #1104 + [hugovk] + - Configure setuptools to run nosetests, fixes #729 [aclark] From 1f6f358132a4569694cddccc1c4efb3a5aeac5aa Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Tue, 31 Mar 2015 21:36:52 -0400 Subject: [PATCH 341/532] Update CHANGES [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 40e727870..5048271ff 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (unreleased) ------------------ +- Re-enable test image caching + [hugovk, homm] + - Fix: Cannot identify EPS images, fixes #1104 [hugovk] From 6572728275b96194a908a1a03d0595eee5f995a5 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Tue, 31 Mar 2015 21:44:07 -0400 Subject: [PATCH 342/532] We're going downtown [ci skip] https://www.youtube.com/watch?v=QCz9CdOCh7w (Set release date for 2.8.0 happening in < 8 hours) --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 5048271ff..0ce3a43b0 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,7 +1,7 @@ Changelog (Pillow) ================== -2.8.0 (unreleased) +2.8.0 (2015-04-01) ------------------ - Re-enable test image caching From 1f5aeea463f1c5e436f2757ba53829a8c2911d81 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 12:21:58 +1100 Subject: [PATCH 343/532] Fixed incorrect import in FpxImagePlugin --- PIL/FpxImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/FpxImagePlugin.py b/PIL/FpxImagePlugin.py index e92ee89eb..ed0c20c4e 100644 --- a/PIL/FpxImagePlugin.py +++ b/PIL/FpxImagePlugin.py @@ -19,8 +19,8 @@ __version__ = "0.1" -from PIL import Image, ImageFile, OleFileIO -from PIL.OleFileIO import i8, i32, MAGIC +from PIL import Image, ImageFile +from PIL.OleFileIO import i8, i32, MAGIC, OleFileIO # we map from colour field tuples to (mode, rawmode) descriptors From 1199665033c93755653be3ebbe5e9467aa18f642 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 12:29:20 +1100 Subject: [PATCH 344/532] Removed duplicate import from OleFileIO --- PIL/OleFileIO.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index c1cc5d5b6..6a6b644bb 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -1983,8 +1983,6 @@ class OleFileIO: if __name__ == "__main__": - import sys - # [PL] display quick usage info if launched from command-line if len(sys.argv) <= 1: print(__doc__) From 68d9860921ce7b9b4d1204cd62a97b31af11c297 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 12:42:39 +1100 Subject: [PATCH 345/532] Changed list comprehension variable name to avoid redefinition --- PIL/BdfFontFile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/BdfFontFile.py b/PIL/BdfFontFile.py index c52812450..0c1614e0f 100644 --- a/PIL/BdfFontFile.py +++ b/PIL/BdfFontFile.py @@ -69,8 +69,8 @@ def bdf_char(f): bitmap.append(s[:-1]) bitmap = b"".join(bitmap) - [x, y, l, d] = [int(s) for s in props["BBX"].split()] - [dx, dy] = [int(s) for s in props["DWIDTH"].split()] + [x, y, l, d] = [int(p) for p in props["BBX"].split()] + [dx, dy] = [int(p) for p in props["DWIDTH"].split()] bbox = (dx, dy), (l, -d-y, x+l, -d), (0, 0, x, y) From 094a2ca59290da4fcd2372d734a09924a9a62dec Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Tue, 31 Mar 2015 21:48:45 -0400 Subject: [PATCH 346/532] I am aclark4life on GitHub [ci skip] --- CHANGES.rst | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 0ce3a43b0..8a9cadd67 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -11,7 +11,7 @@ Changelog (Pillow) [hugovk] - Configure setuptools to run nosetests, fixes #729 - [aclark] + [aclark4life] - Various code health fixes [radarhere] @@ -152,7 +152,7 @@ Changelog (Pillow) [wiredfool] - Fix manifest to include all test files. - [aclark] + [aclark4life] 2.6.0 (2014-10-01) ------------------ @@ -322,7 +322,7 @@ Changelog (Pillow) [wirefool] - Top level flake8 fixes #741 - [aclark] + [aclark4life] - Remove obsolete Animated Raster Graphics (ARG) support [hugovk] @@ -451,7 +451,7 @@ Changelog (Pillow) [larsmans] - Avoid conflicting _expand functions in PIL & MINGW, fixes #538 - [aclark] + [aclark4life] - Merge from Philippe Lagadec’s OleFileIO_PL fork [vadmium] @@ -866,13 +866,13 @@ Changelog (Pillow) [blueyed] - Package cleanup and additional documentation - [aclark] + [aclark4life] 1.7.4 (2011-07-21) ------------------ - Fix brown bag release - [aclark] + [aclark4life] 1.7.3 (2011-07-20) ------------------ @@ -884,19 +884,19 @@ Changelog (Pillow) ------------------ - Bug fix: Python 2.4 compat - [aclark] + [aclark4life] 1.7.1 (2011-05-31) ------------------ - More multi-arch support - [SteveM, regebro, barry, aclark] + [SteveM, regebro, barry, aclark4life] 1.7.0 (2011-05-27) ------------------ - Add support for multi-arch library directory /usr/lib/x86_64-linux-gnu - [aclark] + [aclark4life] 1.6 (12/01/2010) ---------------- @@ -905,28 +905,28 @@ Changelog (Pillow) [elro] - Doc fixes - [aclark] + [aclark4life] 1.5 (11/28/2010) ---------------- - Module and package fixes - [aclark] + [aclark4life] 1.4 (11/28/2010) ---------------- - Doc fixes - [aclark] + [aclark4life] 1.3 (11/28/2010) ---------------- - Add support for /lib64 and /usr/lib64 library directories on Linux - [aclark] + [aclark4life] - Doc fixes - [aclark] + [aclark4life] 1.2 (08/02/2010) ---------------- @@ -935,23 +935,23 @@ Changelog (Pillow) [jezdez] - Doc fixes - [aclark] + [aclark4life] 1.1 (07/31/2010) ---------------- - Removed setuptools_hg requirement - [aclark] + [aclark4life] - Doc fixes - [aclark] + [aclark4life] 1.0 (07/30/2010) ---------------- - Remove support for ``import Image``, etc. from the standard namespace. ``from PIL import Image`` etc. now required. - Forked PIL based on `Hanno Schlichting's re-packaging `_ - [aclark] + [aclark4life] .. Note:: What follows is the original PIL 1.1.7 CHANGES From c562c557887cbdeca41eff888cd9c03fe53e0ea4 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Tue, 31 Mar 2015 22:00:53 -0400 Subject: [PATCH 347/532] Camel case nit [ci skip] --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f0d2e9399..a5f114d88 100644 --- a/setup.py +++ b/setup.py @@ -730,7 +730,7 @@ setup( version=PILLOW_VERSION, description='Python Imaging Library (Fork)', long_description=_read('README.rst').decode('utf-8'), - author='Alex Clark (fork author)', + author='Alex Clark (Fork Author)', author_email='aclark@aclark.net', url='http://python-pillow.github.io/', classifiers=[ From d8c69ef5aa534bd06b1eefcd6c59b8c73c1ffe81 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Tue, 31 Mar 2015 22:01:05 -0400 Subject: [PATCH 348/532] Fix link; wording nit [ci skip] --- docs/about.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/about.rst b/docs/about.rst index 90da5a609..547d4dac3 100644 --- a/docs/about.rst +++ b/docs/about.rst @@ -17,7 +17,7 @@ The fork authors' goal is to foster active development of PIL through: License ------- -Like PIL itself, Pillow is licensed under the MIT-like `PIL Software License `:: +Like PIL, Pillow is licensed under the MIT-a-like `PIL Software License `_:: Software License From 3cd7f0e6f29fe4547c8f995d0463be5c2f6f67e4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 15:14:56 +1100 Subject: [PATCH 349/532] Removed unused variable in Jpeg2KEncode --- libImaging/Jpeg2KEncode.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libImaging/Jpeg2KEncode.c b/libImaging/Jpeg2KEncode.c index ea4bca2f2..868cfdb41 100644 --- a/libImaging/Jpeg2KEncode.c +++ b/libImaging/Jpeg2KEncode.c @@ -257,7 +257,7 @@ j2k_encode_entry(Imaging im, ImagingCodecState state, opj_image_cmptparm_t image_params[4]; unsigned xsiz, ysiz; unsigned tile_width, tile_height; - unsigned tiles_x, tiles_y, num_tiles; + unsigned tiles_x, tiles_y; unsigned x, y, tile_ndx; unsigned n; j2k_pack_tile_t pack; @@ -471,8 +471,6 @@ j2k_encode_entry(Imaging im, ImagingCodecState state, tiles_y = (im->ysize + (params.image_offset_y0 - params.cp_ty0) + tile_height - 1) / tile_height; - num_tiles = tiles_x * tiles_y; - state->buffer = malloc (tile_width * tile_height * components * prec / 8); tile_ndx = 0; From b75ee4c5b618c36e6fa5c7618405010081a14ea0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 15:26:00 +1100 Subject: [PATCH 350/532] Added tests for font paths without extensions and for preferring ttf extensions --- PIL/ImageFont.py | 4 ++-- Tests/test_imagefont.py | 32 +++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 92722a7fe..9aa163c68 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -279,8 +279,8 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): lindirs = '/usr/share' dirs += [os.path.join(lindir, "fonts") for lindir in lindirs.split(":")] elif sys.platform == 'darwin': - dirs += ['/Library/Fonts/', '/System/Library/Fonts/', - os.path.expanduser('~/Library/Fonts/')] + dirs += ['/Library/Fonts', '/System/Library/Fonts', + os.path.expanduser('~/Library/Fonts')] ext = os.path.splitext(ttf_filename)[1] firstFontWithADifferentExtension = None diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index a7d3e5ebb..dff1bce2a 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -233,7 +233,7 @@ try: # Assert self.assert_image_equal(im, target_img) - def _test_fake_loading_font(self, path_to_fake): + 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): @@ -242,7 +242,7 @@ try: return ImageFont._FreeTypeFont(FONT_PATH, size, index, encoding) return ImageFont._FreeTypeFont(filepath, size, index, encoding) with SimplePatcher(ImageFont, 'FreeTypeFont', loadable_font): - font = ImageFont.truetype('Arial') + font = ImageFont.truetype(fontname) #Make sure it's loaded name = font.getname() self.assertEqual(('FreeMono', 'Regular'), name) @@ -252,29 +252,43 @@ try: def test_find_linux_font(self): #A lot of mocking here - this is more for hitting code and catching #syntax like errors + fontDirectory = '/usr/local/share/fonts' with SimplePatcher(sys, 'platform', 'linux'): patched_env = copy.deepcopy(os.environ) patched_env['XDG_DATA_DIRS'] = '/usr/share/:/usr/local/share/' with SimplePatcher(os, 'environ', patched_env): def fake_walker(path): - if path == '/usr/local/share/fonts': - return [(path, [], ['Arial.ttf'], )] + if path == fontDirectory: + return [(path, [], ['Arial.ttf', 'Single.otf', 'Duplicate.otf', 'Duplicate.ttf'], )] return [(path, [], ['some_random_font.ttf'], )] with SimplePatcher(os, 'walk', fake_walker): - self._test_fake_loading_font('/usr/local/share/fonts/Arial.ttf') + # Test that the font loads both with and without the extension + self._test_fake_loading_font(fontDirectory+'/Arial.ttf', 'Arial.ttf') + self._test_fake_loading_font(fontDirectory+'/Arial.ttf', 'Arial') + + # Test that non-ttf fonts can be found without the extension + self._test_fake_loading_font(fontDirectory+'/Single.otf', 'Single') + + # Test that ttf fonts are preferred if the extension is not specified + self._test_fake_loading_font(fontDirectory+'/Duplicate.ttf', 'Duplicate') @unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") def test_find_osx_font(self): #Like the linux test, more cover hitting code rather than testing #correctness. + fontDirectory = '/System/Library/Fonts' with SimplePatcher(sys, 'platform', 'darwin'): - fake_font_path = '/System/Library/Fonts/Arial.ttf' def fake_walker(path): - if path == '/System/Library/Fonts/': - return [(path, [], ['Arial.ttf'], )] + if path == fontDirectory: + return [(path, [], ['Arial.ttf', 'Single.otf', 'Duplicate.otf', 'Duplicate.ttf'], )] return [(path, [], ['some_random_font.ttf'], )] with SimplePatcher(os, 'walk', fake_walker): - self._test_fake_loading_font(fake_font_path) + self._test_fake_loading_font(fontDirectory+'/Arial.ttf', 'Arial.ttf') + self._test_fake_loading_font(fontDirectory+'/Arial.ttf', 'Arial') + + self._test_fake_loading_font(fontDirectory+'/Single.otf', 'Single') + + self._test_fake_loading_font(fontDirectory+'/Duplicate.ttf', 'Duplicate') except ImportError: From 2834b789820f419f3cd214956158372735fe9723 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 17:22:44 +1100 Subject: [PATCH 351/532] Removed or commented unused variables from OleFileIO --- PIL/OleFileIO.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index 6a6b644bb..ebdde80ca 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -1243,7 +1243,7 @@ class OleFileIO: debug( "Number of sectors in the file: %d" % self.nb_sect ) # file clsid (probably never used, so we don't store it) - clsid = _clsid(header[8:24]) + #clsid = _clsid(header[8:24]) self.sectorsize = self.SectorSize #1 << i16(header, 30) self.minisectorsize = self.MiniSectorSize #1 << i16(header, 32) self.minisectorcutoff = self.MiniSectorCutoff # i32(header, 56) @@ -1561,7 +1561,7 @@ class OleFileIO: ## break ## self.direntries.append(_OleDirectoryEntry(entry, sid, self)) # load root entry: - root_entry = self._load_direntry(0) + self._load_direntry(0) # Root entry is the first entry: self.root = self.direntries[0] # read and build all storage trees, starting from the root: @@ -1786,7 +1786,7 @@ class OleFileIO: :returns: True if object exist, else False. """ try: - sid = self._find(filename) + self._find(filename) return True except: return False @@ -1842,11 +1842,11 @@ class OleFileIO: try: # header s = fp.read(28) - clsid = _clsid(s[8:24]) + #clsid = _clsid(s[8:24]) # format id s = fp.read(20) - fmtid = _clsid(s[:16]) + #fmtid = _clsid(s[:16]) fp.seek(i32(s, 16)) # get section From bd3f036a5685e970d698d54770e05df37d2830b8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 17:48:26 +1100 Subject: [PATCH 352/532] Fixed many style problems in OleFileIO resulting from indentation --- PIL/OleFileIO.py | 158 +++++++++++++++++++++++------------------------ 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index ebdde80ca..a08ae0ee3 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -1999,89 +1999,89 @@ Options: check_streams = False for filename in sys.argv[1:]: -## try: - # OPTIONS: - if filename == '-d': - # option to switch debug mode on: - set_debug_mode(True) - continue - if filename == '-c': - # option to switch check streams mode on: - check_streams = True - continue + #try: + # OPTIONS: + if filename == '-d': + # option to switch debug mode on: + set_debug_mode(True) + continue + if filename == '-c': + # option to switch check streams mode on: + check_streams = True + continue - ole = OleFileIO(filename)#, raise_defects=DEFECT_INCORRECT) - print("-" * 68) - print(filename) - print("-" * 68) - ole.dumpdirectory() + ole = OleFileIO(filename)#, raise_defects=DEFECT_INCORRECT) + print("-" * 68) + print(filename) + print("-" * 68) + ole.dumpdirectory() + for streamname in ole.listdir(): + if streamname[-1][0] == "\005": + print(streamname, ": properties") + props = ole.getproperties(streamname, convert_time=True) + props = sorted(props.items()) + for k, v in props: + #[PL]: avoid to display too large or binary values: + if isinstance(v, (basestring, bytes)): + if len(v) > 50: + v = v[:50] + if isinstance(v, bytes): + # quick and dirty binary check: + for c in (1,2,3,4,5,6,7,11,12,14,15,16,17,18,19,20, + 21,22,23,24,25,26,27,28,29,30,31): + if c in bytearray(v): + v = '(binary data)' + break + print(" ", k, v) + + if check_streams: + # Read all streams to check if there are errors: + print('\nChecking streams...') for streamname in ole.listdir(): - if streamname[-1][0] == "\005": - print(streamname, ": properties") - props = ole.getproperties(streamname, convert_time=True) - props = sorted(props.items()) - for k, v in props: - #[PL]: avoid to display too large or binary values: - if isinstance(v, (basestring, bytes)): - if len(v) > 50: - v = v[:50] - if isinstance(v, bytes): - # quick and dirty binary check: - for c in (1,2,3,4,5,6,7,11,12,14,15,16,17,18,19,20, - 21,22,23,24,25,26,27,28,29,30,31): - if c in bytearray(v): - v = '(binary data)' - break - print(" ", k, v) - - if check_streams: - # Read all streams to check if there are errors: - print('\nChecking streams...') - for streamname in ole.listdir(): - # print name using repr() to convert binary chars to \xNN: - print('-', repr('/'.join(streamname)),'-', end=' ') - st_type = ole.get_type(streamname) - if st_type == STGTY_STREAM: - print('size %d' % ole.get_size(streamname)) - # just try to read stream in memory: - ole.openstream(streamname) - else: - print('NOT a stream : type=%d' % st_type) - print() - -## for streamname in ole.listdir(): -## # print name using repr() to convert binary chars to \xNN: -## print('-', repr('/'.join(streamname)),'-', end=' ') -## print(ole.getmtime(streamname)) -## print() - - print('Modification/Creation times of all directory entries:') - for entry in ole.direntries: - if entry is not None: - print('- %s: mtime=%s ctime=%s' % (entry.name, - entry.getmtime(), entry.getctime())) + # print name using repr() to convert binary chars to \xNN: + print('-', repr('/'.join(streamname)),'-', end=' ') + st_type = ole.get_type(streamname) + if st_type == STGTY_STREAM: + print('size %d' % ole.get_size(streamname)) + # just try to read stream in memory: + ole.openstream(streamname) + else: + print('NOT a stream : type=%d' % st_type) print() - # parse and display metadata: - meta = ole.get_metadata() - meta.dump() - print() - #[PL] Test a few new methods: - root = ole.get_rootentry_name() - print('Root entry name: "%s"' % root) - if ole.exists('worddocument'): - print("This is a Word document.") - print("type of stream 'WordDocument':", ole.get_type('worddocument')) - print("size :", ole.get_size('worddocument')) - if ole.exists('macros/vba'): - print("This document may contain VBA macros.") +## for streamname in ole.listdir(): +## # print name using repr() to convert binary chars to \xNN: +## print('-', repr('/'.join(streamname)),'-', end=' ') +## print(ole.getmtime(streamname)) +## print() - # print parsing issues: - print('\nNon-fatal issues raised during parsing:') - if ole.parsing_issues: - for exctype, msg in ole.parsing_issues: - print('- %s: %s' % (exctype.__name__, msg)) - else: - print('None') + print('Modification/Creation times of all directory entries:') + for entry in ole.direntries: + if entry is not None: + print('- %s: mtime=%s ctime=%s' % (entry.name, + entry.getmtime(), entry.getctime())) + print() + + # parse and display metadata: + meta = ole.get_metadata() + meta.dump() + print() + #[PL] Test a few new methods: + root = ole.get_rootentry_name() + print('Root entry name: "%s"' % root) + if ole.exists('worddocument'): + print("This is a Word document.") + print("type of stream 'WordDocument':", ole.get_type('worddocument')) + print("size :", ole.get_size('worddocument')) + if ole.exists('macros/vba'): + print("This document may contain VBA macros.") + + # print parsing issues: + print('\nNon-fatal issues raised during parsing:') + if ole.parsing_issues: + for exctype, msg in ole.parsing_issues: + print('- %s: %s' % (exctype.__name__, msg)) + else: + print('None') ## except IOError as v: ## print("***", "cannot read", file, "-", v) From 68663ad3529611e3a24d39efd43dfe810fcf7561 Mon Sep 17 00:00:00 2001 From: George Davaris Date: Wed, 1 Apr 2015 10:48:28 +0100 Subject: [PATCH 353/532] Define t variable in a more appropriate place --- PIL/ImageFile.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index f81ddf2a0..79faff797 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -196,13 +196,15 @@ class ImageFile(Image.Image): except AttributeError: prefix = b"" + # Buffer length read; assign a default value + t = 0 + for d, e, o, a in self.tile: d = Image._getdecoder(self.mode, d, a, self.decoderconfig) seek(o) try: d.setimage(self.im, e) except ValueError: - t = None continue b = prefix t = len(b) From d20038e8455f60f98c68afe2f7642a1c4a2cb481 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 1 Apr 2015 06:10:17 -0400 Subject: [PATCH 354/532] You don't need to register every release [ci skip] Only once per project --- RELEASING.md | 1 - 1 file changed, 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index 1bd8a28ae..5e6d4649e 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -47,7 +47,6 @@ git push origin --tags * [ ] Ping cgohlke for Windows binaries * [ ] From a clean source directory with no extra temp files: ``` -python setup.py register python setup.py sdist --format=zip upload python setup.py sdist upload ``` From 54956f57c60be90c847c80653bf7d605cbd9b1b7 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 1 Apr 2015 06:15:10 -0400 Subject: [PATCH 355/532] No separate upload required [ci skip] --- RELEASING.md | 1 - 1 file changed, 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index 5e6d4649e..2c3422ef9 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -48,7 +48,6 @@ git push origin --tags * [ ] From a clean source directory with no extra temp files: ``` python setup.py sdist --format=zip upload -python setup.py sdist upload ``` (Debian requests a tarball, everyone else would just prefer that we choose one and stick to it. So both it is) * [ ] Push a commit to https://github.com/python-pillow/pillow-wheels to build OSX versions (UNDONE latest tag or specific release???) From d58e6f873ccb243a847c1b4a3b9c862a9d322f67 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 1 Apr 2015 06:16:36 -0400 Subject: [PATCH 356/532] Add sdist helpers to makefile [ci skip] Document in RELEASING --- Makefile | 15 ++++++++++++++- RELEASING.md | 4 ++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 98e0c647a..b4c6b044d 100644 --- a/Makefile +++ b/Makefile @@ -58,4 +58,17 @@ docs: $(MAKE) -C docs html docserver: - cd docs/_build/html && python -mSimpleHTTPServer 2> /dev/null& \ No newline at end of file + cd docs/_build/html && python -mSimpleHTTPServer 2> /dev/null& + +# Test sdist upload via test.pythonpackages.com, no creds required +# .pypirc: +# [test] +# username: +# password: +# repository = http://test.pythonpackages.com +sdisttest: + python setup.py sdist --format=zip upload -r test +sdistup: + python setup.py sdist --format=zip upload +sdist: + python setup.py sdist --format=zip diff --git a/RELEASING.md b/RELEASING.md index 2c3422ef9..065d951d8 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -49,6 +49,10 @@ git push origin --tags ``` python setup.py sdist --format=zip upload ``` +Or +``` +make sdistup +``` (Debian requests a tarball, everyone else would just prefer that we choose one and stick to it. So both it is) * [ ] Push a commit to https://github.com/python-pillow/pillow-wheels to build OSX versions (UNDONE latest tag or specific release???) * [ ] Retrieve the OS X Wheels from Rackspace files, upload to PyPi (Twine?) From 6dabce59c730a82dd9e950f8c1392c1689561fea Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 1 Apr 2015 06:19:12 -0400 Subject: [PATCH 357/532] Source dists aren't binary [ci skip] --- RELEASING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 065d951d8..18564e3c1 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -20,7 +20,7 @@ Released as required for security or installation fixes. * [ ] Run pre-release check via `make pre` * [ ] Push to release branch in personal repo. Let Travis run cleanly. * [ ] Tag and push to release branch in python-pillow repo. -* [ ] Upload binaries. +* [ ] Upload source and binaries. ## Embargoed Release @@ -42,7 +42,7 @@ git push origin --tags * [ ] Upload binaries -## Binary Upload Process +## Upload Process * [ ] Ping cgohlke for Windows binaries * [ ] From a clean source directory with no extra temp files: From da4469d392b702487c87ab5c3baacaed3e435354 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 1 Apr 2015 06:50:57 -0400 Subject: [PATCH 358/532] Add link to issues [ci skip] --- README.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.rst b/README.rst index ce1c707c3..7c2563387 100644 --- a/README.rst +++ b/README.rst @@ -41,3 +41,5 @@ More Information - `Guides `_ - `Installation `_ - `Reference `_ + +- `Issues Date: Wed, 1 Apr 2015 06:52:12 -0400 Subject: [PATCH 359/532] Fix syntax [ci skip] --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 7c2563387..5a7105455 100644 --- a/README.rst +++ b/README.rst @@ -42,4 +42,4 @@ More Information - `Installation `_ - `Reference `_ -- `Issues `_ From 20fd366eb957debf738dc7c8cfdaf88be8a8c6eb Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 1 Apr 2015 14:18:01 +0300 Subject: [PATCH 360/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 8a9cadd67..9bf7f0889 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (2015-04-01) ------------------ +- Fix UnboundLocalError in ImageFile #1131 + [davarisg] + - Re-enable test image caching [hugovk, homm] From 2879819ce7a4f13d46eb3af1b7f343d14bc85746 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 1 Apr 2015 16:47:01 +0300 Subject: [PATCH 361/532] Style/health fixes --- PIL/GifImagePlugin.py | 107 +++++++++++++++++++-------------------- PIL/ImageFont.py | 25 ++++----- PIL/Jpeg2KImagePlugin.py | 9 ++-- Tests/test_imagefont.py | 88 +++++++++++++++++++------------- Tests/test_pyroma.py | 8 +-- 5 files changed, 128 insertions(+), 109 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 55aece38c..8db42e8e8 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -24,13 +24,11 @@ # See the README file for information on usage and redistribution. # +from PIL import Image, ImageFile, ImagePalette, _binary __version__ = "0.9" -from PIL import Image, ImageFile, ImagePalette, _binary - - # -------------------------------------------------------------------- # Helpers @@ -271,7 +269,7 @@ def _save(im, fp, filename): pass # write uncompressed file if im.mode in RAWMODE: - imOut = im + im_out = im else: # convert on the fly (EXPERIMENTAL -- I'm not sure PIL # should automatically convert images on save...) @@ -279,9 +277,9 @@ def _save(im, fp, filename): palette_size = 256 if im.palette: palette_size = len(im.palette.getdata()[1]) // 3 - imOut = im.convert("P", palette=1, colors=palette_size) + im_out = im.convert("P", palette=1, colors=palette_size) else: - imOut = im.convert("L") + im_out = im.convert("L") # header try: @@ -290,7 +288,7 @@ def _save(im, fp, filename): palette = None im.encoderinfo["optimize"] = im.encoderinfo.get("optimize", True) - header, usedPaletteColors = getheader(imOut, palette, im.encoderinfo) + header, used_palette_colors = getheader(im_out, palette, im.encoderinfo) for s in header: fp.write(s) @@ -315,26 +313,26 @@ def _save(im, fp, filename): else: transparency = int(transparency) # optimize the block away if transparent color is not used - transparentColorExists = True + transparent_color_exists = True # adjust the transparency index after optimize - if usedPaletteColors is not None and len(usedPaletteColors) < 256: - for i in range(len(usedPaletteColors)): - if usedPaletteColors[i] == transparency: + if used_palette_colors is not None and len(used_palette_colors) < 256: + for i in range(len(used_palette_colors)): + if used_palette_colors[i] == transparency: transparency = i - transparentColorExists = True + transparent_color_exists = True break else: - transparentColorExists = False + transparent_color_exists = False # transparency extension block - if transparentColorExists: + if transparent_color_exists: fp.write(b"!" + o8(249) + # extension intro o8(4) + # length o8(1) + # transparency info present o16(0) + # duration - o8(transparency) # transparency index - + o8(0)) + o8(transparency) + # transparency index + o8(0)) # local image header fp.write(b"," + @@ -344,9 +342,9 @@ def _save(im, fp, filename): o8(flags) + # flags o8(8)) # bits - imOut.encoderconfig = (8, interlace) - ImageFile._save(imOut, fp, [("gif", (0, 0)+im.size, 0, - RAWMODE[imOut.mode])]) + im_out.encoderconfig = (8, interlace) + ImageFile._save(im_out, fp, [("gif", (0, 0)+im.size, 0, + RAWMODE[im_out.mode])]) fp.write(b"\0") # end of image data @@ -422,74 +420,75 @@ def getheader(im, palette=None, info=None): if im.mode == "P": if palette and isinstance(palette, bytes): - sourcePalette = palette[:768] + source_palette = palette[:768] else: - sourcePalette = im.im.getpalette("RGB")[:768] + source_palette = im.im.getpalette("RGB")[:768] else: # L-mode if palette and isinstance(palette, bytes): - sourcePalette = palette[:768] + source_palette = palette[:768] else: - sourcePalette = bytearray([i//3 for i in range(768)]) + source_palette = bytearray([i//3 for i in range(768)]) - usedPaletteColors = paletteBytes = None + used_palette_colors = palette_bytes = None if im.mode in ("P", "L") and optimize: - usedPaletteColors = [] + used_palette_colors = [] # check which colors are used i = 0 for count in im.histogram(): if count: - usedPaletteColors.append(i) + used_palette_colors.append(i) i += 1 # create the new palette if not every color is used - if len(usedPaletteColors) < 256: - paletteBytes = b"" - newPositions = {} + if len(used_palette_colors) < 256: + palette_bytes = b"" + new_positions = {} i = 0 # pick only the used colors from the palette - for oldPosition in usedPaletteColors: - paletteBytes += sourcePalette[oldPosition*3:oldPosition*3+3] - newPositions[oldPosition] = i + for oldPosition in used_palette_colors: + palette_bytes += source_palette[oldPosition*3:oldPosition*3+3] + new_positions[oldPosition] = i i += 1 # replace the palette color id of all pixel with the new id - imageBytes = bytearray(im.tobytes()) - for i in range(len(imageBytes)): - imageBytes[i] = newPositions[imageBytes[i]] - im.frombytes(bytes(imageBytes)) - newPaletteBytes = (paletteBytes + - (768 - len(paletteBytes)) * b'\x00') - im.putpalette(newPaletteBytes) - im.palette = ImagePalette.ImagePalette("RGB", palette=paletteBytes, - size=len(paletteBytes)) + image_bytes = bytearray(im.tobytes()) + for i in range(len(image_bytes)): + image_bytes[i] = new_positions[image_bytes[i]] + im.frombytes(bytes(image_bytes)) + new_palette_bytes = (palette_bytes + + (768 - len(palette_bytes)) * b'\x00') + im.putpalette(new_palette_bytes) + im.palette = ImagePalette.ImagePalette("RGB", + palette=palette_bytes, + size=len(palette_bytes)) - if not paletteBytes: - paletteBytes = sourcePalette + if not palette_bytes: + palette_bytes = source_palette # Logical Screen Descriptor # calculate the palette size for the header import math - colorTableSize = int(math.ceil(math.log(len(paletteBytes)//3, 2)))-1 - if colorTableSize < 0: - colorTableSize = 0 + color_table_size = int(math.ceil(math.log(len(palette_bytes)//3, 2)))-1 + if color_table_size < 0: + color_table_size = 0 # size of global color table + global color table flag - header.append(o8(colorTableSize + 128)) + header.append(o8(color_table_size + 128)) # background + reserved/aspect header.append(o8(0) + o8(0)) # end of Logical Screen Descriptor # add the missing amount of bytes # the palette has to be 2< 0: - paletteBytes += o8(0) * 3 * actualTargetSizeDiff + actual_target_size_diff = (2 << color_table_size) - len(palette_bytes)//3 + if actual_target_size_diff > 0: + palette_bytes += o8(0) * 3 * actual_target_size_diff # Header + Logical Screen Descriptor + Global Color Table - header.append(paletteBytes) - return header, usedPaletteColors + header.append(palette_bytes) + return header, used_palette_colors def getdata(im, offset=(0, 0), **params): @@ -497,7 +496,7 @@ def getdata(im, offset=(0, 0), **params): The first string is a local image header, the rest contains encoded image data.""" - class collector: + class Collector: data = [] def write(self, data): @@ -505,7 +504,7 @@ def getdata(im, offset=(0, 0), **params): im.load() # make sure raster data is available - fp = collector() + fp = Collector() try: im.encoderinfo = params diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 9aa163c68..1e5a27f7b 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -262,7 +262,7 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): return FreeTypeFont(font, size, index, encoding) except IOError: ttf_filename = os.path.basename(font) - + dirs = [] if sys.platform == "win32": # check the windows font repository @@ -281,11 +281,11 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): elif sys.platform == 'darwin': dirs += ['/Library/Fonts', '/System/Library/Fonts', os.path.expanduser('~/Library/Fonts')] - + ext = os.path.splitext(ttf_filename)[1] - firstFontWithADifferentExtension = None - for dir in dirs: - for walkroot, walkdir, walkfilenames in os.walk(dir): + first_font_with_a_different_extension = None + for directory in dirs: + for walkroot, walkdir, walkfilenames in os.walk(directory): for walkfilename in walkfilenames: if ext and walkfilename == ttf_filename: fontpath = os.path.join(walkroot, walkfilename) @@ -294,10 +294,11 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): fontpath = os.path.join(walkroot, walkfilename) if os.path.splitext(fontpath)[1] == '.ttf': return FreeTypeFont(fontpath, size, index, encoding) - if not ext and firstFontWithADifferentExtension == None: - firstFontWithADifferentExtension = fontpath - if firstFontWithADifferentExtension: - return FreeTypeFont(firstFontWithADifferentExtension, size, index, encoding) + 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, + index, encoding) raise @@ -310,15 +311,15 @@ def load_path(filename): :return: A font object. :exception IOError: If the file could not be read. """ - for dir in sys.path: - if isDirectory(dir): + for directory in sys.path: + if isDirectory(directory): if not isinstance(filename, str): if bytes is str: filename = filename.encode("utf-8") else: filename = filename.decode("utf-8") try: - return load(os.path.join(dir, filename)) + return load(os.path.join(directory, filename)) except IOError: pass raise IOError("cannot find font file") diff --git a/PIL/Jpeg2KImagePlugin.py b/PIL/Jpeg2KImagePlugin.py index 446699fdb..ed3e1530a 100644 --- a/PIL/Jpeg2KImagePlugin.py +++ b/PIL/Jpeg2KImagePlugin.py @@ -12,14 +12,13 @@ # # See the README file for information on usage and redistribution. # - -__version__ = "0.1" - from PIL import Image, ImageFile import struct import os import io +__version__ = "0.1" + def _parse_codestream(fp): """Parse the JPEG 2000 codestream to extract the size and component @@ -208,8 +207,8 @@ class Jpeg2KImageFile(ImageFile.ImageFile): def _accept(prefix): - return (prefix[:4] == b'\xff\x4f\xff\x51' - or prefix[:12] == b'\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a') + return (prefix[:4] == b'\xff\x4f\xff\x51' or + prefix[:12] == b'\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a') # ------------------------------------------------------------ diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index dff1bce2a..627b28c67 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -22,6 +22,7 @@ try: self._saved = None self._is_saved = False self._value = value + def __enter__(self): # Patch the attr on the object if hasattr(self._parent_obj, self._attr_name): @@ -31,6 +32,7 @@ try: else: setattr(self._parent_obj, self._attr_name, self._value) self._is_saved = False + def __exit__(self, type, value, traceback): # Restore the original value if self._is_saved: @@ -48,14 +50,14 @@ try: ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) self.assertEqual(ttf.path, FONT_PATH) self.assertEqual(ttf.size, FONT_SIZE) - + ttf_copy = ttf.font_variant() self.assertEqual(ttf_copy.path, FONT_PATH) self.assertEqual(ttf_copy.size, FONT_SIZE) - + ttf_copy = ttf.font_variant(size=FONT_SIZE+1) self.assertEqual(ttf_copy.size, FONT_SIZE+1) - + second_font_path = "Tests/fonts/DejaVuSans.ttf" ttf_copy = ttf.font_variant(font=second_font_path) self.assertEqual(ttf_copy.path, second_font_path) @@ -234,61 +236,77 @@ try: self.assert_image_equal(im, target_img) def _test_fake_loading_font(self, path_to_fake, fontname): - #Make a copy of FreeTypeFont so we can patch the original + # 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): if filepath == path_to_fake: - return ImageFont._FreeTypeFont(FONT_PATH, size, index, encoding) - return ImageFont._FreeTypeFont(filepath, size, index, encoding) + return ImageFont._FreeTypeFont(FONT_PATH, size, index, + encoding) + return ImageFont._FreeTypeFont(filepath, size, index, + encoding) with SimplePatcher(ImageFont, 'FreeTypeFont', loadable_font): font = ImageFont.truetype(fontname) - #Make sure it's loaded + # Make sure it's loaded name = font.getname() self.assertEqual(('FreeMono', 'Regular'), name) - - @unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") + @unittest.skipIf(sys.platform.startswith('win32'), + "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 - fontDirectory = '/usr/local/share/fonts' + # A lot of mocking here - this is more for hitting code and + # catching syntax like errors + font_directory = '/usr/local/share/fonts' with SimplePatcher(sys, 'platform', 'linux'): patched_env = copy.deepcopy(os.environ) patched_env['XDG_DATA_DIRS'] = '/usr/share/:/usr/local/share/' with SimplePatcher(os, 'environ', patched_env): def fake_walker(path): - if path == fontDirectory: - return [(path, [], ['Arial.ttf', 'Single.otf', 'Duplicate.otf', 'Duplicate.ttf'], )] + if path == font_directory: + return [(path, [], [ + 'Arial.ttf', 'Single.otf', 'Duplicate.otf', + 'Duplicate.ttf'], )] return [(path, [], ['some_random_font.ttf'], )] with SimplePatcher(os, 'walk', fake_walker): - # Test that the font loads both with and without the extension - self._test_fake_loading_font(fontDirectory+'/Arial.ttf', 'Arial.ttf') - self._test_fake_loading_font(fontDirectory+'/Arial.ttf', 'Arial') - - # Test that non-ttf fonts can be found without the extension - self._test_fake_loading_font(fontDirectory+'/Single.otf', 'Single') - - # Test that ttf fonts are preferred if the extension is not specified - self._test_fake_loading_font(fontDirectory+'/Duplicate.ttf', 'Duplicate') + # Test that the font loads both with and without the + # extension + self._test_fake_loading_font( + font_directory+'/Arial.ttf', 'Arial.ttf') + self._test_fake_loading_font( + font_directory+'/Arial.ttf', 'Arial') - @unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") + # Test that non-ttf fonts can be found without the + # extension + self._test_fake_loading_font( + font_directory+'/Single.otf', 'Single') + + # Test that ttf fonts are preferred if the extension is + # not specified + self._test_fake_loading_font( + font_directory+'/Duplicate.ttf', 'Duplicate') + + @unittest.skipIf(sys.platform.startswith('win32'), + "requires Unix or MacOS") def test_find_osx_font(self): - #Like the linux test, more cover hitting code rather than testing - #correctness. - fontDirectory = '/System/Library/Fonts' + # Like the linux test, more cover hitting code rather than testing + # correctness. + font_directory = '/System/Library/Fonts' with SimplePatcher(sys, 'platform', 'darwin'): def fake_walker(path): - if path == fontDirectory: - return [(path, [], ['Arial.ttf', 'Single.otf', 'Duplicate.otf', 'Duplicate.ttf'], )] + if path == font_directory: + return [(path, [], + ['Arial.ttf', 'Single.otf', + 'Duplicate.otf', 'Duplicate.ttf'], )] return [(path, [], ['some_random_font.ttf'], )] with SimplePatcher(os, 'walk', fake_walker): - self._test_fake_loading_font(fontDirectory+'/Arial.ttf', 'Arial.ttf') - self._test_fake_loading_font(fontDirectory+'/Arial.ttf', 'Arial') - - self._test_fake_loading_font(fontDirectory+'/Single.otf', 'Single') - - self._test_fake_loading_font(fontDirectory+'/Duplicate.ttf', 'Duplicate') + self._test_fake_loading_font( + font_directory+'/Arial.ttf', 'Arial.ttf') + self._test_fake_loading_font( + font_directory+'/Arial.ttf', 'Arial') + self._test_fake_loading_font( + font_directory+'/Single.otf', 'Single') + self._test_fake_loading_font( + font_directory+'/Duplicate.ttf', 'Duplicate') except ImportError: diff --git a/Tests/test_pyroma.py b/Tests/test_pyroma.py index 59aa3810e..0875cc972 100644 --- a/Tests/test_pyroma.py +++ b/Tests/test_pyroma.py @@ -14,6 +14,7 @@ class TestPyroma(PillowTestCase): def setUp(self): try: import pyroma + assert pyroma # Ignore warning except ImportError: self.skipTest("ImportError") @@ -26,9 +27,10 @@ class TestPyroma(PillowTestCase): # Assert if 'rc' in PILLOW_VERSION: - #Pyroma needs to chill about RC versions and not kill all our tests. - self.assertEqual(rating, (9, - ['The packages version number does not comply with PEP-386.'])) + # Pyroma needs to chill about RC versions + # and not kill all our tests. + self.assertEqual(rating, (9, [ + 'The packages version number does not comply with PEP-386.'])) else: # Should have a perfect score From 358ddc3286d6fcf2acbe4a2e8fced94c69b06303 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 1 Apr 2015 10:22:42 -0400 Subject: [PATCH 362/532] Update CHANGES [ci skip] --- CHANGES.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 9bf7f0889..3484b6fda 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -16,8 +16,8 @@ Changelog (Pillow) - Configure setuptools to run nosetests, fixes #729 [aclark4life] -- Various code health fixes - [radarhere] +- Style/health fixes + [radarhere, hugovk] - Add support for HTTP response objects to Image.open() [mfitzp] From 53d1b823518bda72d2c7f04e79f83ed32b776099 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 1 Apr 2015 10:29:01 -0400 Subject: [PATCH 363/532] Add header to orig readme [ci skip] So we can link to it from README --- CHANGES.rst | 3 +++ README.rst | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 3484b6fda..bc5e1af96 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -958,6 +958,9 @@ Changelog (Pillow) .. Note:: What follows is the original PIL 1.1.7 CHANGES +0.2b5 - 1.1.7 (1995-2010) +------------------------- + :: -*- coding: utf-8 -*- diff --git a/README.rst b/README.rst index 5a7105455..fe3f69aa0 100644 --- a/README.rst +++ b/README.rst @@ -35,11 +35,12 @@ More Information - `Changelog `_ - `Contribute `_ + + - `Issues `_ + - `Documentation `_ - `About `_ - `Guides `_ - `Installation `_ - `Reference `_ - -- `Issues `_ From 12ee04a06fc3d2269470105714f77e8bd5f6bd56 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 1 Apr 2015 10:33:11 -0400 Subject: [PATCH 364/532] Include link to pre-fork changelog [ci skip] --- README.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.rst b/README.rst index fe3f69aa0..de4377900 100644 --- a/README.rst +++ b/README.rst @@ -34,6 +34,9 @@ More Information ---------------- - `Changelog `_ + + - `Pre-fork `_ + - `Contribute `_ - `Issues `_ From 071df8d33d4653fed24265dab441f04748a792c9 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 1 Apr 2015 15:38:18 -0400 Subject: [PATCH 365/532] Some Flake 8 fixes --- PIL/BmpImagePlugin.py | 65 +++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index f8a755812..30ca10971 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -57,16 +57,16 @@ 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, 'RLE4': 2, 'BITFIELDS': 3, 'JPEG': 4, 'PNG': 5} RAW, RLE8, RLE4, BITFIELDS, JPEG, PNG = 0, 1, 2, 3, 4, 5 @@ -78,10 +78,10 @@ class BmpImageFile(ImageFile.ImageFile): file_info = dict() file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) file_info['direction'] = -1 - #---------------------- If requested, read header at a specific position + # --------------------- 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 - #---------------------------------------------------- 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]) @@ -89,8 +89,8 @@ class BmpImageFile(ImageFile.ImageFile): 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 + elif file_info['header_size'] in (40, 64, 108, 124): # v3, OS/2 v2, v4, v5 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 @@ -100,7 +100,7 @@ class BmpImageFile(ImageFile.ImageFile): 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])) + 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(map(lambda x: math.ceil(x / 39.3701), file_info['pixels_per_meter'])) @@ -115,27 +115,27 @@ class BmpImageFile(ImageFile.ImageFile): 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']) - #------------------- Special case : header is reported 40, which - #----------------------- is shorter than real size for bpp >= 16 + # ------------------ 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 + # -------- 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 + # -------------------------------- 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), (0xff0000, 0xff00, 0xff, 0xff000000), (0x0, 0x0, 0x0, 0x0)], - 24: [(0xff0000, 0xff00, 0xff)], + 32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000), (0x0, 0x0, 0x0, 0x0)], + 24: [(0xff0000, 0xff00, 0xff)], 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)]} MASK_MODES = { - (32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", - (24, (0xff0000, 0xff00, 0xff)): "BGR", + (32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", + (24, (0xff0000, 0xff00, 0xff)): "BGR", (16, (0xf800, 0x7e0, 0x1f)): "BGR;16", (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']]: @@ -152,9 +152,9 @@ class BmpImageFile(ImageFile.ImageFile): raw_mode, self.mode = "BGRA", "RGBA" 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']) else: @@ -162,23 +162,23 @@ class BmpImageFile(ImageFile.ImageFile): palette = read(padding * file_info['colors']) 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 else: self.mode = "P" 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', (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']) + (raw_mode, ((file_info['width'] * file_info['bits'] + 31) >> 3) & (~3), file_info['direction']) )] def _open(self): @@ -188,16 +188,15 @@ class BmpImageFile(ImageFile.ImageFile): # choke if the file does not have the required magic bytes if head_data[0:2] != b"BM": raise SyntaxError("Not a BMP file") - # read the start position of the BMP image data (u32) + # read the start position of the BMP image data (u32) offset = i32(head_data[10:14]) # load bitmap information (offset=raster info) self._bitmap(offset=offset) - -#=============================================================================== +# ============================================================================== # Image plugin for the DIB format (BMP alias) -#=============================================================================== +# ============================================================================== class DibImageFile(BmpImageFile): format = "DIB" @@ -206,8 +205,6 @@ class DibImageFile(BmpImageFile): def _open(self): self._bitmap() - - # # -------------------------------------------------------------------- # Write BMP file From d754598f146f868e8cd7d247b3af6cf3f3c8d510 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 1 Apr 2015 15:39:41 -0400 Subject: [PATCH 366/532] Update CHANGES [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index bc5e1af96..88720be67 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.8.0 (2015-04-01) ------------------ +- Fix 32-bit BMP loading (RGBA or RGBX) + [artscoop] + - Fix UnboundLocalError in ImageFile #1131 [davarisg] From 66e86f325fb01a3061ebded1995e614a5e8fe475 Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 2 Apr 2015 08:29:18 +0300 Subject: [PATCH 367/532] Catch struct.error on invalid JPEG (#1163) --- PIL/Image.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 58944f891..7cfa72e6f 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -110,6 +110,7 @@ from PIL._util import deferred_error import os import sys import io +import struct # type stuff import collections @@ -601,7 +602,7 @@ class Image: def _repr_png_(self): """ iPython display hook support - + :returns: png version of the image as bytes """ from io import BytesIO @@ -893,12 +894,11 @@ class Image: if isinstance(t, bytes): self.im.putpalettealphas(t) elif isinstance(t, int): - self.im.putpalettealpha(t,0) + self.im.putpalettealpha(t, 0) else: raise ValueError("Transparency for P mode should" + " be bytes or int") - if mode == "P" and palette == ADAPTIVE: im = self.im.quantize(colors) new = self._new(im) @@ -1546,7 +1546,7 @@ class Image: self.load() - size=tuple(size) + size = tuple(size) if self.size == size: return self._new(self.im) @@ -2266,7 +2266,7 @@ def open(fp, mode="r"): im = factory(fp, filename) _decompression_bomb_check(im.size) return im - except (SyntaxError, IndexError, TypeError): + except (SyntaxError, IndexError, TypeError, struct.error): # import traceback # traceback.print_exc() pass @@ -2281,7 +2281,7 @@ def open(fp, mode="r"): im = factory(fp, filename) _decompression_bomb_check(im.size) return im - except (SyntaxError, IndexError, TypeError): + except (SyntaxError, IndexError, TypeError, struct.error): # import traceback # traceback.print_exc() pass From 3f09b8f1715b018e8249337f1432070301c61e18 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Thu, 2 Apr 2015 10:59:03 -0400 Subject: [PATCH 368/532] Prep 2.8.1 --- CHANGES.rst | 6 ++++++ PIL/__init__.py | 2 +- _imaging.c | 2 +- setup.py | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 88720be67..88c9a7793 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,12 @@ Changelog (Pillow) ================== +2.8.1 (2015-04-02) +------------------ + +- Bug fix: Catch struct.error on invalid JPEG, fixes #1163 + [wiredfool, hugovk] + 2.8.0 (2015-04-01) ------------------ diff --git a/PIL/__init__.py b/PIL/__init__.py index d1537769e..4dce12d33 100644 --- a/PIL/__init__.py +++ b/PIL/__init__.py @@ -12,7 +12,7 @@ # ;-) VERSION = '1.1.7' # PIL version -PILLOW_VERSION = '2.8.0' # Pillow +PILLOW_VERSION = '2.8.1' # Pillow _plugins = ['BmpImagePlugin', 'BufrStubImagePlugin', diff --git a/_imaging.c b/_imaging.c index c3be9beab..08e003c80 100644 --- a/_imaging.c +++ b/_imaging.c @@ -71,7 +71,7 @@ * See the README file for information on usage and redistribution. */ -#define PILLOW_VERSION "2.8.0" +#define PILLOW_VERSION "2.8.1" #include "Python.h" diff --git a/setup.py b/setup.py index a5f114d88..3887b421d 100644 --- a/setup.py +++ b/setup.py @@ -90,7 +90,7 @@ except (ImportError, OSError): NAME = 'Pillow' -PILLOW_VERSION = '2.8.0' +PILLOW_VERSION = '2.8.1' TCL_ROOT = None JPEG_ROOT = None JPEG2K_ROOT = None From 5cfc34b2874a246a50deda6658e86209b27c5540 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Thu, 2 Apr 2015 14:53:49 -0400 Subject: [PATCH 369/532] Begin 2.9.0 development with 2.9.0.dev0 Use PEP440 syntax to identify development branch and keep pyroma happy: https://www.python.org/dev/peps/pep-0440/#developmental-releases. --- PIL/__init__.py | 2 +- _imaging.c | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PIL/__init__.py b/PIL/__init__.py index 4dce12d33..6d51a5dcb 100644 --- a/PIL/__init__.py +++ b/PIL/__init__.py @@ -12,7 +12,7 @@ # ;-) VERSION = '1.1.7' # PIL version -PILLOW_VERSION = '2.8.1' # Pillow +PILLOW_VERSION = '2.9.0.dev0' # Pillow _plugins = ['BmpImagePlugin', 'BufrStubImagePlugin', diff --git a/_imaging.c b/_imaging.c index 08e003c80..786363e24 100644 --- a/_imaging.c +++ b/_imaging.c @@ -71,7 +71,7 @@ * See the README file for information on usage and redistribution. */ -#define PILLOW_VERSION "2.8.1" +#define PILLOW_VERSION "2.9.0.dev0" #include "Python.h" diff --git a/setup.py b/setup.py index 3887b421d..5886de07b 100644 --- a/setup.py +++ b/setup.py @@ -90,7 +90,7 @@ except (ImportError, OSError): NAME = 'Pillow' -PILLOW_VERSION = '2.8.1' +PILLOW_VERSION = '2.9.0.dev0' TCL_ROOT = None JPEG_ROOT = None JPEG2K_ROOT = None From 2db66c6d89a8d29feee2274e03e8540012b4f7b5 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Thu, 2 Apr 2015 14:59:49 -0400 Subject: [PATCH 370/532] Update changes [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 88c9a7793..7cda23b6b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,9 @@ Changelog (Pillow) ================== +2.9.0 (Unreleased) +------------------ + 2.8.1 (2015-04-02) ------------------ From 7fcfebdd22ad3769eef05fc688885501ccbba701 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Thu, 2 Apr 2015 15:11:39 -0400 Subject: [PATCH 371/532] Update release documentation [ci skip] - Format files that receive version number update for easy cut/paste. - Wording nits - Clarify steps --- RELEASING.md | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 18564e3c1..181f4e077 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -4,23 +4,34 @@ Released quarterly. -* [ ] Get master to the appropriate code release state. [Travis CI](https://travis-ci.org/python-pillow/Pillow) should be running cleanly for all merges to master. -* [ ] Update version in `PIL/__init__.py`, `setup.py`, `_imaging.c`, Update date in `CHANGES.rst`. +* [ ] Get master to appropriate code release state. [Travis CI](https://travis-ci.org/python-pillow/Pillow) should be running cleanly for all merges to master. +* [ ] Update version in: + +``` + PIL/__init__.py setup.py _imaging.c +``` + +* [ ] Update `CHANGES.rst`. * [ ] Run pre-release check via `make pre` * [ ] Tag and push to release branch in python-pillow repo. -* [ ] Upload binaries. +* [ ] Upload source and binary distributions. ## Point Release -Released as required for security or installation fixes. +Released as required for security, installation or critical bug fixes. * [ ] Make necessary changes in master. -* [ ] Cherry pick individual commits. Touch up `CHANGES.rst` to reflect reality. -* [ ] Update version in `PIL/__init__.py`, `setup.py`, `_imaging.c` +* [ ] Cherry pick individual commits. +* [ ] Update version in: + +``` + PIL/__init__.py setup.py _imaging.c +``` +* [ ] Update `CHANGES.rst`. * [ ] Run pre-release check via `make pre` * [ ] Push to release branch in personal repo. Let Travis run cleanly. * [ ] Tag and push to release branch in python-pillow repo. -* [ ] Upload source and binaries. +* [ ] Upload source and binary distributions. ## Embargoed Release @@ -39,12 +50,12 @@ git tag 2.5.3 git push origin 2.5.x git push origin --tags ``` -* [ ] Upload binaries +* [ ] Upload source and binary distributions. ## Upload Process -* [ ] Ping cgohlke for Windows binaries +* [ ] Contact @cgohlke for Windows binaries. * [ ] From a clean source directory with no extra temp files: ``` python setup.py sdist --format=zip upload @@ -58,4 +69,3 @@ make sdistup * [ ] Retrieve the OS X Wheels from Rackspace files, upload to PyPi (Twine?) * [ ] Grab Windows binaries, `twine upload dist/*.[whl|egg]`. Manually upload .exe installers. * [ ] Announce release availability. [Twitter](https://twitter.com/pythonpillow), web. - From 5c233d12c631dcaab90e1032f4941300ca07062b Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Thu, 2 Apr 2015 15:17:47 -0400 Subject: [PATCH 372/532] Make sure we upload a tar.gz too --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index b4c6b044d..a729e4088 100644 --- a/Makefile +++ b/Makefile @@ -70,5 +70,6 @@ sdisttest: python setup.py sdist --format=zip upload -r test sdistup: python setup.py sdist --format=zip upload + python setup.py sdist upload sdist: python setup.py sdist --format=zip From dcf399b9a0021a129ed9e1d38c5c7e589f8cacba Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Thu, 2 Apr 2015 22:49:15 +0200 Subject: [PATCH 373/532] pcd: minor cleanup; remove draft method It's not supported, and the implementation does nothing. --- PIL/PcdImagePlugin.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/PIL/PcdImagePlugin.py b/PIL/PcdImagePlugin.py index 5ce7aa48c..06db5d628 100644 --- a/PIL/PcdImagePlugin.py +++ b/PIL/PcdImagePlugin.py @@ -52,25 +52,6 @@ class PcdImageFile(ImageFile.ImageFile): self.size = 768, 512 # FIXME: not correct for rotated images! self.tile = [("pcd", (0, 0)+self.size, 96*2048, None)] - def draft(self, mode, size): - - if len(self.tile) != 1: - return - - d, e, o, a = self.tile[0] - - if size: - scale = max(self.size[0] / size[0], self.size[1] / size[1]) - for s, o in [(4, 0*2048), (2, 0*2048), (1, 96*2048)]: - 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.tile = [(d, e, o, a)] - - return self - # # registry From c0d818153ee108925bf8949b7721707d096f82dd Mon Sep 17 00:00:00 2001 From: John Kirkham Date: Fri, 3 Apr 2015 08:37:44 -0400 Subject: [PATCH 374/532] docs/installation.rst: Fix typo. [ci skip] --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index d9027bda6..9bc3d3f0f 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -118,7 +118,7 @@ Build Options Sample Usage:: - $ MAX_CONCURRENCY=1 python setup.py build-ext --enable-[feature] install + $ MAX_CONCURRENCY=1 python setup.py build_ext --enable-[feature] install Linux Installation From 2934b11affad8b7a05e3223e4ec3cf5adefdcfff Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 09:25:58 -0400 Subject: [PATCH 375/532] Release guide wording nits [ci skip] --- RELEASING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index 181f4e077..47b05fd01 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -4,7 +4,8 @@ Released quarterly. -* [ ] Get master to appropriate code release state. [Travis CI](https://travis-ci.org/python-pillow/Pillow) should be running cleanly for all merges to master. +* [ ] Develop and prepare release in ``master`` branch. +* [ ] Check [Travis CI](https://travis-ci.org/python-pillow/Pillow) to confirm passing tests in ``master`` branch. * [ ] Update version in: ``` From eacc3c93d6b9fd88a6fc85b98d403b395e8924bd Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 09:30:37 -0400 Subject: [PATCH 376/532] Release guide wording [ci skip] --- RELEASING.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 47b05fd01..aae0dce62 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -7,15 +7,23 @@ Released quarterly. * [ ] Develop and prepare release in ``master`` branch. * [ ] Check [Travis CI](https://travis-ci.org/python-pillow/Pillow) to confirm passing tests in ``master`` branch. * [ ] Update version in: - ``` PIL/__init__.py setup.py _imaging.c ``` - * [ ] Update `CHANGES.rst`. -* [ ] Run pre-release check via `make pre` -* [ ] Tag and push to release branch in python-pillow repo. -* [ ] Upload source and binary distributions. +* [ ] Run pre-release check via `make pre`. +* [ ] Create branch and tag for release e.g.: +``` + $ git branch 2.9.x + $ git tag 2.9.0 + $ git push --all + $ git push --tags +``` +* [ ] Create and upload source distributions e.g.: +``` + $ make sdistup + +* [ ] Create and upload binary distributions (see below). ## Point Release From 3123db17a5c1fe647cbeff0dd70cad513bed345d Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 09:46:44 -0400 Subject: [PATCH 377/532] Fix syntax [ci skip] --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index aae0dce62..eb463742b 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -22,7 +22,7 @@ Released quarterly. * [ ] Create and upload source distributions e.g.: ``` $ make sdistup - +``` * [ ] Create and upload binary distributions (see below). ## Point Release From 8afc57adb7c2e74fc82f25a5ff33eb178ba0aeba Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 09:48:15 -0400 Subject: [PATCH 378/532] Experiment with footnotes [ci skip] I can't seem to find a compiler for markdown that works like GitHub so I'm making a branch to experiment. Also want to discuss some of the releasing practices in a PR. --- RELEASING.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/RELEASING.md b/RELEASING.md index eb463742b..089c6b7a4 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -78,3 +78,9 @@ make sdistup * [ ] Retrieve the OS X Wheels from Rackspace files, upload to PyPi (Twine?) * [ ] Grab Windows binaries, `twine upload dist/*.[whl|egg]`. Manually upload .exe installers. * [ ] Announce release availability. [Twitter](https://twitter.com/pythonpillow), web. + + +Footnotes[^1] have a label[^@#$%] and the footnote's content. + +[^1]: This is a footnote content. +[^@#$%]: A footnote on the label: "@#$%". From 88f2ce13475d1bcbd681703b5f2eacc301c7dc42 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 09:49:41 -0400 Subject: [PATCH 379/532] Footnote syntax fail --- RELEASING.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 089c6b7a4..eb463742b 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -78,9 +78,3 @@ make sdistup * [ ] Retrieve the OS X Wheels from Rackspace files, upload to PyPi (Twine?) * [ ] Grab Windows binaries, `twine upload dist/*.[whl|egg]`. Manually upload .exe installers. * [ ] Announce release availability. [Twitter](https://twitter.com/pythonpillow), web. - - -Footnotes[^1] have a label[^@#$%] and the footnote's content. - -[^1]: This is a footnote content. -[^@#$%]: A footnote on the label: "@#$%". From bb5247a8bf4cfebe9f3d2bca05def727a00d01a2 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 09:54:55 -0400 Subject: [PATCH 380/532] Add quarterly release date detail --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index eb463742b..21e810a1e 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -2,7 +2,7 @@ ## Main Release -Released quarterly. +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) to confirm passing tests in ``master`` branch. From ade0f3b91df191e7f342fcb490b85610f0ef2b2f Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 09:55:43 -0400 Subject: [PATCH 381/532] Indent --- RELEASING.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 21e810a1e..bfcccb796 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -54,10 +54,10 @@ Security fixes that need to be pushed to the distros prior to public release. * [ ] Amend any commits with the CVE # * [ ] On release date, tag and push to GitHub. ``` -git checkout 2.5.x -git tag 2.5.3 -git push origin 2.5.x -git push origin --tags + git checkout 2.5.x + git tag 2.5.3 + git push origin 2.5.x + git push origin --tags ``` * [ ] Upload source and binary distributions. @@ -71,7 +71,7 @@ python setup.py sdist --format=zip upload ``` Or ``` -make sdistup + make sdistup ``` (Debian requests a tarball, everyone else would just prefer that we choose one and stick to it. So both it is) * [ ] Push a commit to https://github.com/python-pillow/pillow-wheels to build OSX versions (UNDONE latest tag or specific release???) From 8df74228036820f089a8596db09969cf8e1a80ad Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 10:12:13 -0400 Subject: [PATCH 382/532] Wording, add link to PEP 440 https://www.python.org/dev/peps/pep-0440/ --- RELEASING.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index bfcccb796..73a67b9fb 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -6,7 +6,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) to confirm passing tests in ``master`` branch. -* [ ] Update version in: +* [ ] In compliance with https://www.python.org/dev/peps/pep-0440/, update version identifier in: ``` PIL/__init__.py setup.py _imaging.c ``` @@ -27,21 +27,23 @@ Released quarterly on the first day of January, April, July, October. ## Point Release -Released as required for security, installation or critical bug fixes. - -* [ ] Make necessary changes in master. -* [ ] Cherry pick individual commits. -* [ ] Update version in: +Released as needed for security, installation or critical bug fixes. +* [ ] Make necessary changes in ``master`` branch. +* [ ] Cherry pick individual commits from ``master`` branch to release branch e.g. ``2.8.x``. +* [ ] In compliance with https://www.python.org/dev/peps/pep-0440/, update version identifier in: ``` PIL/__init__.py setup.py _imaging.c ``` * [ ] Update `CHANGES.rst`. -* [ ] Run pre-release check via `make pre` +* [ ] Run pre-release check via `make pre`. * [ ] Push to release branch in personal repo. Let Travis run cleanly. * [ ] Tag and push to release branch in python-pillow repo. -* [ ] Upload source and binary distributions. - +* [ ] Create and upload source distributions e.g.: +``` + $ make sdistup +``` +* [ ] Create and upload binary distributions (see below). ## Embargoed Release Security fixes that need to be pushed to the distros prior to public release. @@ -62,7 +64,7 @@ Security fixes that need to be pushed to the distros prior to public release. * [ ] Upload source and binary distributions. -## Upload Process +## Binary Distributions * [ ] Contact @cgohlke for Windows binaries. * [ ] From a clean source directory with no extra temp files: From 16fcf9985f6baf135b6b89bbf75e28ccceb37755 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 10:13:55 -0400 Subject: [PATCH 383/532] Is this an anchor? --- RELEASING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 73a67b9fb..52bf3df81 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -23,7 +23,7 @@ Released quarterly on the first day of January, April, July, October. ``` $ make sdistup ``` -* [ ] Create and upload binary distributions (see below). +* [ ] Create and upload [binary distributions](#binary-distributions) ## Point Release @@ -43,7 +43,7 @@ Released as needed for security, installation or critical bug fixes. ``` $ make sdistup ``` -* [ ] Create and upload binary distributions (see below). +* [ ] Create and upload [binary distributions](#binary-distributions) ## Embargoed Release Security fixes that need to be pushed to the distros prior to public release. From 95047fe206808a106301890764e4a980d01ea7c1 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 10:19:08 -0400 Subject: [PATCH 384/532] Recommend org branches We have Travis-CI for org branches so why personal branch? --- RELEASING.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 52bf3df81..e994c6922 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -30,20 +30,25 @@ Released quarterly on the first day of January, April, July, October. Released as needed for security, installation or critical bug fixes. * [ ] Make necessary changes in ``master`` branch. -* [ ] Cherry pick individual commits from ``master`` branch to release branch e.g. ``2.8.x``. +* [ ] 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``. * [ ] In compliance with https://www.python.org/dev/peps/pep-0440/, update version identifier in: ``` PIL/__init__.py setup.py _imaging.c ``` -* [ ] Update `CHANGES.rst`. * [ ] Run pre-release check via `make pre`. -* [ ] Push to release branch in personal repo. Let Travis run cleanly. -* [ ] Tag and push to release branch in python-pillow repo. +* [ ] Create tag for release e.g.: +``` + $ git tag 2.9.0 + $ git push --tags +``` * [ ] Create and upload source distributions e.g.: ``` $ make sdistup ``` * [ ] Create and upload [binary distributions](#binary-distributions) + ## Embargoed Release Security fixes that need to be pushed to the distros prior to public release. From f52f37341597d51e530ef01b374aab0bb4c951af Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 10:22:15 -0400 Subject: [PATCH 385/532] Specify release branch --- RELEASING.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index e994c6922..6e5cead18 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -33,6 +33,10 @@ 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.: +``` + git checkout -t remotes/origin/2.9.x +``` * [ ] In compliance with https://www.python.org/dev/peps/pep-0440/, update version identifier in: ``` PIL/__init__.py setup.py _imaging.c @@ -40,7 +44,7 @@ Released as needed for security, installation or critical bug fixes. * [ ] Run pre-release check via `make pre`. * [ ] Create tag for release e.g.: ``` - $ git tag 2.9.0 + $ git tag 2.9.1 $ git push --tags ``` * [ ] Create and upload source distributions e.g.: From eed5daa66790e7fdbfab771cd39e951bfb47aa8e Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 10:26:35 -0400 Subject: [PATCH 386/532] Slight tweaks to embargoed release procedure --- RELEASING.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 6e5cead18..4a20d4b32 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -55,7 +55,7 @@ Released as needed for security, installation or critical bug fixes. ## Embargoed Release -Security fixes that need to be pushed to the distros prior to public release. +Released as needed to vendors before public for critical security-related bug fixes. * [ ] Prepare patch for all versions that will get a fix. Test against local installations. * [ ] Commit against master, cherry pick to affected release branches. @@ -70,8 +70,11 @@ Security fixes that need to be pushed to the distros prior to public release. git push origin 2.5.x git push origin --tags ``` -* [ ] Upload source and binary distributions. - +* [ ] Create and upload source distributions e.g.: +``` + $ make sdistup +``` +* [ ] Create and upload [binary distributions](#binary-distributions) ## Binary Distributions From cd32baedc0d19de0d134db6b96d4e36a65ea30be Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 10:29:55 -0400 Subject: [PATCH 387/532] Wording --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index 4a20d4b32..c79aa002f 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -55,7 +55,7 @@ Released as needed for security, installation or critical bug fixes. ## Embargoed Release -Released as needed to vendors before public for critical security-related bug fixes. +Released as needed privately to individual vendors before public for critical security-related bug fixes. * [ ] Prepare patch for all versions that will get a fix. Test against local installations. * [ ] Commit against master, cherry pick to affected release branches. From 150c7f7206473ea7edb367181902e976d991f9f9 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 10:31:40 -0400 Subject: [PATCH 388/532] Wording --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index c79aa002f..35f3f0ec6 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -55,7 +55,7 @@ Released as needed for security, installation or critical bug fixes. ## Embargoed Release -Released as needed privately to individual vendors before public for critical security-related bug fixes. +Released as needed privately to individual vendors for critical security-related bug fixes. * [ ] Prepare patch for all versions that will get a fix. Test against local installations. * [ ] Commit against master, cherry pick to affected release branches. From 2ca2ecb792844edef806629c9bdb7b6383cad2e8 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 10:51:57 -0400 Subject: [PATCH 389/532] Source dists moved above Also dir does not necessarily have to be clean since the manifest determines what is included. --- RELEASING.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 35f3f0ec6..8a58390d0 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -4,6 +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 * [ ] Develop and prepare release in ``master`` branch. * [ ] Check [Travis CI](https://travis-ci.org/python-pillow/Pillow) to confirm passing tests in ``master`` branch. * [ ] In compliance with https://www.python.org/dev/peps/pep-0440/, update version identifier in: @@ -79,14 +80,7 @@ Released as needed privately to individual vendors for critical security-related ## Binary Distributions * [ ] Contact @cgohlke for Windows binaries. -* [ ] From a clean source directory with no extra temp files: -``` -python setup.py sdist --format=zip upload -``` -Or -``` - make sdistup -``` + (Debian requests a tarball, everyone else would just prefer that we choose one and stick to it. So both it is) * [ ] Push a commit to https://github.com/python-pillow/pillow-wheels to build OSX versions (UNDONE latest tag or specific release???) * [ ] Retrieve the OS X Wheels from Rackspace files, upload to PyPi (Twine?) From b9af6253c522e1ad5717c8bd0c840cb0ad46f3f8 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 11:00:47 -0400 Subject: [PATCH 390/532] Such updates to binaries! --- RELEASING.md | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 8a58390d0..29d77ab2d 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -79,10 +79,25 @@ Released as needed privately to individual vendors for critical security-related ## Binary Distributions -* [ ] Contact @cgohlke for Windows binaries. +### Windows +* [ ] Contact @cgohlke for Windows binaries via release ticket e.g. https://github.com/python-pillow/Pillow/issues/1174. +* [ ] Download and extract tarball from @cgohlke and ``twine upload *``. + +### OS X +* [ ] Use the [Pillow OS X Wheel Builder](https://github.com/python-pillow/pillow-wheels): +``` + $ git checkout https://github.com/python-pillow/pillow-wheels + $ cd pillow-wheels + $ git submodule init + $ git submodule update + $ cd Pillow + $ git fetch --all + $ git commit -a -m "Pillow -> 2.9.0" + $ git push +* [ ] Download distributions from the [Pillow OS X Wheel Builder container](http://cdf58691c5cf45771290-6a3b6a0f5f6ab91aadc447b2a897dd9a.r50.cf2.rackcdn.com/) and ``twine upload *``. + +### Linux + +## Publicize Release -(Debian requests a tarball, everyone else would just prefer that we choose one and stick to it. So both it is) -* [ ] Push a commit to https://github.com/python-pillow/pillow-wheels to build OSX versions (UNDONE latest tag or specific release???) -* [ ] Retrieve the OS X Wheels from Rackspace files, upload to PyPi (Twine?) -* [ ] Grab Windows binaries, `twine upload dist/*.[whl|egg]`. Manually upload .exe installers. * [ ] Announce release availability. [Twitter](https://twitter.com/pythonpillow), web. From 7129f65bedbc3552c47dd18beec8d0215bac22b9 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 11:01:47 -0400 Subject: [PATCH 391/532] Fix syntax --- RELEASING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASING.md b/RELEASING.md index 29d77ab2d..ace76bfeb 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 commit -a -m "Pillow -> 2.9.0" $ git push +``` * [ ] Download distributions from the [Pillow OS X Wheel Builder container](http://cdf58691c5cf45771290-6a3b6a0f5f6ab91aadc447b2a897dd9a.r50.cf2.rackcdn.com/) and ``twine upload *``. ### Linux From 8a767db2ca0a77d9348a8bca7b316d761d4fb63a Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 15:27:54 -0400 Subject: [PATCH 392/532] Wording [ci skip] --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index ace76bfeb..88bc4315c 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -101,4 +101,4 @@ Released as needed privately to individual vendors for critical security-related ## Publicize Release -* [ ] Announce release availability. [Twitter](https://twitter.com/pythonpillow), web. +* [ ] Announce release availability via [Twitter](https://twitter.com/pythonpillow) e.g. https://twitter.com/aclark4life/status/583366798302691328. From 935d6949e9fb9761956cd49ee9c8a57ae70f1599 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 15:29:28 -0400 Subject: [PATCH 393/532] Update icons in docs [ci skip] --- docs/index.rst | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 4351438de..4be131198 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -5,8 +5,12 @@ Pillow is the 'friendly' PIL fork by Alex Clark and Contributors. PIL is the Pyt .. image:: https://travis-ci.org/python-pillow/Pillow.svg?branch=master :target: https://travis-ci.org/python-pillow/Pillow - :alt: Travis CI build status + :alt: Travis CI build status (Linux) +.. image:: https://travis-ci.org/python-pillow/pillow-wheels.svg?branch=latest + :target: https://travis-ci.org/python-pillow/pillow-wheels + :alt: Travis CI build status (OS X) + .. image:: https://pypip.in/v/Pillow/badge.png :target: https://pypi.python.org/pypi/Pillow/ :alt: Latest PyPI version @@ -16,8 +20,12 @@ Pillow is the 'friendly' PIL fork by Alex Clark and Contributors. PIL is the Pyt :alt: Number of PyPI downloads .. image:: https://coveralls.io/repos/python-pillow/Pillow/badge.png?branch=master - :target: https://coveralls.io/r/python-pillow/Pillow?branch=master - :alt: Test coverage + :target: https://coveralls.io/r/python-pillow/Pillow?branch=master + :alt: Code coverage + +.. image:: https://landscape.io/github/python-pillow/Pillow/master/landscape.png + :target: https://landscape.io/github/python-pillow/Pillow/master + :alt: Code health To install Pillow, please follow the :doc:`installation instructions `. To download source and/or contribute to development of Pillow please see: https://github.com/python-pillow/Pillow. From efec85804c44032912365f9f9922d3bf125d5b26 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 16:50:38 -0400 Subject: [PATCH 394/532] Clean up reqs Add Sphinx; remove long list of reqs we disabled a while back because RTD was broken. --- docs/requirements.txt | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index f08f7633e..0229cfb8f 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,19 +1,2 @@ +Sphinx sphinx-better-theme - -## requirements for working on docs -# -## install pillow from master if you're into that, but RtD needs this -#pillow>=2.4.0 -# -#Jinja2==2.7.1 -#MarkupSafe==0.18 -#Pygments==1.6 -#Sphinx==1.1.3 -#docopt==0.6.1 -#docutils==0.11 -#wsgiref==0.1.2 -#sphinx-better-theme==0.1.5 -# -## livereload not strictly necessary but really useful (make livehtml) -#tornado==3.1.1 -#livereload==1.0.1 From 02f3685b2d0f96cbe7028d45c0564efb0c5349ad Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 Apr 2015 16:51:45 -0400 Subject: [PATCH 395/532] Not using sphinx-better-theme [ci skip] As far as I know --- docs/requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 0229cfb8f..2806c1649 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,2 +1 @@ Sphinx -sphinx-better-theme From e36e7dd7a2061f287ac093421b9029b34c68a30c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Apr 2015 23:22:13 +1100 Subject: [PATCH 396/532] Added duration set to GifImagePlugin --- PIL/GifImagePlugin.py | 80 ++++++++++++++++++++++++------------------- Scripts/gifmaker.py | 4 +-- 2 files changed, 46 insertions(+), 38 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 8db42e8e8..b414a128b 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -292,8 +292,23 @@ def _save(im, fp, filename): for s in header: fp.write(s) - flags = 0 + # local image header + get_local_header(fp, im) + im_out.encoderconfig = (8, get_interlace(im)) + ImageFile._save(im_out, fp, [("gif", (0, 0)+im.size, 0, + RAWMODE[im_out.mode])]) + + fp.write(b"\0") # end of image data + + fp.write(b";") # end of file + + try: + fp.flush() + except: + pass + +def get_interlace(im): try: interlace = im.encoderinfo["interlace"] except KeyError: @@ -302,10 +317,11 @@ def _save(im, fp, filename): # workaround for @PIL153 if min(im.size) < 16: interlace = 0 + + return interlace - if interlace: - flags = flags | 64 - +def get_local_header(fp, im, offset=(0, 0)): + transparent_color_exists = False try: transparency = im.encoderinfo["transparency"] except KeyError: @@ -324,38 +340,36 @@ def _save(im, fp, filename): else: transparent_color_exists = False - # transparency extension block - if transparent_color_exists: - fp.write(b"!" + - o8(249) + # extension intro - o8(4) + # length - o8(1) + # transparency info present - o16(0) + # duration - o8(transparency) + # transparency index - o8(0)) + if 'duration' in im.encoderinfo: + duration = im.encoderinfo["duration"] / 10 + else: + duration = 0 + if transparent_color_exists or duration != 0: + transparency_flag = 1 if transparent_color_exists else 0 + if not transparent_color_exists: + transparency = 0 + + fp.write(b"!" + + o8(249) + # extension intro + o8(4) + # length + o8(transparency_flag) + # transparency info present + o16(duration) + # duration + o8(transparency) + # transparency index + o8(0)) - # local image header + flags = 0 + + if get_interlace(im): + flags = flags | 64 + fp.write(b"," + - o16(0) + o16(0) + # bounding box + o16(offset[0]) + # offset + o16(offset[1]) + o16(im.size[0]) + # size o16(im.size[1]) + o8(flags) + # flags o8(8)) # bits - im_out.encoderconfig = (8, interlace) - ImageFile._save(im_out, fp, [("gif", (0, 0)+im.size, 0, - RAWMODE[im_out.mode])]) - - fp.write(b"\0") # end of image data - - fp.write(b";") # end of file - - try: - fp.flush() - except: - pass - - def _save_netpbm(im, fp, filename): # @@ -510,13 +524,7 @@ def getdata(im, offset=(0, 0), **params): im.encoderinfo = params # local image header - fp.write(b"," + - o16(offset[0]) + # offset - o16(offset[1]) + - o16(im.size[0]) + # size - o16(im.size[1]) + - o8(0) + # flags - o8(8)) # bits + get_local_header(fp, im, offset) ImageFile._save(im, fp, [("gif", (0, 0)+im.size, 0, RAWMODE[im.mode])]) diff --git a/Scripts/gifmaker.py b/Scripts/gifmaker.py index bd4de99c1..420140303 100644 --- a/Scripts/gifmaker.py +++ b/Scripts/gifmaker.py @@ -72,8 +72,8 @@ def makedelta(fp, sequence): for im in sequence: - # - # FIXME: write graphics control block before each frame + # To specify duration, add the time in milliseconds to getdata(), + # e.g. getdata(im, duration=1000) if not previous: From ecebedba7f2d7f8d7b6921886da58fb3239246f1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 4 Apr 2015 10:32:17 +1100 Subject: [PATCH 397/532] Added loop set to GifImagePlugin --- PIL/GifImagePlugin.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index b414a128b..6c1d53a1c 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -340,7 +340,7 @@ def get_local_header(fp, im, offset=(0, 0)): else: transparent_color_exists = False - if 'duration' in im.encoderinfo: + if "duration" in im.encoderinfo: duration = im.encoderinfo["duration"] / 10 else: duration = 0 @@ -357,6 +357,16 @@ def get_local_header(fp, im, offset=(0, 0)): o8(transparency) + # transparency index o8(0)) + if "loop" in im.encoderinfo: + number_of_loops = im.encoderinfo["loop"] + fp.write(b"!" + + o8(255) + o8(11) + # extension intro + b"NETSCAPE2.0" + + o8(3) + + o8(1) + + o16(number_of_loops) + # number of loops + o8(0)) + flags = 0 if get_interlace(im): From a5917b3fa36fb2128a5451fe355b287056042f7f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 4 Apr 2015 11:45:30 +1100 Subject: [PATCH 398/532] Added GifImagePlugin tests --- PIL/GifImagePlugin.py | 5 +++-- Tests/test_file_gif.py | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 6c1d53a1c..69df28b30 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -341,7 +341,7 @@ def get_local_header(fp, im, offset=(0, 0)): transparent_color_exists = False if "duration" in im.encoderinfo: - duration = im.encoderinfo["duration"] / 10 + duration = int(im.encoderinfo["duration"] / 10) else: duration = 0 if transparent_color_exists or duration != 0: @@ -360,7 +360,8 @@ def get_local_header(fp, im, offset=(0, 0)): if "loop" in im.encoderinfo: number_of_loops = im.encoderinfo["loop"] fp.write(b"!" + - o8(255) + o8(11) + # extension intro + o8(255) + # extension intro + o8(11) + b"NETSCAPE2.0" + o8(3) + o8(1) + diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 2ce728801..1378fb3f6 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -169,6 +169,33 @@ class TestFileGif(PillowTestCase): # first frame self.assertEqual(img.histogram()[img.info['transparency']], 0) + def test_duration(self): + duration = 1000 + + out = self.tempfile('temp.gif') + fp = open(out, "wb") + im = Image.new('L',(100,100),'#000') + for s in GifImagePlugin.getheader(im)[0] + GifImagePlugin.getdata(im, duration=duration): + fp.write(s) + fp.write(b";") + fp.close() + reread = Image.open(out) + + self.assertEqual(reread.info['duration'], duration) + + def test_number_of_loops(self): + number_of_loops = 2 + + out = self.tempfile('temp.gif') + fp = open(out, "wb") + im = Image.new('L',(100,100),'#000') + for s in GifImagePlugin.getheader(im)[0] + GifImagePlugin.getdata(im, loop=number_of_loops): + fp.write(s) + fp.write(b";") + fp.close() + reread = Image.open(out) + + self.assertEqual(reread.info['loop'], number_of_loops) if __name__ == '__main__': unittest.main() From dcefb9351a8f829240836a45f532b50a7d5d405b Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:00:34 -0400 Subject: [PATCH 399/532] Regen conf from quickstart --- docs/_build/.gitignore | 1 - docs/conf.py | 291 +++++++++++++++++++++++++++++++++++------ 2 files changed, 253 insertions(+), 39 deletions(-) delete mode 100644 docs/_build/.gitignore diff --git a/docs/_build/.gitignore b/docs/_build/.gitignore deleted file mode 100644 index b1f9a2ade..000000000 --- a/docs/_build/.gitignore +++ /dev/null @@ -1 +0,0 @@ -# Empty file, to make the directory available in the repository diff --git a/docs/conf.py b/docs/conf.py index ecc7f6722..0b9ee4db6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,72 +1,287 @@ # -*- coding: utf-8 -*- -import PIL +# +# Pillow (PIL Fork) documentation build configuration file, created by +# sphinx-quickstart on Sat Apr 4 07:54:11 2015. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. -### general configuration ### +import sys +import os +import shlex -needs_sphinx = '1.0' +# 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('.')) -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode', - 'sphinx.ext.intersphinx'] -intersphinx_mapping = {'http://docs.python.org/2/': None} +# -- General configuration ------------------------------------------------ -source_suffix = '.rst' +# If your documentation needs a minimal Sphinx version, state it here. +#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 +# ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The encoding of source files. #source_encoding = 'utf-8-sig' + +# The master toctree document. master_doc = 'index' -project = u'Pillow (PIL fork)' -copyright = (u'1997-2011 by Secret Labs AB,' - u' 1995-2011 by Fredrik Lundh, 2010-2013 Alex Clark') +# General information about the project. +project = u'Pillow (PIL Fork)' +copyright = u'2015, Alex Clark' +author = u'Alex Clark' +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# # The short X.Y version. -version = PIL.PILLOW_VERSION +version = '0' # The full version, including alpha/beta/rc tags. -release = version +release = '0' -# currently excluding autodoc'd plugs -exclude_patterns = ['_build', 'plugins.rst'] +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#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 + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' -### HTML output ### +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] -#from better import better_theme_path -#html_theme_path = [better_theme_path] -#html_theme = 'better' +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False -html_title = "Pillow v{release} (PIL fork)".format(release=release) -html_short_title = "Home" +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# 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()] + +# 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 = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#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 + +# 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 + +# 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, +# so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] -html_theme_options = {} +# 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_sidebars = { - '**': ['localtoc.html', 'sourcelink.html', 'sidebarhelp.html', - 'searchbox.html'], - 'index': ['globaltoc.html', 'sidebarhelp.html', 'searchbox.html'], -} +# 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' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is 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 = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#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' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +#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' # Output file base name for HTML help builder. -htmlhelp_basename = 'Pillowdoc' +htmlhelp_basename = 'PillowPILForkdoc' +# -- Options for LaTeX output --------------------------------------------- -### LaTeX output (RtD PDF output as well) ### +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', -latex_elements = {} +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', +# Additional stuff for the LaTeX preamble. +#'preamble': '', + +# Latex figure (float) alignment +#'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). latex_documents = [ - ('index', 'Pillow.tex', u'Pillow (PIL fork) Documentation', u'Author', - 'manual'), + (master_doc, 'PillowPILFork.tex', u'Pillow (PIL Fork) Documentation', + u'Alex Clark', 'manual'), ] +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None -# skip_api_docs setting will skip PIL.rst if True. Used for working on the -# guides; makes livereload basically instantaneous. -def setup(app): - app.add_config_value('skip_api_docs', False, True) +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False -skip_api_docs = False +# If true, show page references after internal links. +#latex_show_pagerefs = False -if skip_api_docs: - exclude_patterns += ['PIL.rst'] +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'pillowpilfork', u'Pillow (PIL Fork) Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'PillowPILFork', u'Pillow (PIL Fork) Documentation', + author, 'PillowPILFork', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False From 15e9c54b9c3dadc1677ab437b16135d765e19303 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:02:33 -0400 Subject: [PATCH 400/532] Duplicate readme wording [ci skip] --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 4be131198..4602f7bdf 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,7 +1,7 @@ Pillow ====== -Pillow is the 'friendly' PIL fork by Alex Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. +Pillow is the "friendly PIL fork" by `Alex Clark and Contributors `_. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. .. image:: https://travis-ci.org/python-pillow/Pillow.svg?branch=master :target: https://travis-ci.org/python-pillow/Pillow From a4fb3767abbc3aea5ca9dc3c5239d9dffc370026 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:04:44 -0400 Subject: [PATCH 401/532] Docs don't need this blurb [ci skip] --- docs/index.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 4602f7bdf..318c55821 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -27,8 +27,6 @@ Pillow is the "friendly PIL fork" by `Alex Clark and Contributors `. To download source and/or contribute to development of Pillow please see: https://github.com/python-pillow/Pillow. - .. toctree:: :maxdepth: 2 From f1639df79984065b0ca7b7526085d8970a950afc Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:11:18 -0400 Subject: [PATCH 402/532] Adjust warnings and notes on install [ci skip] --- docs/installation.rst | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 9bc3d3f0f..43ed9d5f0 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -1,17 +1,16 @@ Installation ============ -.. warning:: Pillow >= 2.1.0 no longer supports "import _imaging". Please use "from PIL.Image import core as _imaging" instead. +.. warning:: Pillow and PIL cannot co-exist in the same environment. Before installing Pillow, please uninstall PIL. .. warning:: Pillow >= 1.0 no longer supports "import Image". Please use "from PIL import Image" instead. -.. warning:: PIL and Pillow currently cannot co-exist in the same environment. - If you want to use Pillow, please remove PIL first. - -.. note:: Pillow >= 2.0.0 supports Python versions 2.6, 2.7, 3.2, 3.3, 3.4 +.. warning:: Pillow >= 2.1.0 no longer supports "import _imaging". Please use "from PIL.Image import core as _imaging" instead. .. note:: Pillow < 2.0.0 supports Python versions 2.4, 2.5, 2.6, 2.7. +.. note:: Pillow >= 2.0.0 supports Python versions 2.6, 2.7, 3.2, 3.3, 3.4 + Simple Installation ------------------- From 178849247603e30375735bcf2991968a9377faf4 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:12:15 -0400 Subject: [PATCH 403/532] s/Simple/Basic/ Basic, but not necessarily simple :-) --- docs/installation.rst | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 43ed9d5f0..a530ab64b 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -11,28 +11,22 @@ Installation .. note:: Pillow >= 2.0.0 supports Python versions 2.6, 2.7, 3.2, 3.3, 3.4 -Simple Installation -------------------- +Basic Installation +------------------ .. note:: - The following instructions will install Pillow with support for most formats. - See :ref:`external-libraries` for the features you would gain by installing - the external libraries first. This page probably also include specific - instructions for your platform. + The following instructions will install Pillow with support for most formats. See :ref:`external-libraries` for the features you would gain by installing the external libraries first. This page probably also include specific instructions for your platform. You can install Pillow with :command:`pip`:: $ pip install Pillow -Or :command:`easy_install` (for installing `Python Eggs -`_, as :command:`pip` does -not support them):: +Or :command:`easy_install` (for installing `Python Eggs `_, as :command:`pip` does not support them):: $ easy_install Pillow -Or download the `compressed archive from PyPI`_, extract it, and inside it -run:: +Or download the `compressed archive from PyPI`_, extract it, and inside it run:: $ python setup.py install From a7625a7ea00854009de032adf665eb44f84aeafa Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:15:42 -0400 Subject: [PATCH 404/532] 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 a530ab64b..6aaf39e59 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -16,7 +16,7 @@ Basic Installation .. note:: - The following instructions will install Pillow with support for most formats. See :ref:`external-libraries` for the features you would gain by installing the external libraries first. This page probably also include specific instructions for your platform. + The following instructions will install Pillow with support for most image formats. See :ref:`external-libraries` for additional libraries and corresponding feature support. You can install Pillow with :command:`pip`:: From 1b0bd98b2128f43044d3643722acfb568d5b8eb6 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:17:29 -0400 Subject: [PATCH 405/532] 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 6aaf39e59..83e2d1435 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -16,7 +16,7 @@ Basic Installation .. note:: - The following instructions will install Pillow with support for most image formats. See :ref:`external-libraries` for additional libraries and corresponding feature support. + The following instructions will install Pillow with support for most common image formats. See :ref:`external-libraries` for a full list of external libraries supported. You can install Pillow with :command:`pip`:: From 2de5988257a934c0b9c5e7aaef5dc7c48d1e3086 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:18:45 -0400 Subject: [PATCH 406/532] Wording [ci skip] --- docs/installation.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 83e2d1435..5df61375e 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -18,15 +18,15 @@ Basic Installation The following instructions will install Pillow with support for most common image formats. See :ref:`external-libraries` for a full list of external libraries supported. -You can install Pillow with :command:`pip`:: +Install Pillow with :command:`pip`:: $ pip install Pillow -Or :command:`easy_install` (for installing `Python Eggs `_, as :command:`pip` does not support them):: +Or use :command:`easy_install` for installing `Python Eggs `_, as :command:`pip` does not support them:: $ easy_install Pillow -Or download the `compressed archive from PyPI`_, extract it, and inside it run:: +Or download and extract the `compressed archive from PyPI`_ and inside it run:: $ python setup.py install From c2cf3289f5090decb7c664469b692c93d43bafc2 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:20:48 -0400 Subject: [PATCH 407/532] Wording [ci skip] --- docs/installation.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 5df61375e..7bbd416b7 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -231,8 +231,7 @@ current versions of Linux, OS X, and Windows. .. note:: - Contributors please test on your platform, edit this document, and send a - pull request. + Contributors please test Pillow on your platform then update this document and send a pull request. +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ |**Operating system** |**Supported**|**Tested Python versions** |**Tested Pillow versions** |**Tested processors** | From a5d46aa0455a73a210e0369ca2b81277ae0a2635 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:24:13 -0400 Subject: [PATCH 408/532] Wording [ci skip] --- docs/installation.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 7bbd416b7..2632cca8c 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -119,8 +119,7 @@ Linux Installation .. note:: - Fedora, Debian/Ubuntu, and ArchLinux include Pillow (instead of PIL) with - their distributions. Consider using those instead of installing manually. + Most major Linux distributions, including Fedora, Debian/Ubuntu and ArchLinux include Pillow in packages that previously contained PIL e.g. ``python-imaging``. Please consider using native operating system packages first to avoid installation problems and/or missing library support later. **We do not provide binaries for Linux.** If you didn't build Python from source, make sure you have Python's development libraries installed. In Debian From e7d004f88bc12814e40752a63856d604a4e27f09 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:24:41 -0400 Subject: [PATCH 409/532] 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 2632cca8c..052653e9f 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -22,7 +22,7 @@ Install Pillow with :command:`pip`:: $ pip install Pillow -Or use :command:`easy_install` for installing `Python Eggs `_, as :command:`pip` does not support them:: +Or use :command:`easy_install` for installing `Python Eggs `_ as :command:`pip` does not support them:: $ easy_install Pillow From c7fd9ee7d18774a87b7a5b85034466b651e7c2a9 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:26:34 -0400 Subject: [PATCH 410/532] Move linux to bottom since it's easiest --- docs/installation.rst | 79 +++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 40 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 052653e9f..fc3b015f9 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -113,45 +113,6 @@ Sample Usage:: $ MAX_CONCURRENCY=1 python setup.py build_ext --enable-[feature] install - -Linux Installation ------------------- - -.. note:: - - Most major Linux distributions, including Fedora, Debian/Ubuntu and ArchLinux include Pillow in packages that previously contained PIL e.g. ``python-imaging``. Please consider using native operating system packages first to avoid installation problems and/or missing library support later. - -**We do not provide binaries for Linux.** If you didn't build Python from -source, make sure you have Python's development libraries installed. In Debian -or Ubuntu:: - - $ sudo apt-get install python-dev python-setuptools - -Or for Python 3:: - - $ sudo apt-get install python3-dev python3-setuptools - -In Fedora, the command is:: - - $ sudo yum install python-devel - -Prerequisites are installed on **Ubuntu 12.04 LTS** or **Raspian Wheezy -7.0** with:: - - $ sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev \ - libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk - -Prerequisites are installed on **Ubuntu 14.04 LTS** with:: - - $ sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev \ - libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk - -Prerequisites are installed on **Fedora 20** with:: - - $ sudo yum install libtiff-devel libjpeg-devel libzip-devel freetype-devel \ - lcms2-devel libwebp-devel tcl-devel tk-devel - - OS X Installation ----------------- @@ -205,7 +166,6 @@ FreeBSD Installation .. Note:: Only FreeBSD 10 tested - Make sure you have Python's development libraries installed.:: $ sudo pkg install python2 @@ -218,6 +178,45 @@ Prerequisites are installed on **FreeBSD 10** with:: $ sudo pkg install jpeg tiff webp lcms2 freetype2 +Linux Installation +------------------ + +.. note:: + + Most major Linux distributions, including Fedora, Debian/Ubuntu and ArchLinux include Pillow in packages that previously contained PIL e.g. ``python-imaging``. Please consider using native operating system packages first to avoid installation problems and/or missing library support later. + +**We do not provide binaries for Linux.** If you didn't build Python from +source, make sure you have Python's development libraries installed. In Debian +or Ubuntu:: + + $ sudo apt-get install python-dev python-setuptools + +Or for Python 3:: + + $ sudo apt-get install python3-dev python3-setuptools + +In Fedora, the command is:: + + $ sudo yum install python-devel + +Prerequisites are installed on **Ubuntu 12.04 LTS** or **Raspian Wheezy +7.0** with:: + + $ sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev \ + libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk + +Prerequisites are installed on **Ubuntu 14.04 LTS** with:: + + $ sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev \ + libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk + +Prerequisites are installed on **Fedora 20** with:: + + $ sudo yum install libtiff-devel libjpeg-devel libzip-devel freetype-devel \ + lcms2-devel libwebp-devel tcl-devel tk-devel + + + Platform support From 95d423e3915fd91599922a1a02048f090c04c95d Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:27:45 -0400 Subject: [PATCH 411/532] Clarify "do not need to do" something --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index fc3b015f9..b5208c857 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -39,7 +39,7 @@ External libraries .. note:: - You *do not* need to install all of the external libraries to use Pillow's basic features. + You **do not need to install all external libraries supported** to use Pillow's basic features. Many of Pillow's features require external libraries: From 0b515268bd63d7b5598817fb660ab1f69444e8a9 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:31:29 -0400 Subject: [PATCH 412/532] Make note about hiding releases on PyPI [ci skip] --- RELEASING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASING.md b/RELEASING.md index 88bc4315c..d9c4d761e 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -25,6 +25,7 @@ Released quarterly on the first day of January, April, July, October. $ make sdistup ``` * [ ] Create and upload [binary distributions](#binary-distributions) +* [ ] Manually hide old versions on PyPI as needed, such that only the latest main release is visible when viewing https://pypi.python.org/pypi/Pillow ## Point Release From dd3c4ad7ee3fbd0e9e4670b2da0e4f8fb204099c Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:33:58 -0400 Subject: [PATCH 413/532] Move about pillow even lower [ci skip] --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 318c55821..9ddb96a91 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -31,11 +31,11 @@ Pillow is the "friendly PIL fork" by `Alex Clark and Contributors Date: Sat, 4 Apr 2015 08:41:03 -0400 Subject: [PATCH 414/532] Wording [ci skip] --- docs/about.rst | 19 ++++++------------- docs/index.rst | 2 +- ...riginal-readme.rst => pre-fork-readme.rst} | 6 +++--- 3 files changed, 10 insertions(+), 17 deletions(-) rename docs/{original-readme.rst => pre-fork-readme.rst} (99%) diff --git a/docs/about.rst b/docs/about.rst index 547d4dac3..3579515cf 100644 --- a/docs/about.rst +++ b/docs/about.rst @@ -4,7 +4,7 @@ About Pillow Goals ----- -The fork authors' goal is to foster active development of PIL through: +The fork author's goal is to foster active development of PIL through: - Continuous integration testing via `Travis CI`_ - Publicized development activity on `GitHub`_ @@ -17,7 +17,7 @@ The fork authors' goal is to foster active development of PIL through: License ------- -Like PIL, Pillow is licensed under the MIT-a-like `PIL Software License `_:: +Like PIL, Pillow is licensed under the MIT-like open source `PIL Software License `_:: Software License @@ -35,10 +35,7 @@ Like PIL, Pillow is licensed under the MIT-a-like `PIL Software License Date: Sat, 4 Apr 2015 08:41:58 -0400 Subject: [PATCH 415/532] Wording [ci skip] --- docs/about.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/about.rst b/docs/about.rst index 3579515cf..67bf20481 100644 --- a/docs/about.rst +++ b/docs/about.rst @@ -4,7 +4,7 @@ About Pillow Goals ----- -The fork author's goal is to foster active development of PIL through: +The fork author's goal is to foster and support active development of PIL through: - Continuous integration testing via `Travis CI`_ - Publicized development activity on `GitHub`_ From 5269a7991e8f859ee66fa217db6b45723344d89a Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:45:16 -0400 Subject: [PATCH 416/532] Add note about more release notes [ci skip] --- docs/releasenotes/index.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 3ffb9c4f1..b4a592937 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -4,5 +4,7 @@ Release Notes .. toctree:: :maxdepth: 2 +.. note:: Contributors please include release notes as needed or appropriate with your bug fixes feature additions and tests. + 2.7.0 2.8.0 From 472a17d89c8a347a51ae984e891dfd9154543c50 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:46:13 -0400 Subject: [PATCH 417/532] Fix syntax [ci skip] --- docs/releasenotes/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index b4a592937..7a27f6f6e 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -1,10 +1,10 @@ Release Notes ============= +.. note:: Contributors please include release notes as needed or appropriate with your bug fixes feature additions and tests. + .. toctree:: :maxdepth: 2 -.. note:: Contributors please include release notes as needed or appropriate with your bug fixes feature additions and tests. - 2.7.0 2.8.0 From fe78a7a7d0052f5821a6a299340c8333a31067eb Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:46:58 -0400 Subject: [PATCH 418/532] Wording [ci skip] --- docs/releasenotes/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 7a27f6f6e..d70edc54d 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -1,7 +1,7 @@ Release Notes ============= -.. note:: Contributors please include release notes as needed or appropriate with your bug fixes feature additions and tests. +.. note:: Contributors please include release notes as needed or appropriate with your bug fixes, feature additions and tests. .. toctree:: :maxdepth: 2 From 583dd007d37c333d0a719cfac16ceadd464423ff Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:49:18 -0400 Subject: [PATCH 419/532] import PIL --- docs/conf.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 0b9ee4db6..f1057b06a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -55,9 +55,10 @@ author = u'Alex Clark' # built documents. # # The short X.Y version. -version = '0' +import PIL +version = PIL.PILLOW_VERSION # The full version, including alpha/beta/rc tags. -release = '0' +release = PIL.PILLOW_VERSION # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 97cd5e1ea1d4c91ab3da9f5fe7c9d0f27ce602ba Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 08:50:47 -0400 Subject: [PATCH 420/532] Add note about appendices [ci skip] --- docs/handbook/appendices.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/handbook/appendices.rst b/docs/handbook/appendices.rst index f5482ffcd..e6c415cc6 100644 --- a/docs/handbook/appendices.rst +++ b/docs/handbook/appendices.rst @@ -1,6 +1,8 @@ Appendices ========== +.. note:: Contributors please include appendices as needed or appropriate with your bug fixes, feature additions and tests. + .. toctree:: :maxdepth: 2 From fd1202da062471e3a6b11e9a05fe33b231f5a8f8 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 09:03:28 -0400 Subject: [PATCH 421/532] Add sphinx-rtd-theme to doc reqs [ci skip] --- docs/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/requirements.txt b/docs/requirements.txt index 2806c1649..6b104fb01 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1 +1,2 @@ Sphinx +sphinx-rtd-theme From b09c861d878bd02c786c47e4db304937e8f788b6 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 09:12:42 -0400 Subject: [PATCH 422/532] Don't show pillow wheel building status [ci skip] I don't think we need to show this, and comparing builds of the source to builds of the wheels is confusing/misleading IMO --- README.rst | 4 ---- docs/index.rst | 4 ---- 2 files changed, 8 deletions(-) diff --git a/README.rst b/README.rst index de4377900..430810f0e 100644 --- a/README.rst +++ b/README.rst @@ -10,10 +10,6 @@ Pillow is the "friendly PIL fork" by `Alex Clark and Contributors Date: Sat, 4 Apr 2015 09:37:53 -0400 Subject: [PATCH 423/532] Update copyright & authorship [ci skip] To reflect PIL author, Pillow author and many contributors over the years. --- docs/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index f1057b06a..77eebca85 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -47,8 +47,8 @@ master_doc = 'index' # General information about the project. project = u'Pillow (PIL Fork)' -copyright = u'2015, Alex Clark' -author = u'Alex Clark' +copyright = u'1995-2015, Fredrik Lundh and Contributors. Alex Clark and Contributors AKA Pillow Fighters.' +author = u'Fredrik Lundh and Contributors. Alex Clark and Contributors AKA Pillow Fighters.' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the From 1d327690a796bd543c002fff7e7a8a6646fda197 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 09:39:52 -0400 Subject: [PATCH 424/532] Wording [ci skip] --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 77eebca85..2ff645370 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -47,7 +47,7 @@ master_doc = 'index' # General information about the project. project = u'Pillow (PIL Fork)' -copyright = u'1995-2015, Fredrik Lundh and Contributors. Alex Clark and Contributors AKA Pillow Fighters.' +copyright = u'1995-2015, Fredrik Lundh and Contributors. Alex Clark and Contributors' author = u'Fredrik Lundh and Contributors. Alex Clark and Contributors AKA Pillow Fighters.' # The version info for the project you're documenting, acts as replacement for From 8779b701199d9ad7205151e4720103ada83f7806 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 09:40:56 -0400 Subject: [PATCH 425/532] Wording [ci skip] --- docs/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 2ff645370..cd583937c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -47,8 +47,8 @@ master_doc = 'index' # General information about the project. project = u'Pillow (PIL Fork)' -copyright = u'1995-2015, Fredrik Lundh and Contributors. Alex Clark and Contributors' -author = u'Fredrik Lundh and Contributors. Alex Clark and Contributors AKA Pillow Fighters.' +copyright = u'1995-2015, Fredrik Lundh and Contributors, Alex Clark and Contributors' +author = u'Fredrik Lundh and Contributors, Alex Clark and Contributors' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the From e934a739a2ae63f695d9c41a414096f0782714f9 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 20:36:53 -0400 Subject: [PATCH 426/532] Add intro [ci skip] --- CONTRIBUTING.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8351625fc..0dcaf86da 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,6 @@ -# Contributing +# Contributing to Pillow + +Contributions of bug fixes, feature additions, tests, documentation and more can be made via [issues](https://github.com/python-pillow/Pillow/issues) and/or [pull requests](https://github.com/python-pillow/Pillow/issues). ## Fixes, Features and Changes From 843ee095769385b117363ebb27213f51f4459d91 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 20:45:47 -0400 Subject: [PATCH 427/532] Wording, headers [ci skip] --- CONTRIBUTING.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0dcaf86da..511c3ce3d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,26 +2,28 @@ Contributions of bug fixes, feature additions, tests, documentation and more can be made via [issues](https://github.com/python-pillow/Pillow/issues) and/or [pull requests](https://github.com/python-pillow/Pillow/issues). -## Fixes, Features and Changes +## Bug fixes, feature additions, etc. -Send a pull request to the master branch. We'll generally want documentation and [tests](Tests/README.rst) for new features. Tests or documentation on their own are also welcomed. Feel free to ask questions as an [issue](https://github.com/python-pillow/Pillow/issues/new) or on IRC (irc.freenode.net, #pil) +Please send a pull request to the master branch. Please include documentation and [tests](Tests/README.rst) for new features. Tests or documentation on their own are also welcomed. Feel free to ask questions as an [issue](https://github.com/python-pillow/Pillow/issues/new) or on IRC (irc.freenode.net, #pil) -- Fork the repo -- Make a branch from master -- Add your changes + Tests -- Run the test suite. Try to run on both Python 2.x and 3.x, or you'll get tripped up. You can enable [Travis CI on your repo](https://travis-ci.org/profile/) 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. -- Push to your fork, and make a pull request onto master. +- 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 on your repo](https://travis-ci.org/profile/) 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 -A few guidelines: - Try to keep any code commits clean and separate from reformatting commits. -- All new code is going to need tests. -- Try to follow PEP8. +- Provide tests for any newly added code. +- Follow PEP8. -## Bugs +## Reporting Issues -When reporting bugs, please include example code that reproduces the issue, and if possible a problem image. The best reproductions are self-contained scripts that pull in as few dependencies as possible. An entire Django stack is harder to handle. +When reporting issues, please include example code that reproduces the issue, and if possible a problem image. The best reproductions are self-contained scripts that pull in as few dependencies as possible. An entire Django stack is harder to reproduce. + +### Provide details -Let us know: - What did you do? - What did you expect to happen? - What actually happened? From 69f81ec089c1aaa70db4d71e21ebd3e6f97904a1 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 20:57:53 -0400 Subject: [PATCH 428/532] Wording [ci skip] --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 511c3ce3d..66a8e2bbc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing to Pillow -Contributions of bug fixes, feature additions, tests, documentation and more can be made via [issues](https://github.com/python-pillow/Pillow/issues) and/or [pull requests](https://github.com/python-pillow/Pillow/issues). +Bug fixes, feature additions, tests, documentation and more can be contributed via [issues](https://github.com/python-pillow/Pillow/issues) and/or [pull requests](https://github.com/python-pillow/Pillow/issues). All contributions are welcome. ## Bug fixes, feature additions, etc. From 5c6e778dbe1668eab14d976e6ca59b94ea3de02c Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 20:59:15 -0400 Subject: [PATCH 429/532] Wording [ci skip] --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 66a8e2bbc..5149f2a7d 100644 --- a/CONTRIBUTING.md +++ b/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 and [tests](Tests/README.rst) for new features. Tests or documentation on their own are also welcomed. Feel free to ask questions as an [issue](https://github.com/python-pillow/Pillow/issues/new) or on IRC (irc.freenode.net, #pil) +Please send a pull request to the master branch. Please include documentation and [tests](Tests/README.rst) for new features. Tests or documentation without bug fixes or feature additions are also welcome. Feel free to ask questions as an [issue](https://github.com/python-pillow/Pillow/issues/new) or on IRC (irc.freenode.net, #pil) - Fork the Pillow repository. - Create a branch from master. From dafcd946e736f9d6a84e16a13ab9581a0571eee3 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 21:00:42 -0400 Subject: [PATCH 430/532] Update --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5149f2a7d..1006ef531 100644 --- a/CONTRIBUTING.md +++ b/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 and [tests](Tests/README.rst) for new features. Tests or documentation without bug fixes or feature additions are also welcome. Feel free to ask questions as an [issue](https://github.com/python-pillow/Pillow/issues/new) or on IRC (irc.freenode.net, #pil) +Please send a pull request to the master branch. Please include [documentation](http://pillow.readthedocs.org) and [tests](Tests/README.rst) for new features. Tests or documentation without bug fixes or feature additions are also welcome. Feel free to ask questions as an [issue](https://github.com/python-pillow/Pillow/issues/new) or on IRC (irc.freenode.net, #pil) - Fork the Pillow repository. - Create a branch from master. From 7ebf4ee90ea82435d86d82c82026dca2b9becfd3 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 21:01:30 -0400 Subject: [PATCH 431/532] Wording [ci skip] --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1006ef531..ca6e53564 100644 --- a/CONTRIBUTING.md +++ b/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](http://pillow.readthedocs.org) and [tests](Tests/README.rst) for new features. Tests or documentation without bug fixes or feature additions are also welcome. Feel free to ask questions as an [issue](https://github.com/python-pillow/Pillow/issues/new) or on IRC (irc.freenode.net, #pil) +Please send a pull request to the master branch. Please include [documentation](http://pillow.readthedocs.org) 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 as an [issue](https://github.com/python-pillow/Pillow/issues/new) or on IRC (irc.freenode.net, #pil) - Fork the Pillow repository. - Create a branch from master. From 3c8795e60bb30a72dd861c7e99c15398e8f1e396 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 21:02:55 -0400 Subject: [PATCH 432/532] Update --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ca6e53564..cc675a99c 100644 --- a/CONTRIBUTING.md +++ b/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](http://pillow.readthedocs.org) 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 as an [issue](https://github.com/python-pillow/Pillow/issues/new) or on IRC (irc.freenode.net, #pil) +Please send a pull request to the master branch. Please include [documentation](http://pillow.readthedocs.org) 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://irc.freenode.net#pil) - Fork the Pillow repository. - Create a branch from master. From 6b7f42f21423f9600ecaedd74e5f1609f4af76b3 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 4 Apr 2015 21:03:40 -0400 Subject: [PATCH 433/532] Update [ci skip] --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cc675a99c..7a71cdd3d 100644 --- a/CONTRIBUTING.md +++ b/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](http://pillow.readthedocs.org) 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://irc.freenode.net#pil) +Please send a pull request to the master branch. Please include [documentation](http://pillow.readthedocs.org) 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 - Fork the Pillow repository. - Create a branch from master. From 4efdb41fe73337e557c62ad05b8b674584c67163 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 5 Apr 2015 06:59:09 -0400 Subject: [PATCH 434/532] Wording [ci skip] --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7a71cdd3d..54ade800a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,7 +14,7 @@ Please send a pull request to the master branch. Please include [documentation]( ### Guidelines -- Try to keep any code commits clean and separate from reformatting commits. +- Separate code commits from reformatting commits. - Provide tests for any newly added code. - Follow PEP8. From 3f3a890c212e9655ef7d38c74cc6f0cb38e8fb80 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 5 Apr 2015 07:01:33 -0400 Subject: [PATCH 435/532] Wording [ci skip] --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 54ade800a..5a49ab2d7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,7 +20,7 @@ Please send a pull request to the master branch. Please include [documentation]( ## Reporting Issues -When reporting issues, please include example code that reproduces the issue, and if possible a problem image. The best reproductions are self-contained scripts that pull in as few dependencies as possible. An entire Django stack is harder to reproduce. +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. ### Provide details From 7f4cfdf36b519fbfe405c870728f602b6ddb5d9a Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 8 Apr 2015 11:07:59 -0400 Subject: [PATCH 436/532] Re-add extensions [ci skip] Fixes #1183. Thanks @joekilner. This should resolve. --- docs/conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index cd583937c..85be12f30 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,7 +29,8 @@ import shlex # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = [] +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode', + 'sphinx.ext.intersphinx'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] From bb01e845ea4ccdd84acedaa82818d17034c212d0 Mon Sep 17 00:00:00 2001 From: Allen Li Date: Wed, 8 Apr 2015 15:57:17 -0400 Subject: [PATCH 437/532] Clarify docstring about mask values [ci skip] The behavior of paste() with regard to intermediate mask values was unclear, so this commit clarifies how it works. --- PIL/Image.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/PIL/Image.py b/PIL/Image.py index 7cfa72e6f..e6f5327be 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1288,7 +1288,13 @@ class Image: images (in the latter case, the alpha band is used as mask). Where the mask is 255, the given image is copied as is. Where the mask is 0, the current value is preserved. Intermediate - values can be used for transparency effects. + values will mix the two images together. If this image has an + alpha channel, intermediate values will also set the alpha + channel to themselves. + + See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to + combine images with a partial mask without setting the alpha + channel. Note that if you paste an "RGBA" image, the alpha band is ignored. You can work around this by using the same image as From 7674694185c4899d679a1c16b5118d397e213204 Mon Sep 17 00:00:00 2001 From: Allen Li Date: Fri, 10 Apr 2015 23:23:26 -0400 Subject: [PATCH 438/532] Correct description of paste() behavior [ci skip] --- PIL/Image.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index e6f5327be..a2f9be15c 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1288,9 +1288,8 @@ class Image: images (in the latter case, the alpha band is used as mask). Where the mask is 255, the given image is copied as is. Where the mask is 0, the current value is preserved. Intermediate - values will mix the two images together. If this image has an - alpha channel, intermediate values will also set the alpha - channel to themselves. + values will mix the two images together, including their alpha + channels if they have them. See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to combine images with a partial mask without setting the alpha From c6d410ff3b13ecf25381178ca35c149b31d6c519 Mon Sep 17 00:00:00 2001 From: Allen Li Date: Fri, 10 Apr 2015 23:24:30 -0400 Subject: [PATCH 439/532] Correct description of alpha-composite [ci skip] --- PIL/Image.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index a2f9be15c..be27bd99b 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1292,8 +1292,7 @@ class Image: channels if they have them. See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to - combine images with a partial mask without setting the alpha - channel. + combine images with respect to their alpha channels. Note that if you paste an "RGBA" image, the alpha band is ignored. You can work around this by using the same image as From e8107e3bbbd48f5713f6c2de2539718e243fe7c2 Mon Sep 17 00:00:00 2001 From: Allen Li Date: Fri, 10 Apr 2015 23:25:15 -0400 Subject: [PATCH 440/532] Remove wrong docstring about RGBA paste [ci skip] Pasting RGBA images does preserve the alpha channel if the current image has an alpha channel. --- PIL/Image.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index be27bd99b..36ff2eebf 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1294,10 +1294,6 @@ class Image: See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to combine images with respect to their alpha channels. - Note that if you paste an "RGBA" image, the alpha band is - ignored. You can work around this by using the same image as - both source image and mask. - :param im: Source image or pixel value (integer or tuple). :param box: An optional 4-tuple giving the region to paste into. If a 2-tuple is used instead, it's treated as the upper left From 689f28aae7c9cc3fddb73e7ec2a07f169b91d4ba Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 12 Apr 2015 12:58:46 +1000 Subject: [PATCH 441/532] Added icns save --- PIL/IcnsImagePlugin.py | 51 ++++++++++++++++++++++++++++++++++++++--- Tests/test_file_icns.py | 18 ++++++++++++++- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/PIL/IcnsImagePlugin.py b/PIL/IcnsImagePlugin.py index e88b84985..26735cc95 100644 --- a/PIL/IcnsImagePlugin.py +++ b/PIL/IcnsImagePlugin.py @@ -18,6 +18,7 @@ from PIL import Image, ImageFile, PngImagePlugin, _binary import io import struct +import tempfile, shutil, os, sys enable_jpeg2k = hasattr(Image.core, 'jp2klib_version') if enable_jpeg2k: @@ -293,12 +294,56 @@ class IcnsImageFile(ImageFile.ImageFile): self.tile = () self.load_end() +def _save(im, fp, filename): + try: + fp.flush() + except: + pass + + # 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) + + if last_w == w: + im_scaled = last_im + else: + im_scaled = im.resize((w,w), Image.LANCZOS) + im_scaled.save(os.path.join(iconset, prefix+'.png')) + + im_scaled = im.resize((w*2,w*2), Image.LANCZOS) + im_scaled.save(os.path.join(iconset, prefix+'@2x.png')) + last_im = im_scaled + + # iconutil -c icns -o {} {} + from subprocess import Popen, PIPE, CalledProcessError + + convert_cmd = ["iconutil","-c","icns","-o",filename,iconset] + stderr = tempfile.TemporaryFile() + convert_proc = Popen(convert_cmd, stdout=PIPE, stderr=stderr) + + convert_proc.stdout.close() + + retcode = convert_proc.wait() + + # remove the temporary files + shutil.rmtree(iconset) + + if retcode: + raise CalledProcessError(retcode, convert_cmd) + Image.register_open("ICNS", IcnsImageFile, lambda x: x[:4] == b'icns') Image.register_extension("ICNS", '.icns') +if sys.platform == 'darwin': + Image.register_save("ICNS", _save) + + Image.register_mime("ICNS", "image/icns") + + if __name__ == '__main__': - import os - import sys imf = IcnsImageFile(open(sys.argv[1], 'rb')) for size in imf.info['sizes']: imf.size = size @@ -308,4 +353,4 @@ if __name__ == '__main__': im = Image.open(open(sys.argv[1], "rb")) im.save("out.png") if sys.platform == 'windows': - os.startfile("out.png") + os.startfile("out.png") \ No newline at end of file diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index 99f6da9e3..ddbed3cd2 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -2,6 +2,8 @@ from helper import unittest, PillowTestCase from PIL import Image +import sys + # sample icon file file = "Tests/images/pillow.icns" data = open(file, "rb").read() @@ -20,6 +22,20 @@ class TestFileIcns(PillowTestCase): self.assertEqual(im.size, (1024, 1024)) self.assertEqual(im.format, "ICNS") + @unittest.skipIf(sys.platform != 'darwin', + "requires MacOS") + def test_save(self): + im = Image.open(file) + + test_file = self.tempfile("temp.icns") + im.save(test_file) + + reread = Image.open(test_file) + + self.assertEqual(reread.mode, "RGBA") + self.assertEqual(reread.size, (1024, 1024)) + self.assertEqual(reread.format, "ICNS") + def test_sizes(self): # Check that we can load all of the sizes, and that the final pixel # dimensions are as expected @@ -71,4 +87,4 @@ class TestFileIcns(PillowTestCase): if __name__ == '__main__': unittest.main() -# End of file +# End of file \ No newline at end of file From 5be6f810a57cbf1280c2571c937d3766f5038c37 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 14 Apr 2015 11:51:04 +0300 Subject: [PATCH 442/532] Up --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 7cda23b6b..e831b9f1d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.9.0 (Unreleased) ------------------ +- Tiff: allow writing floating point tag values #1113 + [bpedersen2] + 2.8.1 (2015-04-02) ------------------ From 740ab40c6da4200ad2387c53fe6c13067e7c5747 Mon Sep 17 00:00:00 2001 From: Karim Bahgat Date: Tue, 14 Apr 2015 20:17:57 +0200 Subject: [PATCH 443/532] Keep user-specified ordering of icon sizes Some consumers of icon files such as py2exe care about the order that icon sizes are added, so the user should be fully in charge of this, instead of force sorting them. --- PIL/IcoImagePlugin.py | 1 - 1 file changed, 1 deletion(-) diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index b4817db27..c4e24d99c 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -48,7 +48,6 @@ def _save(im, fp, filename): width, height = im.size filter(lambda x: False if (x[0] > width or x[1] > height or x[0] > 255 or x[1] > 255) else True, sizes) - sizes = sorted(sizes, key=lambda x: x[0]) fp.write(struct.pack("H", len(sizes))) # idCount(2) offset = fp.tell() + len(sizes)*16 for size in sizes: From 4f6c366e751e1e43fa82c0ffb70e5b7b42f9858d Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Thu, 16 Apr 2015 16:27:57 +0200 Subject: [PATCH 444/532] fix imaging leaks in putdata and getlist --- Tests/check_imaging_leaks.py | 43 ++++++++++++++++++++++++++++++++++++ _imaging.c | 6 ++++- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 Tests/check_imaging_leaks.py diff --git a/Tests/check_imaging_leaks.py b/Tests/check_imaging_leaks.py new file mode 100644 index 000000000..3a7dcaa2b --- /dev/null +++ b/Tests/check_imaging_leaks.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +from __future__ import division +from helper import unittest, PillowTestCase +import sys +from PIL import Image, ImageFilter + +min_iterations = 100 +max_iterations = 10000 + +@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") +class TestImagingLeaks(PillowTestCase): + + def _get_mem_usage(self): + from resource import getpagesize, getrusage, RUSAGE_SELF + mem = getrusage(RUSAGE_SELF).ru_maxrss + return mem * getpagesize() / 1024 / 1024 + + def _test_leak(self, min_iterations, max_iterations, fn, *args, **kwargs): + mem_limit = None + for i in range(max_iterations): + fn(*args, **kwargs) + mem = self._get_mem_usage() + if i < min_iterations: + mem_limit = mem + 1 + continue + self.assertLessEqual(mem, mem_limit, + msg='memory usage limit exceeded after %d iterations' + % (i + 1)) + + def test_leak_putdata(self): + im = Image.new('RGB', (25, 25)) + self._test_leak(min_iterations, max_iterations, im.putdata, im.getdata()) + + def test_leak_getlist(self): + im = Image.new('P', (25, 25)) + self._test_leak(min_iterations, max_iterations, + # Pass a new list at each iteration. + lambda: im.point(range(256))) + +if __name__ == '__main__': + unittest.main() + diff --git a/_imaging.c b/_imaging.c index 786363e24..09345c0dd 100644 --- a/_imaging.c +++ b/_imaging.c @@ -421,6 +421,7 @@ getlist(PyObject* arg, int* length, const char* wrong_length, int type) *length = n; PyErr_Clear(); + Py_DECREF(seq); return list; } @@ -1221,7 +1222,7 @@ _putdata(ImagingObject* self, PyObject* args) Py_ssize_t n, i, x, y; PyObject* data; - PyObject* seq; + PyObject* seq = NULL; PyObject* op; double scale = 1.0; double offset = 0.0; @@ -1329,6 +1330,7 @@ _putdata(ImagingObject* self, PyObject* args) op = PySequence_Fast_GET_ITEM(seq, i); if (!op || !getink(op, image, u.ink)) { + Py_DECREF(seq); return NULL; } /* FIXME: what about scale and offset? */ @@ -1342,6 +1344,8 @@ _putdata(ImagingObject* self, PyObject* args) } } + Py_XDECREF(seq); + Py_INCREF(Py_None); return Py_None; } From a649757f03c25213f54d58b3220372f83c43373b Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Thu, 16 Apr 2015 17:38:15 +0200 Subject: [PATCH 445/532] tests: add missing "from __future__ import division" --- Tests/check_webp_leaks.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/check_webp_leaks.py b/Tests/check_webp_leaks.py index b5875c8ab..95162ad4a 100644 --- a/Tests/check_webp_leaks.py +++ b/Tests/check_webp_leaks.py @@ -1,3 +1,4 @@ +from __future__ import division from helper import unittest, PillowTestCase import sys from PIL import Image From 12583664d0de0f4397d6cc64e722a0fa775eb7b8 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 18 Apr 2015 00:54:07 +0300 Subject: [PATCH 446/532] Tests pass on OS X 10.10 [CI skip] Running selftest: --- 57 tests passed. Ran 567 tests in 66.265s OK (SKIP=34) --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index b5208c857..d1beaf389 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -234,7 +234,7 @@ current versions of Linux, OS X, and Windows. +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ |**Operating system** |**Supported**|**Tested Python versions** |**Tested Pillow versions** |**Tested processors** | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ -| Mac OS X 10.10 Yosemite | | | |x86-64 | +| Mac OS X 10.10 Yosemite |Yes | 2.7 | 2.8.1 |x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Mac OS X 10.9 Mavericks |Yes | 2.7,3.4 | 2.6.1 |x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ From 74f81f43ea2a7c2e06c7926077792822dcff2792 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 18 Apr 2015 01:00:53 +0300 Subject: [PATCH 447/532] Consistent title case [CI skip] --- docs/installation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index d1beaf389..847ed401f 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -34,7 +34,7 @@ Or download and extract the `compressed archive from PyPI`_ and inside it run:: .. _external-libraries: -External libraries +External Libraries ------------------ .. note:: @@ -219,7 +219,7 @@ Prerequisites are installed on **Fedora 20** with:: -Platform support +Platform Support ---------------- Current platform support for Pillow. Binary distributions are contributed for From 8e063caa664eaba20974920b42cf66337a5c4595 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 22 Apr 2015 00:52:57 +1000 Subject: [PATCH 448/532] Updated OS X Platform Support [CI skip] --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index 847ed401f..7634a77fc 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -234,7 +234,7 @@ current versions of Linux, OS X, and Windows. +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ |**Operating system** |**Supported**|**Tested Python versions** |**Tested Pillow versions** |**Tested processors** | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ -| Mac OS X 10.10 Yosemite |Yes | 2.7 | 2.8.1 |x86-64 | +| Mac OS X 10.10 Yosemite |Yes | 2.7,3.3,3.4 | 2.8.1 |x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Mac OS X 10.9 Mavericks |Yes | 2.7,3.4 | 2.6.1 |x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ From f6333cc36f091fe25a9ca1904e38d0cd68d09172 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 23 Apr 2015 08:30:49 +0300 Subject: [PATCH 449/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e831b9f1d..4d13c5841 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,8 @@ Changelog (Pillow) 2.9.0 (Unreleased) ------------------ +- Keep user-specified ordering of icon sizes #1193 + [karimbahgat] - Tiff: allow writing floating point tag values #1113 [bpedersen2] From 6ae1218f4bc6c7aebec5c782bc050856f3d44d74 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 23 Apr 2015 08:33:26 +0300 Subject: [PATCH 450/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 4d13c5841..0a22c33ea 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,8 +4,12 @@ Changelog (Pillow) 2.9.0 (Unreleased) ------------------ +- Fix putdata memory leak #1196 + [benoit-pierre] + - Keep user-specified ordering of icon sizes #1193 [karimbahgat] + - Tiff: allow writing floating point tag values #1113 [bpedersen2] From 1bcda962d28bcc3434fd863a64bc0925fcae18c5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 23 Apr 2015 17:00:21 +1000 Subject: [PATCH 451/532] Updated IcnsImagePlugin documentation --- PIL/IcnsImagePlugin.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/PIL/IcnsImagePlugin.py b/PIL/IcnsImagePlugin.py index 26735cc95..c185277ba 100644 --- a/PIL/IcnsImagePlugin.py +++ b/PIL/IcnsImagePlugin.py @@ -248,7 +248,7 @@ class IcnsFile: class IcnsImageFile(ImageFile.ImageFile): """ - PIL read-only image support for Mac OS .icns files. + PIL image support for Mac OS .icns files. Chooses the best resolution, but will possibly load a different size image if you mutate the size attribute before calling 'load'. @@ -295,6 +295,13 @@ class IcnsImageFile(ImageFile.ImageFile): self.load_end() def _save(im, fp, filename): + """ + Saves the image as a series of PNG files, + that are then converted to a .icns file + using the OS X command line utility 'iconutil'. + + OS X only. + """ try: fp.flush() except: From 6d4b9b6d6169bb61b8ba43e0841856e230a38ea5 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 23 Apr 2015 10:48:53 +0300 Subject: [PATCH 452/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 0a22c33ea..f96f86fdf 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.9.0 (Unreleased) ------------------ +- Added icns save #1185 + [radarhere] + - Fix putdata memory leak #1196 [benoit-pierre] From 63f6e94be40bab534070840222b228db4efc133c Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 23 Apr 2015 13:25:45 +0300 Subject: [PATCH 453/532] Flake8 after PR #1185 --- PIL/IcnsImagePlugin.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/PIL/IcnsImagePlugin.py b/PIL/IcnsImagePlugin.py index c185277ba..a1ebee704 100644 --- a/PIL/IcnsImagePlugin.py +++ b/PIL/IcnsImagePlugin.py @@ -17,8 +17,11 @@ from PIL import Image, ImageFile, PngImagePlugin, _binary import io +import os +import shutil import struct -import tempfile, shutil, os, sys +import sys +import tempfile enable_jpeg2k = hasattr(Image.core, 'jp2klib_version') if enable_jpeg2k: @@ -294,40 +297,41 @@ class IcnsImageFile(ImageFile.ImageFile): self.tile = () self.load_end() + def _save(im, fp, filename): """ Saves the image as a series of PNG files, that are then converted to a .icns file using the OS X command line utility 'iconutil'. - + OS X only. """ try: fp.flush() except: pass - + # 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) - + for w in [16, 32, 128, 256, 512]: + prefix = 'icon_{}x{}'.format(w, w) + if last_w == w: im_scaled = last_im else: - im_scaled = im.resize((w,w), Image.LANCZOS) + im_scaled = im.resize((w, w), Image.LANCZOS) im_scaled.save(os.path.join(iconset, prefix+'.png')) - - im_scaled = im.resize((w*2,w*2), Image.LANCZOS) + + im_scaled = im.resize((w*2, w*2), Image.LANCZOS) im_scaled.save(os.path.join(iconset, prefix+'@2x.png')) last_im = im_scaled - + # iconutil -c icns -o {} {} from subprocess import Popen, PIPE, CalledProcessError - convert_cmd = ["iconutil","-c","icns","-o",filename,iconset] + convert_cmd = ["iconutil", "-c", "icns", "-o", filename, iconset] stderr = tempfile.TemporaryFile() convert_proc = Popen(convert_cmd, stdout=PIPE, stderr=stderr) @@ -337,7 +341,7 @@ def _save(im, fp, filename): # remove the temporary files shutil.rmtree(iconset) - + if retcode: raise CalledProcessError(retcode, convert_cmd) @@ -360,4 +364,4 @@ if __name__ == '__main__': im = Image.open(open(sys.argv[1], "rb")) im.save("out.png") if sys.platform == 'windows': - os.startfile("out.png") \ No newline at end of file + os.startfile("out.png") From aa1368f55115b6c33b9a741b55ee805bb567f209 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 23 Apr 2015 23:40:42 +1000 Subject: [PATCH 454/532] Flake8 fixes --- PIL/GifImagePlugin.py | 31 +++++++++++++++++-------------- Tests/test_file_gif.py | 4 ++-- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 69df28b30..cc41da949 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -308,6 +308,7 @@ def _save(im, fp, filename): except: pass + def get_interlace(im): try: interlace = im.encoderinfo["interlace"] @@ -317,9 +318,10 @@ def get_interlace(im): # workaround for @PIL153 if min(im.size) < 16: interlace = 0 - + return interlace + def get_local_header(fp, im, offset=(0, 0)): transparent_color_exists = False try: @@ -348,38 +350,39 @@ def get_local_header(fp, im, offset=(0, 0)): transparency_flag = 1 if transparent_color_exists else 0 if not transparent_color_exists: transparency = 0 - + fp.write(b"!" + - o8(249) + # extension intro - o8(4) + # length - o8(transparency_flag) + # transparency info present - o16(duration) + # duration - o8(transparency) + # transparency index + o8(249) + # extension intro + o8(4) + # length + o8(transparency_flag) + # transparency info present + o16(duration) + # duration + o8(transparency) + # transparency index o8(0)) if "loop" in im.encoderinfo: number_of_loops = im.encoderinfo["loop"] fp.write(b"!" + - o8(255) + # extension intro + o8(255) + # extension intro o8(11) + b"NETSCAPE2.0" + o8(3) + o8(1) + - o16(number_of_loops) + # number of loops + o16(number_of_loops) + # number of loops o8(0)) flags = 0 if get_interlace(im): flags = flags | 64 - + fp.write(b"," + - o16(offset[0]) + # offset + o16(offset[0]) + # offset o16(offset[1]) + - o16(im.size[0]) + # size + o16(im.size[0]) + # size o16(im.size[1]) + - o8(flags) + # flags - o8(8)) # bits + o8(flags) + # flags + o8(8)) # bits + def _save_netpbm(im, fp, filename): diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 1378fb3f6..3b682f86b 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -174,7 +174,7 @@ class TestFileGif(PillowTestCase): out = self.tempfile('temp.gif') fp = open(out, "wb") - im = Image.new('L',(100,100),'#000') + im = Image.new('L', (100, 100), '#000') for s in GifImagePlugin.getheader(im)[0] + GifImagePlugin.getdata(im, duration=duration): fp.write(s) fp.write(b";") @@ -188,7 +188,7 @@ class TestFileGif(PillowTestCase): out = self.tempfile('temp.gif') fp = open(out, "wb") - im = Image.new('L',(100,100),'#000') + im = Image.new('L', (100, 100), '#000') for s in GifImagePlugin.getheader(im)[0] + GifImagePlugin.getdata(im, loop=number_of_loops): fp.write(s) fp.write(b";") From f028928b5acf10eed759827a6900a52542b254e2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 24 Apr 2015 00:44:27 +1000 Subject: [PATCH 455/532] Rearranged used_palette_colors to fix get_local_header --- PIL/GifImagePlugin.py | 52 ++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index cc41da949..4c59b612b 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -332,15 +332,19 @@ def get_local_header(fp, im, offset=(0, 0)): transparency = int(transparency) # optimize the block away if transparent color is not used transparent_color_exists = True - # adjust the transparency index after optimize - if used_palette_colors is not None and len(used_palette_colors) < 256: - for i in range(len(used_palette_colors)): - if used_palette_colors[i] == transparency: - transparency = i - transparent_color_exists = True - break - else: - transparent_color_exists = False + + if _get_optimize(im, im.encoderinfo): + used_palette_colors = _get_used_palette_colors(im) + + # adjust the transparency index after optimize + if len(used_palette_colors) < 256: + for i in range(len(used_palette_colors)): + if used_palette_colors[i] == transparency: + transparency = i + transparent_color_exists = True + break + else: + transparent_color_exists = False if "duration" in im.encoderinfo: duration = int(im.encoderinfo["duration"] / 10) @@ -433,11 +437,26 @@ def _save_netpbm(im, fp, filename): # -------------------------------------------------------------------- # GIF utilities +def _get_optimize(im, info): + return im.mode in ("P", "L") and info and info.get("optimize", 0) + + +def _get_used_palette_colors(im): + used_palette_colors = [] + + # check which colors are used + i = 0 + for count in im.histogram(): + if count: + used_palette_colors.append(i) + i += 1 + + return used_palette_colors + + def getheader(im, palette=None, info=None): """Return a list of strings representing a GIF header""" - optimize = info and info.get("optimize", 0) - # Header Block # http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp header = [ @@ -459,15 +478,8 @@ def getheader(im, palette=None, info=None): used_palette_colors = palette_bytes = None - if im.mode in ("P", "L") and optimize: - used_palette_colors = [] - - # check which colors are used - i = 0 - for count in im.histogram(): - if count: - used_palette_colors.append(i) - i += 1 + if _get_optimize(im, info): + used_palette_colors = _get_used_palette_colors(im) # create the new palette if not every color is used if len(used_palette_colors) < 256: From d1c182cadcf903b347c89f5e2a0796167e726c87 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 24 Apr 2015 09:26:52 +1000 Subject: [PATCH 456/532] Various Flake8 fixes --- PIL/FitsStubImagePlugin.py | 3 + PIL/FpxImagePlugin.py | 4 +- PIL/Image.py | 4 +- PIL/ImageEnhance.py | 1 + PIL/ImageQt.py | 3 +- PIL/JpegImagePlugin.py | 2 +- PIL/JpegPresets.py | 18 ++-- PIL/OleFileIO.py | 151 +++++++++++++------------------ PIL/PcxImagePlugin.py | 10 +- PIL/PngImagePlugin.py | 1 + PIL/PyAccess.py | 2 +- PIL/TiffImagePlugin.py | 22 ++--- Tests/bench_cffi_access.py | 2 +- Tests/check_imaging_leaks.py | 2 +- Tests/check_jpeg_leaks.py | 7 +- Tests/check_png_dos.py | 11 ++- Tests/check_webp_leaks.py | 2 +- Tests/helper.py | 2 +- Tests/test_binary.py | 7 +- Tests/test_file_eps.py | 26 +++--- Tests/test_file_icns.py | 8 +- Tests/test_file_ico.py | 9 +- Tests/test_file_jpeg.py | 11 +-- Tests/test_file_libtiff.py | 14 +-- Tests/test_file_png.py | 3 +- Tests/test_file_tiff.py | 12 +-- Tests/test_file_tiff_metadata.py | 2 +- Tests/test_file_webp_metadata.py | 1 - Tests/test_file_xpm.py | 2 +- Tests/test_image_putdata.py | 6 +- Tests/test_image_resize.py | 6 +- Tests/test_image_transpose.py | 2 +- Tests/test_imagecms.py | 5 +- Tests/test_imagedraw.py | 8 +- Tests/test_imageenhance.py | 15 ++- Tests/test_imagefile.py | 2 +- Tests/test_imagefont_bitmap.py | 7 +- Tests/test_imagesequence.py | 8 +- Tests/test_numpy.py | 4 +- Tests/test_scipy.py | 26 +++--- 40 files changed, 201 insertions(+), 230 deletions(-) diff --git a/PIL/FitsStubImagePlugin.py b/PIL/FitsStubImagePlugin.py index 0b851ae59..7aefff212 100644 --- a/PIL/FitsStubImagePlugin.py +++ b/PIL/FitsStubImagePlugin.py @@ -18,6 +18,7 @@ _handler = None # # @param handler Handler object. + def register_handler(handler): global _handler _handler = handler @@ -25,9 +26,11 @@ def register_handler(handler): # -------------------------------------------------------------------- # Image adapter + def _accept(prefix): return prefix[:6] == b"SIMPLE" + class FITSStubImageFile(ImageFile.StubImageFile): format = "FITS" diff --git a/PIL/FpxImagePlugin.py b/PIL/FpxImagePlugin.py index ed0c20c4e..9d338d9da 100644 --- a/PIL/FpxImagePlugin.py +++ b/PIL/FpxImagePlugin.py @@ -136,9 +136,9 @@ class FpxImageFile(ImageFile.ImageFile): s = fp.read(36) size = i32(s, 4), i32(s, 8) - #tilecount = i32(s, 12) + # tilecount = i32(s, 12) tilesize = i32(s, 16), i32(s, 20) - #channels = i32(s, 24) + # channels = i32(s, 24) offset = i32(s, 28) length = i32(s, 32) diff --git a/PIL/Image.py b/PIL/Image.py index 7cfa72e6f..9c459dfb1 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -387,7 +387,7 @@ def init(): for plugin in _plugins: try: if DEBUG: - print ("Importing %s" % plugin) + print("Importing %s" % plugin) __import__("PIL.%s" % plugin, globals(), locals(), []) except ImportError: if DEBUG: @@ -546,7 +546,7 @@ class Image: self.fp.close() except Exception as msg: if DEBUG: - print ("Error closing: %s" % msg) + print("Error closing: %s" % msg) # Instead of simply setting to None, we're setting up a # deferred error that will better explain that the core image diff --git a/PIL/ImageEnhance.py b/PIL/ImageEnhance.py index a196d5b09..8c0f166f3 100644 --- a/PIL/ImageEnhance.py +++ b/PIL/ImageEnhance.py @@ -53,6 +53,7 @@ class Color(_Enhance): self.degenerate = image.convert(self.intermediate_mode).convert(image.mode) + class Contrast(_Enhance): """Adjust image contrast. diff --git a/PIL/ImageQt.py b/PIL/ImageQt.py index 22ee2ea8f..1723e3226 100644 --- a/PIL/ImageQt.py +++ b/PIL/ImageQt.py @@ -29,12 +29,13 @@ if 'PyQt4.QtGui' not in sys.modules: except: from PySide.QtGui import QImage, qRgba -else: #PyQt4 is used +else: #PyQt4 is used from PyQt4.QtGui import QImage, qRgba ## # (Internal) Turns an RGB color into a Qt compatible color integer. + def rgb(r, g, b, a=255): # use qRgb to pack the colors, and then turn the resulting long # into a negative integer with the same bitpattern. diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 8c20f5863..0ecc902e4 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -684,7 +684,7 @@ def _save(im, fp, filename): # https://github.com/jdriscoll/django-imagekit/issues/50 bufsize = 0 if "optimize" in info or "progressive" in info or "progression" in info: - # keep sets quality to 0, but the actual value may be high. + # keep sets quality to 0, but the actual value may be high. if quality >= 95 or quality == 0: bufsize = 2 * im.size[0] * im.size[1] else: diff --git a/PIL/JpegPresets.py b/PIL/JpegPresets.py index 6ca46d0cd..67af9ac9a 100644 --- a/PIL/JpegPresets.py +++ b/PIL/JpegPresets.py @@ -67,7 +67,7 @@ Libjpeg ref.: http://www.jpegcameras.com/libjpeg/libjpeg-3.html """ presets = { - 'web_low': {'subsampling': 2, # "4:1:1" + 'web_low': {'subsampling': 2, # "4:1:1" 'quantization': [ [20, 16, 25, 39, 50, 46, 62, 68, 16, 18, 23, 38, 38, 53, 65, 68, @@ -86,7 +86,7 @@ presets = { 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68] ]}, - 'web_medium': {'subsampling': 2, # "4:1:1" + 'web_medium': {'subsampling': 2, # "4:1:1" 'quantization': [ [16, 11, 11, 16, 23, 27, 31, 30, 11, 12, 12, 15, 20, 23, 23, 30, @@ -105,7 +105,7 @@ presets = { 38, 35, 46, 53, 64, 64, 64, 64, 48, 43, 53, 64, 64, 64, 64, 64] ]}, - 'web_high': {'subsampling': 0, # "4:4:4" + 'web_high': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 6, 4, 4, 6, 9, 11, 12, 16, 4, 5, 5, 6, 8, 10, 12, 12, @@ -124,7 +124,7 @@ presets = { 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31] ]}, - 'web_very_high': {'subsampling': 0, # "4:4:4" + 'web_very_high': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 2, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 2, 3, 4, 5, 6, @@ -143,7 +143,7 @@ presets = { 15, 12, 12, 12, 12, 12, 12, 12, 15, 12, 12, 12, 12, 12, 12, 12] ]}, - 'web_maximum': {'subsampling': 0, # "4:4:4" + 'web_maximum': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -162,7 +162,7 @@ presets = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] ]}, - 'low': {'subsampling': 2, # "4:1:1" + 'low': {'subsampling': 2, # "4:1:1" 'quantization': [ [18, 14, 14, 21, 30, 35, 34, 17, 14, 16, 16, 19, 26, 23, 12, 12, @@ -181,7 +181,7 @@ presets = { 17, 12, 12, 12, 12, 12, 12, 12, 17, 12, 12, 12, 12, 12, 12, 12] ]}, - 'medium': {'subsampling': 2, # "4:1:1" + 'medium': {'subsampling': 2, # "4:1:1" 'quantization': [ [12, 8, 8, 12, 17, 21, 24, 17, 8, 9, 9, 11, 15, 19, 12, 12, @@ -200,7 +200,7 @@ presets = { 17, 12, 12, 12, 12, 12, 12, 12, 17, 12, 12, 12, 12, 12, 12, 12] ]}, - 'high': {'subsampling': 0, # "4:4:4" + 'high': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 6, 4, 4, 6, 9, 11, 12, 16, 4, 5, 5, 6, 8, 10, 12, 12, @@ -219,7 +219,7 @@ presets = { 17, 12, 12, 12, 12, 12, 12, 12, 17, 12, 12, 12, 12, 12, 12, 12] ]}, - 'maximum': {'subsampling': 0, # "4:4:4" + 'maximum': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 2, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 2, 3, 4, 5, 6, diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index a08ae0ee3..a94b760c8 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -28,7 +28,7 @@ # This import enables print() as a function rather than a keyword # (main requirement to be compatible with Python 3.x) # The comment on the line below should be printed on Python 2.5 or older: -from __future__ import print_function # This version of OleFileIO_PL requires Python 2.6+ or 3.x. +from __future__ import print_function # This version of OleFileIO_PL requires Python 2.6+ or 3.x. __author__ = "Philippe Lagadec, Fredrik Lundh (Secret Labs AB)" @@ -234,7 +234,10 @@ __version__ = '0.30' import io import sys -import struct, array, os.path, datetime +import struct +import array +import os.path +import datetime #[PL] Define explicitly the public API to avoid private objects in pydoc: __all__ = ['OleFileIO', 'isOleFile', 'MAGIC'] @@ -283,12 +286,17 @@ KEEP_UNICODE_NAMES = False #[PL] DEBUG display mode: False by default, use set_debug_mode() or "-d" on # command line to change it. DEBUG_MODE = False + + def debug_print(msg): print(msg) + + def debug_pass(msg): pass debug = debug_pass + def set_debug_mode(debug_mode): """ Set debug mode on or off, to control display of debugging messages. @@ -303,24 +311,24 @@ def set_debug_mode(debug_mode): MAGIC = b'\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1' -#[PL]: added constants for Sector IDs (from AAF specifications) +# [PL]: added constants for Sector IDs (from AAF specifications) MAXREGSECT = 0xFFFFFFFA; # maximum SECT DIFSECT = 0xFFFFFFFC; # (-4) denotes a DIFAT sector in a FAT FATSECT = 0xFFFFFFFD; # (-3) denotes a FAT sector in a FAT ENDOFCHAIN = 0xFFFFFFFE; # (-2) end of a virtual stream chain FREESECT = 0xFFFFFFFF; # (-1) unallocated sector -#[PL]: added constants for Directory Entry IDs (from AAF specifications) +# [PL]: added constants for Directory Entry IDs (from AAF specifications) MAXREGSID = 0xFFFFFFFA; # maximum directory entry ID NOSTREAM = 0xFFFFFFFF; # (-1) unallocated directory entry -#[PL] object types in storage (from AAF specifications) -STGTY_EMPTY = 0 # empty directory entry (according to OpenOffice.org doc) -STGTY_STORAGE = 1 # element is a storage object -STGTY_STREAM = 2 # element is a stream object -STGTY_LOCKBYTES = 3 # element is an ILockBytes object -STGTY_PROPERTY = 4 # element is an IPropertyStorage object -STGTY_ROOT = 5 # element is a root storage +# [PL] object types in storage (from AAF specifications) +STGTY_EMPTY = 0 # empty directory entry (according to OpenOffice.org doc) +STGTY_STORAGE = 1 # element is a storage object +STGTY_STREAM = 2 # element is a stream object +STGTY_LOCKBYTES = 3 # element is an ILockBytes object +STGTY_PROPERTY = 4 # element is an IPropertyStorage object +STGTY_ROOT = 5 # element is a root storage # @@ -370,7 +378,7 @@ for key in list(vars().keys()): def isOleFile (filename): """ Test if file is an OLE container (according to its header). - + :param filename: file name or path (str, unicode) :returns: True if OLE, False otherwise. """ @@ -433,7 +441,6 @@ def _clsid(clsid): tuple(map(i8, clsid[8:16])))) - # UNICODE support: # (necessary to handle storages/streams names which use Unicode) @@ -471,7 +478,6 @@ def filetime2datetime(filetime): return _FILETIME_null_date + datetime.timedelta(microseconds=filetime//10) - #=== CLASSES ================================================================== class OleMetadata: @@ -579,7 +585,6 @@ class OleMetadata: self.language = None self.doc_version = None - def parse_properties(self, olefile): """ Parse standard properties of an OLE file, from the streams @@ -663,7 +668,7 @@ class _OleStream(io.BytesIO): """ debug('_OleStream.__init__:') debug(' sect=%d (%X), size=%d, offset=%d, sectorsize=%d, len(fat)=%d, fp=%s' - %(sect,sect,size,offset,sectorsize,len(fat), repr(fp))) + %(sect, sect, size, offset, sectorsize, len(fat), repr(fp))) #[PL] To detect malformed documents with FAT loops, we compute the # expected number of sectors in the stream: unknown_size = False @@ -789,7 +794,6 @@ class _OleDirectoryEntry: DIRENTRY_SIZE = 128 assert struct.calcsize(STRUCT_DIRENTRY) == DIRENTRY_SIZE - def __init__(self, entry, sid, olefile): """ Constructor for an _OleDirectoryEntry object. @@ -882,8 +886,6 @@ class _OleDirectoryEntry: minifat = False olefile._check_duplicate_stream(self.isectStart, minifat) - - def build_storage_tree(self): """ Read and build the red-black tree attached to this _OleDirectoryEntry @@ -907,7 +909,6 @@ class _OleDirectoryEntry: # (see rich comparison methods in this class) self.kids.sort() - def append_kids(self, child_sid): """ Walk through red-black tree of children of this directory entry to add @@ -916,7 +917,7 @@ class _OleDirectoryEntry: child_sid : index of child directory entry to use, or None when called first time for the root. (only used during recursion) """ - #[PL] this method was added to use simple recursion instead of a complex + # [PL] this method was added to use simple recursion instead of a complex # algorithm. # if this is not a storage or a leaf of the tree, nothing to do: if child_sid == NOSTREAM: @@ -951,7 +952,6 @@ class _OleDirectoryEntry: # Afterwards build kid's own tree if it's also a storage: child.build_storage_tree() - def __eq__(self, other): "Compare entries by name" return self.name == other.name @@ -971,7 +971,6 @@ class _OleDirectoryEntry: #TODO: replace by the same function as MS implementation ? # (order by name length first, then case-insensitive order) - def dump(self, tab = 0): "Dump this entry, and all its subentries (for debug purposes only)" TYPES = ["(invalid)", "(storage)", "(stream)", "(lockbytes)", @@ -986,7 +985,6 @@ class _OleDirectoryEntry: for kid in self.kids: kid.dump(tab + 2) - def getmtime(self): """ Return modification time of a directory entry. @@ -1000,7 +998,6 @@ class _OleDirectoryEntry: return None return filetime2datetime(self.modifyTime) - def getctime(self): """ Return creation time of a directory entry. @@ -1064,7 +1061,6 @@ class OleFileIO: if filename: self.open(filename) - def _raise_defect(self, defect_level, message, exception_type=IOError): """ This method should be called for any defect found during file parsing. @@ -1086,7 +1082,6 @@ class OleFileIO: # just record the issue, no exception raised: self.parsing_issues.append((exception_type, message)) - def open(self, filename): """ Open an OLE2 file. @@ -1189,7 +1184,7 @@ class OleFileIO: self.sectDifStart, self.csectDif ) = struct.unpack(fmt_header, header1) - debug( struct.unpack(fmt_header, header1)) + debug(struct.unpack(fmt_header, header1)) if self.Sig != MAGIC: # OLE signature should always be present @@ -1231,11 +1226,11 @@ class OleFileIO: # rule => only a potential defect: if self.signature != 0: self._raise_defect(DEFECT_POTENTIAL, "incorrect OLE header (signature>0)") - debug( "MiniSectorCutoff = %d" % self.MiniSectorCutoff ) - debug( "MiniFatStart = %X" % self.MiniFatStart ) - debug( "csectMiniFat = %d" % self.csectMiniFat ) - debug( "sectDifStart = %X" % self.sectDifStart ) - debug( "csectDif = %d" % self.csectDif ) + debug("MiniSectorCutoff = %d" % self.MiniSectorCutoff) + debug("MiniFatStart = %X" % self.MiniFatStart) + debug("csectMiniFat = %d" % self.csectMiniFat) + debug("sectDifStart = %X" % self.sectDifStart) + debug("csectDif = %d" % self.csectDif) # calculate the number of sectors in the file # (-1 because header doesn't count) @@ -1266,14 +1261,12 @@ class OleFileIO: self.ministream = None self.minifatsect = self.MiniFatStart #i32(header, 60) - def close(self): """ close the OLE file, to release the file object """ self.fp.close() - def _check_duplicate_stream(self, first_sect, minifat=False): """ Checks if a stream has not been already referenced elsewhere. @@ -1298,7 +1291,6 @@ class OleFileIO: else: used_streams.append(first_sect) - def dumpfat(self, fat, firstindex=0): "Displays a part of FAT in human-readable form for debugging purpose" # [PL] added only for debug @@ -1335,7 +1327,6 @@ class OleFileIO: print(nom, end=" ") print() - def dumpsect(self, sector, firstindex=0): "Displays a sector in a human-readable form, for debugging purpose." if not DEBUG_MODE: @@ -1370,11 +1361,10 @@ class OleFileIO: a.byteswap() return a - def loadfat_sect(self, sect): """ Adds the indexes of the given sector to the FAT - + :param sect: string containing the first FAT sector, or array of long integers :returns: index of last FAT sector. """ @@ -1400,7 +1390,6 @@ class OleFileIO: self.fat = self.fat + nextfat return isect - def loadfat(self, header): """ Load the FAT table. @@ -1436,16 +1425,16 @@ class OleFileIO: if self.sectDifStart >= self.nb_sect: # initial DIFAT block index must be valid self._raise_defect(DEFECT_FATAL, 'incorrect DIFAT, first index out of range') - debug( "DIFAT analysis..." ) + debug("DIFAT analysis...") # We compute the necessary number of DIFAT sectors : # (each DIFAT sector = 127 pointers + 1 towards next DIFAT sector) nb_difat = (self.csectFat-109 + 126)//127 - debug( "nb_difat = %d" % nb_difat ) + debug("nb_difat = %d" % nb_difat) if self.csectDif != nb_difat: raise IOError('incorrect DIFAT') isect_difat = self.sectDifStart for i in iterrange(nb_difat): - debug( "DIFAT block %d, sector %X" % (i, isect_difat) ) + debug("DIFAT block %d, sector %X" % (i, isect_difat)) #TODO: check if corresponding FAT SID = DIFSECT sector_difat = self.getsect(isect_difat) difat = self.sect2array(sector_difat) @@ -1453,7 +1442,7 @@ class OleFileIO: self.loadfat_sect(difat[:127]) # last DIFAT pointer is next DIFAT sector: isect_difat = difat[127] - debug( "next DIFAT sector: %X" % isect_difat ) + debug("next DIFAT sector: %X" % isect_difat) # checks: if isect_difat not in [ENDOFCHAIN, FREESECT]: # last DIFAT pointer value must be ENDOFCHAIN or FREESECT @@ -1471,7 +1460,6 @@ class OleFileIO: debug('\nFAT:') self.dumpfat(self.fat) - def loadminifat(self): """ Load the MiniFAT table. @@ -1509,7 +1497,7 @@ class OleFileIO: def getsect(self, sect): """ Read given sector from file on disk. - + :param sect: sector index :returns: a string containing the sector data. """ @@ -1531,11 +1519,10 @@ class OleFileIO: self._raise_defect(DEFECT_FATAL, 'incomplete OLE sector') return sector - def loaddirectory(self, sect): """ Load the directory. - + :param sect: sector index of directory stream. """ # The directory is stored in a standard @@ -1567,7 +1554,6 @@ class OleFileIO: # read and build all storage trees, starting from the root: self.root.build_storage_tree() - def _load_direntry (self, sid): """ Load a directory entry from the directory. @@ -1592,14 +1578,12 @@ class OleFileIO: self.direntries[sid] = _OleDirectoryEntry(entry, sid, self) return self.direntries[sid] - def dumpdirectory(self): """ Dump directory (for debugging only) """ self.root.dump() - def _open(self, start, size = 0x7FFFFFFF, force_FAT=False): """ Open a stream, either in FAT or MiniFAT according to its size. @@ -1633,7 +1617,6 @@ class OleFileIO: return _OleStream(self.fp, start, size, 512, self.sectorsize, self.fat, self._filesize) - def _list(self, files, prefix, node, streams=True, storages=False): """ (listdir helper) @@ -1659,7 +1642,6 @@ class OleFileIO: # add it to the list files.append(prefix[1:] + [entry.name]) - def listdir(self, streams=True, storages=False): """ Return a list of streams stored in this file @@ -1672,14 +1654,13 @@ class OleFileIO: self._list(files, [], self.root, streams, storages) return files - def _find(self, filename): """ Returns directory entry of given filename. (openstream helper) Note: this method is case-insensitive. :param filename: path of stream in storage tree (except root entry), either: - + - a string using Unix path syntax, for example: 'storage_1/storage_1.2/stream' - a list of storage filenames, path to the desired stream/storage. @@ -1703,18 +1684,17 @@ class OleFileIO: node = kid return node.sid - def openstream(self, filename): """ Open a stream as a read-only file object (BytesIO). :param filename: path of stream in storage tree (except root entry), either: - + - a string using Unix path syntax, for example: 'storage_1/storage_1.2/stream' - a list of storage filenames, path to the desired stream/storage. Example: ['storage_1', 'storage_1.2', 'stream'] - + :returns: file object (read-only) :exception IOError: if filename not found, or if this is not a stream. """ @@ -1724,7 +1704,6 @@ class OleFileIO: raise IOError("this file is not a stream") return self._open(entry.isectStart, entry.size) - def get_type(self, filename): """ Test if given filename exists as a stream or a storage in the OLE @@ -1732,7 +1711,7 @@ class OleFileIO: :param filename: path of stream in storage tree. (see openstream for syntax) :returns: False if object does not exist, its entry type (>0) otherwise: - + - STGTY_STREAM: a stream - STGTY_STORAGE: a storage - STGTY_ROOT: the root entry @@ -1744,7 +1723,6 @@ class OleFileIO: except: return False - def getmtime(self, filename): """ Return modification time of a stream/storage. @@ -1760,7 +1738,6 @@ class OleFileIO: entry = self.direntries[sid] return entry.getmtime() - def getctime(self, filename): """ Return creation time of a stream/storage. @@ -1776,7 +1753,6 @@ class OleFileIO: entry = self.direntries[sid] return entry.getctime() - def exists(self, filename): """ Test if given filename exists as a stream or a storage in the OLE @@ -1791,7 +1767,6 @@ class OleFileIO: except: return False - def get_size(self, filename): """ Return size of a stream in the OLE container, in bytes. @@ -1808,7 +1783,6 @@ class OleFileIO: raise TypeError('object is not an OLE stream') return entry.size - def get_rootentry_name(self): """ Return root entry name. Should usually be 'Root Entry' or 'R' in most @@ -1816,7 +1790,6 @@ class OleFileIO: """ return self.root.name - def getproperties(self, filename, convert_time=False, no_conversion=None): """ Return properties described in substream. @@ -1828,7 +1801,7 @@ class OleFileIO: :returns: a dictionary of values indexed by id (integer) """ # make sure no_conversion is a list, just to simplify code below: - if no_conversion == None: + if no_conversion is None: no_conversion = [] # stream path as a string to report exceptions: streampath = filename @@ -1842,11 +1815,11 @@ class OleFileIO: try: # header s = fp.read(28) - #clsid = _clsid(s[8:24]) + # clsid = _clsid(s[8:24]) # format id s = fp.read(20) - #fmtid = _clsid(s[:16]) + # fmtid = _clsid(s[:16]) fp.seek(i32(s, 16)) # get section @@ -1864,34 +1837,34 @@ class OleFileIO: for i in range(num_props): try: - id = 0 # just in case of an exception + id = 0 # just in case of an exception id = i32(s, 8+i*8) offset = i32(s, 12+i*8) type = i32(s, offset) - debug ('property id=%d: type=%d offset=%X' % (id, type, offset)) + debug('property id=%d: type=%d offset=%X' % (id, type, offset)) # test for common types first (should perhaps use # a dictionary instead?) - if type == VT_I2: # 16-bit signed integer + if type == VT_I2: # 16-bit signed integer value = i16(s, offset+4) if value >= 32768: value = value - 65536 - elif type == VT_UI2: # 2-byte unsigned integer + elif type == VT_UI2: # 2-byte unsigned integer value = i16(s, offset+4) elif type in (VT_I4, VT_INT, VT_ERROR): # VT_I4: 32-bit signed integer # VT_ERROR: HRESULT, similar to 32-bit signed integer, # see http://msdn.microsoft.com/en-us/library/cc230330.aspx value = i32(s, offset+4) - elif type in (VT_UI4, VT_UINT): # 4-byte unsigned integer - value = i32(s, offset+4) # FIXME + elif type in (VT_UI4, VT_UINT): # 4-byte unsigned integer + value = i32(s, offset+4) # FIXME elif type in (VT_BSTR, VT_LPSTR): # CodePageString, see http://msdn.microsoft.com/en-us/library/dd942354.aspx # size is a 32 bits integer, including the null terminator, and # possibly trailing or embedded null chars - #TODO: if codepage is unicode, the string should be converted as such + # TODO: if codepage is unicode, the string should be converted as such count = i32(s, offset+4) value = s[offset+8:offset+8+count-1] # remove all null chars: @@ -1909,7 +1882,7 @@ class OleFileIO: count = i32(s, offset+4) value = _unicode(s[offset+8:offset+8+count*2]) elif type == VT_FILETIME: - value = long(i32(s, offset+4)) + (long(i32(s, offset+8))<<32) + value = long(i32(s, offset+4)) + (long(i32(s, offset+8)) << 32) # FILETIME is a 64-bit int: "number of 100ns periods # since Jan 1,1601". if convert_time and id not in no_conversion: @@ -1923,8 +1896,8 @@ class OleFileIO: else: # legacy code kept for backward compatibility: returns a # number of seconds since Jan 1,1601 - value = value // 10000000 # seconds - elif type == VT_UI1: # 1-byte unsigned integer + value = value // 10000000 # seconds + elif type == VT_UI1: # 1-byte unsigned integer value = i8(s[offset+4]) elif type == VT_CLSID: value = _clsid(s[offset+4:offset+20]) @@ -1938,8 +1911,8 @@ class OleFileIO: # see http://msdn.microsoft.com/en-us/library/cc237864.aspx value = bool(i16(s, offset+4)) else: - value = None # everything else yields "None" - debug ('property id=%d: type=%d not implemented in parser yet' % (id, type)) + value = None # everything else yields "None" + debug('property id=%d: type=%d not implemented in parser yet' % (id, type)) # missing: VT_EMPTY, VT_NULL, VT_R4, VT_R8, VT_CY, VT_DATE, # VT_DECIMAL, VT_I1, VT_I8, VT_UI8, @@ -1951,8 +1924,8 @@ class OleFileIO: # type of items, e.g. VT_VECTOR|VT_BSTR # see http://msdn.microsoft.com/en-us/library/dd942011.aspx - #print("%08x" % id, repr(value), end=" ") - #print("(%s)" % VT[i32(s, offset) & 0xFFF]) + # print("%08x" % id, repr(value), end=" ") + # print("(%s)" % VT[i32(s, offset) & 0xFFF]) data[id] = value except BaseException as exc: @@ -1999,7 +1972,7 @@ Options: check_streams = False for filename in sys.argv[1:]: - #try: + # try: # OPTIONS: if filename == '-d': # option to switch debug mode on: @@ -2010,7 +1983,7 @@ Options: check_streams = True continue - ole = OleFileIO(filename)#, raise_defects=DEFECT_INCORRECT) + ole = OleFileIO(filename) #, raise_defects=DEFECT_INCORRECT) print("-" * 68) print(filename) print("-" * 68) @@ -2027,8 +2000,8 @@ Options: v = v[:50] if isinstance(v, bytes): # quick and dirty binary check: - for c in (1,2,3,4,5,6,7,11,12,14,15,16,17,18,19,20, - 21,22,23,24,25,26,27,28,29,30,31): + for c in (1, 2, 3, 4, 5, 6, 7, 11, 12, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31): if c in bytearray(v): v = '(binary data)' break @@ -2039,7 +2012,7 @@ Options: print('\nChecking streams...') for streamname in ole.listdir(): # print name using repr() to convert binary chars to \xNN: - print('-', repr('/'.join(streamname)),'-', end=' ') + print('-', repr('/'.join(streamname)), '-', end=' ') st_type = ole.get_type(streamname) if st_type == STGTY_STREAM: print('size %d' % ole.get_size(streamname)) @@ -2066,7 +2039,7 @@ Options: meta = ole.get_metadata() meta.dump() print() - #[PL] Test a few new methods: + # [PL] Test a few new methods: root = ole.get_rootentry_name() print('Root entry name: "%s"' % root) if ole.exists('worddocument'): diff --git a/PIL/PcxImagePlugin.py b/PIL/PcxImagePlugin.py index 0765f099e..8eac6a594 100644 --- a/PIL/PcxImagePlugin.py +++ b/PIL/PcxImagePlugin.py @@ -58,7 +58,7 @@ class PcxImageFile(ImageFile.ImageFile): if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]: raise SyntaxError("bad PCX image size") if Image.DEBUG: - print ("BBox: %s %s %s %s" % bbox) + print("BBox: %s %s %s %s" % bbox) # format version = i8(s[1]) @@ -66,8 +66,8 @@ class PcxImageFile(ImageFile.ImageFile): planes = i8(s[65]) stride = i16(s, 66) if Image.DEBUG: - print ("PCX version %s, bits %s, planes %s, stride %s" % - (version, bits, planes, stride)) + print("PCX version %s, bits %s, planes %s, stride %s" % + (version, bits, planes, stride)) self.info["dpi"] = i16(s, 12), i16(s, 14) @@ -106,7 +106,7 @@ class PcxImageFile(ImageFile.ImageFile): bbox = (0, 0) + self.size if Image.DEBUG: - print ("size: %sx%s" % self.size) + print("size: %sx%s" % self.size) self.tile = [("pcx", bbox, self.fp.tell(), (rawmode, planes * stride))] @@ -143,7 +143,7 @@ def _save(im, fp, filename, check=0): # gets overwritten. if Image.DEBUG: - print ("PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d" % ( + print("PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d" % ( im.size[0], bits, stride)) # under windows, we could determine the current screen size with diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index d8593f90d..398a01f33 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -78,6 +78,7 @@ MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK # Set the maximum total text chunk size. MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK + def _safe_zlib_decompress(s): dobj = zlib.decompressobj() plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) diff --git a/PIL/PyAccess.py b/PIL/PyAccess.py index a3f1c3909..87a6d4915 100644 --- a/PIL/PyAccess.py +++ b/PIL/PyAccess.py @@ -51,7 +51,7 @@ class PyAccess(object): self.ysize = vals['ysize'] if DEBUG: - print (vals) + print(vals) self._post_init() def _post_init(self): diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index d7291e87c..e4028fdbb 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -506,7 +506,7 @@ class ImageFileDirectory(collections.MutableMapping): typ = self.tagtype[tag] if Image.DEBUG: - print ("Tag %s, Type: %s, Value: %s" % (tag, typ, value)) + print("Tag %s, Type: %s, Value: %s" % (tag, typ, value)) if typ == 1: # byte data @@ -638,9 +638,9 @@ class TiffImageFile(ImageFile.ImageFile): self.__fp = self.fp if Image.DEBUG: - print ("*** TiffImageFile._open ***") - print ("- __first:", self.__first) - print ("- ifh: ", ifh) + print("*** TiffImageFile._open ***") + print("- __first:", self.__first) + print("- ifh: ", ifh) # and load the first frame self._seek(0) @@ -751,19 +751,19 @@ class TiffImageFile(ImageFile.ImageFile): # that returns an IOError if there's no underlying fp. Easier to # dea. with here by reordering. if Image.DEBUG: - print ("have getvalue. just sending in a string from getvalue") + print("have getvalue. just sending in a string from getvalue") n, err = decoder.decode(self.fp.getvalue()) elif hasattr(self.fp, "fileno"): # we've got a actual file on disk, pass in the fp. if Image.DEBUG: - print ("have fileno, calling fileno version of the decoder.") + print("have fileno, calling fileno version of the decoder.") self.fp.seek(0) # 4 bytes, otherwise the trace might error out n, err = decoder.decode(b"fpfp") else: # we have something else. if Image.DEBUG: - print ("don't have fileno or getvalue. just reading") + print("don't have fileno or getvalue. just reading") # UNDONE -- so much for that buffer size thing. n, err = decoder.decode(self.fp.read()) @@ -943,7 +943,7 @@ class TiffImageFile(ImageFile.ImageFile): (0, min(y, ysize), w, min(y+h, ysize)), offsets[i], a)) if Image.DEBUG: - print ("tiles: ", self.tile) + print("tiles: ", self.tile) y = y + h if y >= self.size[1]: x = y = 0 @@ -1128,8 +1128,8 @@ def _save(im, fp, filename): if libtiff: if Image.DEBUG: - print ("Saving using libtiff encoder") - print (ifd.items()) + print("Saving using libtiff encoder") + print(ifd.items()) _fp = 0 if hasattr(fp, "fileno"): try: @@ -1186,7 +1186,7 @@ def _save(im, fp, filename): atts[k] = v if Image.DEBUG: - print (atts) + print(atts) # libtiff always expects the bytes in native order. # we're storing image byte order. So, if the rawmode diff --git a/Tests/bench_cffi_access.py b/Tests/bench_cffi_access.py index 769396f53..5b64813e4 100644 --- a/Tests/bench_cffi_access.py +++ b/Tests/bench_cffi_access.py @@ -47,7 +47,7 @@ class BenchCffiAccess(PillowTestCase): self.assertEqual(caccess[(0, 0)], access[(0, 0)]) - print ("Size: %sx%s" % im.size) + print("Size: %sx%s" % im.size) timer(iterate_get, 'PyAccess - get', im.size, access) timer(iterate_set, 'PyAccess - set', im.size, access) timer(iterate_get, 'C-api - get', im.size, caccess) diff --git a/Tests/check_imaging_leaks.py b/Tests/check_imaging_leaks.py index 3a7dcaa2b..c6d99b8d1 100644 --- a/Tests/check_imaging_leaks.py +++ b/Tests/check_imaging_leaks.py @@ -8,6 +8,7 @@ from PIL import Image, ImageFilter min_iterations = 100 max_iterations = 10000 + @unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") class TestImagingLeaks(PillowTestCase): @@ -40,4 +41,3 @@ class TestImagingLeaks(PillowTestCase): if __name__ == '__main__': unittest.main() - diff --git a/Tests/check_jpeg_leaks.py b/Tests/check_jpeg_leaks.py index adf7652cf..290bac4d8 100644 --- a/Tests/check_jpeg_leaks.py +++ b/Tests/check_jpeg_leaks.py @@ -71,9 +71,8 @@ post-patch: | :@:@@: :#:::@ :::@::::@ : :: : @ :::::: :@:: ::: :::: @:: @:::::::@:::: 0 +----------------------------------------------------------------------->Gi 0 8.421 - -""" +""" def test_qtables_leak(self): im = hopper('RGB') @@ -103,7 +102,6 @@ post-patch: qtables = [standard_l_qtable, standard_chrominance_qtable] - for count in range(iterations): test_output = BytesIO() im.save(test_output, "JPEG", qtables=qtables) @@ -135,7 +133,7 @@ pre patch: 0 +----------------------------------------------------------------------->Gi 0 11.37 - + post patch: MB @@ -172,7 +170,6 @@ post patch: test_output = BytesIO() im.save(test_output, "JPEG", exif=exif) - """ base case: MB diff --git a/Tests/check_png_dos.py b/Tests/check_png_dos.py index c74990a8c..762c9607a 100644 --- a/Tests/check_png_dos.py +++ b/Tests/check_png_dos.py @@ -5,6 +5,7 @@ import zlib TEST_FILE = "Tests/images/png_decompression_dos.png" + class TestPngDos(PillowTestCase): def test_dos_text(self): @@ -19,19 +20,19 @@ class TestPngDos(PillowTestCase): self.assertLess(len(s), 1024*1024, "Text chunk larger than 1M") def test_dos_total_memory(self): - im = Image.new('L',(1,1)) + im = Image.new('L', (1, 1)) compressed_data = zlib.compress('a'*1024*1023) info = PngImagePlugin.PngInfo() for x in range(64): - info.add_text('t%s'%x, compressed_data, 1) - info.add_itxt('i%s'%x, compressed_data, zip=True) + info.add_text('t%s' % x, compressed_data, 1) + info.add_itxt('i%s' % x, compressed_data, zip=True) b = BytesIO() im.save(b, 'PNG', pnginfo=info) b.seek(0) - + try: im2 = Image.open(b) except ValueError as msg: @@ -42,6 +43,6 @@ class TestPngDos(PillowTestCase): for txt in im2.text.values(): total_len += len(txt) self.assertLess(total_len, 64*1024*1024, "Total text chunks greater than 64M") - + if __name__ == '__main__': unittest.main() diff --git a/Tests/check_webp_leaks.py b/Tests/check_webp_leaks.py index 95162ad4a..79e22328b 100644 --- a/Tests/check_webp_leaks.py +++ b/Tests/check_webp_leaks.py @@ -5,7 +5,7 @@ from PIL import Image from io import BytesIO # Limits for testing the leak -mem_limit = 16 # max increase in MB +mem_limit = 16 # max increase in MB iterations = 5000 test_file = "Tests/images/hopper.webp" diff --git a/Tests/helper.py b/Tests/helper.py index c59caa2f5..1255b1819 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -130,7 +130,7 @@ class PillowTestCase(unittest.TestCase): # Skip if platform/travis matches, and # PILLOW_RUN_KNOWN_BAD is not true in the environment. if bool(os.environ.get('PILLOW_RUN_KNOWN_BAD', False)): - print (os.environ.get('PILLOW_RUN_KNOWN_BAD', False)) + print(os.environ.get('PILLOW_RUN_KNOWN_BAD', False)) return skip = True diff --git a/Tests/test_binary.py b/Tests/test_binary.py index 4d3fb5914..1e44d9641 100644 --- a/Tests/test_binary.py +++ b/Tests/test_binary.py @@ -2,6 +2,7 @@ from helper import unittest, PillowTestCase from PIL import _binary + class TestBinary(PillowTestCase): def test_standard(self): @@ -11,18 +12,18 @@ class TestBinary(PillowTestCase): def test_little_endian(self): self.assertEqual(_binary.i16le(b'\xff\xff\x00\x00'), 65535) self.assertEqual(_binary.i32le(b'\xff\xff\x00\x00'), 65535) - + self.assertEqual(_binary.o16le(65535), b'\xff\xff') self.assertEqual(_binary.o32le(65535), b'\xff\xff\x00\x00') def test_big_endian(self): self.assertEqual(_binary.i16be(b'\x00\x00\xff\xff'), 0) self.assertEqual(_binary.i32be(b'\x00\x00\xff\xff'), 65535) - + self.assertEqual(_binary.o16be(65535), b'\xff\xff') self.assertEqual(_binary.o32be(65535), b'\x00\x00\xff\xff') if __name__ == '__main__': unittest.main() -# End of file \ No newline at end of file +# End of file diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index 861cf264a..f1fbac922 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -148,8 +148,8 @@ class TestFileEps(PillowTestCase): # open image with binary preview Image.open(file3) - def _test_readline(self,t, ending): - ending = "Failure with line ending: %s" %("".join("%s" %ord(s) for s in ending)) + def _test_readline(self, t, ending): + ending = "Failure with line ending: %s" % ("".join("%s" % ord(s) for s in ending)) self.assertEqual(t.readline().strip('\r\n'), 'something', ending) self.assertEqual(t.readline().strip('\r\n'), 'else', ending) self.assertEqual(t.readline().strip('\r\n'), 'baz', ending) @@ -174,30 +174,30 @@ class TestFileEps(PillowTestCase): def _test_readline_file_universal(self, test_string, ending): f = self.tempfile('temp.txt') - with open(f,'wb') as w: + with open(f, 'wb') as w: if str is bytes: w.write(test_string) else: w.write(test_string.encode('UTF-8')) - with open(f,'rU') as t: + 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: + with open(f, 'wb') as w: if str is bytes: w.write(test_string) else: w.write(test_string.encode('UTF-8')) - with open(f,'rb') as r: + with open(f, 'rb') as r: t = EpsImagePlugin.PSFile(r) self._test_readline(t, 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' + # test_string = u'something\r\nelse\n\rbaz\rbif\n' line_endings = ['\r\n', '\n'] not_working_endings = ['\n\r', '\r'] strings = ['something', 'else', 'baz', 'bif'] @@ -205,9 +205,9 @@ class TestFileEps(PillowTestCase): 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_stringio(s, ending) + # self._test_readline_io(s, ending) + # self._test_readline_file_universal(s, ending) self._test_readline_file_psfile(s, ending) @@ -217,9 +217,9 @@ class TestFileEps(PillowTestCase): 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_stringio(s, ending) + # self._test_readline_io(s, ending) + # self._test_readline_file_universal(s, ending) self._test_readline_file_psfile(s, ending) diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index ddbed3cd2..23d22df1b 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -26,12 +26,12 @@ class TestFileIcns(PillowTestCase): "requires MacOS") def test_save(self): im = Image.open(file) - + test_file = self.tempfile("temp.icns") im.save(test_file) - + reread = Image.open(test_file) - + self.assertEqual(reread.mode, "RGBA") self.assertEqual(reread.size, (1024, 1024)) self.assertEqual(reread.format, "ICNS") @@ -87,4 +87,4 @@ class TestFileIcns(PillowTestCase): if __name__ == '__main__': unittest.main() -# End of file \ No newline at end of file +# End of file diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 4f53fe1c1..f7b52b124 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -25,23 +25,22 @@ class TestFileIco(PillowTestCase): # 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'], set([(32, 32), (64, 64)])) self.assertEqual(im.mode, reloaded.mode) self.assertEqual((64, 64), reloaded.size) self.assertEqual(reloaded.format, "ICO") - self.assert_image_equal(reloaded, hopper().resize((64,64), Image.LANCZOS)) + self.assert_image_equal(reloaded, hopper().resize((64, 64), Image.LANCZOS)) # the other one output.seek(0) reloaded = Image.open(output) - reloaded.size = (32,32) + reloaded.size = (32, 32) self.assertEqual(im.mode, reloaded.mode) self.assertEqual((32, 32), reloaded.size) self.assertEqual(reloaded.format, "ICO") - self.assert_image_equal(reloaded, hopper().resize((32,32), Image.LANCZOS)) - + self.assert_image_equal(reloaded, hopper().resize((32, 32), Image.LANCZOS)) if __name__ == '__main__': diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 64e8b74af..aa24582cc 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -301,15 +301,12 @@ class TestFileJpeg(PillowTestCase): # sequence wrong length self.assertRaises(Exception, lambda: self.roundtrip(im, qtables=[])) # sequence wrong length - self.assertRaises(Exception, lambda: self.roundtrip(im, qtables=[1,2,3,4,5])) + self.assertRaises(Exception, lambda: self.roundtrip(im, qtables=[1, 2, 3, 4, 5])) # qtable entry not a sequence self.assertRaises(Exception, lambda: self.roundtrip(im, qtables=[1])) # qtable entry has wrong number of items - self.assertRaises(Exception, lambda: self.roundtrip(im, qtables=[[1,2,3,4]])) - - - + self.assertRaises(Exception, lambda: self.roundtrip(im, qtables=[[1, 2, 3, 4]])) @unittest.skipUnless(djpeg_available(), "djpeg not available") def test_load_djpeg(self): @@ -340,9 +337,9 @@ class TestFileJpeg(PillowTestCase): """ Generates a very hard to compress file :param size: tuple """ - return Image.frombytes('RGB',size, os.urandom(size[0]*size[1] *3)) + return Image.frombytes('RGB', size, os.urandom(size[0]*size[1] * 3)) - im = gen_random_image((512,512)) + im = gen_random_image((512, 512)) f = self.tempfile("temp.jpeg") im.save(f, quality=100, optimize=True) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index a9377bf63..07850f8cf 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -27,7 +27,7 @@ class LibTiffTestCase(PillowTestCase): self.assertEqual(im._compression, 'group4') except: print("No _compression") - print (dir(im)) + print(dir(im)) # can we write it back out, in a different form. out = self.tempfile("temp.png") @@ -243,13 +243,13 @@ class TestFileLibTiff(LibTiffTestCase): im2 = Image.open('Tests/images/12in16bit.tif') if Image.DEBUG: - print (im.getpixel((0, 0))) - print (im.getpixel((0, 1))) - print (im.getpixel((0, 2))) + print(im.getpixel((0, 0))) + print(im.getpixel((0, 1))) + print(im.getpixel((0, 2))) - print (im2.getpixel((0, 0))) - print (im2.getpixel((0, 1))) - print (im2.getpixel((0, 2))) + print(im2.getpixel((0, 0))) + print(im2.getpixel((0, 1))) + print(im2.getpixel((0, 2))) self.assert_image_equal(im, im2) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 4cd5dc703..dbbe72afa 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -153,7 +153,7 @@ class TestFilePng(PillowTestCase): im = load(HEAD + chunk(b'iTXt', b'spam\0\1\0en\0Spam\0' + zlib.compress(b"egg")[:1]) + TAIL) - self.assertEqual(im.info, {'spam':''}) + self.assertEqual(im.info, {'spam': ''}) im = load(HEAD + chunk(b'iTXt', b'spam\0\1\1en\0Spam\0' + zlib.compress(b"egg")) + TAIL) @@ -380,7 +380,6 @@ class TestFilePng(PillowTestCase): repr_png = Image.open(BytesIO(im._repr_png_())) self.assertEqual(repr_png.format, 'PNG') self.assert_image_equal(im, repr_png) - if __name__ == '__main__': diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 32aef075e..b885780d6 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -121,13 +121,13 @@ class TestFileTiff(PillowTestCase): im2 = Image.open('Tests/images/12in16bit.tif') if Image.DEBUG: - print (im.getpixel((0, 0))) - print (im.getpixel((0, 1))) - print (im.getpixel((0, 2))) + print(im.getpixel((0, 0))) + print(im.getpixel((0, 1))) + print(im.getpixel((0, 2))) - print (im2.getpixel((0, 0))) - print (im2.getpixel((0, 1))) - print (im2.getpixel((0, 2))) + print(im2.getpixel((0, 0))) + print(im2.getpixel((0, 1))) + print(im2.getpixel((0, 2))) self.assert_image_equal(im, im2) diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index 2954c0879..dfc16682b 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -37,7 +37,7 @@ class TestFileTiffMetadata(PillowTestCase): self.assertEqual(loaded.tag[50838], (len(textdata),)) self.assertEqual(loaded.tag[50839], textdata) - self.assertAlmostEqual(loaded.tag[tag_ids['RollAngle']][0], floatdata, + self.assertAlmostEqual(loaded.tag[tag_ids['RollAngle']][0], floatdata, places=5) self.assertAlmostEqual(loaded.tag[tag_ids['YawAngle']][0], doubledata) diff --git a/Tests/test_file_webp_metadata.py b/Tests/test_file_webp_metadata.py index f2f18d713..08d42d7c6 100644 --- a/Tests/test_file_webp_metadata.py +++ b/Tests/test_file_webp_metadata.py @@ -15,7 +15,6 @@ class TestFileWebpMetadata(PillowTestCase): if not _webp.HAVE_WEBPMUX: self.skipTest('WebPMux support not installed') - def test_read_exif_metadata(self): file_path = "Tests/images/flower.webp" diff --git a/Tests/test_file_xpm.py b/Tests/test_file_xpm.py index 9a666a705..6a6817048 100644 --- a/Tests/test_file_xpm.py +++ b/Tests/test_file_xpm.py @@ -15,7 +15,7 @@ class TestFileXpm(PillowTestCase): self.assertEqual(im.size, (128, 128)) self.assertEqual(im.format, "XPM") - #large error due to quantization->44 colors. + # large error due to quantization->44 colors. self.assert_image_similar(im.convert('RGB'), hopper('RGB'), 60) def test_load_read(self): diff --git a/Tests/test_image_putdata.py b/Tests/test_image_putdata.py index 3b7dc836a..b46456eba 100644 --- a/Tests/test_image_putdata.py +++ b/Tests/test_image_putdata.py @@ -72,8 +72,8 @@ class TestImagePutData(PillowTestCase): im = Image.new('L', (150, 100)) im.putdata(arr) - self.assertEqual(len(im.getdata()),len(arr)) - + self.assertEqual(len(im.getdata()), len(arr)) + def test_array_F(self): # shouldn't segfault # see https://github.com/python-pillow/Pillow/issues/1008 @@ -82,7 +82,7 @@ class TestImagePutData(PillowTestCase): arr = array('f', [0.0])*15000 im.putdata(arr) - self.assertEqual(len(im.getdata()),len(arr)) + self.assertEqual(len(im.getdata()), len(arr)) if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py index 9cd85d1b1..414758529 100644 --- a/Tests/test_image_resize.py +++ b/Tests/test_image_resize.py @@ -17,11 +17,11 @@ class TestImagingCoreResize(PillowTestCase): def test_nearest_mode(self): for mode in ["1", "P", "L", "I", "F", "RGB", "RGBA", "CMYK", "YCbCr", - "I;16"]: # exotic mode + "I;16"]: # exotic mode im = hopper(mode) r = self.resize(im, (15, 12), Image.NEAREST) self.assertEqual(r.mode, mode) - self.assertEqual(r.size, (15, 12) ) + self.assertEqual(r.size, (15, 12)) self.assertEqual(r.im.bands, im.im.bands) def test_convolution_modes(self): @@ -35,7 +35,7 @@ class TestImagingCoreResize(PillowTestCase): im = hopper(mode) r = self.resize(im, (15, 12), Image.BILINEAR) self.assertEqual(r.mode, mode) - self.assertEqual(r.size, (15, 12) ) + self.assertEqual(r.size, (15, 12)) self.assertEqual(r.im.bands, im.im.bands) def test_reduce_filters(self): diff --git a/Tests/test_image_transpose.py b/Tests/test_image_transpose.py index 3183ceadd..3069df61c 100644 --- a/Tests/test_image_transpose.py +++ b/Tests/test_image_transpose.py @@ -1,7 +1,7 @@ from helper import unittest, PillowTestCase, hopper from PIL.Image import (FLIP_LEFT_RIGHT, FLIP_TOP_BOTTOM, ROTATE_90, ROTATE_180, - ROTATE_270, TRANSPOSE) + ROTATE_270, TRANSPOSE) class TestImageTranspose(PillowTestCase): diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index 93bdda44c..7a2a57151 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -4,7 +4,7 @@ from PIL import Image from io import BytesIO import os - + try: from PIL import ImageCms from PIL.ImageCms import ImageCmsProfile @@ -17,6 +17,7 @@ except ImportError as v: SRGB = "Tests/icc/sRGB_IEC61966-2-1_black_scaled.icc" HAVE_PROFILE = os.path.exists(SRGB) + class TestImageCms(PillowTestCase): def setUp(self): @@ -32,7 +33,7 @@ class TestImageCms(PillowTestCase): self.skipTest("SRGB profile not available") def test_sanity(self): - + # basic smoke test. # this mostly follows the cms_test outline. diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 6adc6c1f2..3b9919834 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -64,7 +64,7 @@ class TestImageDraw(PillowTestCase): # Assert self.assert_image_similar( - im, Image.open("Tests/images/imagedraw_arc.png"),1) + im, Image.open("Tests/images/imagedraw_arc.png"), 1) def test_arc1(self): self.helper_arc(BBOX1) @@ -97,7 +97,7 @@ class TestImageDraw(PillowTestCase): # Assert self.assert_image_similar( - im, Image.open("Tests/images/imagedraw_chord.png"),1) + im, Image.open("Tests/images/imagedraw_chord.png"), 1) def test_chord1(self): self.helper_chord(BBOX1) @@ -116,7 +116,7 @@ class TestImageDraw(PillowTestCase): # Assert self.assert_image_similar( - im, Image.open("Tests/images/imagedraw_ellipse.png"),1) + im, Image.open("Tests/images/imagedraw_ellipse.png"), 1) def test_ellipse1(self): self.helper_ellipse(BBOX1) @@ -154,7 +154,7 @@ class TestImageDraw(PillowTestCase): # Assert self.assert_image_similar( - im, Image.open("Tests/images/imagedraw_pieslice.png"),1) + im, Image.open("Tests/images/imagedraw_pieslice.png"), 1) def test_pieslice1(self): self.helper_pieslice(BBOX1) diff --git a/Tests/test_imageenhance.py b/Tests/test_imageenhance.py index 58042db85..82ba2e5db 100644 --- a/Tests/test_imageenhance.py +++ b/Tests/test_imageenhance.py @@ -21,23 +21,22 @@ class TestImageEnhance(PillowTestCase): im = Image.new("RGB", (1, 1)) ImageEnhance.Sharpness(im).enhance(0.5) - def _half_transparent_image(self): # returns an image, half transparent, half solid im = hopper('RGB') - + transparent = Image.new('L', im.size, 0) solid = Image.new('L', (im.size[0]//2, im.size[1]), 255) - transparent.paste(solid, (0,0)) + transparent.paste(solid, (0, 0)) im.putalpha(transparent) return im - def _check_alpha(self,im, original, op, amount): + def _check_alpha(self, im, original, op, amount): self.assertEqual(im.getbands(), original.getbands()) self.assert_image_equal(im.split()[-1], original.split()[-1], "Diff on %s: %s" % (op, amount)) - + def test_alpha(self): # Issue https://github.com/python-pillow/Pillow/issues/899 # Is alpha preserved through image enhancement? @@ -45,10 +44,10 @@ class TestImageEnhance(PillowTestCase): original = self._half_transparent_image() for op in ['Color', 'Brightness', 'Contrast', 'Sharpness']: - for amount in [0,0.5,1.0]: - self._check_alpha(getattr(ImageEnhance,op)(original).enhance(amount), + for amount in [0, 0.5, 1.0]: + self._check_alpha(getattr(ImageEnhance, op)(original).enhance(amount), original, op, amount) - + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index 662a3bfb0..01503dff7 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -58,7 +58,7 @@ class TestImageFile(PillowTestCase): # This test fails on Ubuntu 12.04, PPC (Bigendian) It # appears to be a ghostscript 9.05 bug, since the # ghostscript rendering is wonky and the file is identical - # to that written on ubuntu 12.04 x64 + # to that written on ubuntu 12.04 x64 # md5sum: ba974835ff2d6f3f2fd0053a23521d4a # EPS comes back in RGB: diff --git a/Tests/test_imagefont_bitmap.py b/Tests/test_imagefont_bitmap.py index 9da3d1776..27141f4b3 100644 --- a/Tests/test_imagefont_bitmap.py +++ b/Tests/test_imagefont_bitmap.py @@ -1,6 +1,7 @@ from helper import unittest, PillowTestCase from PIL import Image, ImageFont, ImageDraw + class TestImageFontBitmap(PillowTestCase): def test_similar(self): text = 'EmbeddedBitmap' @@ -13,10 +14,10 @@ class TestImageFontBitmap(PillowTestCase): draw_bitmap, draw_outline = ImageDraw.Draw(im_bitmap), ImageDraw.Draw(im_outline) # Metrics are different on the bitmap and ttf fonts, more so on some platforms - # and versions of freetype than others. Mac has a 1px difference, linux doesn't. - draw_bitmap.text((0, size_final[1] - size_bitmap[1]), + # and versions of freetype than others. Mac has a 1px difference, linux doesn't. + draw_bitmap.text((0, size_final[1] - size_bitmap[1]), text, fill=(0, 0, 0), font=font_bitmap) - draw_outline.text((0, size_final[1] - size_outline[1]), + draw_outline.text((0, size_final[1] - size_outline[1]), text, fill=(0, 0, 0), font=font_outline) self.assert_image_similar(im_bitmap, im_outline, 20) diff --git a/Tests/test_imagesequence.py b/Tests/test_imagesequence.py index 62a83cda6..459a053d8 100644 --- a/Tests/test_imagesequence.py +++ b/Tests/test_imagesequence.py @@ -24,16 +24,16 @@ class TestImageSequence(PillowTestCase): def _test_multipage_tiff(self, dbg=False): # debug had side effect of calling fp.tell. - Image.DEBUG=dbg + Image.DEBUG = dbg im = Image.open('Tests/images/multipage.tiff') for index, frame in enumerate(ImageSequence.Iterator(im)): frame.load() self.assertEqual(index, im.tell()) frame.convert('RGB') - Image.DEBUG=False + Image.DEBUG = False def test_tiff(self): - #self._test_multipage_tiff(True) + # self._test_multipage_tiff(True) self._test_multipage_tiff(False) def test_libtiff(self): @@ -43,7 +43,7 @@ class TestImageSequence(PillowTestCase): self.skipTest("tiff support not available") TiffImagePlugin.READ_LIBTIFF = True - #self._test_multipage_tiff(True) + # self._test_multipage_tiff(True) self._test_multipage_tiff(False) TiffImagePlugin.READ_LIBTIFF = False diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 7b6f22b2b..f010e0df5 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -129,8 +129,8 @@ class TestNumpy(PillowTestCase): arr = numpy.zeros((15000,), numpy.float32) im.putdata(arr) - self.assertEqual(len(im.getdata()),len(arr)) - + self.assertEqual(len(im.getdata()), len(arr)) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_scipy.py b/Tests/test_scipy.py index 926bbb186..60f1a1b1e 100644 --- a/Tests/test_scipy.py +++ b/Tests/test_scipy.py @@ -8,12 +8,12 @@ try: HAS_SCIPY = True except: HAS_SCIPY = False - + class Test_scipy_resize(PillowTestCase): """ Tests for scipy regression in 2.6.0 - Tests from https://github.com/scipy/scipy/blob/master/scipy/misc/pilutil.py + Tests from https://github.com/scipy/scipy/blob/master/scipy/misc/pilutil.py """ def setUp(self): @@ -21,25 +21,23 @@ class Test_scipy_resize(PillowTestCase): self.skipTest("Scipy Required") def test_imresize(self): - im = np.random.random((10,20)) + 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)) + im1 = misc.imresize(im, T(1.101)) + self.assertEqual(im1.shape, (11, 22)) 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) + 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 + 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) - - From 86be744d1fe75726c461d7d8cffa726bebb874e2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 24 Apr 2015 09:41:33 +1000 Subject: [PATCH 457/532] Various Flake8 Scripts fixes --- Scripts/enhancer.py | 3 ++- Scripts/explode.py | 6 ++++-- Scripts/gifmaker.py | 8 ++++++-- Scripts/painter.py | 5 +++-- Scripts/pilconvert.py | 7 +++++-- Scripts/pildriver.py | 3 ++- Scripts/pilfile.py | 5 ++++- Scripts/pilfont.py | 3 ++- Scripts/pilprint.py | 11 +++++++---- Scripts/player.py | 4 ++-- Scripts/thresholder.py | 9 +++++---- Scripts/viewer.py | 1 + 12 files changed, 43 insertions(+), 22 deletions(-) diff --git a/Scripts/enhancer.py b/Scripts/enhancer.py index fe250c9f8..34becf873 100644 --- a/Scripts/enhancer.py +++ b/Scripts/enhancer.py @@ -18,6 +18,7 @@ import sys # # enhancer widget + class Enhance(Frame): def __init__(self, master, image, name, enhancer, lo, hi): Frame.__init__(self, master) @@ -25,7 +26,7 @@ class Enhance(Frame): # set up the image self.tkim = ImageTk.PhotoImage(image.mode, image.size) self.enhancer = enhancer(image) - self.update("1.0") # normalize + self.update("1.0") # normalize # image window Label(self, image=self.tkim).pack() diff --git a/Scripts/explode.py b/Scripts/explode.py index b8680f631..0460fa020 100644 --- a/Scripts/explode.py +++ b/Scripts/explode.py @@ -9,11 +9,13 @@ from __future__ import print_function from PIL import Image -import os, sys +import os +import sys + class Interval: - def __init__(self, interval = "0"): + def __init__(self, interval="0"): self.setinterval(interval) diff --git a/Scripts/gifmaker.py b/Scripts/gifmaker.py index bd4de99c1..8777f74f6 100644 --- a/Scripts/gifmaker.py +++ b/Scripts/gifmaker.py @@ -49,20 +49,23 @@ from PIL.GifImagePlugin import getheader, getdata # -------------------------------------------------------------------- # sequence iterator + class image_sequence: def __init__(self, im): self.im = im + def __getitem__(self, ix): try: if ix: self.im.seek(ix) return self.im except EOFError: - raise IndexError # end of sequence + raise IndexError # end of sequence # -------------------------------------------------------------------- # straightforward delta encoding + def makedelta(fp, sequence): """Convert list of image frames to a GIF animation file""" @@ -91,7 +94,7 @@ def makedelta(fp, sequence): if bbox: # compress difference - for s in getdata(im.crop(bbox), offset = bbox[:2]): + for s in getdata(im.crop(bbox), offset=bbox[:2]): fp.write(s) else: @@ -109,6 +112,7 @@ def makedelta(fp, sequence): # -------------------------------------------------------------------- # main hack + def compress(infile, outfile): # open input image, and force loading of first frame diff --git a/Scripts/painter.py b/Scripts/painter.py index 80c4db6a0..6f1c19484 100644 --- a/Scripts/painter.py +++ b/Scripts/painter.py @@ -20,6 +20,7 @@ import sys # # painter widget + class PaintCanvas(Canvas): def __init__(self, master, image): Canvas.__init__(self, master, width=image.size[0], height=image.size[1]) @@ -33,7 +34,7 @@ class PaintCanvas(Canvas): box = x, y, min(xsize, x+tilesize), min(ysize, y+tilesize) tile = ImageTk.PhotoImage(image.crop(box)) self.create_image(x, y, image=tile, anchor=NW) - self.tile[(x,y)] = box, tile + self.tile[(x, y)] = box, tile self.image = image @@ -59,7 +60,7 @@ class PaintCanvas(Canvas): xy, tile = self.tile[(x, y)] tile.paste(self.image.crop(xy)) except KeyError: - pass # outside the image + pass # outside the image self.update_idletasks() # diff --git a/Scripts/pilconvert.py b/Scripts/pilconvert.py index 0341994c9..66b2e5ac2 100644 --- a/Scripts/pilconvert.py +++ b/Scripts/pilconvert.py @@ -15,10 +15,13 @@ from __future__ import print_function -import getopt, string, sys +import getopt +import string +import sys from PIL import Image + def usage(): print("PIL Convert 0.5/1998-12-30 -- convert image files") print("Usage: pilconvert [option] infile outfile") @@ -49,7 +52,7 @@ except getopt.error as v: format = None convert = None -options = { } +options = {} for o, a in opt: diff --git a/Scripts/pildriver.py b/Scripts/pildriver.py index e45b05008..ba2a8c66f 100644 --- a/Scripts/pildriver.py +++ b/Scripts/pildriver.py @@ -52,6 +52,7 @@ from __future__ import print_function from PIL import Image + class PILDriver: verbose = 0 @@ -500,7 +501,7 @@ if __name__ == '__main__': try: import readline except ImportError: - pass # not available on all platforms + pass # not available on all platforms # If we see command-line arguments, interpret them as a stack state # and execute. Otherwise go interactive. diff --git a/Scripts/pilfile.py b/Scripts/pilfile.py index 1b77b0e78..b4fe4942c 100644 --- a/Scripts/pilfile.py +++ b/Scripts/pilfile.py @@ -20,7 +20,9 @@ from __future__ import print_function import site -import getopt, glob, sys +import getopt +import glob +import sys from PIL import Image @@ -59,6 +61,7 @@ for o, a in opt: elif o == "-D": Image.DEBUG += 1 + def globfix(files): # expand wildcards where necessary if sys.platform == "win32": diff --git a/Scripts/pilfont.py b/Scripts/pilfont.py index ec25e7a71..4425c072c 100644 --- a/Scripts/pilfont.py +++ b/Scripts/pilfont.py @@ -14,7 +14,8 @@ from __future__ import print_function VERSION = "0.4" -import glob, sys +import glob +import sys # drivers from PIL import BdfFontFile diff --git a/Scripts/pilprint.py b/Scripts/pilprint.py index 889944de7..d13a2a526 100644 --- a/Scripts/pilprint.py +++ b/Scripts/pilprint.py @@ -12,14 +12,17 @@ # from __future__ import print_function -import getopt, os, sys +import getopt +import os +import sys VERSION = "pilprint 0.3/2003-05-05" from PIL import Image from PIL import PSDraw -letter = ( 1.0*72, 1.0*72, 7.5*72, 10.0*72 ) +letter = (1.0*72, 1.0*72, 7.5*72, 10.0*72) + def description(file, image): title = os.path.splitext(os.path.split(file)[1])[0] @@ -43,8 +46,8 @@ except getopt.error as v: print(v) sys.exit(1) -printer = None # print to stdout -monochrome = 1 # reduce file size for most common case +printer = None # print to stdout +monochrome = 1 # reduce file size for most common case for o, a in opt: if o == "-d": diff --git a/Scripts/player.py b/Scripts/player.py index 0c90286c5..43877415a 100644 --- a/Scripts/player.py +++ b/Scripts/player.py @@ -56,7 +56,7 @@ class UI(Label): del self.im[0] self.image.paste(im) except IndexError: - return # end of list + return # end of list else: @@ -65,7 +65,7 @@ class UI(Label): im.seek(im.tell() + 1) self.image.paste(im) except EOFError: - return # end of file + return # end of file try: duration = im.info["duration"] diff --git a/Scripts/thresholder.py b/Scripts/thresholder.py index 29d4592d9..1e55c5a32 100644 --- a/Scripts/thresholder.py +++ b/Scripts/thresholder.py @@ -18,8 +18,9 @@ import sys # # an image viewer + class UI(Frame): - def __init__(self, master, im, value = 128): + def __init__(self, master, im, value=128): Frame.__init__(self, master) self.image = im @@ -45,16 +46,16 @@ class UI(Frame): self.redraw() - def redraw(self, event = None): + def redraw(self, event=None): # create overlay (note the explicit conversion to mode "1") - im = self.image.point(lambda v,t=self.value: v>=t, "1") + im = self.image.point(lambda v, t=self.value: v >= t, "1") self.overlay = ImageTk.BitmapImage(im, foreground="green") # update canvas self.canvas.delete("overlay") self.canvas.create_image(0, 0, image=self.overlay, anchor=NW, - tags="overlay") + tags="overlay") # -------------------------------------------------------------------- # main diff --git a/Scripts/viewer.py b/Scripts/viewer.py index 86b2526cd..c0fc59d96 100644 --- a/Scripts/viewer.py +++ b/Scripts/viewer.py @@ -16,6 +16,7 @@ from PIL import Image, ImageTk # # an image viewer + class UI(Label): def __init__(self, master, im): From 87c4c6a72d9103373386a9103a18d88289444c0e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 24 Apr 2015 10:15:14 +1000 Subject: [PATCH 458/532] Various Flake8 fixes to base scripts --- mp_compile.py | 5 +++-- setup.py | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mp_compile.py b/mp_compile.py index 955cd9c1b..892452558 100644 --- a/mp_compile.py +++ b/mp_compile.py @@ -3,7 +3,8 @@ from multiprocessing import Pool, cpu_count from distutils.ccompiler import CCompiler -import os, sys +import os +import sys try: MAX_PROCS = int(os.environ.get('MAX_CONCURRENCY', min(4, cpu_count()))) @@ -38,7 +39,7 @@ def _mp_compile(self, sources, output_dir=None, macros=None, pool = Pool(MAX_PROCS) try: - print ("Building using %d processes" % pool._processes) + print("Building using %d processes" % pool._processes) except: pass arr = [(self, obj, build, cc_args, extra_postargs, pp_opts) diff --git a/setup.py b/setup.py index 5886de07b..216322ec2 100644 --- a/setup.py +++ b/setup.py @@ -570,7 +570,7 @@ class pil_build_ext(build_ext): if feature.webpmux: defs.append(("HAVE_WEBPMUX", None)) libs.append(feature.webpmux) - libs.append(feature.webpmux.replace('pmux','pdemux')) + libs.append(feature.webpmux.replace('pmux', 'pdemux')) exts.append(Extension( "PIL._webp", ["_webp.c"], libraries=libs, define_macros=defs)) @@ -757,6 +757,6 @@ setup( test_suite='nose.collector', keywords=["Imaging", ], license='Standard PIL License', - zip_safe= not debug_build(), + zip_safe=not debug_build(), ) # End of file From ebc6996ba5790744724ecdd81dfb24920aca7ef0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 2 Apr 2015 16:35:52 +1100 Subject: [PATCH 459/532] Changed list comprehension variable name to avoid redefinition --- PIL/EpsImagePlugin.py | 2 +- PIL/TiffImagePlugin.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/EpsImagePlugin.py b/PIL/EpsImagePlugin.py index 83024b63f..62e438f0d 100644 --- a/PIL/EpsImagePlugin.py +++ b/PIL/EpsImagePlugin.py @@ -248,7 +248,7 @@ class EpsImageFile(ImageFile.ImageFile): # Note: The DSC spec says that BoundingBox # fields should be integers, but some drivers # put floating point values there anyway. - box = [int(float(s)) for s in v.split()] + box = [int(float(i)) for i in v.split()] self.size = box[2] - box[0], box[3] - box[1] self.tile = [("eps", (0, 0) + self.size, offset, (length, box))] diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index e4028fdbb..ec1c84220 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -978,7 +978,7 @@ class TiffImageFile(ImageFile.ImageFile): # fixup palette descriptor if self.mode == "P": - palette = [o8(a // 256) for a in self.tag[COLORMAP]] + palette = [o8(b // 256) for b in self.tag[COLORMAP]] self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) # # -------------------------------------------------------------------- From e22e4239e502ece06848d53de2a804983c374e55 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 2 Apr 2015 16:37:04 +1100 Subject: [PATCH 460/532] Removed unused imports --- PIL/FontFile.py | 5 ----- Scripts/pilfile.py | 1 - Tests/check_jpeg_leaks.py | 1 - Tests/test_image.py | 1 - 4 files changed, 8 deletions(-) diff --git a/PIL/FontFile.py b/PIL/FontFile.py index 26ddff0ac..fa984fa72 100644 --- a/PIL/FontFile.py +++ b/PIL/FontFile.py @@ -17,11 +17,6 @@ import os from PIL import Image, _binary -try: - import zlib -except ImportError: - zlib = None - WIDTH = 800 diff --git a/Scripts/pilfile.py b/Scripts/pilfile.py index b4fe4942c..b954114ac 100644 --- a/Scripts/pilfile.py +++ b/Scripts/pilfile.py @@ -19,7 +19,6 @@ from __future__ import print_function -import site import getopt import glob import sys diff --git a/Tests/check_jpeg_leaks.py b/Tests/check_jpeg_leaks.py index 290bac4d8..b46643a55 100644 --- a/Tests/check_jpeg_leaks.py +++ b/Tests/check_jpeg_leaks.py @@ -1,5 +1,4 @@ from helper import unittest, PillowTestCase, hopper -from PIL import Image from io import BytesIO import sys diff --git a/Tests/test_image.py b/Tests/test_image.py index de43b010e..0b84de630 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -1,7 +1,6 @@ from helper import unittest, PillowTestCase, hopper from PIL import Image -import sys class TestImage(PillowTestCase): From 9794aafc3783277e2cf213de6e6014db01782a00 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 8 Apr 2015 21:12:37 +1000 Subject: [PATCH 461/532] Removed or commented unused variables --- PIL/FontFile.py | 3 ++- PIL/IptcImagePlugin.py | 2 +- PIL/PcfFontFile.py | 2 +- PIL/TiffImagePlugin.py | 4 ++-- Tests/bench_get.py | 2 +- Tests/check_j2k_leaks.py | 6 +++--- Tests/check_jpeg_leaks.py | 6 +++--- Tests/check_webp_leaks.py | 2 +- 8 files changed, 14 insertions(+), 13 deletions(-) diff --git a/PIL/FontFile.py b/PIL/FontFile.py index fa984fa72..5cf688256 100644 --- a/PIL/FontFile.py +++ b/PIL/FontFile.py @@ -78,7 +78,8 @@ class FontFile: glyph = self[i] if glyph: d, dst, src, im = glyph - xx, yy = src[2] - src[0], src[3] - src[1] + xx = src[2] - src[0] + # yy = src[3] - src[1] x0, y0 = x, y x = x + xx if x > WIDTH: diff --git a/PIL/IptcImagePlugin.py b/PIL/IptcImagePlugin.py index dc8607591..aa0193894 100644 --- a/PIL/IptcImagePlugin.py +++ b/PIL/IptcImagePlugin.py @@ -222,7 +222,7 @@ def getiptcinfo(im): offset += 2 # resource name (usually empty) name_len = i8(app[offset]) - name = app[offset+1:offset+1+name_len] + # name = app[offset+1:offset+1+name_len] offset = 1 + offset + name_len if offset & 1: offset += 1 diff --git a/PIL/PcfFontFile.py b/PIL/PcfFontFile.py index c19a1c532..c2006905e 100644 --- a/PIL/PcfFontFile.py +++ b/PIL/PcfFontFile.py @@ -204,7 +204,7 @@ class PcfFontFile(FontFile.FontFile): for i in range(4): bitmapSizes.append(i32(fp.read(4))) - byteorder = format & 4 # non-zero => MSB + # byteorder = format & 4 # non-zero => MSB bitorder = format & 8 # non-zero => MSB padindex = format & 3 diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index ec1c84220..ad085451b 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -731,8 +731,8 @@ class TiffImageFile(ImageFile.ImageFile): # (self._compression, (extents tuple), # 0, (rawmode, self._compression, fp)) - ignored, extents, ignored_2, args = self.tile[0] - args = args + (self.ifd.offset,) + extents = self.tile[0][1] + args = self.tile[0][3] + (self.ifd.offset,) decoder = Image._getdecoder(self.mode, 'libtiff', args, self.decoderconfig) try: diff --git a/Tests/bench_get.py b/Tests/bench_get.py index 8f786acf0..9c51c0258 100644 --- a/Tests/bench_get.py +++ b/Tests/bench_get.py @@ -10,7 +10,7 @@ def bench(mode): get = im.im.getpixel xy = 50, 50 # position shouldn't really matter t0 = timeit.default_timer() - for i in range(1000000): + for _ in range(1000000): get(xy) print(mode, timeit.default_timer() - t0, "us") diff --git a/Tests/check_j2k_leaks.py b/Tests/check_j2k_leaks.py index 9dbb8c1f4..8e9c4ca20 100755 --- a/Tests/check_j2k_leaks.py +++ b/Tests/check_j2k_leaks.py @@ -21,7 +21,7 @@ class TestJpegLeaks(PillowTestCase): from resource import setrlimit, RLIMIT_AS, RLIMIT_STACK setrlimit(RLIMIT_STACK, (stack_size, stack_size)) setrlimit(RLIMIT_AS, (mem_limit, mem_limit)) - for count in range(iterations): + for _ in range(iterations): with Image.open(test_file) as im: im.load() @@ -29,13 +29,13 @@ class TestJpegLeaks(PillowTestCase): from resource import setrlimit, RLIMIT_AS, RLIMIT_STACK setrlimit(RLIMIT_STACK, (stack_size, stack_size)) setrlimit(RLIMIT_AS, (mem_limit, mem_limit)) - for count in range(iterations): + for _ in range(iterations): with Image.open(test_file) as im: im.load() test_output = BytesIO() im.save(test_output, "JPEG2000") test_output.seek(0) - output = test_output.read() + test_output.read() if __name__ == '__main__': diff --git a/Tests/check_jpeg_leaks.py b/Tests/check_jpeg_leaks.py index b46643a55..b8a82a5ec 100644 --- a/Tests/check_jpeg_leaks.py +++ b/Tests/check_jpeg_leaks.py @@ -101,7 +101,7 @@ post-patch: qtables = [standard_l_qtable, standard_chrominance_qtable] - for count in range(iterations): + for _ in range(iterations): test_output = BytesIO() im.save(test_output, "JPEG", qtables=qtables) @@ -165,7 +165,7 @@ post patch: im = hopper('RGB') exif = b'12345678'*4096 - for count in range(iterations): + for _ in range(iterations): test_output = BytesIO() im.save(test_output, "JPEG", exif=exif) @@ -199,7 +199,7 @@ base case: def test_base_save(self): im = hopper('RGB') - for count in range(iterations): + for _ in range(iterations): test_output = BytesIO() im.save(test_output, "JPEG") diff --git a/Tests/check_webp_leaks.py b/Tests/check_webp_leaks.py index 79e22328b..0f54f382d 100644 --- a/Tests/check_webp_leaks.py +++ b/Tests/check_webp_leaks.py @@ -28,7 +28,7 @@ class TestWebPLeaks(PillowTestCase): with open(test_file, 'rb') as f: im_data = f.read() start_mem = self._get_mem_usage() - for count in range(iterations): + for _ in range(iterations): with Image.open(BytesIO(im_data)) as im: im.load() mem = (self._get_mem_usage() - start_mem) From 8193a07305942ba4b7f5e522fc532c4dcc77ad48 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Apr 2015 23:52:59 +1100 Subject: [PATCH 462/532] Removed unnecessary line from ImageOps --- PIL/ImageOps.py | 1 - 1 file changed, 1 deletion(-) diff --git a/PIL/ImageOps.py b/PIL/ImageOps.py index a1706875d..931ad3c75 100644 --- a/PIL/ImageOps.py +++ b/PIL/ImageOps.py @@ -233,7 +233,6 @@ def expand(image, border=0, fill=0): :param fill: Pixel fill value (a color value). Default is 0 (black). :return: An image. """ - "Add border to image" left, top, right, bottom = _border(border) width = left + image.size[0] + right height = top + image.size[1] + bottom From 540a225ea059468d0ee3d48272cd2a821f34f778 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Apr 2015 11:49:04 +1100 Subject: [PATCH 463/532] Removed unnecessary pass lines and commented debugging lines --- PIL/ImagePalette.py | 4 ++-- Tests/test_imageshow.py | 1 - Tests/test_imagewin.py | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/PIL/ImagePalette.py b/PIL/ImagePalette.py index 62f8814f1..c6c05d162 100644 --- a/PIL/ImagePalette.py +++ b/PIL/ImagePalette.py @@ -225,8 +225,8 @@ def load(filename): p = PaletteFile.PaletteFile(fp) lut = p.getpalette() except (SyntaxError, ValueError): - import traceback - traceback.print_exc() + #import traceback + #traceback.print_exc() pass if not lut: diff --git a/Tests/test_imageshow.py b/Tests/test_imageshow.py index e94ae2d0a..236d6e224 100644 --- a/Tests/test_imageshow.py +++ b/Tests/test_imageshow.py @@ -9,7 +9,6 @@ class TestImageShow(PillowTestCase): def test_sanity(self): dir(Image) dir(ImageShow) - pass if __name__ == '__main__': diff --git a/Tests/test_imagewin.py b/Tests/test_imagewin.py index 6fb58a0dc..7cfd7fe5c 100644 --- a/Tests/test_imagewin.py +++ b/Tests/test_imagewin.py @@ -8,7 +8,6 @@ class TestImageWin(PillowTestCase): def test_sanity(self): dir(ImageWin) - pass def test_hdc(self): # Arrange From e8679dff66e5039982e087b5c6077cf10f744582 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Apr 2015 17:42:34 +1100 Subject: [PATCH 464/532] Fixed indentation in OleFileIO --- PIL/OleFileIO.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index a94b760c8..88b68fa4a 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -360,12 +360,12 @@ WORD_CLSID = "00020900-0000-0000-C000-000000000046" #TODO: check Excel, PPT, ... #[PL]: Defect levels to classify parsing errors - see OleFileIO._raise_defect() -DEFECT_UNSURE = 10 # a case which looks weird, but not sure it's a defect -DEFECT_POTENTIAL = 20 # a potential defect -DEFECT_INCORRECT = 30 # an error according to specifications, but parsing - # can go on -DEFECT_FATAL = 40 # an error which cannot be ignored, parsing is - # impossible +DEFECT_UNSURE = 10 # a case which looks weird, but not sure it's a defect +DEFECT_POTENTIAL = 20 # a potential defect +DEFECT_INCORRECT = 30 # an error according to specifications, but parsing + # can go on +DEFECT_FATAL = 40 # an error which cannot be ignored, parsing is + # impossible #[PL] add useful constants to __all__: for key in list(vars().keys()): @@ -468,14 +468,14 @@ def _unicode(s, errors='replace'): def filetime2datetime(filetime): - """ - convert FILETIME (64 bits int) to Python datetime.datetime - """ - # TODO: manage exception when microseconds is too large - # inspired from http://code.activestate.com/recipes/511425-filetime-to-datetime/ - _FILETIME_null_date = datetime.datetime(1601, 1, 1, 0, 0, 0) - #debug('timedelta days=%d' % (filetime//(10*1000000*3600*24))) - return _FILETIME_null_date + datetime.timedelta(microseconds=filetime//10) + """ + convert FILETIME (64 bits int) to Python datetime.datetime + """ + # TODO: manage exception when microseconds is too large + # inspired from http://code.activestate.com/recipes/511425-filetime-to-datetime/ + _FILETIME_null_date = datetime.datetime(1601, 1, 1, 0, 0, 0) + #debug('timedelta days=%d' % (filetime//(10*1000000*3600*24))) + return _FILETIME_null_date + datetime.timedelta(microseconds=filetime//10) #=== CLASSES ================================================================== From f2145baedb16b1dd76b17bb09b260f7ec4cce10c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 2 Apr 2015 00:01:07 +1100 Subject: [PATCH 465/532] Fixed unused imports in MicImagePlugin --- PIL/MicImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/MicImagePlugin.py b/PIL/MicImagePlugin.py index cdfaf3eda..d1f8b082a 100644 --- a/PIL/MicImagePlugin.py +++ b/PIL/MicImagePlugin.py @@ -21,7 +21,7 @@ __version__ = "0.1" from PIL import Image, TiffImagePlugin -from PIL.OleFileIO import * +from PIL.OleFileIO import MAGIC, OleFileIO # From 566153f59fade763754ff2c72b71463d1dfeb6ae Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 2 Apr 2015 19:57:24 +1100 Subject: [PATCH 466/532] Fixed statements with no effect --- Tests/test_cffi.py | 12 ++++++------ Tests/test_file_webp_metadata.py | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Tests/test_cffi.py b/Tests/test_cffi.py index 5599dbb48..5d5427685 100644 --- a/Tests/test_cffi.py +++ b/Tests/test_cffi.py @@ -49,10 +49,10 @@ class TestCffi(PillowTestCase): self.skipTest("No cffi") def _test_get_access(self, im): - """ Do we get the same thing as the old pixel access """ + """Do we get the same thing as the old pixel access - """ Using private interfaces, forcing a capi access and - a pyaccess for the same image """ + Using private interfaces, forcing a capi access and + a pyaccess for the same image""" caccess = im.im.pixel_access(False) access = PyAccess.new(im, False) @@ -90,10 +90,10 @@ class TestCffi(PillowTestCase): # self._test_get_access(im) def _test_set_access(self, im, color): - """ Are we writing the correct bits into the image? """ + """Are we writing the correct bits into the image? - """ Using private interfaces, forcing a capi access and - a pyaccess for the same image """ + Using private interfaces, forcing a capi access and + a pyaccess for the same image""" caccess = im.im.pixel_access(False) access = PyAccess.new(im, False) diff --git a/Tests/test_file_webp_metadata.py b/Tests/test_file_webp_metadata.py index 08d42d7c6..9093f31ba 100644 --- a/Tests/test_file_webp_metadata.py +++ b/Tests/test_file_webp_metadata.py @@ -96,7 +96,7 @@ class TestFileWebpMetadata(PillowTestCase): file_path = "Tests/images/flower.jpg" image = Image.open(file_path) - image.info['exif'] + self.assertTrue('exif' in image.info) buffer = BytesIO() From 7f414057c97b526a074c38ba191073bff0536d50 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 2 Apr 2015 19:45:24 +1100 Subject: [PATCH 467/532] Fixed redefinition of built-in --- PIL/ImImagePlugin.py | 4 ++-- PIL/ImageFilter.py | 4 ++-- PIL/ImageOps.py | 4 ++-- PIL/ImageStat.py | 10 +++++----- PIL/MspImagePlugin.py | 12 ++++++------ Scripts/pilconvert.py | 8 ++++---- Scripts/pilprint.py | 10 +++++----- Tests/test_file_libtiff.py | 24 ++++++++++++------------ 8 files changed, 38 insertions(+), 38 deletions(-) diff --git a/PIL/ImImagePlugin.py b/PIL/ImImagePlugin.py index 4266f8315..c68a3cea4 100644 --- a/PIL/ImImagePlugin.py +++ b/PIL/ImImagePlugin.py @@ -313,7 +313,7 @@ SAVE = { def _save(im, fp, filename, check=0): try: - type, rawmode = SAVE[im.mode] + image_type, rawmode = SAVE[im.mode] except KeyError: raise ValueError("Cannot save %s images as IM" % im.mode) @@ -325,7 +325,7 @@ def _save(im, fp, filename, check=0): if check: return check - fp.write(("Image type: %s image\r\n" % type).encode('ascii')) + fp.write(("Image type: %s image\r\n" % image_type).encode('ascii')) if filename: fp.write(("Name: %s\r\n" % filename).encode('ascii')) fp.write(("Image size (x*y): %d*%d\r\n" % im.size).encode('ascii')) diff --git a/PIL/ImageFilter.py b/PIL/ImageFilter.py index b46845807..baa168aa7 100644 --- a/PIL/ImageFilter.py +++ b/PIL/ImageFilter.py @@ -15,7 +15,7 @@ # See the README file for information on usage and redistribution. # -from functools import reduce +import functools class Filter(object): @@ -43,7 +43,7 @@ class Kernel(Filter): def __init__(self, size, kernel, scale=None, offset=0): if scale is None: # default scale is sum of kernel - scale = reduce(lambda a, b: a+b, kernel) + scale = functools.reduce(lambda a, b: a+b, kernel) if size[0] * size[1] != len(kernel): raise ValueError("not enough coefficients in kernel") self.filterargs = size, scale, offset, kernel diff --git a/PIL/ImageOps.py b/PIL/ImageOps.py index 931ad3c75..f317645b2 100644 --- a/PIL/ImageOps.py +++ b/PIL/ImageOps.py @@ -20,7 +20,7 @@ from PIL import Image from PIL._util import isStringType import operator -from functools import reduce +import functools # @@ -213,7 +213,7 @@ def equalize(image, mask=None): if len(histo) <= 1: lut.extend(list(range(256))) else: - step = (reduce(operator.add, histo) - histo[-1]) // 255 + step = (functools.reduce(operator.add, histo) - histo[-1]) // 255 if not step: lut.extend(list(range(256))) else: diff --git a/PIL/ImageStat.py b/PIL/ImageStat.py index 7e023c673..37e7515d4 100644 --- a/PIL/ImageStat.py +++ b/PIL/ImageStat.py @@ -23,7 +23,7 @@ import math import operator -from functools import reduce +import functools class Stat: @@ -71,7 +71,7 @@ class Stat: v = [] for i in range(0, len(self.h), 256): - v.append(reduce(operator.add, self.h[i:i+256])) + v.append(functools.reduce(operator.add, self.h[i:i+256])) return v def _getsum(self): @@ -79,10 +79,10 @@ class Stat: v = [] for i in range(0, len(self.h), 256): - sum = 0.0 + layerSum = 0.0 for j in range(256): - sum += j * self.h[i + j] - v.append(sum) + layerSum += j * self.h[i + j] + v.append(layerSum) return v def _getsum2(self): diff --git a/PIL/MspImagePlugin.py b/PIL/MspImagePlugin.py index 4753be7cd..1e974d53f 100644 --- a/PIL/MspImagePlugin.py +++ b/PIL/MspImagePlugin.py @@ -49,10 +49,10 @@ class MspImageFile(ImageFile.ImageFile): raise SyntaxError("not an MSP file") # Header checksum - sum = 0 + checksum = 0 for i in range(0, 32, 2): - sum = sum ^ i16(s[i:i+2]) - if sum != 0: + checksum = checksum ^ i16(s[i:i+2]) + if checksum != 0: raise SyntaxError("bad MSP checksum") self.mode = "1" @@ -83,10 +83,10 @@ def _save(im, fp, filename): header[6], header[7] = 1, 1 header[8], header[9] = im.size - sum = 0 + checksum = 0 for h in header: - sum = sum ^ h - header[12] = sum # FIXME: is this the right field? + checksum = checksum ^ h + header[12] = checksum # FIXME: is this the right field? # header for h in header: diff --git a/Scripts/pilconvert.py b/Scripts/pilconvert.py index 66b2e5ac2..b9ebd52ae 100644 --- a/Scripts/pilconvert.py +++ b/Scripts/pilconvert.py @@ -49,7 +49,7 @@ except getopt.error as v: print(v) sys.exit(1) -format = None +output_format = None convert = None options = {} @@ -68,7 +68,7 @@ for o, a in opt: sys.exit(1) elif o == "-c": - format = a + output_format = a if o == "-g": convert = "L" @@ -90,8 +90,8 @@ try: if convert and im.mode != convert: im.draft(convert, im.size) im = im.convert(convert) - if format: - im.save(argv[1], format, **options) + if output_format: + im.save(argv[1], output_format, **options) else: im.save(argv[1], **options) except: diff --git a/Scripts/pilprint.py b/Scripts/pilprint.py index d13a2a526..2a5e23061 100644 --- a/Scripts/pilprint.py +++ b/Scripts/pilprint.py @@ -24,8 +24,8 @@ from PIL import PSDraw letter = (1.0*72, 1.0*72, 7.5*72, 10.0*72) -def description(file, image): - title = os.path.splitext(os.path.split(file)[1])[0] +def description(filepath, image): + title = os.path.splitext(os.path.split(filepath)[1])[0] format = " (%dx%d " if image.format: format = " (" + image.format + " %dx%d " @@ -65,12 +65,12 @@ for o, a in opt: # printer channel printer = "lpr -P%s" % a -for file in argv: +for filepath in argv: try: - im = Image.open(file) + im = Image.open(filepath) - title = description(file, im) + title = description(filepath, im) if monochrome and im.mode not in ["1", "L"]: im.draft("L", im.size) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 07850f8cf..26a30ca30 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -39,8 +39,8 @@ class TestFileLibTiff(LibTiffTestCase): def test_g4_tiff(self): """Test the ordinary file path load path""" - file = "Tests/images/hopper_g4_500.tif" - im = Image.open(file) + test_file = "Tests/images/hopper_g4_500.tif" + im = Image.open(test_file) self.assertEqual(im.size, (500, 500)) self._assert_noerr(im) @@ -53,8 +53,8 @@ class TestFileLibTiff(LibTiffTestCase): def test_g4_tiff_file(self): """Testing the string load path""" - file = "Tests/images/hopper_g4_500.tif" - with open(file, 'rb') as f: + test_file = "Tests/images/hopper_g4_500.tif" + with open(test_file, 'rb') as f: im = Image.open(f) self.assertEqual(im.size, (500, 500)) @@ -62,9 +62,9 @@ class TestFileLibTiff(LibTiffTestCase): def test_g4_tiff_bytesio(self): """Testing the stringio loading code path""" - file = "Tests/images/hopper_g4_500.tif" + test_file = "Tests/images/hopper_g4_500.tif" s = io.BytesIO() - with open(file, 'rb') as f: + with open(test_file, 'rb') as f: s.write(f.read()) s.seek(0) im = Image.open(s) @@ -89,8 +89,8 @@ class TestFileLibTiff(LibTiffTestCase): def test_g4_write(self): """Checking to see that the saved image is the same as what we wrote""" - file = "Tests/images/hopper_g4_500.tif" - orig = Image.open(file) + test_file = "Tests/images/hopper_g4_500.tif" + orig = Image.open(test_file) out = self.tempfile("temp.tif") rot = orig.transpose(Image.ROTATE_90) @@ -108,8 +108,8 @@ class TestFileLibTiff(LibTiffTestCase): self.assertNotEqual(orig.tobytes(), reread.tobytes()) def test_adobe_deflate_tiff(self): - file = "Tests/images/tiff_adobe_deflate.tif" - im = Image.open(file) + test_file = "Tests/images/tiff_adobe_deflate.tif" + im = Image.open(test_file) self.assertEqual(im.mode, "RGB") self.assertEqual(im.size, (278, 374)) @@ -215,8 +215,8 @@ class TestFileLibTiff(LibTiffTestCase): def test_g4_string_info(self): """Tests String data in info directory""" - file = "Tests/images/hopper_g4_500.tif" - orig = Image.open(file) + test_file = "Tests/images/hopper_g4_500.tif" + orig = Image.open(test_file) out = self.tempfile("temp.tif") From 76fec69edad4fa61c6c5280fc73632bfad7982ba Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 2 Apr 2015 18:08:14 +1100 Subject: [PATCH 468/532] Removed unnecessary lambdas --- Tests/test_file_png.py | 2 +- Tests/test_image_load.py | 2 +- Tests/test_imagepalette.py | 2 +- Tests/test_imagewin.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index dbbe72afa..505d48c81 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -245,7 +245,7 @@ class TestFilePng(PillowTestCase): im = Image.open(TEST_PNG_FILE) im.load() - self.assertRaises(RuntimeError, lambda: im.verify()) + self.assertRaises(RuntimeError, im.verify) def test_roundtrip_dpi(self): # Check dpi roundtripping diff --git a/Tests/test_image_load.py b/Tests/test_image_load.py index b1fc73182..f9d92e13c 100644 --- a/Tests/test_image_load.py +++ b/Tests/test_image_load.py @@ -18,7 +18,7 @@ class TestImageLoad(PillowTestCase): def test_close(self): im = Image.open("Tests/images/hopper.gif") im.close() - self.assertRaises(ValueError, lambda: im.load()) + self.assertRaises(ValueError, im.load) self.assertRaises(ValueError, lambda: im.getpixel((0, 0))) def test_contextmanager(self): diff --git a/Tests/test_imagepalette.py b/Tests/test_imagepalette.py index e56c61390..a16b590ba 100644 --- a/Tests/test_imagepalette.py +++ b/Tests/test_imagepalette.py @@ -117,7 +117,7 @@ class TestImagePalette(PillowTestCase): palette = raw("RGB", list(range(256))*3) # Act / Assert - self.assertRaises(ValueError, lambda: palette.tobytes()) + self.assertRaises(ValueError, palette.tobytes) self.assertRaises(ValueError, lambda: palette.getcolor((1, 2, 3))) f = self.tempfile("temp.lut") self.assertRaises(ValueError, lambda: palette.save(f)) diff --git a/Tests/test_imagewin.py b/Tests/test_imagewin.py index 7cfd7fe5c..c32290e43 100644 --- a/Tests/test_imagewin.py +++ b/Tests/test_imagewin.py @@ -114,7 +114,7 @@ class TestImageWinDib(PillowTestCase): buffer = dib.tobytes() # Act/Assert - self.assert_warning(DeprecationWarning, lambda: dib.tostring()) + self.assert_warning(DeprecationWarning, dib.tostring) self.assert_warning(DeprecationWarning, lambda: dib.fromstring(buffer)) From b33642c36163888dde547b7f754f3b3169890faa Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 2 Apr 2015 19:46:35 +1100 Subject: [PATCH 469/532] Fixed unintentional method overriding --- Scripts/thresholder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripts/thresholder.py b/Scripts/thresholder.py index 1e55c5a32..bfeebfa9f 100644 --- a/Scripts/thresholder.py +++ b/Scripts/thresholder.py @@ -32,7 +32,7 @@ class UI(Frame): self.canvas.pack() scale = Scale(self, orient=HORIZONTAL, from_=0, to=255, - resolution=1, command=self.update, length=256) + resolution=1, command=self.update_scale, length=256) scale.set(value) scale.bind("", self.redraw) scale.pack() @@ -41,7 +41,7 @@ class UI(Frame): # be too slow on some platforms) # self.redraw() - def update(self, value): + def update_scale(self, value): self.value = eval(value) self.redraw() From ee34d6843b634dc4d0fd130892663f486cc7d227 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 24 Apr 2015 18:24:52 +1000 Subject: [PATCH 470/532] Further health fixes --- PIL/EpsImagePlugin.py | 2 +- PIL/GbrImagePlugin.py | 4 +- PIL/IcnsImagePlugin.py | 2 +- PIL/ImageFile.py | 1 + PIL/JpegImagePlugin.py | 6 +-- PIL/MicImagePlugin.py | 6 +-- PIL/PyAccess.py | 2 +- PIL/SpiderImagePlugin.py | 12 +++--- Scripts/enhancer.py | 4 +- Scripts/painter.py | 4 +- Scripts/viewer.py | 4 +- Tests/check_jpeg_leaks.py | 5 +-- Tests/test_bmp_reference.py | 4 +- Tests/test_file_fli.py | 6 +-- Tests/test_file_gif.py | 10 ++--- Tests/test_file_icns.py | 10 ++--- Tests/test_file_jpeg.py | 4 +- Tests/test_file_jpeg2k.py | 4 +- Tests/test_file_libtiff.py | 4 +- Tests/test_file_libtiff_small.py | 12 +++--- Tests/test_file_mpo.py | 4 +- Tests/test_file_pcx.py | 4 +- Tests/test_file_png.py | 72 ++++++++++++++++---------------- Tests/test_file_ppm.py | 6 +-- Tests/test_file_psd.py | 6 +-- Tests/test_file_webp_metadata.py | 24 +++++------ Tests/test_font_bdf.py | 4 +- Tests/test_font_pcf.py | 4 +- Tests/test_image.py | 4 +- Tests/test_image_filter.py | 6 +-- Tests/test_image_split.py | 8 ++-- Tests/test_image_transpose.py | 7 ++-- Tests/test_imagefile.py | 6 +-- Tests/test_imagefont.py | 3 +- Tests/test_imagepalette.py | 6 +-- Tests/test_imagesequence.py | 4 +- Tests/test_imagewin.py | 8 ++-- Tests/test_mode_i16.py | 8 ++-- Tests/test_pickle.py | 4 +- Tests/threaded_save.py | 7 +--- 40 files changed, 150 insertions(+), 151 deletions(-) diff --git a/PIL/EpsImagePlugin.py b/PIL/EpsImagePlugin.py index 62e438f0d..e2e7fa5e9 100644 --- a/PIL/EpsImagePlugin.py +++ b/PIL/EpsImagePlugin.py @@ -288,7 +288,7 @@ class EpsImageFile(ImageFile.ImageFile): if s[:11] == "%ImageData:": # Encoded bitmapped image. - [x, y, bi, mo, z3, z4, en, id] = s[11:].split(None, 7) + x, y, bi, mo = s[11:].split(None, 7)[:4] if int(bi) != 8: break diff --git a/PIL/GbrImagePlugin.py b/PIL/GbrImagePlugin.py index 0e686326c..e1580e718 100644 --- a/PIL/GbrImagePlugin.py +++ b/PIL/GbrImagePlugin.py @@ -39,8 +39,8 @@ class GbrImageFile(ImageFile.ImageFile): width = i32(self.fp.read(4)) height = i32(self.fp.read(4)) - bytes = i32(self.fp.read(4)) - if width <= 0 or height <= 0 or bytes != 1: + color_depth = i32(self.fp.read(4)) + if width <= 0 or height <= 0 or color_depth != 1: raise SyntaxError("not a GIMP brush") comment = self.fp.read(header_size - 20)[:-1] diff --git a/PIL/IcnsImagePlugin.py b/PIL/IcnsImagePlugin.py index a1ebee704..1bb1066d8 100644 --- a/PIL/IcnsImagePlugin.py +++ b/PIL/IcnsImagePlugin.py @@ -94,7 +94,7 @@ def read_32(fobj, start_length, size): def read_mk(fobj, start_length, size): # Alpha masks seem to be uncompressed - (start, length) = start_length + start = start_length[0] fobj.seek(start) pixel_size = (size[0] * size[2], size[1] * size[2]) sizesq = pixel_size[0] * pixel_size[1] diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 79faff797..01c3e0303 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -322,6 +322,7 @@ class Parser: image = None data = None decoder = None + offset = 0 finished = 0 def reset(self): diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 0ecc902e4..01a173b5b 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -454,13 +454,13 @@ def _getmp(self): data = self.info["mp"] except KeyError: return None - file = io.BytesIO(data) - head = file.read(8) + file_contents = io.BytesIO(data) + head = file_contents.read(8) endianness = '>' if head[:4] == b'\x4d\x4d\x00\x2a' else '<' mp = {} # process dictionary info = TiffImagePlugin.ImageFileDirectory(head) - info.load(file) + info.load(file_contents) for key, value in info.items(): mp[key] = _fixup(value) # it's an error not to have a number of images diff --git a/PIL/MicImagePlugin.py b/PIL/MicImagePlugin.py index d1f8b082a..5aed618ac 100644 --- a/PIL/MicImagePlugin.py +++ b/PIL/MicImagePlugin.py @@ -54,9 +54,9 @@ class MicImageFile(TiffImagePlugin.TiffImageFile): # best way to identify MIC files, but what the... ;-) self.images = [] - for file in self.ole.listdir(): - if file[1:] and file[0][-4:] == ".ACI" and file[1] == "Image": - self.images.append(file) + for path in self.ole.listdir(): + if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image": + self.images.append(path) # if we didn't find any images, this is probably not # an MIC file. diff --git a/PIL/PyAccess.py b/PIL/PyAccess.py index 87a6d4915..4924facd5 100644 --- a/PIL/PyAccess.py +++ b/PIL/PyAccess.py @@ -194,7 +194,7 @@ class _PyAccessI16_L(PyAccess): pixel = self.pixels[y][x] try: color = min(color, 65535) - except: + except TypeError: color = min(color[0], 65535) pixel.l = color & 0xFF diff --git a/PIL/SpiderImagePlugin.py b/PIL/SpiderImagePlugin.py index 306b348bc..f1ccb67f6 100644 --- a/PIL/SpiderImagePlugin.py +++ b/PIL/SpiderImagePlugin.py @@ -48,7 +48,7 @@ def isInt(f): return 1 else: return 0 - except: + except ValueError: return 0 iforms = [1, 3, -11, -12, -21, -22] @@ -173,11 +173,11 @@ class SpiderImageFile(ImageFile.ImageFile): # returns a byte image after rescaling to 0..255 def convert2byte(self, depth=255): - (min, max) = self.getextrema() + (minimum, maximum) = self.getextrema() m = 1 - if max != min: - m = depth / (max-min) - b = -m * min + if maximum != minimum: + m = depth / (maximum-minimum) + b = -m * minimum return self.point(lambda i, m=m, b=b: i * m + b).convert("L") # returns a ImageTk.PhotoImage object, after rescaling to 0..255 @@ -271,7 +271,7 @@ def _save(im, fp, filename): def _save_spider(im, fp, filename): # get the filename extension and register it with Image - fn, ext = os.path.splitext(filename) + ext = os.path.splitext(filename)[1] Image.register_extension("SPIDER", ext) _save(im, fp, filename) diff --git a/Scripts/enhancer.py b/Scripts/enhancer.py index 34becf873..6393c983f 100644 --- a/Scripts/enhancer.py +++ b/Scripts/enhancer.py @@ -8,9 +8,9 @@ # try: - from tkinter import * + from tkinter import Tk, Toplevel, Frame, Label, Scale, HORIZONTAL except ImportError: - from Tkinter import * + from Tkinter import Tk, Toplevel, Frame, Label, Scale, HORIZONTAL from PIL import Image, ImageTk, ImageEnhance import sys diff --git a/Scripts/painter.py b/Scripts/painter.py index 6f1c19484..234f06171 100644 --- a/Scripts/painter.py +++ b/Scripts/painter.py @@ -10,9 +10,9 @@ # try: - from tkinter import * + from tkinter import Tk, Canvas, NW except ImportError: - from Tkinter import * + from Tkinter import Tk, Canvas, NW from PIL import Image, ImageTk import sys diff --git a/Scripts/viewer.py b/Scripts/viewer.py index c0fc59d96..f9bccec4f 100644 --- a/Scripts/viewer.py +++ b/Scripts/viewer.py @@ -7,9 +7,9 @@ from __future__ import print_function try: - from tkinter import * + from tkinter import Tk, Label except ImportError: - from Tkinter import * + from Tkinter import Tk, Label from PIL import Image, ImageTk diff --git a/Tests/check_jpeg_leaks.py b/Tests/check_jpeg_leaks.py index b8a82a5ec..4d13978f8 100644 --- a/Tests/check_jpeg_leaks.py +++ b/Tests/check_jpeg_leaks.py @@ -169,7 +169,8 @@ post patch: test_output = BytesIO() im.save(test_output, "JPEG", exif=exif) - """ + def test_base_save(self): + """ base case: MB 20.99^ ::::: :::::::::::::::::::::::::::::::::::::::::::@::: @@ -195,8 +196,6 @@ base case: 0 +----------------------------------------------------------------------->Gi 0 7.882 """ - - def test_base_save(self): im = hopper('RGB') for _ in range(iterations): diff --git a/Tests/test_bmp_reference.py b/Tests/test_bmp_reference.py index b45ea76f6..79ad439ba 100644 --- a/Tests/test_bmp_reference.py +++ b/Tests/test_bmp_reference.py @@ -58,10 +58,10 @@ class TestBmpReference(PillowTestCase): } def get_compare(f): - (head, name) = os.path.split(f) + name = os.path.split(f)[1] if name in file_map: return os.path.join(base, 'html', file_map[name]) - (name, ext) = os.path.splitext(name) + name = os.path.splitext(name)[0] return os.path.join(base, 'html', "%s.png" % name) for f in self.get_files('g'): diff --git a/Tests/test_file_fli.py b/Tests/test_file_fli.py index 3580edc18..e6634c799 100644 --- a/Tests/test_file_fli.py +++ b/Tests/test_file_fli.py @@ -5,14 +5,14 @@ from PIL import Image # sample ppm stream # created as an export of a palette image from Gimp2.6 # save as...-> hopper.fli, default options. -file = "Tests/images/hopper.fli" -data = open(file, "rb").read() +test_file = "Tests/images/hopper.fli" +data = open(test_file, "rb").read() class TestFileFli(PillowTestCase): def test_sanity(self): - im = Image.open(file) + im = Image.open(test_file) im.load() self.assertEqual(im.mode, "P") self.assertEqual(im.size, (128, 128)) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 2ce728801..1aa8a36bc 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -36,9 +36,9 @@ class TestFileGif(PillowTestCase): def test_bilevel(optimize): im = Image.new("1", (1, 1), 0) - file = BytesIO() - im.save(file, "GIF", optimize=optimize) - return len(file.getvalue()) + test_file = BytesIO() + im.save(test_file, "GIF", optimize=optimize) + return len(test_file.getvalue()) self.assertEqual(test_grayscale(0), 800) self.assertEqual(test_grayscale(1), 38) @@ -49,8 +49,8 @@ class TestFileGif(PillowTestCase): from io import BytesIO im = Image.frombytes("L", (16, 16), bytes(bytearray(range(256)))) - file = BytesIO() - im.save(file, "GIF", optimize=True) + test_file = BytesIO() + im.save(test_file, "GIF", optimize=True) self.assertEqual(im.mode, "L") def test_roundtrip(self): diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index 23d22df1b..2edf9dd20 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -5,8 +5,8 @@ from PIL import Image import sys # sample icon file -file = "Tests/images/pillow.icns" -data = open(file, "rb").read() +test_file = "Tests/images/pillow.icns" +data = open(test_file, "rb").read() enable_jpeg2k = hasattr(Image.core, 'jp2klib_version') @@ -16,7 +16,7 @@ class TestFileIcns(PillowTestCase): def test_sanity(self): # Loading this icon by default should result in the largest size # (512x512@2x) being loaded - im = Image.open(file) + im = Image.open(test_file) im.load() self.assertEqual(im.mode, "RGBA") self.assertEqual(im.size, (1024, 1024)) @@ -39,11 +39,11 @@ class TestFileIcns(PillowTestCase): def test_sizes(self): # Check that we can load all of the sizes, and that the final pixel # dimensions are as expected - im = Image.open(file) + im = Image.open(test_file) for w, h, r in im.info['sizes']: wr = w * r hr = h * r - im2 = Image.open(file) + im2 = Image.open(test_file) im2.size = (w, h, r) im2.load() self.assertEqual(im2.mode, 'RGBA') diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index aa24582cc..d4929dd58 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -23,10 +23,10 @@ class TestFileJpeg(PillowTestCase): def roundtrip(self, im, **options): out = BytesIO() im.save(out, "JPEG", **options) - bytes = out.tell() + test_bytes = out.tell() out.seek(0) im = Image.open(out) - im.bytes = bytes # for testing only + im.bytes = test_bytes # for testing only return im def test_sanity(self): diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index db67e9551..9768a881d 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -22,10 +22,10 @@ class TestFileJpeg2k(PillowTestCase): def roundtrip(self, im, **options): out = BytesIO() im.save(out, "JPEG2000", **options) - bytes = out.tell() + test_bytes = out.tell() out.seek(0) im = Image.open(out) - im.bytes = bytes # for testing only + im.bytes = test_bytes # for testing only im.load() return im diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 26a30ca30..4f798675b 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -46,8 +46,8 @@ class TestFileLibTiff(LibTiffTestCase): self._assert_noerr(im) def test_g4_large(self): - file = "Tests/images/pport_g4.tif" - im = Image.open(file) + test_file = "Tests/images/pport_g4.tif" + im = Image.open(test_file) self._assert_noerr(im) def test_g4_tiff_file(self): diff --git a/Tests/test_file_libtiff_small.py b/Tests/test_file_libtiff_small.py index cd16292a0..c6a639ae9 100644 --- a/Tests/test_file_libtiff_small.py +++ b/Tests/test_file_libtiff_small.py @@ -18,8 +18,8 @@ class TestFileLibTiffSmall(LibTiffTestCase): def test_g4_hopper_file(self): """Testing the open file load path""" - file = "Tests/images/hopper_g4.tif" - with open(file, 'rb') as f: + test_file = "Tests/images/hopper_g4.tif" + with open(test_file, 'rb') as f: im = Image.open(f) self.assertEqual(im.size, (128, 128)) @@ -28,9 +28,9 @@ class TestFileLibTiffSmall(LibTiffTestCase): def test_g4_hopper_bytesio(self): """Testing the bytesio loading code path""" from io import BytesIO - file = "Tests/images/hopper_g4.tif" + test_file = "Tests/images/hopper_g4.tif" s = BytesIO() - with open(file, 'rb') as f: + with open(test_file, 'rb') as f: s.write(f.read()) s.seek(0) im = Image.open(s) @@ -41,8 +41,8 @@ class TestFileLibTiffSmall(LibTiffTestCase): def test_g4_hopper(self): """The 128x128 lena image failed for some reason.""" - file = "Tests/images/hopper_g4.tif" - im = Image.open(file) + test_file = "Tests/images/hopper_g4.tif" + im = Image.open(test_file) self.assertEqual(im.size, (128, 128)) self._assert_noerr(im) diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index 066f39dc4..7850744af 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -17,10 +17,10 @@ class TestFileMpo(PillowTestCase): # Note that for now, there is no MPO saving functionality out = BytesIO() im.save(out, "MPO", **options) - bytes = out.tell() + test_bytes = out.tell() out.seek(0) im = Image.open(out) - im.bytes = bytes # for testing only + im.bytes = test_bytes # for testing only return im def test_sanity(self): diff --git a/Tests/test_file_pcx.py b/Tests/test_file_pcx.py index 36d6e0315..10d17d349 100644 --- a/Tests/test_file_pcx.py +++ b/Tests/test_file_pcx.py @@ -31,8 +31,8 @@ class TestFilePcx(PillowTestCase): def test_pil184(self): # Check reading of files where xmin/xmax is not zero. - file = "Tests/images/pil184.pcx" - im = Image.open(file) + test_file = "Tests/images/pil184.pcx" + im = Image.open(test_file) self.assertEqual(im.size, (447, 144)) self.assertEqual(im.tile[0][1], (0, 0, 447, 144)) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 505d48c81..b3169ed25 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -19,9 +19,9 @@ MAGIC = PngImagePlugin._MAGIC def chunk(cid, *data): - file = BytesIO() - PngImagePlugin.putchunk(*(file, cid) + data) - return file.getvalue() + test_file = BytesIO() + PngImagePlugin.putchunk(*(test_file, cid) + data) + return test_file.getvalue() o32 = PngImagePlugin.o32 @@ -56,37 +56,37 @@ class TestFilePng(PillowTestCase): self.assertRegexpMatches( Image.core.zlib_version, "\d+\.\d+\.\d+(\.\d+)?$") - file = self.tempfile("temp.png") + test_file = self.tempfile("temp.png") - hopper("RGB").save(file) + hopper("RGB").save(test_file) - im = Image.open(file) + im = Image.open(test_file) im.load() self.assertEqual(im.mode, "RGB") self.assertEqual(im.size, (128, 128)) self.assertEqual(im.format, "PNG") - hopper("1").save(file) - im = Image.open(file) + hopper("1").save(test_file) + im = Image.open(test_file) - hopper("L").save(file) - im = Image.open(file) + hopper("L").save(test_file) + im = Image.open(test_file) - hopper("P").save(file) - im = Image.open(file) + hopper("P").save(test_file) + im = Image.open(test_file) - hopper("RGB").save(file) - im = Image.open(file) + hopper("RGB").save(test_file) + im = Image.open(test_file) - hopper("I").save(file) - im = Image.open(file) + hopper("I").save(test_file) + im = Image.open(test_file) def test_broken(self): # Check reading of totally broken files. In this case, the test # file was checked into Subversion as a text file. - file = "Tests/images/broken.png" - self.assertRaises(IOError, lambda: Image.open(file)) + test_file = "Tests/images/broken.png" + self.assertRaises(IOError, lambda: Image.open(test_file)) def test_bad_text(self): # Make sure PIL can read malformed tEXt chunks (@PIL152) @@ -167,16 +167,16 @@ class TestFilePng(PillowTestCase): def test_interlace(self): - file = "Tests/images/pil123p.png" - im = Image.open(file) + test_file = "Tests/images/pil123p.png" + im = Image.open(test_file) self.assert_image(im, "P", (162, 150)) self.assertTrue(im.info.get("interlace")) im.load() - file = "Tests/images/pil123rgba.png" - im = Image.open(file) + test_file = "Tests/images/pil123rgba.png" + im = Image.open(test_file) self.assert_image(im, "RGBA", (162, 150)) self.assertTrue(im.info.get("interlace")) @@ -184,8 +184,8 @@ class TestFilePng(PillowTestCase): im.load() def test_load_transparent_p(self): - file = "Tests/images/pil123p.png" - im = Image.open(file) + test_file = "Tests/images/pil123p.png" + im = Image.open(test_file) self.assert_image(im, "P", (162, 150)) im = im.convert("RGBA") @@ -195,8 +195,8 @@ class TestFilePng(PillowTestCase): self.assertEqual(len(im.split()[3].getcolors()), 124) def test_load_transparent_rgb(self): - file = "Tests/images/rgb_trns.png" - im = Image.open(file) + test_file = "Tests/images/rgb_trns.png" + im = Image.open(test_file) self.assert_image(im, "RGB", (64, 64)) im = im.convert("RGBA") @@ -209,22 +209,22 @@ class TestFilePng(PillowTestCase): in_file = "Tests/images/pil123p.png" im = Image.open(in_file) - file = self.tempfile("temp.png") - im.save(file) + test_file = self.tempfile("temp.png") + im.save(test_file) def test_save_p_single_transparency(self): in_file = "Tests/images/p_trns_single.png" im = Image.open(in_file) - file = self.tempfile("temp.png") - im.save(file) + test_file = self.tempfile("temp.png") + im.save(test_file) def test_save_l_transparency(self): in_file = "Tests/images/l_trns.png" im = Image.open(in_file) - file = self.tempfile("temp.png") - im.save(file) + test_file = self.tempfile("temp.png") + im.save(test_file) # There are 559 transparent pixels. im = im.convert('RGBA') @@ -234,8 +234,8 @@ class TestFilePng(PillowTestCase): in_file = "Tests/images/caption_6_33_22.png" im = Image.open(in_file) - file = self.tempfile("temp.png") - im.save(file) + test_file = self.tempfile("temp.png") + im.save(test_file) def test_load_verify(self): # Check open/load/verify exception (@PIL150) @@ -329,8 +329,8 @@ class TestFilePng(PillowTestCase): # Check writing and reading of tRNS chunks for RGB images. # Independent file sample provided by Sebastian Spaeth. - file = "Tests/images/caption_6_33_22.png" - im = Image.open(file) + test_file = "Tests/images/caption_6_33_22.png" + im = Image.open(test_file) self.assertEqual(im.info["transparency"], (248, 248, 248)) # check saving transparency by default diff --git a/Tests/test_file_ppm.py b/Tests/test_file_ppm.py index 3731fd9b1..80c2e60da 100644 --- a/Tests/test_file_ppm.py +++ b/Tests/test_file_ppm.py @@ -3,14 +3,14 @@ from helper import unittest, PillowTestCase from PIL import Image # sample ppm stream -file = "Tests/images/hopper.ppm" -data = open(file, "rb").read() +test_file = "Tests/images/hopper.ppm" +data = open(test_file, "rb").read() class TestFilePpm(PillowTestCase): def test_sanity(self): - im = Image.open(file) + im = Image.open(test_file) im.load() self.assertEqual(im.mode, "RGB") self.assertEqual(im.size, (128, 128)) diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index 46cef4c78..51b8cf3f4 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -3,14 +3,14 @@ from helper import unittest, PillowTestCase from PIL import Image # sample ppm stream -file = "Tests/images/hopper.psd" -data = open(file, "rb").read() +test_file = "Tests/images/hopper.psd" +data = open(test_file, "rb").read() class TestImagePsd(PillowTestCase): def test_sanity(self): - im = Image.open(file) + im = Image.open(test_file) im.load() self.assertEqual(im.mode, "RGB") self.assertEqual(im.size, (128, 128)) diff --git a/Tests/test_file_webp_metadata.py b/Tests/test_file_webp_metadata.py index 9093f31ba..8b1254d61 100644 --- a/Tests/test_file_webp_metadata.py +++ b/Tests/test_file_webp_metadata.py @@ -41,12 +41,12 @@ class TestFileWebpMetadata(PillowTestCase): image = Image.open(file_path) expected_exif = image.info['exif'] - buffer = BytesIO() + test_buffer = BytesIO() - image.save(buffer, "webp", exif=expected_exif) + image.save(test_buffer, "webp", exif=expected_exif) - buffer.seek(0) - webp_image = Image.open(buffer) + test_buffer.seek(0) + webp_image = Image.open(test_buffer) webp_exif = webp_image.info.get('exif', None) self.assertTrue(webp_exif) @@ -76,12 +76,12 @@ class TestFileWebpMetadata(PillowTestCase): image = Image.open(file_path) expected_icc_profile = image.info['icc_profile'] - buffer = BytesIO() + test_buffer = BytesIO() - image.save(buffer, "webp", icc_profile=expected_icc_profile) + image.save(test_buffer, "webp", icc_profile=expected_icc_profile) - buffer.seek(0) - webp_image = Image.open(buffer) + test_buffer.seek(0) + webp_image = Image.open(test_buffer) webp_icc_profile = webp_image.info.get('icc_profile', None) @@ -98,12 +98,12 @@ class TestFileWebpMetadata(PillowTestCase): image = Image.open(file_path) self.assertTrue('exif' in image.info) - buffer = BytesIO() + test_buffer = BytesIO() - image.save(buffer, "webp") + image.save(test_buffer, "webp") - buffer.seek(0) - webp_image = Image.open(buffer) + test_buffer.seek(0) + webp_image = Image.open(test_buffer) self.assertFalse(webp_image._getexif()) diff --git a/Tests/test_font_bdf.py b/Tests/test_font_bdf.py index 0df8e866b..b844f1228 100644 --- a/Tests/test_font_bdf.py +++ b/Tests/test_font_bdf.py @@ -9,8 +9,8 @@ class TestFontBdf(PillowTestCase): def test_sanity(self): - file = open(filename, "rb") - font = BdfFontFile.BdfFontFile(file) + test_file = open(filename, "rb") + font = BdfFontFile.BdfFontFile(test_file) self.assertIsInstance(font, FontFile.FontFile) self.assertEqual(len([_f for _f in font.glyph if _f]), 190) diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py index 5e9e02c8c..3cc6afa64 100644 --- a/Tests/test_font_pcf.py +++ b/Tests/test_font_pcf.py @@ -17,8 +17,8 @@ class TestFontPcf(PillowTestCase): self.skipTest("zlib support not available") def save_font(self): - file = open(fontname, "rb") - font = PcfFontFile.PcfFontFile(file) + test_file = open(fontname, "rb") + font = PcfFontFile.PcfFontFile(test_file) self.assertIsInstance(font, FontFile.FontFile) self.assertEqual(len([_f for _f in font.glyph if _f]), 192) diff --git a/Tests/test_image.py b/Tests/test_image.py index 0b84de630..caee70fec 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -41,8 +41,8 @@ class TestImage(PillowTestCase): im.paste(0, (0, 0, 100, 100)) self.assertFalse(im.readonly) - file = self.tempfile("temp.ppm") - im._dump(file) + test_file = self.tempfile("temp.ppm") + im._dump(test_file) def test_comparison_with_other_type(self): # Arrange diff --git a/Tests/test_image_filter.py b/Tests/test_image_filter.py index d29fd3dfd..6a694b3ca 100644 --- a/Tests/test_image_filter.py +++ b/Tests/test_image_filter.py @@ -76,10 +76,10 @@ class TestImageFilter(PillowTestCase): # 0 1 2 # 3 4 5 # 6 7 8 - min = im.filter(ImageFilter.MinFilter).getpixel((1, 1)) + minimum = im.filter(ImageFilter.MinFilter).getpixel((1, 1)) med = im.filter(ImageFilter.MedianFilter).getpixel((1, 1)) - max = im.filter(ImageFilter.MaxFilter).getpixel((1, 1)) - return min, med, max + maximum = im.filter(ImageFilter.MaxFilter).getpixel((1, 1)) + return minimum, med, maximum self.assertEqual(rankfilter("1"), (0, 4, 8)) self.assertEqual(rankfilter("L"), (0, 4, 8)) diff --git a/Tests/test_image_split.py b/Tests/test_image_split.py index 0e057523b..beab7b546 100644 --- a/Tests/test_image_split.py +++ b/Tests/test_image_split.py @@ -45,13 +45,13 @@ class TestImageSplit(PillowTestCase): codecs = dir(Image.core) if 'zip_encoder' in codecs: - file = self.tempfile("temp.png") + test_file = self.tempfile("temp.png") else: - file = self.tempfile("temp.pcx") + test_file = self.tempfile("temp.pcx") def split_open(mode): - hopper(mode).save(file) - im = Image.open(file) + hopper(mode).save(test_file) + im = Image.open(test_file) return len(im.split()) self.assertEqual(split_open("1"), 1) self.assertEqual(split_open("L"), 1) diff --git a/Tests/test_image_transpose.py b/Tests/test_image_transpose.py index 3069df61c..e13fc8605 100644 --- a/Tests/test_image_transpose.py +++ b/Tests/test_image_transpose.py @@ -1,4 +1,5 @@ -from helper import unittest, PillowTestCase, hopper +import helper +from helper import unittest, PillowTestCase from PIL.Image import (FLIP_LEFT_RIGHT, FLIP_TOP_BOTTOM, ROTATE_90, ROTATE_180, ROTATE_270, TRANSPOSE) @@ -7,8 +8,8 @@ from PIL.Image import (FLIP_LEFT_RIGHT, FLIP_TOP_BOTTOM, ROTATE_90, ROTATE_180, class TestImageTranspose(PillowTestCase): hopper = { - 'L': hopper('L').crop((0, 0, 121, 127)).copy(), - 'RGB': hopper('RGB').crop((0, 0, 121, 127)).copy(), + 'L': helper.hopper('L').crop((0, 0, 121, 127)).copy(), + 'RGB': helper.hopper('RGB').crop((0, 0, 121, 127)).copy(), } def test_flip_left_right(self): diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index 01503dff7..5311b899f 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -24,11 +24,11 @@ class TestImageFile(PillowTestCase): if format in ("MSP", "XBM"): im = im.convert("1") - file = BytesIO() + test_file = BytesIO() - im.save(file, format) + im.save(test_file, format) - data = file.getvalue() + data = test_file.getvalue() parser = ImageFile.Parser() parser.feed(data) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 627b28c67..f1d59ae43 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -94,7 +94,8 @@ try: def _render(self, font): txt = "Hello World!" ttf = ImageFont.truetype(font, FONT_SIZE) - w, h = ttf.getsize(txt) + ttf.getsize(txt) + img = Image.new("RGB", (256, 64), "white") d = ImageDraw.Draw(img) d.text((10, 10), txt, font=ttf, fill='black') diff --git a/Tests/test_imagepalette.py b/Tests/test_imagepalette.py index a16b590ba..707ab4080 100644 --- a/Tests/test_imagepalette.py +++ b/Tests/test_imagepalette.py @@ -17,11 +17,11 @@ class TestImagePalette(PillowTestCase): palette = ImagePalette() - map = {} + test_map = {} for i in range(256): - map[palette.getcolor((i, i, i))] = i + test_map[palette.getcolor((i, i, i))] = i - self.assertEqual(len(map), 256) + self.assertEqual(len(test_map), 256) self.assertRaises(ValueError, lambda: palette.getcolor((1, 2, 3))) def test_file(self): diff --git a/Tests/test_imagesequence.py b/Tests/test_imagesequence.py index 459a053d8..1b4bb3c02 100644 --- a/Tests/test_imagesequence.py +++ b/Tests/test_imagesequence.py @@ -7,10 +7,10 @@ class TestImageSequence(PillowTestCase): def test_sanity(self): - file = self.tempfile("temp.im") + test_file = self.tempfile("temp.im") im = hopper("RGB") - im.save(file) + im.save(test_file) seq = ImageSequence.Iterator(im) diff --git a/Tests/test_imagewin.py b/Tests/test_imagewin.py index c32290e43..7ceea86ee 100644 --- a/Tests/test_imagewin.py +++ b/Tests/test_imagewin.py @@ -100,8 +100,8 @@ class TestImageWinDib(PillowTestCase): # Act # Make one the same as the using tobytes()/frombytes() - buffer = dib1.tobytes() - dib2.frombytes(buffer) + test_buffer = dib1.tobytes() + dib2.frombytes(test_buffer) # Assert # Confirm they're the same @@ -111,11 +111,11 @@ class TestImageWinDib(PillowTestCase): # Arrange im = hopper() dib = ImageWin.Dib(im) - buffer = dib.tobytes() + test_buffer = dib.tobytes() # Act/Assert self.assert_warning(DeprecationWarning, dib.tostring) - self.assert_warning(DeprecationWarning, lambda: dib.fromstring(buffer)) + self.assert_warning(DeprecationWarning, lambda: dib.fromstring(test_buffer)) if __name__ == '__main__': diff --git a/Tests/test_mode_i16.py b/Tests/test_mode_i16.py index 20e39b235..0827e218b 100644 --- a/Tests/test_mode_i16.py +++ b/Tests/test_mode_i16.py @@ -64,15 +64,15 @@ class TestModeI16(PillowTestCase): self.assertEqual(imIn.getpixel((0, 0)), 2) if mode == "L": - max = 255 + maximum = 255 else: - max = 32767 + maximum = 32767 imIn = Image.new(mode, (1, 1), 256) - self.assertEqual(imIn.getpixel((0, 0)), min(256, max)) + self.assertEqual(imIn.getpixel((0, 0)), min(256, maximum)) imIn.putpixel((0, 0), 512) - self.assertEqual(imIn.getpixel((0, 0)), min(512, max)) + self.assertEqual(imIn.getpixel((0, 0)), min(512, maximum)) basic("L") diff --git a/Tests/test_pickle.py b/Tests/test_pickle.py index f1c594be9..52d64acee 100644 --- a/Tests/test_pickle.py +++ b/Tests/test_pickle.py @@ -60,7 +60,7 @@ class TestPickle(PillowTestCase): import pickle # Act / Assert - for file in [ + for test_file in [ "Tests/images/test-card.png", "Tests/images/zero_bb.png", "Tests/images/zero_bb_scale2.png", @@ -69,7 +69,7 @@ class TestPickle(PillowTestCase): "Tests/images/p_trns_single.png", "Tests/images/pil123p.png" ]: - self.helper_pickle_string(pickle, file=file) + self.helper_pickle_string(pickle, file=test_file) def test_pickle_l_mode(self): # Arrange diff --git a/Tests/threaded_save.py b/Tests/threaded_save.py index 376abe7bd..3bcbdd0b0 100644 --- a/Tests/threaded_save.py +++ b/Tests/threaded_save.py @@ -6,10 +6,7 @@ import sys import threading import time -try: - format = sys.argv[1] -except: - format = "PNG" +test_format = sys.argv[1] if len(sys.argv) > 1 else "PNG" im = Image.open("Tests/images/hopper.ppm") im.load() @@ -28,7 +25,7 @@ class Worker(threading.Thread): sys.stdout.write("x") break f = io.BytesIO() - im.save(f, format, optimize=1) + im.save(f, test_format, optimize=1) data = f.getvalue() result.append(len(data)) im = Image.open(io.BytesIO(data)) From 80a8463225f4261e1376dc9d9179d08250c63bba Mon Sep 17 00:00:00 2001 From: Thomas Bechtold Date: Wed, 29 Apr 2015 13:02:21 +0200 Subject: [PATCH 471/532] Fix test TestImageFont.test_textsize_equal The current test failed on SLE11SP3 so use assert_image_similar() for the test. This fixes issue 1202. --- Tests/test_imagefont.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 627b28c67..c07d99258 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -126,7 +126,7 @@ try: target = 'Tests/images/rectangle_surrounding_text.png' target_img = Image.open(target) - self.assert_image_equal(im, target_img) + self.assert_image_similar(im, target_img, .5) def test_render_multiline(self): im = Image.new(mode='RGB', size=(300, 100)) From e7d85432e4fa8a0cc847f260c91048c675fb9653 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 5 May 2015 11:15:55 +0300 Subject: [PATCH 472/532] Fix OS X build PR https://github.com/python-pillow/Pillow/pull/1209 missed a `file` -> `test_file` change on line 28, which broke the Mac build. Let's also make the constant uppercase whilst we're at it. --- Tests/test_file_icns.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index 2edf9dd20..230a3e9b9 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -5,8 +5,8 @@ from PIL import Image import sys # sample icon file -test_file = "Tests/images/pillow.icns" -data = open(test_file, "rb").read() +TEST_FILE = "Tests/images/pillow.icns" +data = open(TEST_FILE, "rb").read() enable_jpeg2k = hasattr(Image.core, 'jp2klib_version') @@ -16,7 +16,7 @@ class TestFileIcns(PillowTestCase): 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 = Image.open(TEST_FILE) im.load() self.assertEqual(im.mode, "RGBA") self.assertEqual(im.size, (1024, 1024)) @@ -25,12 +25,12 @@ class TestFileIcns(PillowTestCase): @unittest.skipIf(sys.platform != 'darwin', "requires MacOS") def test_save(self): - im = Image.open(file) + im = Image.open(TEST_FILE) - test_file = self.tempfile("temp.icns") - im.save(test_file) + TEST_FILE = self.tempfile("temp.icns") + im.save(TEST_FILE) - reread = Image.open(test_file) + reread = Image.open(TEST_FILE) self.assertEqual(reread.mode, "RGBA") self.assertEqual(reread.size, (1024, 1024)) @@ -39,11 +39,11 @@ class TestFileIcns(PillowTestCase): def test_sizes(self): # Check that we can load all of the sizes, and that the final pixel # dimensions are as expected - im = Image.open(test_file) + im = Image.open(TEST_FILE) for w, h, r in im.info['sizes']: wr = w * r hr = h * r - im2 = Image.open(test_file) + im2 = Image.open(TEST_FILE) im2.size = (w, h, r) im2.load() self.assertEqual(im2.mode, 'RGBA') From 30bb31ef596e0547ed5fa83ac3c269749ab84801 Mon Sep 17 00:00:00 2001 From: hugovk Date: Tue, 5 May 2015 19:38:10 +0300 Subject: [PATCH 473/532] Fix test according to original: https://github.com/python-pillow/Pillow/commit/689f28aae7c9cc3fddb73e7ec2a07f169b91d4ba#diff-d48d995756d16b9d9b8151e27377a37dR25 --- Tests/test_file_icns.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index 230a3e9b9..67eb1335f 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -27,10 +27,10 @@ class TestFileIcns(PillowTestCase): def test_save(self): im = Image.open(TEST_FILE) - TEST_FILE = self.tempfile("temp.icns") - im.save(TEST_FILE) + temp_file = self.tempfile("temp.icns") + im.save(temp_file) - reread = Image.open(TEST_FILE) + reread = Image.open(temp_file) self.assertEqual(reread.mode, "RGBA") self.assertEqual(reread.size, (1024, 1024)) From fa27200fe32c8bc976c59a372d56035f47fa139c Mon Sep 17 00:00:00 2001 From: hugovk Date: Fri, 8 May 2015 00:05:59 +0300 Subject: [PATCH 474/532] Pyroma (really docutils)' installation no longer slow on Py3 --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 382f205d0..a75c80873 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,9 +20,7 @@ install: - "travis_retry sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake imagemagick" - "travis_retry pip install cffi" - "travis_retry pip install coverage nose" - - # Pyroma installation is slow on Py3, so just do it for Py2. - - if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then travis_retry pip install pyroma; fi + - "travis_retry pip install pyroma" - if [ "$TRAVIS_PYTHON_VERSION" == "2.6" ]; then travis_retry pip install unittest2; fi From 9e00c7788499c03331d1de388311cdff41eb6e39 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 8 May 2015 14:28:49 +1000 Subject: [PATCH 475/532] Fixed variable name in JpegImagePlugin --- PIL/JpegImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 01a173b5b..e15042504 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -704,7 +704,7 @@ def _save_cjpeg(im, fp, filename): tempfile = im._dump() subprocess.check_call(["cjpeg", "-outfile", filename, tempfile]) try: - os.unlink(file) + os.unlink(tempfile) except: pass From 3ac92445aece4b8bce8032049a5ea13a68a8ca3d Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 8 May 2015 07:28:50 -0400 Subject: [PATCH 476/532] Add headers [ci skip] --- docs/installation.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/installation.rst b/docs/installation.rst index 7634a77fc..e94afa892 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -1,12 +1,18 @@ Installation ============ +Warnings +-------- + .. warning:: Pillow and PIL cannot co-exist in the same environment. Before installing Pillow, please uninstall PIL. .. warning:: Pillow >= 1.0 no longer supports "import Image". Please use "from PIL import Image" instead. .. warning:: Pillow >= 2.1.0 no longer supports "import _imaging". Please use "from PIL.Image import core as _imaging" instead. +Notes +----- + .. note:: Pillow < 2.0.0 supports Python versions 2.4, 2.5, 2.6, 2.7. .. note:: Pillow >= 2.0.0 supports Python versions 2.6, 2.7, 3.2, 3.3, 3.4 From 61bc6e5be2649481a0e072d425a7d6836f9a6f7e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 8 May 2015 14:24:40 +1000 Subject: [PATCH 477/532] Removed unused import from pildriver script --- Scripts/pildriver.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Scripts/pildriver.py b/Scripts/pildriver.py index ba2a8c66f..bb01004f5 100644 --- a/Scripts/pildriver.py +++ b/Scripts/pildriver.py @@ -498,10 +498,6 @@ class PILDriver: if __name__ == '__main__': import sys - try: - import readline - except ImportError: - pass # not available on all platforms # If we see command-line arguments, interpret them as a stack state # and execute. Otherwise go interactive. From dbd3415709e43b77430e1ba34e17e6de4830a905 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 8 May 2015 16:37:52 +1000 Subject: [PATCH 478/532] Removed pre-Python 2.3 workaround --- PIL/OleFileIO.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index 88b68fa4a..c804dd454 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -267,17 +267,10 @@ else: #[PL] These workarounds were inspired from the Path module # (see http://www.jorendorff.com/articles/python/path/) -#TODO: test with old Python versions - -# Pre-2.3 workaround for basestring. try: basestring except NameError: - try: - # is Unicode supported (Python >2.0 or >1.6 ?) - basestring = (str, unicode) - except NameError: - basestring = str + basestring = str #[PL] Experimental setting: if True, OLE filenames will be kept in Unicode # if False (default PIL behaviour), all filenames are converted to Latin-1. From b503d27f45ff6d5f549e12757a7b9e4b2cf088d3 Mon Sep 17 00:00:00 2001 From: Lawrence Kesteloot Date: Sat, 9 May 2015 22:10:05 -0700 Subject: [PATCH 479/532] Release GIL during image load (decode). --- decode.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/decode.c b/decode.c index c56f42592..6299d9124 100644 --- a/decode.c +++ b/decode.c @@ -116,12 +116,17 @@ _decode(ImagingDecoderObject* decoder, PyObject* args) { UINT8* buffer; int bufsize, status; + ImagingSectionCookie cookie; if (!PyArg_ParseTuple(args, PY_ARG_BYTES_LENGTH, &buffer, &bufsize)) return NULL; + ImagingSectionEnter(&cookie); + status = decoder->decode(decoder->im, &decoder->state, buffer, bufsize); + ImagingSectionLeave(&cookie); + return Py_BuildValue("ii", status, decoder->state.errcode); } From 1dd3bef61507847375772ffd207e8451fa5c897e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 10 May 2015 23:55:33 +1000 Subject: [PATCH 480/532] Upgraded OleFileIO to 0.42b --- PIL/OleFileIO.py | 941 +++++++++++++++++++++++++++++++---------------- 1 file changed, 616 insertions(+), 325 deletions(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index c804dd454..d787e59ed 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -1,47 +1,70 @@ #!/usr/bin/env python -## OleFileIO_PL: -## Module to read Microsoft OLE2 files (also called Structured Storage or -## Microsoft Compound Document File Format), such as Microsoft Office -## documents, Image Composer and FlashPix files, Outlook messages, ... -## This version is compatible with Python 2.6+ and 3.x -## version 0.30 2014-02-04 Philippe Lagadec - http://www.decalage.info - -## Project website: http://www.decalage.info/python/olefileio - -## Improved version of the OleFileIO module from PIL library v1.1.6 -## See: http://www.pythonware.com/products/pil/index.htm - -## The Python Imaging Library (PIL) is - -## Copyright (c) 1997-2005 by Secret Labs AB -## Copyright (c) 1995-2005 by Fredrik Lundh - -## OleFileIO_PL changes are Copyright (c) 2005-2014 by Philippe Lagadec - -## See source code and LICENSE.txt for information on usage and redistribution. - -## WARNING: THIS IS (STILL) WORK IN PROGRESS. +# olefile (formerly OleFileIO_PL) version 0.42 2015-01-25 +# +# Module to read/write Microsoft OLE2 files (also called Structured Storage or +# Microsoft Compound Document File Format), such as Microsoft Office 97-2003 +# documents, Image Composer and FlashPix files, Outlook messages, ... +# This version is compatible with Python 2.6+ and 3.x +# +# Project website: http://www.decalage.info/olefile +# +# olefile is copyright (c) 2005-2015 Philippe Lagadec (http://www.decalage.info) +# +# olefile is based on the OleFileIO module from the PIL library v1.1.6 +# See: http://www.pythonware.com/products/pil/index.htm +# +# The Python Imaging Library (PIL) is +# Copyright (c) 1997-2005 by Secret Labs AB +# Copyright (c) 1995-2005 by Fredrik Lundh +# +# See source code and LICENSE.txt for information on usage and redistribution. -# Starting with OleFileIO_PL v0.30, only Python 2.6+ and 3.x is supported +# Since OleFileIO_PL v0.30, only Python 2.6+ and 3.x is supported # This import enables print() as a function rather than a keyword # (main requirement to be compatible with Python 3.x) # The comment on the line below should be printed on Python 2.5 or older: -from __future__ import print_function # This version of OleFileIO_PL requires Python 2.6+ or 3.x. +from __future__ import print_function # This version of olefile requires Python 2.6+ or 3.x. -__author__ = "Philippe Lagadec, Fredrik Lundh (Secret Labs AB)" -__date__ = "2014-02-04" -__version__ = '0.30' +__author__ = "Philippe Lagadec" +__date__ = "2015-01-25" +__version__ = '0.42b' #--- LICENSE ------------------------------------------------------------------ -# OleFileIO_PL is an improved version of the OleFileIO module from the -# Python Imaging Library (PIL). - -# OleFileIO_PL changes are Copyright (c) 2005-2014 by Philippe Lagadec +# olefile (formerly OleFileIO_PL) is copyright (c) 2005-2015 Philippe Lagadec +# (http://www.decalage.info) # +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# ---------- +# PIL License: +# +# olefile is based on source code from the OleFileIO module of the Python +# Imaging Library (PIL) published by Fredrik Lundh under the following license: + # The Python Imaging Library (PIL) is # Copyright (c) 1997-2005 by Secret Labs AB # Copyright (c) 1995-2005 by Fredrik Lundh @@ -67,7 +90,7 @@ __version__ = '0.30' # PERFORMANCE OF THIS SOFTWARE. #----------------------------------------------------------------------------- -# CHANGELOG: (only OleFileIO_PL changes compared to PIL 1.1.6) +# CHANGELOG: (only olefile/OleFileIO_PL changes compared to PIL 1.1.6) # 2005-05-11 v0.10 PL: - a few fixes for Python 2.4 compatibility # (all changes flagged with [PL]) # 2006-02-22 v0.11 PL: - a few fixes for some Office 2003 documents which raise @@ -142,10 +165,29 @@ __version__ = '0.30' # 2014-02-04 v0.30 PL: - upgraded code to support Python 3.x by Martin Panter # - several fixes for Python 2.6 (xrange, MAGIC) # - reused i32 from Pillow's _binary +# 2014-07-18 v0.31 - preliminary support for 4K sectors +# 2014-07-27 v0.31 PL: - a few improvements in OleFileIO.open (header parsing) +# - Fixed loadfat for large files with 4K sectors (issue #3) +# 2014-07-30 v0.32 PL: - added write_sect to write sectors to disk +# - added write_mode option to OleFileIO.__init__ and open +# 2014-07-31 PL: - fixed padding in write_sect for Python 3, added checks +# - added write_stream to write a stream to disk +# 2014-09-26 v0.40 PL: - renamed OleFileIO_PL to olefile +# 2014-11-09 NE: - added support for Jython (Niko Ehrenfeuchter) +# 2014-11-13 v0.41 PL: - improved isOleFile and OleFileIO.open to support OLE +# data in a string buffer and file-like objects. +# 2014-11-21 PL: - updated comments according to Pillow's commits +# 2015-01-24 v0.42 PL: - changed the default path name encoding from Latin-1 +# to UTF-8 on Python 2.x (Unicode on Python 3.x) +# - added path_encoding option to override the default +# - fixed a bug in _list when a storage is empty #----------------------------------------------------------------------------- # TODO (for version 1.0): -# + isOleFile should accept file-like objects like open +# + get rid of print statements, to simplify Python 2.x and 3.x support +# + add is_stream and is_storage +# + remove leading and trailing slashes where a path is used +# + add functions path_list2str and path_str2list # + fix how all the methods handle unicode str and/or bytes as arguments # + add path attrib to _OleDirEntry, set it once and for all in init or # append_kids (then listdir/_list can be simplified) @@ -177,30 +219,16 @@ __version__ = '0.30' # - move all debug code (and maybe dump methods) to a separate module, with # a class which inherits OleFileIO ? # - fix docstrings to follow epydoc format -# - add support for 4K sectors ? # - add support for big endian byte order ? # - create a simple OLE explorer with wxPython # FUTURE EVOLUTIONS to add write support: -# 1) add ability to write a stream back on disk from BytesIO (same size, no -# change in FAT/MiniFAT). -# 2) rename a stream/storage if it doesn't change the RB tree -# 3) use rbtree module to update the red-black tree + any rename -# 4) remove a stream/storage: free sectors in FAT/MiniFAT -# 5) allocate new sectors in FAT/MiniFAT -# 6) create new storage/stream -#----------------------------------------------------------------------------- +# see issue #6 on Bitbucket: +# https://bitbucket.org/decalage/olefileio_pl/issue/6/improve-olefileio_pl-to-write-ole-files + +#----------------------------------------------------------------------------- +# NOTES from PIL 1.1.6: -# -# THIS IS WORK IN PROGRESS -# -# The Python Imaging Library -# $Id$ -# -# stuff to deal with OLE2 Structured Storage files. this module is -# used by PIL to read Image Composer and FlashPix files, but can also -# be used to read other files of this type. -# # History: # 1997-01-20 fl Created # 1997-01-22 fl Fixed 64-bit portability quirk @@ -222,25 +250,19 @@ __version__ = '0.30' # "If this document and functionality of the Software conflict, # the actual functionality of the Software represents the correct # functionality" -- Microsoft, in the OLE format specification -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# #------------------------------------------------------------------------------ import io import sys -import struct -import array -import os.path -import datetime +import struct, array, os.path, datetime + +#=== COMPATIBILITY WORKAROUNDS ================================================ #[PL] Define explicitly the public API to avoid private objects in pydoc: -__all__ = ['OleFileIO', 'isOleFile', 'MAGIC'] +#TODO: add more +# __all__ = ['OleFileIO', 'isOleFile', 'MAGIC'] # For Python 3.x, need to redefine long as int: if str is not bytes: @@ -261,39 +283,66 @@ if array.array('L').itemsize == 4: elif array.array('I').itemsize == 4: # on 64 bits platforms, integers in an array are 32 bits: UINT32 = 'I' +elif array.array('i').itemsize == 4: + # On 64 bit Jython, signed integers ('i') are the only way to store our 32 + # bit values in an array in a *somewhat* reasonable way, as the otherwise + # perfectly suited 'H' (unsigned int, 32 bits) results in a completely + # unusable behaviour. This is most likely caused by the fact that Java + # doesn't have unsigned values, and thus Jython's "array" implementation, + # which is based on "jarray", doesn't have them either. + # NOTE: to trick Jython into converting the values it would normally + # interpret as "signed" into "unsigned", a binary-and operation with + # 0xFFFFFFFF can be used. This way it is possible to use the same comparing + # operations on all platforms / implementations. The corresponding code + # lines are flagged with a 'JYTHON-WORKAROUND' tag below. + UINT32 = 'i' else: raise ValueError('Need to fix a bug with 32 bit arrays, please contact author...') #[PL] These workarounds were inspired from the Path module # (see http://www.jorendorff.com/articles/python/path/) +#TODO: test with old Python versions + +# Pre-2.3 workaround for basestring. try: basestring except NameError: - basestring = str + try: + # is Unicode supported (Python >2.0 or >1.6 ?) + basestring = (str, unicode) + except NameError: + basestring = str #[PL] Experimental setting: if True, OLE filenames will be kept in Unicode # if False (default PIL behaviour), all filenames are converted to Latin-1. -KEEP_UNICODE_NAMES = False +KEEP_UNICODE_NAMES = True + +if sys.version_info[0] < 3: + # On Python 2.x, the default encoding for path names is UTF-8: + DEFAULT_PATH_ENCODING = 'utf-8' +else: + # On Python 3.x, the default encoding for path names is Unicode (None): + DEFAULT_PATH_ENCODING = None + + +#=== DEBUGGING =============================================================== + +#TODO: replace this by proper logging #[PL] DEBUG display mode: False by default, use set_debug_mode() or "-d" on # command line to change it. DEBUG_MODE = False - - def debug_print(msg): print(msg) - - def debug_pass(msg): pass debug = debug_pass - def set_debug_mode(debug_mode): """ Set debug mode on or off, to control display of debugging messages. - mode: True or False + :param mode: True or False """ global DEBUG_MODE, debug DEBUG_MODE = debug_mode @@ -302,26 +351,30 @@ def set_debug_mode(debug_mode): else: debug = debug_pass + +#=== CONSTANTS =============================================================== + +# magic bytes that should be at the beginning of every OLE file: MAGIC = b'\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1' -# [PL]: added constants for Sector IDs (from AAF specifications) -MAXREGSECT = 0xFFFFFFFA; # maximum SECT -DIFSECT = 0xFFFFFFFC; # (-4) denotes a DIFAT sector in a FAT -FATSECT = 0xFFFFFFFD; # (-3) denotes a FAT sector in a FAT -ENDOFCHAIN = 0xFFFFFFFE; # (-2) end of a virtual stream chain -FREESECT = 0xFFFFFFFF; # (-1) unallocated sector +#[PL]: added constants for Sector IDs (from AAF specifications) +MAXREGSECT = 0xFFFFFFFA # (-6) maximum SECT +DIFSECT = 0xFFFFFFFC # (-4) denotes a DIFAT sector in a FAT +FATSECT = 0xFFFFFFFD # (-3) denotes a FAT sector in a FAT +ENDOFCHAIN = 0xFFFFFFFE # (-2) end of a virtual stream chain +FREESECT = 0xFFFFFFFF # (-1) unallocated sector -# [PL]: added constants for Directory Entry IDs (from AAF specifications) -MAXREGSID = 0xFFFFFFFA; # maximum directory entry ID -NOSTREAM = 0xFFFFFFFF; # (-1) unallocated directory entry +#[PL]: added constants for Directory Entry IDs (from AAF specifications) +MAXREGSID = 0xFFFFFFFA # (-6) maximum directory entry ID +NOSTREAM = 0xFFFFFFFF # (-1) unallocated directory entry -# [PL] object types in storage (from AAF specifications) -STGTY_EMPTY = 0 # empty directory entry (according to OpenOffice.org doc) -STGTY_STORAGE = 1 # element is a storage object -STGTY_STREAM = 2 # element is a stream object -STGTY_LOCKBYTES = 3 # element is an ILockBytes object -STGTY_PROPERTY = 4 # element is an IPropertyStorage object -STGTY_ROOT = 5 # element is a root storage +#[PL] object types in storage (from AAF specifications) +STGTY_EMPTY = 0 # empty directory entry (according to OpenOffice.org doc) +STGTY_STORAGE = 1 # element is a storage object +STGTY_STREAM = 2 # element is a stream object +STGTY_LOCKBYTES = 3 # element is an ILockBytes object +STGTY_PROPERTY = 4 # element is an IPropertyStorage object +STGTY_ROOT = 5 # element is a root storage # @@ -353,30 +406,52 @@ WORD_CLSID = "00020900-0000-0000-C000-000000000046" #TODO: check Excel, PPT, ... #[PL]: Defect levels to classify parsing errors - see OleFileIO._raise_defect() -DEFECT_UNSURE = 10 # a case which looks weird, but not sure it's a defect -DEFECT_POTENTIAL = 20 # a potential defect -DEFECT_INCORRECT = 30 # an error according to specifications, but parsing - # can go on -DEFECT_FATAL = 40 # an error which cannot be ignored, parsing is - # impossible +DEFECT_UNSURE = 10 # a case which looks weird, but not sure it's a defect +DEFECT_POTENTIAL = 20 # a potential defect +DEFECT_INCORRECT = 30 # an error according to specifications, but parsing + # can go on +DEFECT_FATAL = 40 # an error which cannot be ignored, parsing is + # impossible + +# Minimal size of an empty OLE file, with 512-bytes sectors = 1536 bytes +# (this is used in isOleFile and OleFile.open) +MINIMAL_OLEFILE_SIZE = 1536 #[PL] add useful constants to __all__: -for key in list(vars().keys()): - if key.startswith('STGTY_') or key.startswith('DEFECT_'): - __all__.append(key) +# for key in list(vars().keys()): +# if key.startswith('STGTY_') or key.startswith('DEFECT_'): +# __all__.append(key) -#--- FUNCTIONS ---------------------------------------------------------------- +#=== FUNCTIONS =============================================================== def isOleFile (filename): """ - Test if file is an OLE container (according to its header). + Test if a file is an OLE container (according to the magic bytes in its header). + + :param filename: string-like or file-like object, OLE file to parse + + - if filename is a string smaller than 1536 bytes, it is the path + of the file to open. (bytes or unicode string) + - if filename is a string longer than 1535 bytes, it is parsed + as the content of an OLE file in memory. (bytes type only) + - if filename is a file-like object (with read and seek methods), + it is parsed as-is. - :param filename: file name or path (str, unicode) :returns: True if OLE, False otherwise. """ - f = open(filename, 'rb') - header = f.read(len(MAGIC)) + # check if filename is a string-like or file-like object: + if hasattr(filename, 'read'): + # file-like object: use it directly + header = filename.read(len(MAGIC)) + # just in case, seek back to start of file: + filename.seek(0) + elif isinstance(filename, bytes) and len(filename) >= MINIMAL_OLEFILE_SIZE: + # filename is a bytes string containing the OLE file to be parsed: + header = filename[:len(MAGIC)] + else: + # string-like object: filename of file on disk + header = open(filename, 'rb').read(len(MAGIC)) if header == MAGIC: return True else: @@ -434,41 +509,17 @@ def _clsid(clsid): tuple(map(i8, clsid[8:16])))) -# UNICODE support: -# (necessary to handle storages/streams names which use Unicode) - -def _unicode(s, errors='replace'): - """ - Map unicode string to Latin 1. (Python with Unicode support) - - :param s: UTF-16LE unicode string to convert to Latin-1 - :param errors: 'replace', 'ignore' or 'strict'. - """ - #TODO: test if it OleFileIO works with Unicode strings, instead of - # converting to Latin-1. - try: - # First the string is converted to plain Unicode: - # (assuming it is encoded as UTF-16 little-endian) - u = s.decode('UTF-16LE', errors) - if bytes is not str or KEEP_UNICODE_NAMES: - return u - else: - # Second the unicode string is converted to Latin-1 - return u.encode('latin_1', errors) - except: - # there was an error during Unicode to Latin-1 conversion: - raise IOError('incorrect Unicode name') - def filetime2datetime(filetime): - """ - convert FILETIME (64 bits int) to Python datetime.datetime - """ - # TODO: manage exception when microseconds is too large - # inspired from http://code.activestate.com/recipes/511425-filetime-to-datetime/ - _FILETIME_null_date = datetime.datetime(1601, 1, 1, 0, 0, 0) - #debug('timedelta days=%d' % (filetime//(10*1000000*3600*24))) - return _FILETIME_null_date + datetime.timedelta(microseconds=filetime//10) + """ + convert FILETIME (64 bits int) to Python datetime.datetime + """ + # TODO: manage exception when microseconds is too large + # inspired from http://code.activestate.com/recipes/511425-filetime-to-datetime/ + _FILETIME_null_date = datetime.datetime(1601, 1, 1, 0, 0, 0) + #debug('timedelta days=%d' % (filetime//(10*1000000*3600*24))) + return _FILETIME_null_date + datetime.timedelta(microseconds=filetime//10) + #=== CLASSES ================================================================== @@ -578,6 +629,7 @@ class OleMetadata: self.language = None self.doc_version = None + def parse_properties(self, olefile): """ Parse standard properties of an OLE file, from the streams @@ -639,6 +691,7 @@ class _OleStream(io.BytesIO): fat table arguments. Attributes: + - size: actual size of data stream, after it was opened. """ @@ -650,18 +703,18 @@ class _OleStream(io.BytesIO): """ Constructor for _OleStream class. - :param fp : file object, the OLE container or the MiniFAT stream - :param sect : sector index of first sector in the stream - :param size : total size of the stream - :param offset : offset in bytes for the first FAT or MiniFAT sector + :param fp: file object, the OLE container or the MiniFAT stream + :param sect: sector index of first sector in the stream + :param size: total size of the stream + :param offset: offset in bytes for the first FAT or MiniFAT sector :param sectorsize: size of one sector - :param fat : array/list of sector indexes (FAT or MiniFAT) - :param filesize : size of OLE file (for debugging) - :returns : a BytesIO instance containing the OLE stream + :param fat: array/list of sector indexes (FAT or MiniFAT) + :param filesize: size of OLE file (for debugging) + :returns: a BytesIO instance containing the OLE stream """ debug('_OleStream.__init__:') debug(' sect=%d (%X), size=%d, offset=%d, sectorsize=%d, len(fat)=%d, fp=%s' - %(sect, sect, size, offset, sectorsize, len(fat), repr(fp))) + %(sect,sect,size,offset,sectorsize,len(fat), repr(fp))) #[PL] To detect malformed documents with FAT loops, we compute the # expected number of sectors in the stream: unknown_size = False @@ -729,7 +782,7 @@ class _OleStream(io.BytesIO): data.append(sector_data) # jump to next sector in the FAT: try: - sect = fat[sect] + sect = fat[sect] & 0xFFFFFFFF # JYTHON-WORKAROUND except IndexError: # [PL] if pointer is out of the FAT an exception is raised raise IOError('incorrect OLE FAT, sector index out of range') @@ -787,6 +840,7 @@ class _OleDirectoryEntry: DIRENTRY_SIZE = 128 assert struct.calcsize(STRUCT_DIRENTRY) == DIRENTRY_SIZE + def __init__(self, entry, sid, olefile): """ Constructor for an _OleDirectoryEntry object. @@ -842,8 +896,11 @@ class _OleDirectoryEntry: namelength = 64 # only characters without ending null char are kept: name = name[:(namelength-2)] - # name is converted from unicode to Latin-1: - self.name = _unicode(name) + #TODO: check if the name is actually followed by a null unicode character ([MS-CFB] 2.6.1) + #TODO: check if the name does not contain forbidden characters: + # [MS-CFB] 2.6.1: "The following characters are illegal and MUST NOT be part of the name: '/', '\', ':', '!'." + # name is converted from UTF-16LE to the path encoding specified in the OleFileIO: + self.name = olefile._decode_utf16_str(name) debug('DirEntry SID=%d: %s' % (self.sid, repr(self.name))) debug(' - type: %d' % self.entry_type) @@ -879,6 +936,8 @@ class _OleDirectoryEntry: minifat = False olefile._check_duplicate_stream(self.isectStart, minifat) + + def build_storage_tree(self): """ Read and build the red-black tree attached to this _OleDirectoryEntry @@ -902,15 +961,16 @@ class _OleDirectoryEntry: # (see rich comparison methods in this class) self.kids.sort() + def append_kids(self, child_sid): """ Walk through red-black tree of children of this directory entry to add all of them to the kids list. (recursive method) - child_sid : index of child directory entry to use, or None when called - first time for the root. (only used during recursion) + :param child_sid : index of child directory entry to use, or None when called + first time for the root. (only used during recursion) """ - # [PL] this method was added to use simple recursion instead of a complex + #[PL] this method was added to use simple recursion instead of a complex # algorithm. # if this is not a storage or a leaf of the tree, nothing to do: if child_sid == NOSTREAM: @@ -945,6 +1005,7 @@ class _OleDirectoryEntry: # Afterwards build kid's own tree if it's also a storage: child.build_storage_tree() + def __eq__(self, other): "Compare entries by name" return self.name == other.name @@ -964,6 +1025,7 @@ class _OleDirectoryEntry: #TODO: replace by the same function as MS implementation ? # (order by name length first, then case-insensitive order) + def dump(self, tab = 0): "Dump this entry, and all its subentries (for debug purposes only)" TYPES = ["(invalid)", "(storage)", "(stream)", "(lockbytes)", @@ -978,12 +1040,13 @@ class _OleDirectoryEntry: for kid in self.kids: kid.dump(tab + 2) + def getmtime(self): """ Return modification time of a directory entry. :returns: None if modification time is null, a python datetime object - otherwise (UTC timezone) + otherwise (UTC timezone) new in version 0.26 """ @@ -991,12 +1054,13 @@ class _OleDirectoryEntry: return None return filetime2datetime(self.modifyTime) + def getctime(self): """ Return creation time of a directory entry. :returns: None if modification time is null, a python datetime object - otherwise (UTC timezone) + otherwise (UTC timezone) new in version 0.26 """ @@ -1012,8 +1076,7 @@ class OleFileIO: OLE container object This class encapsulates the interface to an OLE 2 structured - storage file. Use the :py:meth:`~PIL.OleFileIO.OleFileIO.listdir` and - :py:meth:`~PIL.OleFileIO.OleFileIO.openstream` methods to + storage file. Use the listdir and openstream methods to access the contents of this file. Object names are given as a list of strings, one for each subentry @@ -1037,22 +1100,47 @@ class OleFileIO: TIFF files). """ - def __init__(self, filename = None, raise_defects=DEFECT_FATAL): + def __init__(self, filename=None, raise_defects=DEFECT_FATAL, + write_mode=False, debug=False, path_encoding=DEFAULT_PATH_ENCODING): """ - Constructor for OleFileIO class. + Constructor for the OleFileIO class. :param filename: file to open. + + - if filename is a string smaller than 1536 bytes, it is the path + of the file to open. (bytes or unicode string) + - if filename is a string longer than 1535 bytes, it is parsed + as the content of an OLE file in memory. (bytes type only) + - if filename is a file-like object (with read, seek and tell methods), + it is parsed as-is. + :param raise_defects: minimal level for defects to be raised as exceptions. - (use DEFECT_FATAL for a typical application, DEFECT_INCORRECT for a - security-oriented application, see source code for details) + (use DEFECT_FATAL for a typical application, DEFECT_INCORRECT for a + security-oriented application, see source code for details) + + :param write_mode: bool, if True the file is opened in read/write mode instead + of read-only by default. + + :param debug: bool, set debug mode + + :param path_encoding: None or str, name of the codec to use for path + names (streams and storages), or None for Unicode. + Unicode by default on Python 3+, UTF-8 on Python 2.x. + (new in olefile 0.42, was hardcoded to Latin-1 until olefile v0.41) """ + set_debug_mode(debug) # minimal level for defects to be raised as exceptions: self._raise_defects_level = raise_defects # list of defects/issues not raised as exceptions: # tuples of (exception type, message) self.parsing_issues = [] + self.write_mode = write_mode + self.path_encoding = path_encoding + self._filesize = None + self.fp = None if filename: - self.open(filename) + self.open(filename, write_mode=write_mode) + def _raise_defect(self, defect_level, message, exception_type=IOError): """ @@ -1061,10 +1149,12 @@ class OleFileIO: for the OleFileIO object. :param defect_level: defect level, possible values are: - DEFECT_UNSURE : a case which looks weird, but not sure it's a defect - DEFECT_POTENTIAL : a potential defect - DEFECT_INCORRECT : an error according to specifications, but parsing can go on - DEFECT_FATAL : an error which cannot be ignored, parsing is impossible + + - DEFECT_UNSURE : a case which looks weird, but not sure it's a defect + - DEFECT_POTENTIAL : a potential defect + - DEFECT_INCORRECT : an error according to specifications, but parsing can go on + - DEFECT_FATAL : an error which cannot be ignored, parsing is impossible + :param message: string describing the defect, used with raised exception. :param exception_type: exception class to be raised, IOError by default """ @@ -1075,31 +1165,70 @@ class OleFileIO: # just record the issue, no exception raised: self.parsing_issues.append((exception_type, message)) - def open(self, filename): - """ - Open an OLE2 file. - Reads the header, FAT and directory. - :param filename: string-like or file-like object + def _decode_utf16_str(self, utf16_str, errors='replace'): """ + Decode a string encoded in UTF-16 LE format, as found in the OLE + directory or in property streams. Return a string encoded + according to the path_encoding specified for the OleFileIO object. + + :param utf16_str: bytes string encoded in UTF-16 LE format + :param errors: str, see python documentation for str.decode() + :return: str, encoded according to path_encoding + """ + unicode_str = utf16_str.decode('UTF-16LE', errors) + if self.path_encoding: + # an encoding has been specified for path names: + return unicode_str.encode(self.path_encoding, errors) + else: + # path_encoding=None, return the Unicode string as-is: + return unicode_str + + + def open(self, filename, write_mode=False): + """ + Open an OLE2 file in read-only or read/write mode. + Read and parse the header, FAT and directory. + + :param filename: string-like or file-like object, OLE file to parse + + - if filename is a string smaller than 1536 bytes, it is the path + of the file to open. (bytes or unicode string) + - if filename is a string longer than 1535 bytes, it is parsed + as the content of an OLE file in memory. (bytes type only) + - if filename is a file-like object (with read, seek and tell methods), + it is parsed as-is. + + :param write_mode: bool, if True the file is opened in read/write mode instead + of read-only by default. (ignored if filename is not a path) + """ + self.write_mode = write_mode #[PL] check if filename is a string-like or file-like object: # (it is better to check for a read() method) if hasattr(filename, 'read'): - # file-like object + #TODO: also check seek and tell methods? + # file-like object: use it directly self.fp = filename + elif isinstance(filename, bytes) and len(filename) >= MINIMAL_OLEFILE_SIZE: + # filename is a bytes string containing the OLE file to be parsed: + # convert it to BytesIO + self.fp = io.BytesIO(filename) else: # string-like object: filename of file on disk - #TODO: if larger than 1024 bytes, this could be the actual data => BytesIO - self.fp = open(filename, "rb") - # old code fails if filename is not a plain string: - #if isinstance(filename, (bytes, basestring)): - # self.fp = open(filename, "rb") - #else: - # self.fp = filename + if self.write_mode: + # open file in mode 'read with update, binary' + # According to https://docs.python.org/2/library/functions.html#open + # 'w' would truncate the file, 'a' may only append on some Unixes + mode = 'r+b' + else: + # read-only mode by default + mode = 'rb' + self.fp = open(filename, mode) # obtain the filesize by using seek and tell, which should work on most # file-like objects: #TODO: do it above, using getsize with filename when possible? #TODO: fix code to fail with clear exception when filesize cannot be obtained + filesize=0 self.fp.seek(0, os.SEEK_END) try: filesize = self.fp.tell() @@ -1177,7 +1306,7 @@ class OleFileIO: self.sectDifStart, self.csectDif ) = struct.unpack(fmt_header, header1) - debug(struct.unpack(fmt_header, header1)) + debug( struct.unpack(fmt_header, header1)) if self.Sig != MAGIC: # OLE signature should always be present @@ -1196,6 +1325,7 @@ class OleFileIO: # For now only common little-endian documents are handled correctly self._raise_defect(DEFECT_FATAL, "incorrect ByteOrder in OLE header") # TODO: add big-endian support for documents created on Mac ? + # But according to [MS-CFB] ? v20140502, ByteOrder MUST be 0xFFFE. self.SectorSize = 2**self.SectorShift debug( "SectorSize = %d" % self.SectorSize ) if self.SectorSize not in [512, 4096]: @@ -1210,28 +1340,44 @@ class OleFileIO: if self.Reserved != 0 or self.Reserved1 != 0: self._raise_defect(DEFECT_INCORRECT, "incorrect OLE header (non-null reserved bytes)") debug( "csectDir = %d" % self.csectDir ) + # Number of directory sectors (only allowed if DllVersion != 3) if self.SectorSize==512 and self.csectDir!=0: self._raise_defect(DEFECT_INCORRECT, "incorrect csectDir in OLE header") debug( "csectFat = %d" % self.csectFat ) + # csectFat = number of FAT sectors in the file debug( "sectDirStart = %X" % self.sectDirStart ) + # sectDirStart = 1st sector containing the directory debug( "signature = %d" % self.signature ) # Signature should be zero, BUT some implementations do not follow this # rule => only a potential defect: + # (according to MS-CFB, may be != 0 for applications supporting file + # transactions) if self.signature != 0: self._raise_defect(DEFECT_POTENTIAL, "incorrect OLE header (signature>0)") - debug("MiniSectorCutoff = %d" % self.MiniSectorCutoff) - debug("MiniFatStart = %X" % self.MiniFatStart) - debug("csectMiniFat = %d" % self.csectMiniFat) - debug("sectDifStart = %X" % self.sectDifStart) - debug("csectDif = %d" % self.csectDif) + debug( "MiniSectorCutoff = %d" % self.MiniSectorCutoff ) + # MS-CFB: This integer field MUST be set to 0x00001000. This field + # specifies the maximum size of a user-defined data stream allocated + # from the mini FAT and mini stream, and that cutoff is 4096 bytes. + # Any user-defined data stream larger than or equal to this cutoff size + # must be allocated as normal sectors from the FAT. + if self.MiniSectorCutoff != 0x1000: + self._raise_defect(DEFECT_INCORRECT, "incorrect MiniSectorCutoff in OLE header") + debug( "MiniFatStart = %X" % self.MiniFatStart ) + debug( "csectMiniFat = %d" % self.csectMiniFat ) + debug( "sectDifStart = %X" % self.sectDifStart ) + debug( "csectDif = %d" % self.csectDif ) # calculate the number of sectors in the file # (-1 because header doesn't count) self.nb_sect = ( (filesize + self.SectorSize-1) // self.SectorSize) - 1 debug( "Number of sectors in the file: %d" % self.nb_sect ) + #TODO: change this test, because an OLE file MAY contain other data + # after the last sector. - # file clsid (probably never used, so we don't store it) - #clsid = _clsid(header[8:24]) + # file clsid + self.clsid = _clsid(header[8:24]) + + #TODO: remove redundant attributes, and fix the code which uses them? self.sectorsize = self.SectorSize #1 << i16(header, 30) self.minisectorsize = self.MiniSectorSize #1 << i16(header, 32) self.minisectorcutoff = self.MiniSectorCutoff # i32(header, 56) @@ -1254,19 +1400,22 @@ class OleFileIO: self.ministream = None self.minifatsect = self.MiniFatStart #i32(header, 60) + def close(self): """ close the OLE file, to release the file object """ self.fp.close() + def _check_duplicate_stream(self, first_sect, minifat=False): """ Checks if a stream has not been already referenced elsewhere. This method should only be called once for each known stream, and only if stream size is not null. - :param first_sect: index of first sector of the stream in FAT - :param minifat: if True, stream is located in the MiniFAT, else in the FAT + + :param first_sect: int, index of first sector of the stream in FAT + :param minifat: bool, if True, stream is located in the MiniFAT, else in the FAT """ if minifat: debug('_check_duplicate_stream: sect=%d in MiniFAT' % first_sect) @@ -1284,13 +1433,14 @@ class OleFileIO: else: used_streams.append(first_sect) + def dumpfat(self, fat, firstindex=0): "Displays a part of FAT in human-readable form for debugging purpose" # [PL] added only for debug if not DEBUG_MODE: return # dictionary to convert special FAT values in human-readable strings - VPL=8 # valeurs par ligne (8+1 * 8+1 = 81) + VPL = 8 # values per line (8+1 * 8+1 = 81) fatnames = { FREESECT: "..free..", ENDOFCHAIN: "[ END. ]", @@ -1310,22 +1460,26 @@ class OleFileIO: if i>=nbsect: break sect = fat[i] - if sect in fatnames: - nom = fatnames[sect] + aux = sect & 0xFFFFFFFF # JYTHON-WORKAROUND + if aux in fatnames: + name = fatnames[aux] else: if sect == i+1: - nom = " --->" + name = " --->" else: - nom = "%8X" % sect - print(nom, end=" ") + name = "%8X" % sect + print(name, end=" ") print() + def dumpsect(self, sector, firstindex=0): "Displays a sector in a human-readable form, for debugging purpose." if not DEBUG_MODE: return VPL=8 # number of values per line (8+1 * 8+1 = 81) tab = array.array(UINT32, sector) + if sys.byteorder == 'big': + tab.byteswap() nbsect = len(tab) nlines = (nbsect+VPL-1)//VPL print("index", end=" ") @@ -1339,8 +1493,8 @@ class OleFileIO: if i>=nbsect: break sect = tab[i] - nom = "%8X" % sect - print(nom, end=" ") + name = "%8X" % sect + print(name, end=" ") print() def sect2array(self, sect): @@ -1354,6 +1508,7 @@ class OleFileIO: a.byteswap() return a + def loadfat_sect(self, sect): """ Adds the indexes of the given sector to the FAT @@ -1371,9 +1526,11 @@ class OleFileIO: self.dumpsect(sect) # The FAT is a sector chain starting at the first index of itself. for isect in fat1: - #print("isect = %X" % isect) + isect = isect & 0xFFFFFFFF # JYTHON-WORKAROUND + debug("isect = %X" % isect) if isect == ENDOFCHAIN or isect == FREESECT: # the end of the sector chain has been reached + debug("found end of sector chain") break # read the FAT sector s = self.getsect(isect) @@ -1383,13 +1540,15 @@ class OleFileIO: self.fat = self.fat + nextfat return isect + def loadfat(self, header): """ Load the FAT table. """ - # The header contains a sector numbers - # for the first 109 FAT sectors. Additional sectors are - # described by DIF blocks + # The 1st sector of the file contains sector numbers for the first 109 + # FAT sectors, right after the header which is 76 bytes long. + # (always 109, whatever the sector size: 512 bytes = 76+4*109) + # Additional sectors are described by DIF blocks sect = header[76:512] debug( "len(sect)=%d, so %d integers" % (len(sect), len(sect)//4) ) @@ -1418,24 +1577,27 @@ class OleFileIO: if self.sectDifStart >= self.nb_sect: # initial DIFAT block index must be valid self._raise_defect(DEFECT_FATAL, 'incorrect DIFAT, first index out of range') - debug("DIFAT analysis...") + debug( "DIFAT analysis..." ) # We compute the necessary number of DIFAT sectors : - # (each DIFAT sector = 127 pointers + 1 towards next DIFAT sector) - nb_difat = (self.csectFat-109 + 126)//127 - debug("nb_difat = %d" % nb_difat) + # Number of pointers per DIFAT sector = (sectorsize/4)-1 + # (-1 because the last pointer is the next DIFAT sector number) + nb_difat_sectors = (self.sectorsize//4)-1 + # (if 512 bytes: each DIFAT sector = 127 pointers + 1 towards next DIFAT sector) + nb_difat = (self.csectFat-109 + nb_difat_sectors-1)//nb_difat_sectors + debug( "nb_difat = %d" % nb_difat ) if self.csectDif != nb_difat: raise IOError('incorrect DIFAT') isect_difat = self.sectDifStart for i in iterrange(nb_difat): - debug("DIFAT block %d, sector %X" % (i, isect_difat)) + debug( "DIFAT block %d, sector %X" % (i, isect_difat) ) #TODO: check if corresponding FAT SID = DIFSECT sector_difat = self.getsect(isect_difat) difat = self.sect2array(sector_difat) self.dumpsect(sector_difat) - self.loadfat_sect(difat[:127]) + self.loadfat_sect(difat[:nb_difat_sectors]) # last DIFAT pointer is next DIFAT sector: - isect_difat = difat[127] - debug("next DIFAT sector: %X" % isect_difat) + isect_difat = difat[nb_difat_sectors] + debug( "next DIFAT sector: %X" % isect_difat ) # checks: if isect_difat not in [ENDOFCHAIN, FREESECT]: # last DIFAT pointer value must be ENDOFCHAIN or FREESECT @@ -1453,6 +1615,7 @@ class OleFileIO: debug('\nFAT:') self.dumpfat(self.fat) + def loadminifat(self): """ Load the MiniFAT table. @@ -1491,10 +1654,16 @@ class OleFileIO: """ Read given sector from file on disk. - :param sect: sector index + :param sect: int, sector index :returns: a string containing the sector data. """ - # [PL] this original code was wrong when sectors are 4KB instead of + # From [MS-CFB]: A sector number can be converted into a byte offset + # into the file by using the following formula: + # (sector number + 1) x Sector Size. + # This implies that sector #0 of the file begins at byte offset Sector + # Size, not at 0. + + # [PL] the original code in PIL was wrong when sectors are 4KB instead of # 512 bytes: #self.fp.seek(512 + self.sectorsize * sect) #[PL]: added safety checks: @@ -1512,6 +1681,34 @@ class OleFileIO: self._raise_defect(DEFECT_FATAL, 'incomplete OLE sector') return sector + + def write_sect(self, sect, data, padding=b'\x00'): + """ + Write given sector to file on disk. + + :param sect: int, sector index + :param data: bytes, sector data + :param padding: single byte, padding character if data < sector size + """ + if not isinstance(data, bytes): + raise TypeError("write_sect: data must be a bytes string") + if not isinstance(padding, bytes) or len(padding)!=1: + raise TypeError("write_sect: padding must be a bytes string of 1 char") + #TODO: we could allow padding=None for no padding at all + try: + self.fp.seek(self.sectorsize * (sect+1)) + except: + debug('write_sect(): sect=%X, seek=%d, filesize=%d' % + (sect, self.sectorsize*(sect+1), self._filesize)) + self._raise_defect(DEFECT_FATAL, 'OLE sector index out of range') + if len(data) < self.sectorsize: + # add padding + data += padding * (self.sectorsize - len(data)) + elif len(data) < self.sectorsize: + raise ValueError("Data is larger than sector size") + self.fp.write(data) + + def loaddirectory(self, sect): """ Load the directory. @@ -1541,12 +1738,13 @@ class OleFileIO: ## break ## self.direntries.append(_OleDirectoryEntry(entry, sid, self)) # load root entry: - self._load_direntry(0) + root_entry = self._load_direntry(0) # Root entry is the first entry: self.root = self.direntries[0] # read and build all storage trees, starting from the root: self.root.build_storage_tree() + def _load_direntry (self, sid): """ Load a directory entry from the directory. @@ -1555,6 +1753,7 @@ class OleFileIO: :param sid: index of storage/stream in the directory. :returns: a _OleDirectoryEntry object + :exception IOError: if the entry has always been referenced. """ # check if SID is OK: @@ -1571,12 +1770,14 @@ class OleFileIO: self.direntries[sid] = _OleDirectoryEntry(entry, sid, self) return self.direntries[sid] + def dumpdirectory(self): """ Dump directory (for debugging only) """ self.root.dump() + def _open(self, start, size = 0x7FFFFFFF, force_FAT=False): """ Open a stream, either in FAT or MiniFAT according to its size. @@ -1585,7 +1786,7 @@ class OleFileIO: :param start: index of first sector :param size: size of stream (or nothing if size is unknown) :param force_FAT: if False (default), stream will be opened in FAT or MiniFAT - according to size. If True, it will always be opened in FAT. + according to size. If True, it will always be opened in FAT. """ debug('OleFileIO.open(): sect=%d, size=%d, force_FAT=%s' % (start, size, str(force_FAT))) @@ -1602,51 +1803,60 @@ class OleFileIO: (self.root.isectStart, size_ministream)) self.ministream = self._open(self.root.isectStart, size_ministream, force_FAT=True) - return _OleStream(self.ministream, start, size, 0, - self.minisectorsize, self.minifat, - self.ministream.size) + return _OleStream(fp=self.ministream, sect=start, size=size, + offset=0, sectorsize=self.minisectorsize, + fat=self.minifat, filesize=self.ministream.size) else: # standard stream - return _OleStream(self.fp, start, size, 512, - self.sectorsize, self.fat, self._filesize) + return _OleStream(fp=self.fp, sect=start, size=size, + offset=self.sectorsize, + sectorsize=self.sectorsize, fat=self.fat, + filesize=self._filesize) + def _list(self, files, prefix, node, streams=True, storages=False): """ - (listdir helper) + listdir helper + :param files: list of files to fill in :param prefix: current location in storage tree (list of names) :param node: current node (_OleDirectoryEntry object) :param streams: bool, include streams if True (True by default) - new in v0.26 :param storages: bool, include storages if True (False by default) - new in v0.26 - (note: the root storage is never included) + (note: the root storage is never included) """ prefix = prefix + [node.name] for entry in node.kids: - if entry.kids: + if entry.entry_type == STGTY_STORAGE: # this is a storage if storages: # add it to the list files.append(prefix[1:] + [entry.name]) # check its kids self._list(files, prefix, entry, streams, storages) - else: + elif entry.entry_type == STGTY_STREAM: # this is a stream if streams: # add it to the list files.append(prefix[1:] + [entry.name]) + else: + self._raise_defect(DEFECT_INCORRECT, 'The directory tree contains an entry which is not a stream nor a storage.') + def listdir(self, streams=True, storages=False): """ - Return a list of streams stored in this file + Return a list of streams and/or storages stored in this file :param streams: bool, include streams if True (True by default) - new in v0.26 :param storages: bool, include storages if True (False by default) - new in v0.26 (note: the root storage is never included) + :returns: list of stream and/or storage paths """ files = [] self._list(files, [], self.root, streams, storages) return files + def _find(self, filename): """ Returns directory entry of given filename. (openstream helper) @@ -1656,10 +1866,11 @@ class OleFileIO: - a string using Unix path syntax, for example: 'storage_1/storage_1.2/stream' - - a list of storage filenames, path to the desired stream/storage. + - or a list of storage filenames, path to the desired stream/storage. Example: ['storage_1', 'storage_1.2', 'stream'] + :returns: sid of requested filename - raise IOError if file not found + :exception IOError: if file not found """ # if filename is a string instead of a list, split it on slashes to @@ -1677,15 +1888,17 @@ class OleFileIO: node = kid return node.sid + def openstream(self, filename): """ Open a stream as a read-only file object (BytesIO). + Note: filename is case-insensitive. :param filename: path of stream in storage tree (except root entry), either: - a string using Unix path syntax, for example: 'storage_1/storage_1.2/stream' - - a list of storage filenames, path to the desired stream/storage. + - or a list of storage filenames, path to the desired stream/storage. Example: ['storage_1', 'storage_1.2', 'stream'] :returns: file object (read-only) @@ -1697,6 +1910,68 @@ class OleFileIO: raise IOError("this file is not a stream") return self._open(entry.isectStart, entry.size) + + def write_stream(self, stream_name, data): + """ + Write a stream to disk. For now, it is only possible to replace an + existing stream by data of the same size. + + :param stream_name: path of stream in storage tree (except root entry), either: + + - a string using Unix path syntax, for example: + 'storage_1/storage_1.2/stream' + - or a list of storage filenames, path to the desired stream/storage. + Example: ['storage_1', 'storage_1.2', 'stream'] + + :param data: bytes, data to be written, must be the same size as the original + stream. + """ + if not isinstance(data, bytes): + raise TypeError("write_stream: data must be a bytes string") + sid = self._find(stream_name) + entry = self.direntries[sid] + if entry.entry_type != STGTY_STREAM: + raise IOError("this is not a stream") + size = entry.size + if size != len(data): + raise ValueError("write_stream: data must be the same size as the existing stream") + if size < self.minisectorcutoff: + raise NotImplementedError("Writing a stream in MiniFAT is not implemented yet") + sect = entry.isectStart + # number of sectors to write + nb_sectors = (size + (self.sectorsize-1)) // self.sectorsize + debug('nb_sectors = %d' % nb_sectors) + for i in range(nb_sectors): +## try: +## self.fp.seek(offset + self.sectorsize * sect) +## except: +## debug('sect=%d, seek=%d' % +## (sect, offset+self.sectorsize*sect)) +## raise IOError('OLE sector index out of range') + # extract one sector from data, the last one being smaller: + if i<(nb_sectors-1): + data_sector = data [i*self.sectorsize : (i+1)*self.sectorsize] + #TODO: comment this if it works + assert(len(data_sector)==self.sectorsize) + else: + data_sector = data [i*self.sectorsize:] + #TODO: comment this if it works + debug('write_stream: size=%d sectorsize=%d data_sector=%d size%%sectorsize=%d' + % (size, self.sectorsize, len(data_sector), size % self.sectorsize)) + assert(len(data_sector) % self.sectorsize==size % self.sectorsize) + self.write_sect(sect, data_sector) +## self.fp.write(data_sector) + # jump to next sector in the FAT: + try: + sect = self.fat[sect] + except IndexError: + # [PL] if pointer is out of the FAT an exception is raised + raise IOError('incorrect OLE FAT, sector index out of range') + #[PL] Last sector should be a "end of chain" marker: + if sect != ENDOFCHAIN: + raise IOError('incorrect last sector index in OLE stream') + + def get_type(self, filename): """ Test if given filename exists as a stream or a storage in the OLE @@ -1716,6 +1991,7 @@ class OleFileIO: except: return False + def getmtime(self, filename): """ Return modification time of a stream/storage. @@ -1731,6 +2007,7 @@ class OleFileIO: entry = self.direntries[sid] return entry.getmtime() + def getctime(self, filename): """ Return creation time of a stream/storage. @@ -1746,20 +2023,23 @@ class OleFileIO: entry = self.direntries[sid] return entry.getctime() + def exists(self, filename): """ Test if given filename exists as a stream or a storage in the OLE container. + Note: filename is case-insensitive. :param filename: path of stream in storage tree. (see openstream for syntax) :returns: True if object exist, else False. """ try: - self._find(filename) + sid = self._find(filename) return True except: return False + def get_size(self, filename): """ Return size of a stream in the OLE container, in bytes. @@ -1767,7 +2047,7 @@ class OleFileIO: :param filename: path of stream in storage tree (see openstream for syntax) :returns: size in bytes (long integer) :exception IOError: if file not found - :exception TypeError: if this is not a stream + :exception TypeError: if this is not a stream. """ sid = self._find(filename) entry = self.direntries[sid] @@ -1776,6 +2056,7 @@ class OleFileIO: raise TypeError('object is not an OLE stream') return entry.size + def get_rootentry_name(self): """ Return root entry name. Should usually be 'Root Entry' or 'R' in most @@ -1783,6 +2064,7 @@ class OleFileIO: """ return self.root.name + def getproperties(self, filename, convert_time=False, no_conversion=None): """ Return properties described in substream. @@ -1791,10 +2073,12 @@ class OleFileIO: :param convert_time: bool, if True timestamps will be converted to Python datetime :param no_conversion: None or list of int, timestamps not to be converted (for example total editing time is not a real timestamp) + :returns: a dictionary of values indexed by id (integer) """ + #REFERENCE: [MS-OLEPS] https://msdn.microsoft.com/en-us/library/dd942421.aspx # make sure no_conversion is a list, just to simplify code below: - if no_conversion is None: + if no_conversion == None: no_conversion = [] # stream path as a string to report exceptions: streampath = filename @@ -1808,11 +2092,11 @@ class OleFileIO: try: # header s = fp.read(28) - # clsid = _clsid(s[8:24]) + clsid = _clsid(s[8:24]) # format id s = fp.read(20) - # fmtid = _clsid(s[:16]) + fmtid = _clsid(s[:16]) fp.seek(i32(s, 16)) # get section @@ -1830,34 +2114,34 @@ class OleFileIO: for i in range(num_props): try: - id = 0 # just in case of an exception + id = 0 # just in case of an exception id = i32(s, 8+i*8) offset = i32(s, 12+i*8) type = i32(s, offset) - debug('property id=%d: type=%d offset=%X' % (id, type, offset)) + debug ('property id=%d: type=%d offset=%X' % (id, type, offset)) # test for common types first (should perhaps use # a dictionary instead?) - if type == VT_I2: # 16-bit signed integer + if type == VT_I2: # 16-bit signed integer value = i16(s, offset+4) if value >= 32768: value = value - 65536 - elif type == VT_UI2: # 2-byte unsigned integer + elif type == VT_UI2: # 2-byte unsigned integer value = i16(s, offset+4) elif type in (VT_I4, VT_INT, VT_ERROR): # VT_I4: 32-bit signed integer # VT_ERROR: HRESULT, similar to 32-bit signed integer, # see http://msdn.microsoft.com/en-us/library/cc230330.aspx value = i32(s, offset+4) - elif type in (VT_UI4, VT_UINT): # 4-byte unsigned integer - value = i32(s, offset+4) # FIXME + elif type in (VT_UI4, VT_UINT): # 4-byte unsigned integer + value = i32(s, offset+4) # FIXME elif type in (VT_BSTR, VT_LPSTR): # CodePageString, see http://msdn.microsoft.com/en-us/library/dd942354.aspx # size is a 32 bits integer, including the null terminator, and # possibly trailing or embedded null chars - # TODO: if codepage is unicode, the string should be converted as such + #TODO: if codepage is unicode, the string should be converted as such count = i32(s, offset+4) value = s[offset+8:offset+8+count-1] # remove all null chars: @@ -1873,9 +2157,9 @@ class OleFileIO: # "the string should NOT contain embedded or additional trailing # null characters." count = i32(s, offset+4) - value = _unicode(s[offset+8:offset+8+count*2]) + value = self._decode_utf16_str(s[offset+8:offset+8+count*2]) elif type == VT_FILETIME: - value = long(i32(s, offset+4)) + (long(i32(s, offset+8)) << 32) + value = long(i32(s, offset+4)) + (long(i32(s, offset+8))<<32) # FILETIME is a 64-bit int: "number of 100ns periods # since Jan 1,1601". if convert_time and id not in no_conversion: @@ -1889,8 +2173,8 @@ class OleFileIO: else: # legacy code kept for backward compatibility: returns a # number of seconds since Jan 1,1601 - value = value // 10000000 # seconds - elif type == VT_UI1: # 1-byte unsigned integer + value = value // 10000000 # seconds + elif type == VT_UI1: # 1-byte unsigned integer value = i8(s[offset+4]) elif type == VT_CLSID: value = _clsid(s[offset+4:offset+20]) @@ -1904,8 +2188,8 @@ class OleFileIO: # see http://msdn.microsoft.com/en-us/library/cc237864.aspx value = bool(i16(s, offset+4)) else: - value = None # everything else yields "None" - debug('property id=%d: type=%d not implemented in parser yet' % (id, type)) + value = None # everything else yields "None" + debug ('property id=%d: type=%d not implemented in parser yet' % (id, type)) # missing: VT_EMPTY, VT_NULL, VT_R4, VT_R8, VT_CY, VT_DATE, # VT_DECIMAL, VT_I1, VT_I8, VT_UI8, @@ -1917,8 +2201,8 @@ class OleFileIO: # type of items, e.g. VT_VECTOR|VT_BSTR # see http://msdn.microsoft.com/en-us/library/dd942011.aspx - # print("%08x" % id, repr(value), end=" ") - # print("(%s)" % VT[i32(s, offset) & 0xFFF]) + #print("%08x" % id, repr(value), end=" ") + #print("(%s)" % VT[i32(s, offset) & 0xFFF]) data[id] = value except BaseException as exc: @@ -1949,105 +2233,112 @@ class OleFileIO: if __name__ == "__main__": + import sys + # [PL] display quick usage info if launched from command-line if len(sys.argv) <= 1: - print(__doc__) - print(""" -Launched from command line, this script parses OLE files and prints info. + print('olefile version %s %s - %s' % (__version__, __date__, __author__)) + print( +""" +Launched from the command line, this script parses OLE files and prints info. -Usage: OleFileIO_PL.py [-d] [-c] [file2 ...] +Usage: olefile.py [-d] [-c] [file2 ...] Options: --d : debug mode (display a lot of debug information, for developers only) +-d : debug mode (displays a lot of debug information, for developers only) -c : check all streams (for debugging purposes) + +For more information, see http://www.decalage.info/olefile """) sys.exit() check_streams = False for filename in sys.argv[1:]: - # try: - # OPTIONS: - if filename == '-d': - # option to switch debug mode on: - set_debug_mode(True) - continue - if filename == '-c': - # option to switch check streams mode on: - check_streams = True - continue +## try: + # OPTIONS: + if filename == '-d': + # option to switch debug mode on: + set_debug_mode(True) + continue + if filename == '-c': + # option to switch check streams mode on: + check_streams = True + continue - ole = OleFileIO(filename) #, raise_defects=DEFECT_INCORRECT) - print("-" * 68) - print(filename) - print("-" * 68) - ole.dumpdirectory() - for streamname in ole.listdir(): - if streamname[-1][0] == "\005": - print(streamname, ": properties") - props = ole.getproperties(streamname, convert_time=True) - props = sorted(props.items()) - for k, v in props: - #[PL]: avoid to display too large or binary values: - if isinstance(v, (basestring, bytes)): - if len(v) > 50: - v = v[:50] - if isinstance(v, bytes): - # quick and dirty binary check: - for c in (1, 2, 3, 4, 5, 6, 7, 11, 12, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31): - if c in bytearray(v): - v = '(binary data)' - break - print(" ", k, v) - - if check_streams: - # Read all streams to check if there are errors: - print('\nChecking streams...') + ole = OleFileIO(filename)#, raise_defects=DEFECT_INCORRECT) + print("-" * 68) + print(filename) + print("-" * 68) + ole.dumpdirectory() for streamname in ole.listdir(): - # print name using repr() to convert binary chars to \xNN: - print('-', repr('/'.join(streamname)), '-', end=' ') - st_type = ole.get_type(streamname) - if st_type == STGTY_STREAM: - print('size %d' % ole.get_size(streamname)) - # just try to read stream in memory: - ole.openstream(streamname) - else: - print('NOT a stream : type=%d' % st_type) + if streamname[-1][0] == "\005": + print(streamname, ": properties") + props = ole.getproperties(streamname, convert_time=True) + props = sorted(props.items()) + for k, v in props: + #[PL]: avoid to display too large or binary values: + if isinstance(v, (basestring, bytes)): + if len(v) > 50: + v = v[:50] + if isinstance(v, bytes): + # quick and dirty binary check: + for c in (1,2,3,4,5,6,7,11,12,14,15,16,17,18,19,20, + 21,22,23,24,25,26,27,28,29,30,31): + if c in bytearray(v): + v = '(binary data)' + break + print(" ", k, v) + + if check_streams: + # Read all streams to check if there are errors: + print('\nChecking streams...') + for streamname in ole.listdir(): + # print name using repr() to convert binary chars to \xNN: + print('-', repr('/'.join(streamname)),'-', end=' ') + st_type = ole.get_type(streamname) + if st_type == STGTY_STREAM: + print('size %d' % ole.get_size(streamname)) + # just try to read stream in memory: + ole.openstream(streamname) + else: + print('NOT a stream : type=%d' % st_type) + print() + +## for streamname in ole.listdir(): +## # print name using repr() to convert binary chars to \xNN: +## print('-', repr('/'.join(streamname)),'-', end=' ') +## print(ole.getmtime(streamname)) +## print() + + print('Modification/Creation times of all directory entries:') + for entry in ole.direntries: + if entry is not None: + print('- %s: mtime=%s ctime=%s' % (entry.name, + entry.getmtime(), entry.getctime())) print() -## for streamname in ole.listdir(): -## # print name using repr() to convert binary chars to \xNN: -## print('-', repr('/'.join(streamname)),'-', end=' ') -## print(ole.getmtime(streamname)) -## print() + # parse and display metadata: + meta = ole.get_metadata() + meta.dump() + print() + #[PL] Test a few new methods: + root = ole.get_rootentry_name() + print('Root entry name: "%s"' % root) + if ole.exists('worddocument'): + print("This is a Word document.") + print("type of stream 'WordDocument':", ole.get_type('worddocument')) + print("size :", ole.get_size('worddocument')) + if ole.exists('macros/vba'): + print("This document may contain VBA macros.") - print('Modification/Creation times of all directory entries:') - for entry in ole.direntries: - if entry is not None: - print('- %s: mtime=%s ctime=%s' % (entry.name, - entry.getmtime(), entry.getctime())) - print() - - # parse and display metadata: - meta = ole.get_metadata() - meta.dump() - print() - # [PL] Test a few new methods: - root = ole.get_rootentry_name() - print('Root entry name: "%s"' % root) - if ole.exists('worddocument'): - print("This is a Word document.") - print("type of stream 'WordDocument':", ole.get_type('worddocument')) - print("size :", ole.get_size('worddocument')) - if ole.exists('macros/vba'): - print("This document may contain VBA macros.") - - # print parsing issues: - print('\nNon-fatal issues raised during parsing:') - if ole.parsing_issues: - for exctype, msg in ole.parsing_issues: - print('- %s: %s' % (exctype.__name__, msg)) - else: - print('None') + # print parsing issues: + print('\nNon-fatal issues raised during parsing:') + if ole.parsing_issues: + for exctype, msg in ole.parsing_issues: + print('- %s: %s' % (exctype.__name__, msg)) + else: + print('None') ## except IOError as v: ## print("***", "cannot read", file, "-", v) + +# this code was developed while listening to The Wedding Present "Sea Monsters" \ No newline at end of file From 93461e6faa9a5a2676101394bd2fae68040f6b53 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 13 May 2015 03:05:45 -0700 Subject: [PATCH 481/532] Ico files are little endian, ref #1204 --- PIL/IcoImagePlugin.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index c4e24d99c..03f3aef43 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -48,7 +48,7 @@ def _save(im, fp, filename): width, height = im.size filter(lambda x: False if (x[0] > width or x[1] > height or x[0] > 255 or x[1] > 255) else True, sizes) - fp.write(struct.pack("H", len(sizes))) # idCount(2) + fp.write(struct.pack(" Date: Wed, 13 May 2015 18:10:12 +0300 Subject: [PATCH 482/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f96f86fdf..66d448d2f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.9.0 (Unreleased) ------------------ +- Release GIL during image load (decode) #1224 + [lkesteloot] + - Added icns save #1185 [radarhere] From 799e8312cb6ede52d83d96f9ae414fb8ba457154 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 14 May 2015 19:43:28 +1000 Subject: [PATCH 483/532] Separated out feature checking from selftest --- PIL/features.py | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ selftest.py | 48 +++++++++++---------------------- 2 files changed, 87 insertions(+), 32 deletions(-) create mode 100644 PIL/features.py diff --git a/PIL/features.py b/PIL/features.py new file mode 100644 index 000000000..b9ff99ee9 --- /dev/null +++ b/PIL/features.py @@ -0,0 +1,71 @@ +from PIL import Image + +modules = { + "PIL CORE": "PIL._imaging", + "TKINTER": "PIL._imagingtk", + "FREETYPE2": "PIL._imagingft", + "LITTLECMS2": "PIL._imagingcms", + "WEBP": "PIL._webp", + "Transparent WEBP": ("WEBP", "WebPDecoderBuggyAlpha") +} + + +def check_module(feature): + module = modules[feature] + + method_to_call = None + if type(module) is tuple: + module, method_to_call = module + + try: + imported_module = __import__(module) + except ImportError: + # If a method is being checked, None means that + # rather than the method failing, the module required for the method + # failed to be imported first + return None if method_to_call else False + + if method_to_call: + method = getattr(imported_module, method_to_call) + return method() is True + else: + return True + + +def get_supported_modules(): + supported_modules = [] + for feature in get_all_modules(): + if check_module(feature): + supported_modules.append(feature) + return supported_modules + + +def get_all_modules(): + # While the dictionary keys could be used here, + # a static list is used to maintain order + return ["PIL CORE", "TKINTER", "FREETYPE2", + "LITTLECMS2", "WEBP", "Transparent WEBP"] + +codecs = { + "JPEG": "jpeg", + "JPEG 2000": "jpeg2k", + "ZLIB (PNG/ZIP)": "zip", + "LIBTIFF": "libtiff" +} + + +def check_codec(feature): + codec = codecs[feature] + return codec + "_encoder" in dir(Image.core) + + +def get_supported_codecs(): + supported_codecs = [] + for feature in get_all_codecs(): + if check_codec(feature): + supported_codecs.append(feature) + return supported_codecs + + +def get_all_codecs(): + return ["JPEG", "JPEG 2000", "ZLIB (PNG/ZIP)", "LIBTIFF"] diff --git a/selftest.py b/selftest.py index b13dfec28..1872d3e97 100644 --- a/selftest.py +++ b/selftest.py @@ -9,6 +9,7 @@ if "--installed" in sys.argv: del sys.path[0] from PIL import Image, ImageDraw, ImageFilter, ImageMath +from PIL import features if "--installed" in sys.argv: sys.path.insert(0, sys_path_0) @@ -162,22 +163,6 @@ def testimage(): """ -def check_module(feature, module): - try: - __import__(module) - except ImportError: - print("***", feature, "support not installed") - else: - print("---", feature, "support ok") - - -def check_codec(feature, codec): - if codec + "_encoder" not in dir(Image.core): - print("***", feature, "support not installed") - else: - print("---", feature, "support ok") - - if __name__ == "__main__": # check build sanity @@ -189,23 +174,22 @@ if __name__ == "__main__": print("Python modules loaded from", os.path.dirname(Image.__file__)) print("Binary modules loaded from", os.path.dirname(Image.core.__file__)) print("-"*68) - check_module("PIL CORE", "PIL._imaging") - check_module("TKINTER", "PIL._imagingtk") - check_codec("JPEG", "jpeg") - check_codec("JPEG 2000", "jpeg2k") - check_codec("ZLIB (PNG/ZIP)", "zip") - check_codec("LIBTIFF", "libtiff") - check_module("FREETYPE2", "PIL._imagingft") - check_module("LITTLECMS2", "PIL._imagingcms") - check_module("WEBP", "PIL._webp") - try: - from PIL import _webp - if _webp.WebPDecoderBuggyAlpha(): - print("***", "Transparent WEBP", "support not installed") + for feature in features.get_all_modules(): + supported = features.check_module(feature) + + if supported is None: + # A method was being tested, but the module required + # for the method could not be correctly imported + pass + elif supported: + print("---", feature, "support ok") else: - print("---", "Transparent WEBP", "support ok") - except Exception: - pass + print("***", feature, "support not installed") + for feature in features.get_all_codecs(): + if features.check_codec(feature): + print("---", feature, "support ok") + else: + print("***", feature, "support not installed") print("-"*68) # use doctest to make sure the test program behaves as documented! From 98fa49ea378af0d5485a313386dcaefa4bb17d9d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 14 May 2015 20:57:01 +1000 Subject: [PATCH 484/532] Changed module and codec names --- PIL/features.py | 42 +++++++++++++++++++----------------------- selftest.py | 20 ++++++++++++++++---- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/PIL/features.py b/PIL/features.py index b9ff99ee9..fd87f094f 100644 --- a/PIL/features.py +++ b/PIL/features.py @@ -1,16 +1,19 @@ from PIL import Image modules = { - "PIL CORE": "PIL._imaging", - "TKINTER": "PIL._imagingtk", - "FREETYPE2": "PIL._imagingft", - "LITTLECMS2": "PIL._imagingcms", - "WEBP": "PIL._webp", - "Transparent WEBP": ("WEBP", "WebPDecoderBuggyAlpha") + "pil": "PIL._imaging", + "tkinter": "PIL._imagingtk", + "freetype2": "PIL._imagingft", + "littlecms2": "PIL._imagingcms", + "webp": "PIL._webp", + "transp_webp": ("WEBP", "WebPDecoderBuggyAlpha") } def check_module(feature): + if feature not in modules: + raise ValueError("Unknown module %s" % feature) + module = modules[feature] method_to_call = None @@ -34,38 +37,31 @@ def check_module(feature): def get_supported_modules(): supported_modules = [] - for feature in get_all_modules(): + for feature in modules: if check_module(feature): supported_modules.append(feature) return supported_modules - -def get_all_modules(): - # While the dictionary keys could be used here, - # a static list is used to maintain order - return ["PIL CORE", "TKINTER", "FREETYPE2", - "LITTLECMS2", "WEBP", "Transparent WEBP"] - codecs = { - "JPEG": "jpeg", - "JPEG 2000": "jpeg2k", - "ZLIB (PNG/ZIP)": "zip", - "LIBTIFF": "libtiff" + "jpg": "jpeg", + "jpg_2000": "jpeg2k", + "zlib": "zip", + "libtiff": "libtiff" } def check_codec(feature): + if feature not in codecs: + raise ValueError("Unknown codec %s" % feature) + codec = codecs[feature] + return codec + "_encoder" in dir(Image.core) def get_supported_codecs(): supported_codecs = [] - for feature in get_all_codecs(): + for feature in codecs: if check_codec(feature): supported_codecs.append(feature) return supported_codecs - - -def get_all_codecs(): - return ["JPEG", "JPEG 2000", "ZLIB (PNG/ZIP)", "LIBTIFF"] diff --git a/selftest.py b/selftest.py index 1872d3e97..779e83c90 100644 --- a/selftest.py +++ b/selftest.py @@ -174,8 +174,15 @@ if __name__ == "__main__": print("Python modules loaded from", os.path.dirname(Image.__file__)) print("Binary modules loaded from", os.path.dirname(Image.core.__file__)) print("-"*68) - for feature in features.get_all_modules(): - supported = features.check_module(feature) + for name, feature in [ + ("pil", "PIL CORE"), + ("tkinter", "TKINTER"), + ("freetype2", "FREETYPE2"), + ("littlecms2", "LITTLECMS2"), + ("webp", "WEBP"), + ("transp_webp", "Transparent WEBP") + ]: + supported = features.check_module(name) if supported is None: # A method was being tested, but the module required @@ -185,8 +192,13 @@ if __name__ == "__main__": print("---", feature, "support ok") else: print("***", feature, "support not installed") - for feature in features.get_all_codecs(): - if features.check_codec(feature): + for name, feature in [ + ("jpg", "JPEG"), + ("jpg_2000", "JPEG 2000"), + ("zlib", "ZLIB (PNG/ZIP)"), + ("libtiff", "LIBTIFF") + ]: + if features.check_codec(name): print("---", feature, "support ok") else: print("***", feature, "support not installed") From 3458e7a4c3ea336bbc6164c6b7b122f36526f80b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 15 May 2015 07:33:17 +1000 Subject: [PATCH 485/532] Added feature checking tests --- Tests/test_features.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Tests/test_features.py diff --git a/Tests/test_features.py b/Tests/test_features.py new file mode 100644 index 000000000..01c5d6495 --- /dev/null +++ b/Tests/test_features.py @@ -0,0 +1,21 @@ +from helper import unittest, PillowTestCase + +from PIL import features + + +class TestFeatures(PillowTestCase): + + def test_check_features(self): + for feature in features.modules: + self.assertTrue(features.check_module(feature) in [True, False, None]) + for feature in features.codecs: + self.assertTrue(features.check_codec(feature) in [True, False]) + + def test_supported_features(self): + self.assertTrue(type(features.get_supported_modules()) is list) + self.assertTrue(type(features.get_supported_codecs()) is list) + +if __name__ == '__main__': + unittest.main() + +# End of file From aed878e7d1fc46c34f7b581fc4e96d007e23eda3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 15 May 2015 07:42:22 +1000 Subject: [PATCH 486/532] Adjusted selftest feature label to be in sync with setup --- selftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selftest.py b/selftest.py index 779e83c90..4ffae3a16 100644 --- a/selftest.py +++ b/selftest.py @@ -194,7 +194,7 @@ if __name__ == "__main__": print("***", feature, "support not installed") for name, feature in [ ("jpg", "JPEG"), - ("jpg_2000", "JPEG 2000"), + ("jpg_2000", "OPENJPEG (JPEG2000)"), ("zlib", "ZLIB (PNG/ZIP)"), ("libtiff", "LIBTIFF") ]: From 05987c8d60171f02fbbcea069b3fe22ad43153a5 Mon Sep 17 00:00:00 2001 From: hugovk Date: Fri, 15 May 2015 11:42:36 +0300 Subject: [PATCH 487/532] Test unsupported features --- Tests/test_features.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Tests/test_features.py b/Tests/test_features.py index 01c5d6495..8da22088e 100644 --- a/Tests/test_features.py +++ b/Tests/test_features.py @@ -7,7 +7,8 @@ class TestFeatures(PillowTestCase): def test_check_features(self): for feature in features.modules: - self.assertTrue(features.check_module(feature) in [True, False, None]) + self.assertTrue( + features.check_module(feature) in [True, False, None]) for feature in features.codecs: self.assertTrue(features.check_codec(feature) in [True, False]) @@ -15,6 +16,19 @@ class TestFeatures(PillowTestCase): self.assertTrue(type(features.get_supported_modules()) is list) self.assertTrue(type(features.get_supported_codecs()) is list) + def test_unsupported_codec(self): + # Arrange + codec = "unsupported_codec" + # Act / Assert + self.assertRaises(ValueError, lambda: features.check_codec(codec)) + + def test_unsupported_module(self): + # Arrange + module = "unsupported_module" + # Act / Assert + self.assertRaises(ValueError, lambda: features.check_module(module)) + + if __name__ == '__main__': unittest.main() From 9fd69fa7179d5891a5e7e31314759de46e1dedb9 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 18 May 2015 11:29:32 +0300 Subject: [PATCH 488/532] Add Python 3.4 --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 8d6ea7067..80f7edef4 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ # and then run "tox" from this directory. [tox] -envlist = py26, py27, py32, py33 +envlist = py26, py27, py32, py33, py34 [testenv] commands = From 74803dfd736c8e6853da800298146f70301c9bc8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 19 May 2015 13:01:03 +1000 Subject: [PATCH 489/532] Update WebP from 0.4.1 to 0.4.3 --- depends/install_webp.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/depends/install_webp.sh b/depends/install_webp.sh index 7810159cc..97edf2bcf 100755 --- a/depends/install_webp.sh +++ b/depends/install_webp.sh @@ -1,14 +1,14 @@ #!/bin/bash # install webp -if [ ! -f libwebp-0.4.1.tar.gz ]; then - wget 'http://downloads.webmproject.org/releases/webp/libwebp-0.4.1.tar.gz' +if [ ! -f libwebp-0.4.3.tar.gz ]; then + wget 'http://downloads.webmproject.org/releases/webp/libwebp-0.4.3.tar.gz' fi -rm -r libwebp-0.4.1 -tar -xvzf libwebp-0.4.1.tar.gz +rm -r libwebp-0.4.3 +tar -xvzf libwebp-0.4.3.tar.gz -pushd libwebp-0.4.1 +pushd libwebp-0.4.3 ./configure --prefix=/usr --enable-libwebpmux --enable-libwebpdemux && make -j4 && sudo make -j4 install From 5a8c63249e5df180388573b4eedd826095512f37 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 19 May 2015 08:01:00 +0300 Subject: [PATCH 490/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 66d448d2f..7337f1d8c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.9.0 (Unreleased) ------------------ +- Update WebP from 0.4.1 to 0.4.3 #1235 + [radarhere] + - Release GIL during image load (decode) #1224 [lkesteloot] From cb4172675ac8bc36404cd370a2ffd36f921ff393 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 20 May 2015 13:28:48 +1000 Subject: [PATCH 491/532] Removed description for missing scripts [CI skip] --- Scripts/README.rst | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/Scripts/README.rst b/Scripts/README.rst index 1b26ea68c..f86a9a8b6 100644 --- a/Scripts/README.rst +++ b/Scripts/README.rst @@ -63,20 +63,3 @@ explode.py -------------------------------------------------------------------- Split a sequence file into individual frames. - -image2py.py --------------------------------------------------------------------- - -Convert an image to a Python module containing an IMAGE variable. -Note that the module using the module must include JPEG and ZIP -decoders, unless the -u option is used. - -olesummary.py --------------------------------------------------------------------- - -Uses the OleFileIO module to dump the summary information from an OLE -structured storage file. This works with most OLE files, including -Word documents, FlashPix images, etc. - -Note that datetime fields currently show the number of seconds since -January 1st, 1601. From e317a729f31c83c5d0d43e517507774757a5686f Mon Sep 17 00:00:00 2001 From: Justin Wilson Date: Fri, 22 May 2015 16:37:50 -0600 Subject: [PATCH 492/532] Setting transparency value to 0 when the tRNS contains only null byte(s) --- PIL/PngImagePlugin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index 398a01f33..4b677b7cb 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -71,6 +71,7 @@ _MODES = { _simple_palette = re.compile(b'^\xff+\x00\xff*$') +_null_palette = re.compile(b'^\x00*$') # Maximum decompressed size for a iTXt or zTXt chunk. # Eliminates decompression bombs where compressed chunks can expand 1000x @@ -350,6 +351,8 @@ class PngStream(ChunkStream): i = s.find(b"\0") if i >= 0: self.im_info["transparency"] = i + elif _null_palette.match(s): + self.im_info["transparency"] = 0 else: self.im_info["transparency"] = s elif self.im_mode == "L": From 4e2de9d9edb633da2607bfc59e826a2d2e726ef2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 23 May 2015 20:28:41 +1000 Subject: [PATCH 493/532] Added missing future print imports and removed unnecessary imports --- PIL/ImageFont.py | 2 -- PIL/PSDraw.py | 2 -- PIL/PcxImagePlugin.py | 4 +++- Scripts/createfontdatachunk.py | 1 + Tests/import_all.py | 1 + Tests/make_hash.py | 2 ++ Tests/test_file_libtiff.py | 1 + Tests/test_file_tiff.py | 1 + Tests/test_format_hsv.py | 1 + Tests/test_imagemath.py | 1 + Tests/test_numpy.py | 1 + Tests/threaded_save.py | 1 + Tests/versions.py | 1 + mp_compile.py | 1 + 14 files changed, 15 insertions(+), 5 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 1e5a27f7b..dfcbbeaca 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -25,8 +25,6 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - from PIL import Image from PIL._util import isDirectory, isPath import os diff --git a/PIL/PSDraw.py b/PIL/PSDraw.py index 6187e40ad..0f4495fe3 100644 --- a/PIL/PSDraw.py +++ b/PIL/PSDraw.py @@ -15,8 +15,6 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - from PIL import EpsImagePlugin diff --git a/PIL/PcxImagePlugin.py b/PIL/PcxImagePlugin.py index 8eac6a594..40fafa0dc 100644 --- a/PIL/PcxImagePlugin.py +++ b/PIL/PcxImagePlugin.py @@ -25,7 +25,7 @@ # See the README file for information on usage and redistribution. # -__version__ = "0.6" +from __future__ import print_function from PIL import Image, ImageFile, ImagePalette, _binary @@ -33,6 +33,8 @@ i8 = _binary.i8 i16 = _binary.i16le o8 = _binary.o8 +__version__ = "0.6" + def _accept(prefix): return i8(prefix[0]) == 10 and i8(prefix[1]) in [0, 2, 3, 5] diff --git a/Scripts/createfontdatachunk.py b/Scripts/createfontdatachunk.py index 0c860701a..b9514eb6e 100644 --- a/Scripts/createfontdatachunk.py +++ b/Scripts/createfontdatachunk.py @@ -1,3 +1,4 @@ +from __future__ import print_function import base64 import os import sys diff --git a/Tests/import_all.py b/Tests/import_all.py index d8299d969..88a102b64 100644 --- a/Tests/import_all.py +++ b/Tests/import_all.py @@ -1,3 +1,4 @@ +from __future__ import print_function import sys sys.path.insert(0, ".") diff --git a/Tests/make_hash.py b/Tests/make_hash.py index 88bb2994b..a92886df9 100644 --- a/Tests/make_hash.py +++ b/Tests/make_hash.py @@ -1,5 +1,7 @@ # brute-force search for access descriptor hash table +from __future__ import print_function + modes = [ "1", "L", "LA", diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 4f798675b..896038b9d 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -1,3 +1,4 @@ +from __future__ import print_function from helper import unittest, PillowTestCase, hopper, py3 import os diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index b885780d6..c51f46a04 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -1,3 +1,4 @@ +from __future__ import print_function from helper import unittest, PillowTestCase, hopper, py3 from PIL import Image, TiffImagePlugin diff --git a/Tests/test_format_hsv.py b/Tests/test_format_hsv.py index d9baf91bf..dd4413f41 100644 --- a/Tests/test_format_hsv.py +++ b/Tests/test_format_hsv.py @@ -1,3 +1,4 @@ +from __future__ import print_function from helper import unittest, PillowTestCase, hopper from PIL import Image diff --git a/Tests/test_imagemath.py b/Tests/test_imagemath.py index 5d87c0229..4ca4e2c6c 100644 --- a/Tests/test_imagemath.py +++ b/Tests/test_imagemath.py @@ -1,3 +1,4 @@ +from __future__ import print_function from helper import unittest, PillowTestCase from PIL import Image diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index f010e0df5..19b9a2014 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -1,3 +1,4 @@ +from __future__ import print_function from helper import unittest, PillowTestCase, hopper from PIL import Image diff --git a/Tests/threaded_save.py b/Tests/threaded_save.py index 3bcbdd0b0..ba8b17dbc 100644 --- a/Tests/threaded_save.py +++ b/Tests/threaded_save.py @@ -1,3 +1,4 @@ +from __future__ import print_function from PIL import Image import io diff --git a/Tests/versions.py b/Tests/versions.py index e367ae46a..89be1d7c8 100644 --- a/Tests/versions.py +++ b/Tests/versions.py @@ -1,3 +1,4 @@ +from __future__ import print_function from PIL import Image diff --git a/mp_compile.py b/mp_compile.py index 892452558..a930f4245 100644 --- a/mp_compile.py +++ b/mp_compile.py @@ -1,6 +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. +from __future__ import print_function from multiprocessing import Pool, cpu_count from distutils.ccompiler import CCompiler import os From 3c7e37d2d71fdf4f6ab249b5777c655a27980204 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 27 May 2015 00:07:21 +1000 Subject: [PATCH 494/532] Replaced old-style classes --- PIL/ContainerIO.py | 2 +- PIL/EpsImagePlugin.py | 4 ++-- PIL/FontFile.py | 2 +- PIL/GifImagePlugin.py | 2 +- PIL/GimpGradientFile.py | 2 +- PIL/GimpPaletteFile.py | 2 +- PIL/IcnsImagePlugin.py | 2 +- PIL/IcoImagePlugin.py | 2 +- PIL/Image.py | 10 +++++----- PIL/ImageCms.py | 2 +- PIL/ImageDraw.py | 2 +- PIL/ImageDraw2.py | 8 ++++---- PIL/ImageEnhance.py | 2 +- PIL/ImageFile.py | 2 +- PIL/ImageFont.py | 8 ++++---- PIL/ImageMath.py | 2 +- PIL/ImageMode.py | 2 +- PIL/ImageMorph.py | 4 ++-- PIL/ImagePalette.py | 2 +- PIL/ImagePath.py | 2 +- PIL/ImageSequence.py | 2 +- PIL/ImageShow.py | 2 +- PIL/ImageStat.py | 2 +- PIL/ImageTk.py | 4 ++-- PIL/ImageWin.py | 8 ++++---- PIL/IptcImagePlugin.py | 2 +- PIL/MpegImagePlugin.py | 2 +- PIL/OleFileIO.py | 6 +++--- PIL/PSDraw.py | 2 +- PIL/PaletteFile.py | 2 +- PIL/PdfImagePlugin.py | 2 +- PIL/PngImagePlugin.py | 8 ++++---- PIL/WmfImagePlugin.py | 2 +- Scripts/explode.py | 2 +- Scripts/gifmaker.py | 2 +- Scripts/pildriver.py | 2 +- Tests/test_file_iptc.py | 2 +- Tests/test_imagefileio.py | 2 +- Tests/test_imagefont.py | 2 +- Tests/test_imageops.py | 2 +- 40 files changed, 61 insertions(+), 61 deletions(-) diff --git a/PIL/ContainerIO.py b/PIL/ContainerIO.py index dcedcd6dd..262f2afb9 100644 --- a/PIL/ContainerIO.py +++ b/PIL/ContainerIO.py @@ -19,7 +19,7 @@ # file (for example a TAR file). -class ContainerIO: +class ContainerIO(object): ## # Create file object. diff --git a/PIL/EpsImagePlugin.py b/PIL/EpsImagePlugin.py index e2e7fa5e9..7b1f4c1ca 100644 --- a/PIL/EpsImagePlugin.py +++ b/PIL/EpsImagePlugin.py @@ -157,7 +157,7 @@ def Ghostscript(tile, size, fp, scale=1): return im -class PSFile: +class PSFile(object): """ Wrapper for bytesio object that treats either CR or LF as end of line. """ @@ -365,7 +365,7 @@ def _save(im, fp, filename, eps=1): else: raise ValueError("image mode is not supported") - class NoCloseStream: + class NoCloseStream(object): def __init__(self, fp): self.fp = fp diff --git a/PIL/FontFile.py b/PIL/FontFile.py index 5cf688256..db8e6bec1 100644 --- a/PIL/FontFile.py +++ b/PIL/FontFile.py @@ -31,7 +31,7 @@ def puti16(fp, values): ## # Base class for raster font file handlers. -class FontFile: +class FontFile(object): bitmap = None diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 8db42e8e8..d2b2f7fee 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -496,7 +496,7 @@ def getdata(im, offset=(0, 0), **params): The first string is a local image header, the rest contains encoded image data.""" - class Collector: + class Collector(object): data = [] def write(self, data): diff --git a/PIL/GimpGradientFile.py b/PIL/GimpGradientFile.py index 696f425f1..45af573bb 100644 --- a/PIL/GimpGradientFile.py +++ b/PIL/GimpGradientFile.py @@ -58,7 +58,7 @@ def sphere_decreasing(middle, pos): SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] -class GradientFile: +class GradientFile(object): gradient = None diff --git a/PIL/GimpPaletteFile.py b/PIL/GimpPaletteFile.py index a066c80cc..4bf3ca36a 100644 --- a/PIL/GimpPaletteFile.py +++ b/PIL/GimpPaletteFile.py @@ -21,7 +21,7 @@ from PIL._binary import o8 ## # File handler for GIMP's palette format. -class GimpPaletteFile: +class GimpPaletteFile(object): rawmode = "RGB" diff --git a/PIL/IcnsImagePlugin.py b/PIL/IcnsImagePlugin.py index 1bb1066d8..e0b130e81 100644 --- a/PIL/IcnsImagePlugin.py +++ b/PIL/IcnsImagePlugin.py @@ -130,7 +130,7 @@ def read_png_or_jpeg2000(fobj, start_length, size): raise ValueError('Unsupported icon subimage format') -class IcnsFile: +class IcnsFile(object): SIZES = { (512, 512, 2): [ diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index c4e24d99c..8a2144463 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -79,7 +79,7 @@ def _accept(prefix): return prefix[:4] == _MAGIC -class IcoFile: +class IcoFile(object): def __init__(self, buf): """ Parse image from file-like object containing ico file data diff --git a/PIL/Image.py b/PIL/Image.py index 37428ec30..274e7ee0e 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -35,7 +35,7 @@ class DecompressionBombWarning(RuntimeWarning): pass -class _imaging_not_installed: +class _imaging_not_installed(object): # module placeholder def __getattr__(self, id): raise ImportError("The _imaging C module is not installed") @@ -443,7 +443,7 @@ def coerce_e(value): return value if isinstance(value, _E) else _E(value) -class _E: +class _E(object): def __init__(self, data): self.data = data @@ -478,7 +478,7 @@ def _getscaleoffset(expr): # -------------------------------------------------------------------- # Implementation wrapper -class Image: +class Image(object): """ This class represents an image object. To create :py:class:`~PIL.Image.Image` objects, use the appropriate factory @@ -1975,12 +1975,12 @@ class _ImageCrop(Image): # -------------------------------------------------------------------- # Abstract handlers. -class ImagePointHandler: +class ImagePointHandler(object): # used as a mixin by point transforms (for use with im.point) pass -class ImageTransformHandler: +class ImageTransformHandler(object): # used as a mixin by geometry transforms (for use with im.transform) pass diff --git a/PIL/ImageCms.py b/PIL/ImageCms.py index ed219f7ba..6cd2f5d2d 100644 --- a/PIL/ImageCms.py +++ b/PIL/ImageCms.py @@ -147,7 +147,7 @@ for flag in FLAGS.values(): ## # Profile. -class ImageCmsProfile: +class ImageCmsProfile(object): def __init__(self, profile): """ diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index a2a75d1c6..1fc5b4d61 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -47,7 +47,7 @@ except ImportError: # Application code should use the Draw factory, instead of # directly. -class ImageDraw: +class ImageDraw(object): ## # Create a drawing instance. diff --git a/PIL/ImageDraw2.py b/PIL/ImageDraw2.py index c967a200f..62ee11630 100644 --- a/PIL/ImageDraw2.py +++ b/PIL/ImageDraw2.py @@ -19,25 +19,25 @@ from PIL import Image, ImageColor, ImageDraw, ImageFont, ImagePath -class Pen: +class Pen(object): def __init__(self, color, width=1, opacity=255): self.color = ImageColor.getrgb(color) self.width = width -class Brush: +class Brush(object): def __init__(self, color, opacity=255): self.color = ImageColor.getrgb(color) -class Font: +class Font(object): def __init__(self, color, file, size=12): # FIXME: add support for bitmap fonts self.color = ImageColor.getrgb(color) self.font = ImageFont.truetype(file, size) -class Draw: +class Draw(object): def __init__(self, image, size=None, color=None): if not hasattr(image, "im"): diff --git a/PIL/ImageEnhance.py b/PIL/ImageEnhance.py index 8c0f166f3..fbacbee8f 100644 --- a/PIL/ImageEnhance.py +++ b/PIL/ImageEnhance.py @@ -21,7 +21,7 @@ from PIL import Image, ImageFilter, ImageStat -class _Enhance: +class _Enhance(object): def enhance(self, factor): """ diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 01c3e0303..b1d261166 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -311,7 +311,7 @@ class StubImageFile(ImageFile): ) -class Parser: +class Parser(object): """ Incremental image parser. This class implements the standard feed/close consumer interface. diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 1e5a27f7b..58889b6e5 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -38,7 +38,7 @@ except ImportError: warnings = None -class _imagingft_not_installed: +class _imagingft_not_installed(object): # module placeholder def __getattr__(self, id): raise ImportError("The _imagingft C module is not installed") @@ -64,7 +64,7 @@ except ImportError: # -------------------------------------------------------------------- -class ImageFont: +class ImageFont(object): "PIL font wrapper" def _load_pilfont(self, filename): @@ -120,7 +120,7 @@ class ImageFont: # Wrapper for FreeType fonts. Application code should use the # truetype factory function to create font objects. -class FreeTypeFont: +class FreeTypeFont(object): "FreeType font wrapper (requires _imagingft service)" def __init__(self, font=None, size=10, index=0, encoding="", file=None): @@ -193,7 +193,7 @@ class FreeTypeFont: # Image.ROTATE_90, Image.ROTATE_180, or Image.ROTATE_270. -class TransposedFont: +class TransposedFont(object): "Wrapper for writing rotated or mirrored text" def __init__(self, font, orientation=None): diff --git a/PIL/ImageMath.py b/PIL/ImageMath.py index 4dcc5125c..f92d5001f 100644 --- a/PIL/ImageMath.py +++ b/PIL/ImageMath.py @@ -31,7 +31,7 @@ def _isconstant(v): return isinstance(v, int) or isinstance(v, float) -class _Operand: +class _Operand(object): # wraps an image operand, providing standard operators def __init__(self, im): diff --git a/PIL/ImageMode.py b/PIL/ImageMode.py index 295069108..d8960017b 100644 --- a/PIL/ImageMode.py +++ b/PIL/ImageMode.py @@ -20,7 +20,7 @@ _modes = {} ## # Wrapper for mode strings. -class ModeDescriptor: +class ModeDescriptor(object): def __init__(self, mode, bands, basemode, basetype): self.mode = mode diff --git a/PIL/ImageMorph.py b/PIL/ImageMorph.py index 996eacb7d..6f92e9e67 100644 --- a/PIL/ImageMorph.py +++ b/PIL/ImageMorph.py @@ -12,7 +12,7 @@ import re LUT_SIZE = 1 << 9 -class LutBuilder: +class LutBuilder(object): """A class for building a MorphLut from a descriptive language The input patterns is a list of a strings sequences like these:: @@ -176,7 +176,7 @@ class LutBuilder: return self.lut -class MorphOp: +class MorphOp(object): """A class for binary morphological operators""" def __init__(self, diff --git a/PIL/ImagePalette.py b/PIL/ImagePalette.py index c6c05d162..b2f51dd06 100644 --- a/PIL/ImagePalette.py +++ b/PIL/ImagePalette.py @@ -21,7 +21,7 @@ import warnings from PIL import ImageColor -class ImagePalette: +class ImagePalette(object): "Color palette for palette mapped images" def __init__(self, mode="RGB", palette=None, size=0): diff --git a/PIL/ImagePath.py b/PIL/ImagePath.py index 656d5ce61..f23d01430 100644 --- a/PIL/ImagePath.py +++ b/PIL/ImagePath.py @@ -20,7 +20,7 @@ from PIL import Image # the Python class below is overridden by the C implementation. -class Path: +class Path(object): def __init__(self, xy): pass diff --git a/PIL/ImageSequence.py b/PIL/ImageSequence.py index dd01e2902..256bcbedb 100644 --- a/PIL/ImageSequence.py +++ b/PIL/ImageSequence.py @@ -16,7 +16,7 @@ ## -class Iterator: +class Iterator(object): """ This class implements an iterator object that can be used to loop over an image sequence. diff --git a/PIL/ImageShow.py b/PIL/ImageShow.py index 9527dbf97..51417c30b 100644 --- a/PIL/ImageShow.py +++ b/PIL/ImageShow.py @@ -56,7 +56,7 @@ def show(image, title=None, **options): ## # Base class for viewers. -class Viewer: +class Viewer(object): # main api diff --git a/PIL/ImageStat.py b/PIL/ImageStat.py index 37e7515d4..f3c138b3a 100644 --- a/PIL/ImageStat.py +++ b/PIL/ImageStat.py @@ -26,7 +26,7 @@ import operator import functools -class Stat: +class Stat(object): def __init__(self, image_or_list, mask=None): try: diff --git a/PIL/ImageTk.py b/PIL/ImageTk.py index 5fb5ecff3..68d388e74 100644 --- a/PIL/ImageTk.py +++ b/PIL/ImageTk.py @@ -56,7 +56,7 @@ def _pilbitmap_check(): # -------------------------------------------------------------------- # PhotoImage -class PhotoImage: +class PhotoImage(object): """ A Tkinter-compatible photo image. This can be used everywhere Tkinter expects an image object. If the image is an RGBA @@ -190,7 +190,7 @@ class PhotoImage: # BitmapImage -class BitmapImage: +class BitmapImage(object): """ A Tkinter-compatible bitmap image. This can be used everywhere Tkinter diff --git a/PIL/ImageWin.py b/PIL/ImageWin.py index 300d118c9..bcb54bc3e 100644 --- a/PIL/ImageWin.py +++ b/PIL/ImageWin.py @@ -21,7 +21,7 @@ import warnings from PIL import Image -class HDC: +class HDC(object): """ Wraps an HDC integer. The resulting object can be passed to the :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` @@ -34,7 +34,7 @@ class HDC: return self.dc -class HWND: +class HWND(object): """ Wraps an HWND integer. The resulting object can be passed to the :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` @@ -47,7 +47,7 @@ class HWND: return self.wnd -class Dib: +class Dib(object): """ A Windows bitmap with the given mode and size. The mode can be one of "1", "L", "P", or "RGB". @@ -206,7 +206,7 @@ class Dib: ## # Create a Window with the given title size. -class Window: +class Window(object): def __init__(self, title="PIL", width=None, height=None): self.hwnd = Image.core.createwindow( diff --git a/PIL/IptcImagePlugin.py b/PIL/IptcImagePlugin.py index aa0193894..47c7e1936 100644 --- a/PIL/IptcImagePlugin.py +++ b/PIL/IptcImagePlugin.py @@ -251,7 +251,7 @@ def getiptcinfo(im): return None # no properties # create an IptcImagePlugin object without initializing it - class FakeImage: + class FakeImage(object): pass im = FakeImage() im.__class__ = IptcImageFile diff --git a/PIL/MpegImagePlugin.py b/PIL/MpegImagePlugin.py index 9aca58f16..ff7c0dce4 100644 --- a/PIL/MpegImagePlugin.py +++ b/PIL/MpegImagePlugin.py @@ -22,7 +22,7 @@ from PIL._binary import i8 # # Bitstream parser -class BitStream: +class BitStream(object): def __init__(self, fp): self.fp = fp diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index c804dd454..d3c1cd9a0 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -473,7 +473,7 @@ def filetime2datetime(filetime): #=== CLASSES ================================================================== -class OleMetadata: +class OleMetadata(object): """ class to parse and store metadata from standard properties of OLE files. @@ -757,7 +757,7 @@ class _OleStream(io.BytesIO): #--- _OleDirectoryEntry ------------------------------------------------------- -class _OleDirectoryEntry: +class _OleDirectoryEntry(object): """ OLE2 Directory Entry @@ -1007,7 +1007,7 @@ class _OleDirectoryEntry: #--- OleFileIO ---------------------------------------------------------------- -class OleFileIO: +class OleFileIO(object): """ OLE container object diff --git a/PIL/PSDraw.py b/PIL/PSDraw.py index 6187e40ad..66e3d7982 100644 --- a/PIL/PSDraw.py +++ b/PIL/PSDraw.py @@ -23,7 +23,7 @@ from PIL import EpsImagePlugin ## # Simple Postscript graphics interface. -class PSDraw: +class PSDraw(object): """ Sets up printing to the given file. If **file** is omitted, :py:attr:`sys.stdout` is assumed. diff --git a/PIL/PaletteFile.py b/PIL/PaletteFile.py index 37ba4cbff..ef50feefd 100644 --- a/PIL/PaletteFile.py +++ b/PIL/PaletteFile.py @@ -19,7 +19,7 @@ from PIL._binary import o8 ## # File handler for Teragon-style palette files. -class PaletteFile: +class PaletteFile(object): rawmode = "RGB" diff --git a/PIL/PdfImagePlugin.py b/PIL/PdfImagePlugin.py index 5113f099e..1d8c2ff93 100644 --- a/PIL/PdfImagePlugin.py +++ b/PIL/PdfImagePlugin.py @@ -63,7 +63,7 @@ def _save(im, fp, filename): xref = [0]*(5+1) # placeholders - class TextWriter: + class TextWriter(object): def __init__(self, fp): self.fp = fp diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index 398a01f33..53d38eecd 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -90,7 +90,7 @@ def _safe_zlib_decompress(s): # -------------------------------------------------------------------- # Support classes. Suitable for PNG and related formats like MNG etc. -class ChunkStream: +class ChunkStream(object): def __init__(self, fp): @@ -183,7 +183,7 @@ class iTXt(str): return self -class PngInfo: +class PngInfo(object): """ PNG chunk container (for use with save(pnginfo=)) @@ -620,7 +620,7 @@ def putchunk(fp, cid, *data): fp.write(o16(hi) + o16(lo)) -class _idat: +class _idat(object): # wrap output from the encoder in IDAT chunks def __init__(self, fp, chunk): @@ -771,7 +771,7 @@ def _save(im, fp, filename, chunk=putchunk, check=0): def getchunks(im, **params): """Return a list of PNG chunks representing this image.""" - class collector: + class collector(object): data = [] def write(self, data): diff --git a/PIL/WmfImagePlugin.py b/PIL/WmfImagePlugin.py index 6146c1560..bdbbc72f0 100644 --- a/PIL/WmfImagePlugin.py +++ b/PIL/WmfImagePlugin.py @@ -37,7 +37,7 @@ def register_handler(handler): if hasattr(Image.core, "drawwmf"): # install default handler (windows only) - class WmfHandler: + class WmfHandler(object): def open(self, im): im.mode = "RGB" diff --git a/Scripts/explode.py b/Scripts/explode.py index 0460fa020..53436100b 100644 --- a/Scripts/explode.py +++ b/Scripts/explode.py @@ -13,7 +13,7 @@ import os import sys -class Interval: +class Interval(object): def __init__(self, interval="0"): diff --git a/Scripts/gifmaker.py b/Scripts/gifmaker.py index 8777f74f6..5d1781499 100644 --- a/Scripts/gifmaker.py +++ b/Scripts/gifmaker.py @@ -50,7 +50,7 @@ from PIL.GifImagePlugin import getheader, getdata # sequence iterator -class image_sequence: +class image_sequence(object): def __init__(self, im): self.im = im diff --git a/Scripts/pildriver.py b/Scripts/pildriver.py index bb01004f5..32989ccdf 100644 --- a/Scripts/pildriver.py +++ b/Scripts/pildriver.py @@ -53,7 +53,7 @@ from __future__ import print_function from PIL import Image -class PILDriver: +class PILDriver(object): verbose = 0 diff --git a/Tests/test_file_iptc.py b/Tests/test_file_iptc.py index 14eb135aa..84fa873be 100644 --- a/Tests/test_file_iptc.py +++ b/Tests/test_file_iptc.py @@ -11,7 +11,7 @@ class TestFileIptc(PillowTestCase): def dummy_IptcImagePlugin(self): # Create an IptcImagePlugin object without initializing it - class FakeImage: + class FakeImage(object): pass im = FakeImage() im.__class__ = IptcImagePlugin.IptcImageFile diff --git a/Tests/test_imagefileio.py b/Tests/test_imagefileio.py index f18474403..b06178437 100644 --- a/Tests/test_imagefileio.py +++ b/Tests/test_imagefileio.py @@ -8,7 +8,7 @@ class TestImageFileIo(PillowTestCase): def test_fileio(self): - class DumbFile: + class DumbFile(object): def __init__(self, data): self.data = data diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 49aa9c8b2..88858c717 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -15,7 +15,7 @@ try: from PIL import ImageFont ImageFont.core.getfont # check if freetype is available - class SimplePatcher(): + class SimplePatcher(object): def __init__(self, parent_obj, attr_name, value): self._parent_obj = parent_obj self._attr_name = attr_name diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 0ffb14bfe..396f0da6c 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -5,7 +5,7 @@ from PIL import ImageOps class TestImageOps(PillowTestCase): - class Deformer: + class Deformer(object): def getmesh(self, im): x, y = im.size return [((0, 0, x, y), (0, 0, x, 0, x, y, y, 0))] From 54c3224b80d393ce3a8f7966d088ff04ca470c3d Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 27 May 2015 14:41:06 +0300 Subject: [PATCH 495/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 7337f1d8c..f4f9866f6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 2.9.0 (Unreleased) ------------------ +- Separated out feature checking from selftest #1233 + [radarhere] + +- Style/health fixes + [radarhere] + - Update WebP from 0.4.1 to 0.4.3 #1235 [radarhere] From e33b5c635551f7a5434d06b4f2396e42f468f64a Mon Sep 17 00:00:00 2001 From: Justin Wilson Date: Wed, 27 May 2015 09:45:27 -0600 Subject: [PATCH 496/532] Added test to check that png with null tRNS value defaults to a zero transparency value. --- Tests/images/tRNS_null_1x1.png | Bin 0 -> 96 bytes Tests/test_file_png.py | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 Tests/images/tRNS_null_1x1.png diff --git a/Tests/images/tRNS_null_1x1.png b/Tests/images/tRNS_null_1x1.png new file mode 100644 index 0000000000000000000000000000000000000000..976eae9390a4816aeee265e5014468cd9a6d7464 GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga%mF?juK#@*VoWXSL2@NQe!&b5 n&u*jvIb5DDjv*Cul9PaJHU?%h^O_Yv7K5j&pUXO@geEQkXtESH literal 0 HcmV?d00001 diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index b3169ed25..f438e24cc 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -354,6 +354,13 @@ class TestFilePng(PillowTestCase): self.assert_image_equal(im2.convert('RGBA'), im.convert('RGBA')) + def test_trns_null(self): + # Check reading images with null tRNS value, issue #1239 + test_file = "Tests/images/tRNS_null_1x1.png" + im = Image.open(test_file) + + self.assertEqual(im.info["transparency"], 0) + def test_save_icc_profile_none(self): # check saving files with an ICC profile set to None (omit profile) in_file = "Tests/images/icc_profile_none.png" From 96b96e565429b818c5136cde31a9faefe4b83547 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 27 May 2015 22:40:24 +0300 Subject: [PATCH 497/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f4f9866f6..2bd4ff0a0 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.9.0 (Unreleased) ------------------ +- Setting transparency value to 0 when the tRNS contains only null byte(s) #1239 + [juztin] + - Separated out feature checking from selftest #1233 [radarhere] From 0999ec95a0cb400974e7650805850e946425ca20 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 28 May 2015 17:20:33 +1000 Subject: [PATCH 498/532] Fixed typo in ImageEnhance.py --- PIL/ImageEnhance.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/ImageEnhance.py b/PIL/ImageEnhance.py index fbacbee8f..56b5c0199 100644 --- a/PIL/ImageEnhance.py +++ b/PIL/ImageEnhance.py @@ -73,7 +73,7 @@ class Contrast(_Enhance): class Brightness(_Enhance): """Adjust image brightness. - This class can be used to control the brighntess of an image. An + This class can be used to control the brightness of an image. An enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the original image. """ From b213f63c591df7e6512b0b92b54c589a2a0141a9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 10 May 2015 22:36:23 +1000 Subject: [PATCH 499/532] Removed pre-Python 2.3 workaround --- PIL/OleFileIO.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index d787e59ed..df95e2d83 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -302,17 +302,10 @@ else: #[PL] These workarounds were inspired from the Path module # (see http://www.jorendorff.com/articles/python/path/) -#TODO: test with old Python versions - -# Pre-2.3 workaround for basestring. try: basestring except NameError: - try: - # is Unicode supported (Python >2.0 or >1.6 ?) - basestring = (str, unicode) - except NameError: - basestring = str + basestring = str #[PL] Experimental setting: if True, OLE filenames will be kept in Unicode # if False (default PIL behaviour), all filenames are converted to Latin-1. From f55f2d13cb3023426b5d24dd5da506a40b476bd2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 11 May 2015 00:00:36 +1000 Subject: [PATCH 500/532] Various health fixes --- PIL/OleFileIO.py | 196 +++++++++++++++++++++++------------------------ 1 file changed, 97 insertions(+), 99 deletions(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index df95e2d83..98c126761 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -399,12 +399,12 @@ WORD_CLSID = "00020900-0000-0000-C000-000000000046" #TODO: check Excel, PPT, ... #[PL]: Defect levels to classify parsing errors - see OleFileIO._raise_defect() -DEFECT_UNSURE = 10 # a case which looks weird, but not sure it's a defect -DEFECT_POTENTIAL = 20 # a potential defect -DEFECT_INCORRECT = 30 # an error according to specifications, but parsing - # can go on -DEFECT_FATAL = 40 # an error which cannot be ignored, parsing is - # impossible +DEFECT_UNSURE = 10 # a case which looks weird, but not sure it's a defect +DEFECT_POTENTIAL = 20 # a potential defect +DEFECT_INCORRECT = 30 # an error according to specifications, but parsing + # can go on +DEFECT_FATAL = 40 # an error which cannot be ignored, parsing is + # impossible # Minimal size of an empty OLE file, with 512-bytes sectors = 1536 bytes # (this is used in isOleFile and OleFile.open) @@ -504,20 +504,20 @@ def _clsid(clsid): def filetime2datetime(filetime): - """ - convert FILETIME (64 bits int) to Python datetime.datetime - """ - # TODO: manage exception when microseconds is too large - # inspired from http://code.activestate.com/recipes/511425-filetime-to-datetime/ - _FILETIME_null_date = datetime.datetime(1601, 1, 1, 0, 0, 0) - #debug('timedelta days=%d' % (filetime//(10*1000000*3600*24))) - return _FILETIME_null_date + datetime.timedelta(microseconds=filetime//10) + """ + convert FILETIME (64 bits int) to Python datetime.datetime + """ + # TODO: manage exception when microseconds is too large + # inspired from http://code.activestate.com/recipes/511425-filetime-to-datetime/ + _FILETIME_null_date = datetime.datetime(1601, 1, 1, 0, 0, 0) + #debug('timedelta days=%d' % (filetime//(10*1000000*3600*24))) + return _FILETIME_null_date + datetime.timedelta(microseconds=filetime//10) #=== CLASSES ================================================================== -class OleMetadata: +class OleMetadata(object): """ class to parse and store metadata from standard properties of OLE files. @@ -803,7 +803,7 @@ class _OleStream(io.BytesIO): #--- _OleDirectoryEntry ------------------------------------------------------- -class _OleDirectoryEntry: +class _OleDirectoryEntry(object): """ OLE2 Directory Entry @@ -1064,7 +1064,7 @@ class _OleDirectoryEntry: #--- OleFileIO ---------------------------------------------------------------- -class OleFileIO: +class OleFileIO(object): """ OLE container object @@ -1935,12 +1935,12 @@ class OleFileIO: nb_sectors = (size + (self.sectorsize-1)) // self.sectorsize debug('nb_sectors = %d' % nb_sectors) for i in range(nb_sectors): -## try: -## self.fp.seek(offset + self.sectorsize * sect) -## except: -## debug('sect=%d, seek=%d' % -## (sect, offset+self.sectorsize*sect)) -## raise IOError('OLE sector index out of range') + # try: + # self.fp.seek(offset + self.sectorsize * sect) + # except: + # debug('sect=%d, seek=%d' % + # (sect, offset+self.sectorsize*sect)) + # raise IOError('OLE sector index out of range') # extract one sector from data, the last one being smaller: if i<(nb_sectors-1): data_sector = data [i*self.sectorsize : (i+1)*self.sectorsize] @@ -2071,7 +2071,7 @@ class OleFileIO: """ #REFERENCE: [MS-OLEPS] https://msdn.microsoft.com/en-us/library/dd942421.aspx # make sure no_conversion is a list, just to simplify code below: - if no_conversion == None: + if no_conversion is None: no_conversion = [] # stream path as a string to report exceptions: streampath = filename @@ -2226,8 +2226,6 @@ class OleFileIO: if __name__ == "__main__": - import sys - # [PL] display quick usage info if launched from command-line if len(sys.argv) <= 1: print('olefile version %s %s - %s' % (__version__, __date__, __author__)) @@ -2247,55 +2245,55 @@ For more information, see http://www.decalage.info/olefile check_streams = False for filename in sys.argv[1:]: -## try: - # OPTIONS: - if filename == '-d': - # option to switch debug mode on: - set_debug_mode(True) - continue - if filename == '-c': - # option to switch check streams mode on: - check_streams = True - continue + # try: + # OPTIONS: + if filename == '-d': + # option to switch debug mode on: + set_debug_mode(True) + continue + if filename == '-c': + # option to switch check streams mode on: + check_streams = True + continue - ole = OleFileIO(filename)#, raise_defects=DEFECT_INCORRECT) - print("-" * 68) - print(filename) - print("-" * 68) - ole.dumpdirectory() + ole = OleFileIO(filename)#, raise_defects=DEFECT_INCORRECT) + print("-" * 68) + print(filename) + print("-" * 68) + ole.dumpdirectory() + for streamname in ole.listdir(): + if streamname[-1][0] == "\005": + print(streamname, ": properties") + props = ole.getproperties(streamname, convert_time=True) + props = sorted(props.items()) + for k, v in props: + #[PL]: avoid to display too large or binary values: + if isinstance(v, (basestring, bytes)): + if len(v) > 50: + v = v[:50] + if isinstance(v, bytes): + # quick and dirty binary check: + for c in (1,2,3,4,5,6,7,11,12,14,15,16,17,18,19,20, + 21,22,23,24,25,26,27,28,29,30,31): + if c in bytearray(v): + v = '(binary data)' + break + print(" ", k, v) + + if check_streams: + # Read all streams to check if there are errors: + print('\nChecking streams...') for streamname in ole.listdir(): - if streamname[-1][0] == "\005": - print(streamname, ": properties") - props = ole.getproperties(streamname, convert_time=True) - props = sorted(props.items()) - for k, v in props: - #[PL]: avoid to display too large or binary values: - if isinstance(v, (basestring, bytes)): - if len(v) > 50: - v = v[:50] - if isinstance(v, bytes): - # quick and dirty binary check: - for c in (1,2,3,4,5,6,7,11,12,14,15,16,17,18,19,20, - 21,22,23,24,25,26,27,28,29,30,31): - if c in bytearray(v): - v = '(binary data)' - break - print(" ", k, v) - - if check_streams: - # Read all streams to check if there are errors: - print('\nChecking streams...') - for streamname in ole.listdir(): - # print name using repr() to convert binary chars to \xNN: - print('-', repr('/'.join(streamname)),'-', end=' ') - st_type = ole.get_type(streamname) - if st_type == STGTY_STREAM: - print('size %d' % ole.get_size(streamname)) - # just try to read stream in memory: - ole.openstream(streamname) - else: - print('NOT a stream : type=%d' % st_type) - print() + # print name using repr() to convert binary chars to \xNN: + print('-', repr('/'.join(streamname)),'-', end=' ') + st_type = ole.get_type(streamname) + if st_type == STGTY_STREAM: + print('size %d' % ole.get_size(streamname)) + # just try to read stream in memory: + ole.openstream(streamname) + else: + print('NOT a stream : type=%d' % st_type) + print() ## for streamname in ole.listdir(): ## # print name using repr() to convert binary chars to \xNN: @@ -2303,34 +2301,34 @@ For more information, see http://www.decalage.info/olefile ## print(ole.getmtime(streamname)) ## print() - print('Modification/Creation times of all directory entries:') - for entry in ole.direntries: - if entry is not None: - print('- %s: mtime=%s ctime=%s' % (entry.name, - entry.getmtime(), entry.getctime())) - print() + print('Modification/Creation times of all directory entries:') + for entry in ole.direntries: + if entry is not None: + print('- %s: mtime=%s ctime=%s' % (entry.name, + entry.getmtime(), entry.getctime())) + print() - # parse and display metadata: - meta = ole.get_metadata() - meta.dump() - print() - #[PL] Test a few new methods: - root = ole.get_rootentry_name() - print('Root entry name: "%s"' % root) - if ole.exists('worddocument'): - print("This is a Word document.") - print("type of stream 'WordDocument':", ole.get_type('worddocument')) - print("size :", ole.get_size('worddocument')) - if ole.exists('macros/vba'): - print("This document may contain VBA macros.") + # parse and display metadata: + meta = ole.get_metadata() + meta.dump() + print() + #[PL] Test a few new methods: + root = ole.get_rootentry_name() + print('Root entry name: "%s"' % root) + if ole.exists('worddocument'): + print("This is a Word document.") + print("type of stream 'WordDocument':", ole.get_type('worddocument')) + print("size :", ole.get_size('worddocument')) + if ole.exists('macros/vba'): + print("This document may contain VBA macros.") - # print parsing issues: - print('\nNon-fatal issues raised during parsing:') - if ole.parsing_issues: - for exctype, msg in ole.parsing_issues: - print('- %s: %s' % (exctype.__name__, msg)) - else: - print('None') + # print parsing issues: + print('\nNon-fatal issues raised during parsing:') + if ole.parsing_issues: + for exctype, msg in ole.parsing_issues: + print('- %s: %s' % (exctype.__name__, msg)) + else: + print('None') ## except IOError as v: ## print("***", "cannot read", file, "-", v) From 1208fe89cd9d04187f1a4ebef2167e577e4eebdd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 10 May 2015 23:50:06 +1000 Subject: [PATCH 501/532] Renamed _raise_defect to avoid protected member warnings --- PIL/OleFileIO.py | 68 ++++++++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index 98c126761..7449407b9 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -874,17 +874,17 @@ class _OleDirectoryEntry(object): sizeHigh ) = struct.unpack(_OleDirectoryEntry.STRUCT_DIRENTRY, entry) if self.entry_type not in [STGTY_ROOT, STGTY_STORAGE, STGTY_STREAM, STGTY_EMPTY]: - olefile._raise_defect(DEFECT_INCORRECT, 'unhandled OLE storage type') + olefile.raise_defect(DEFECT_INCORRECT, 'unhandled OLE storage type') # only first directory entry can (and should) be root: if self.entry_type == STGTY_ROOT and sid != 0: - olefile._raise_defect(DEFECT_INCORRECT, 'duplicate OLE root entry') + olefile.raise_defect(DEFECT_INCORRECT, 'duplicate OLE root entry') if sid == 0 and self.entry_type != STGTY_ROOT: - olefile._raise_defect(DEFECT_INCORRECT, 'incorrect OLE root entry') + olefile.raise_defect(DEFECT_INCORRECT, 'incorrect OLE root entry') #debug (struct.unpack(fmt_entry, entry[:len_entry])) # name should be at most 31 unicode characters + null character, # so 64 bytes in total (31*2 + 2): if namelength>64: - olefile._raise_defect(DEFECT_INCORRECT, 'incorrect DirEntry name length') + olefile.raise_defect(DEFECT_INCORRECT, 'incorrect DirEntry name length') # if exception not raised, namelength is set to the maximum value: namelength = 64 # only characters without ending null char are kept: @@ -908,7 +908,7 @@ class _OleDirectoryEntry(object): if sizeHigh != 0 and sizeHigh != 0xFFFFFFFF: debug('sectorsize=%d, sizeLow=%d, sizeHigh=%d (%X)' % (olefile.sectorsize, sizeLow, sizeHigh, sizeHigh)) - olefile._raise_defect(DEFECT_UNSURE, 'incorrect OLE stream size') + olefile.raise_defect(DEFECT_UNSURE, 'incorrect OLE stream size') self.size = sizeLow else: self.size = sizeLow + (long(sizeHigh)<<32) @@ -918,7 +918,7 @@ class _OleDirectoryEntry(object): # a storage should have a null size, BUT some implementations such as # Word 8 for Mac seem to allow non-null values => Potential defect: if self.entry_type == STGTY_STORAGE and self.size != 0: - olefile._raise_defect(DEFECT_POTENTIAL, 'OLE storage with size>0') + olefile.raise_defect(DEFECT_POTENTIAL, 'OLE storage with size>0') # check if stream is not already referenced elsewhere: if self.entry_type in (STGTY_ROOT, STGTY_STREAM) and self.size>0: if self.size < olefile.minisectorcutoff \ @@ -970,7 +970,7 @@ class _OleDirectoryEntry(object): return # check if child SID is in the proper range: if child_sid<0 or child_sid>=len(self.olefile.direntries): - self.olefile._raise_defect(DEFECT_FATAL, 'OLE DirEntry index out of range') + self.olefile.raise_defect(DEFECT_FATAL, 'OLE DirEntry index out of range') # get child direntry: child = self.olefile._load_direntry(child_sid) #direntries[child_sid] debug('append_kids: child_sid=%d - %s - sid_left=%d, sid_right=%d, sid_child=%d' @@ -982,7 +982,7 @@ class _OleDirectoryEntry(object): # Check if its name is not already used (case-insensitive): name_lower = child.name.lower() if name_lower in self.kids_dict: - self.olefile._raise_defect(DEFECT_INCORRECT, + self.olefile.raise_defect(DEFECT_INCORRECT, "Duplicate filename in OLE storage") # Then the child_sid _OleDirectoryEntry object is appended to the # kids list and dictionary: @@ -990,7 +990,7 @@ class _OleDirectoryEntry(object): self.kids_dict[name_lower] = child # Check if kid was not already referenced in a storage: if child.used: - self.olefile._raise_defect(DEFECT_INCORRECT, + self.olefile.raise_defect(DEFECT_INCORRECT, 'OLE Entry referenced more than once') child.used = True # Finally walk through right side of the tree: @@ -1135,7 +1135,7 @@ class OleFileIO(object): self.open(filename, write_mode=write_mode) - def _raise_defect(self, defect_level, message, exception_type=IOError): + def raise_defect(self, defect_level, message, exception_type=IOError): """ This method should be called for any defect found during file parsing. It may raise an IOError exception according to the minimal level chosen @@ -1237,7 +1237,7 @@ class OleFileIO(object): header = self.fp.read(512) if len(header) != 512 or header[:8] != MAGIC: - self._raise_defect(DEFECT_FATAL, "not an OLE2 structured storage file") + self.raise_defect(DEFECT_FATAL, "not an OLE2 structured storage file") # [PL] header structure according to AAF specifications: ##Header @@ -1303,39 +1303,39 @@ class OleFileIO(object): if self.Sig != MAGIC: # OLE signature should always be present - self._raise_defect(DEFECT_FATAL, "incorrect OLE signature") + self.raise_defect(DEFECT_FATAL, "incorrect OLE signature") if self.clsid != bytearray(16): # according to AAF specs, CLSID should always be zero - self._raise_defect(DEFECT_INCORRECT, "incorrect CLSID in OLE header") + self.raise_defect(DEFECT_INCORRECT, "incorrect CLSID in OLE header") debug( "MinorVersion = %d" % self.MinorVersion ) debug( "DllVersion = %d" % self.DllVersion ) if self.DllVersion not in [3, 4]: # version 3: usual format, 512 bytes per sector # version 4: large format, 4K per sector - self._raise_defect(DEFECT_INCORRECT, "incorrect DllVersion in OLE header") + self.raise_defect(DEFECT_INCORRECT, "incorrect DllVersion in OLE header") debug( "ByteOrder = %X" % self.ByteOrder ) if self.ByteOrder != 0xFFFE: # For now only common little-endian documents are handled correctly - self._raise_defect(DEFECT_FATAL, "incorrect ByteOrder in OLE header") + self.raise_defect(DEFECT_FATAL, "incorrect ByteOrder in OLE header") # TODO: add big-endian support for documents created on Mac ? # But according to [MS-CFB] ? v20140502, ByteOrder MUST be 0xFFFE. self.SectorSize = 2**self.SectorShift debug( "SectorSize = %d" % self.SectorSize ) if self.SectorSize not in [512, 4096]: - self._raise_defect(DEFECT_INCORRECT, "incorrect SectorSize in OLE header") + self.raise_defect(DEFECT_INCORRECT, "incorrect SectorSize in OLE header") if (self.DllVersion==3 and self.SectorSize!=512) \ or (self.DllVersion==4 and self.SectorSize!=4096): - self._raise_defect(DEFECT_INCORRECT, "SectorSize does not match DllVersion in OLE header") + self.raise_defect(DEFECT_INCORRECT, "SectorSize does not match DllVersion in OLE header") self.MiniSectorSize = 2**self.MiniSectorShift debug( "MiniSectorSize = %d" % self.MiniSectorSize ) if self.MiniSectorSize not in [64]: - self._raise_defect(DEFECT_INCORRECT, "incorrect MiniSectorSize in OLE header") + self.raise_defect(DEFECT_INCORRECT, "incorrect MiniSectorSize in OLE header") if self.Reserved != 0 or self.Reserved1 != 0: - self._raise_defect(DEFECT_INCORRECT, "incorrect OLE header (non-null reserved bytes)") + self.raise_defect(DEFECT_INCORRECT, "incorrect OLE header (non-null reserved bytes)") debug( "csectDir = %d" % self.csectDir ) # Number of directory sectors (only allowed if DllVersion != 3) if self.SectorSize==512 and self.csectDir!=0: - self._raise_defect(DEFECT_INCORRECT, "incorrect csectDir in OLE header") + self.raise_defect(DEFECT_INCORRECT, "incorrect csectDir in OLE header") debug( "csectFat = %d" % self.csectFat ) # csectFat = number of FAT sectors in the file debug( "sectDirStart = %X" % self.sectDirStart ) @@ -1346,7 +1346,7 @@ class OleFileIO(object): # (according to MS-CFB, may be != 0 for applications supporting file # transactions) if self.signature != 0: - self._raise_defect(DEFECT_POTENTIAL, "incorrect OLE header (signature>0)") + self.raise_defect(DEFECT_POTENTIAL, "incorrect OLE header (signature>0)") debug( "MiniSectorCutoff = %d" % self.MiniSectorCutoff ) # MS-CFB: This integer field MUST be set to 0x00001000. This field # specifies the maximum size of a user-defined data stream allocated @@ -1354,7 +1354,7 @@ class OleFileIO(object): # Any user-defined data stream larger than or equal to this cutoff size # must be allocated as normal sectors from the FAT. if self.MiniSectorCutoff != 0x1000: - self._raise_defect(DEFECT_INCORRECT, "incorrect MiniSectorCutoff in OLE header") + self.raise_defect(DEFECT_INCORRECT, "incorrect MiniSectorCutoff in OLE header") debug( "MiniFatStart = %X" % self.MiniFatStart ) debug( "csectMiniFat = %d" % self.csectMiniFat ) debug( "sectDifStart = %X" % self.sectDifStart ) @@ -1422,7 +1422,7 @@ class OleFileIO(object): #TODO: would it be more efficient using a dict or hash values, instead # of a list of long ? if first_sect in used_streams: - self._raise_defect(DEFECT_INCORRECT, 'Stream referenced twice') + self.raise_defect(DEFECT_INCORRECT, 'Stream referenced twice') else: used_streams.append(first_sect) @@ -1566,10 +1566,10 @@ class OleFileIO(object): if self.csectFat <= 109: # there must be at least 109 blocks in header and the rest in # DIFAT, so number of sectors must be >109. - self._raise_defect(DEFECT_INCORRECT, 'incorrect DIFAT, not enough sectors') + self.raise_defect(DEFECT_INCORRECT, 'incorrect DIFAT, not enough sectors') if self.sectDifStart >= self.nb_sect: # initial DIFAT block index must be valid - self._raise_defect(DEFECT_FATAL, 'incorrect DIFAT, first index out of range') + self.raise_defect(DEFECT_FATAL, 'incorrect DIFAT, first index out of range') debug( "DIFAT analysis..." ) # We compute the necessary number of DIFAT sectors : # Number of pointers per DIFAT sector = (sectorsize/4)-1 @@ -1630,7 +1630,7 @@ class OleFileIO(object): (self.minifatsect, self.csectMiniFat, used_size, stream_size, nb_minisectors)) if used_size > stream_size: # This is not really a problem, but may indicate a wrong implementation: - self._raise_defect(DEFECT_INCORRECT, 'OLE MiniStream is larger than MiniFAT') + self.raise_defect(DEFECT_INCORRECT, 'OLE MiniStream is larger than MiniFAT') # In any case, first read stream_size: s = self._open(self.minifatsect, stream_size, force_FAT=True).read() #[PL] Old code replaced by an array: @@ -1666,12 +1666,12 @@ class OleFileIO(object): except: debug('getsect(): sect=%X, seek=%d, filesize=%d' % (sect, self.sectorsize*(sect+1), self._filesize)) - self._raise_defect(DEFECT_FATAL, 'OLE sector index out of range') + self.raise_defect(DEFECT_FATAL, 'OLE sector index out of range') sector = self.fp.read(self.sectorsize) if len(sector) != self.sectorsize: debug('getsect(): sect=%X, read=%d, sectorsize=%d' % (sect, len(sector), self.sectorsize)) - self._raise_defect(DEFECT_FATAL, 'incomplete OLE sector') + self.raise_defect(DEFECT_FATAL, 'incomplete OLE sector') return sector @@ -1693,7 +1693,7 @@ class OleFileIO(object): except: debug('write_sect(): sect=%X, seek=%d, filesize=%d' % (sect, self.sectorsize*(sect+1), self._filesize)) - self._raise_defect(DEFECT_FATAL, 'OLE sector index out of range') + self.raise_defect(DEFECT_FATAL, 'OLE sector index out of range') if len(data) < self.sectorsize: # add padding data += padding * (self.sectorsize - len(data)) @@ -1751,10 +1751,10 @@ class OleFileIO(object): """ # check if SID is OK: if sid<0 or sid>=len(self.direntries): - self._raise_defect(DEFECT_FATAL, "OLE directory index out of range") + self.raise_defect(DEFECT_FATAL, "OLE directory index out of range") # check if entry was already referenced: if self.direntries[sid] is not None: - self._raise_defect(DEFECT_INCORRECT, + self.raise_defect(DEFECT_INCORRECT, "double reference for OLE stream/storage") # if exception not raised, return the object return self.direntries[sid] @@ -1833,7 +1833,7 @@ class OleFileIO(object): # add it to the list files.append(prefix[1:] + [entry.name]) else: - self._raise_defect(DEFECT_INCORRECT, 'The directory tree contains an entry which is not a stream nor a storage.') + self.raise_defect(DEFECT_INCORRECT, 'The directory tree contains an entry which is not a stream nor a storage.') def listdir(self, streams=True, storages=False): @@ -2102,7 +2102,7 @@ class OleFileIO(object): # a fatal error when parsing the whole file msg = 'Error while parsing properties header in stream %s: %s' % ( repr(streampath), exc) - self._raise_defect(DEFECT_INCORRECT, msg, type(exc)) + self.raise_defect(DEFECT_INCORRECT, msg, type(exc)) return data for i in range(num_props): @@ -2203,7 +2203,7 @@ class OleFileIO(object): # a DEFECT_INCORRECT, because parsing can go on msg = 'Error while parsing property id %d in stream %s: %s' % ( id, repr(streampath), exc) - self._raise_defect(DEFECT_INCORRECT, msg, type(exc)) + self.raise_defect(DEFECT_INCORRECT, msg, type(exc)) return data From 1b98b76bcfe5dd0068ae6504d15760c99943dc41 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 28 May 2015 22:34:23 +1000 Subject: [PATCH 502/532] Flake8 fixes --- PIL/OleFileIO.py | 288 +++++++++++++++++++++-------------------------- 1 file changed, 130 insertions(+), 158 deletions(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index 7449407b9..877599add 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -256,11 +256,14 @@ __version__ = '0.42b' import io import sys -import struct, array, os.path, datetime +import struct +import array +import os.path +import datetime #=== COMPATIBILITY WORKAROUNDS ================================================ -#[PL] Define explicitly the public API to avoid private objects in pydoc: +# [PL] Define explicitly the public API to avoid private objects in pydoc: #TODO: add more # __all__ = ['OleFileIO', 'isOleFile', 'MAGIC'] @@ -276,7 +279,7 @@ except: # no xrange, for Python 3 it was renamed as range: iterrange = range -#[PL] workaround to fix an issue with array item size on 64 bits systems: +# [PL] workaround to fix an issue with array item size on 64 bits systems: if array.array('L').itemsize == 4: # on 32 bits platforms, long integers in an array are 32 bits: UINT32 = 'L' @@ -300,14 +303,14 @@ else: raise ValueError('Need to fix a bug with 32 bit arrays, please contact author...') -#[PL] These workarounds were inspired from the Path module +# [PL] These workarounds were inspired from the Path module # (see http://www.jorendorff.com/articles/python/path/) try: basestring except NameError: basestring = str -#[PL] Experimental setting: if True, OLE filenames will be kept in Unicode +# [PL] Experimental setting: if True, OLE filenames will be kept in Unicode # if False (default PIL behaviour), all filenames are converted to Latin-1. KEEP_UNICODE_NAMES = True @@ -323,15 +326,22 @@ else: #TODO: replace this by proper logging -#[PL] DEBUG display mode: False by default, use set_debug_mode() or "-d" on +# [PL] DEBUG display mode: False by default, use set_debug_mode() or "-d" on # command line to change it. DEBUG_MODE = False + + def debug_print(msg): print(msg) + + def debug_pass(msg): pass + + debug = debug_pass + def set_debug_mode(debug_mode): """ Set debug mode on or off, to control display of debugging messages. @@ -350,39 +360,39 @@ def set_debug_mode(debug_mode): # magic bytes that should be at the beginning of every OLE file: MAGIC = b'\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1' -#[PL]: added constants for Sector IDs (from AAF specifications) -MAXREGSECT = 0xFFFFFFFA # (-6) maximum SECT -DIFSECT = 0xFFFFFFFC # (-4) denotes a DIFAT sector in a FAT -FATSECT = 0xFFFFFFFD # (-3) denotes a FAT sector in a FAT -ENDOFCHAIN = 0xFFFFFFFE # (-2) end of a virtual stream chain -FREESECT = 0xFFFFFFFF # (-1) unallocated sector +# [PL]: added constants for Sector IDs (from AAF specifications) +MAXREGSECT = 0xFFFFFFFA # (-6) maximum SECT +DIFSECT = 0xFFFFFFFC # (-4) denotes a DIFAT sector in a FAT +FATSECT = 0xFFFFFFFD # (-3) denotes a FAT sector in a FAT +ENDOFCHAIN = 0xFFFFFFFE # (-2) end of a virtual stream chain +FREESECT = 0xFFFFFFFF # (-1) unallocated sector -#[PL]: added constants for Directory Entry IDs (from AAF specifications) -MAXREGSID = 0xFFFFFFFA # (-6) maximum directory entry ID -NOSTREAM = 0xFFFFFFFF # (-1) unallocated directory entry +# [PL]: added constants for Directory Entry IDs (from AAF specifications) +MAXREGSID = 0xFFFFFFFA # (-6) maximum directory entry ID +NOSTREAM = 0xFFFFFFFF # (-1) unallocated directory entry -#[PL] object types in storage (from AAF specifications) -STGTY_EMPTY = 0 # empty directory entry (according to OpenOffice.org doc) -STGTY_STORAGE = 1 # element is a storage object -STGTY_STREAM = 2 # element is a stream object -STGTY_LOCKBYTES = 3 # element is an ILockBytes object -STGTY_PROPERTY = 4 # element is an IPropertyStorage object -STGTY_ROOT = 5 # element is a root storage +# [PL] object types in storage (from AAF specifications) +STGTY_EMPTY = 0 # empty directory entry (according to OpenOffice.org doc) +STGTY_STORAGE = 1 # element is a storage object +STGTY_STREAM = 2 # element is a stream object +STGTY_LOCKBYTES = 3 # element is an ILockBytes object +STGTY_PROPERTY = 4 # element is an IPropertyStorage object +STGTY_ROOT = 5 # element is a root storage # # -------------------------------------------------------------------- # property types -VT_EMPTY=0; VT_NULL=1; VT_I2=2; VT_I4=3; VT_R4=4; VT_R8=5; VT_CY=6; -VT_DATE=7; VT_BSTR=8; VT_DISPATCH=9; VT_ERROR=10; VT_BOOL=11; -VT_VARIANT=12; VT_UNKNOWN=13; VT_DECIMAL=14; VT_I1=16; VT_UI1=17; -VT_UI2=18; VT_UI4=19; VT_I8=20; VT_UI8=21; VT_INT=22; VT_UINT=23; -VT_VOID=24; VT_HRESULT=25; VT_PTR=26; VT_SAFEARRAY=27; VT_CARRAY=28; -VT_USERDEFINED=29; VT_LPSTR=30; VT_LPWSTR=31; VT_FILETIME=64; -VT_BLOB=65; VT_STREAM=66; VT_STORAGE=67; VT_STREAMED_OBJECT=68; -VT_STORED_OBJECT=69; VT_BLOB_OBJECT=70; VT_CF=71; VT_CLSID=72; -VT_VECTOR=0x1000; +VT_EMPTY = 0; VT_NULL = 1; VT_I2 = 2; VT_I4 = 3; VT_R4 = 4; VT_R8 = 5; VT_CY = 6; +VT_DATE = 7; VT_BSTR = 8; VT_DISPATCH = 9; VT_ERROR = 10; VT_BOOL = 11; +VT_VARIANT = 12; VT_UNKNOWN = 13; VT_DECIMAL = 14; VT_I1 = 16; VT_UI1 = 17; +VT_UI2 = 18; VT_UI4 = 19; VT_I8 = 20; VT_UI8 = 21; VT_INT = 22; VT_UINT = 23; +VT_VOID = 24; VT_HRESULT = 25; VT_PTR = 26; VT_SAFEARRAY = 27; VT_CARRAY = 28; +VT_USERDEFINED = 29; VT_LPSTR = 30; VT_LPWSTR = 31; VT_FILETIME = 64; +VT_BLOB = 65; VT_STREAM = 66; VT_STORAGE = 67; VT_STREAMED_OBJECT = 68; +VT_STORED_OBJECT = 69; VT_BLOB_OBJECT = 70; VT_CF = 71; VT_CLSID = 72; +VT_VECTOR = 0x1000; # map property id to name (for debugging purposes) @@ -398,7 +408,7 @@ for keyword, var in list(vars().items()): WORD_CLSID = "00020900-0000-0000-C000-000000000046" #TODO: check Excel, PPT, ... -#[PL]: Defect levels to classify parsing errors - see OleFileIO._raise_defect() +# [PL]: Defect levels to classify parsing errors - see OleFileIO._raise_defect() DEFECT_UNSURE = 10 # a case which looks weird, but not sure it's a defect DEFECT_POTENTIAL = 20 # a potential defect DEFECT_INCORRECT = 30 # an error according to specifications, but parsing @@ -410,7 +420,7 @@ DEFECT_FATAL = 40 # an error which cannot be ignored, parsing is # (this is used in isOleFile and OleFile.open) MINIMAL_OLEFILE_SIZE = 1536 -#[PL] add useful constants to __all__: +# [PL] add useful constants to __all__: # for key in list(vars().keys()): # if key.startswith('STGTY_') or key.startswith('DEFECT_'): # __all__.append(key) @@ -418,7 +428,7 @@ MINIMAL_OLEFILE_SIZE = 1536 #=== FUNCTIONS =============================================================== -def isOleFile (filename): +def isOleFile(filename): """ Test if a file is an OLE container (according to the magic bytes in its header). @@ -502,7 +512,6 @@ def _clsid(clsid): tuple(map(i8, clsid[8:16])))) - def filetime2datetime(filetime): """ convert FILETIME (64 bits int) to Python datetime.datetime @@ -514,7 +523,6 @@ def filetime2datetime(filetime): return _FILETIME_null_date + datetime.timedelta(microseconds=filetime//10) - #=== CLASSES ================================================================== class OleMetadata(object): @@ -622,7 +630,6 @@ class OleMetadata(object): self.language = None self.doc_version = None - def parse_properties(self, olefile): """ Parse standard properties of an OLE file, from the streams @@ -707,11 +714,11 @@ class _OleStream(io.BytesIO): """ debug('_OleStream.__init__:') debug(' sect=%d (%X), size=%d, offset=%d, sectorsize=%d, len(fat)=%d, fp=%s' - %(sect,sect,size,offset,sectorsize,len(fat), repr(fp))) - #[PL] To detect malformed documents with FAT loops, we compute the + % (sect, sect, size, offset, sectorsize, len(fat), repr(fp))) + # [PL] To detect malformed documents with FAT loops, we compute the # expected number of sectors in the stream: unknown_size = False - if size==0x7FFFFFFF: + if size == 0x7FFFFFFF: # this is the case when called from OleFileIO._open(), and stream # size is not known in advance (for example when reading the # Directory stream). Then we can only guess maximum size: @@ -733,7 +740,7 @@ class _OleStream(io.BytesIO): if size == 0 and sect != ENDOFCHAIN: debug('size == 0 and sect != ENDOFCHAIN:') raise IOError('incorrect OLE sector index for empty stream') - #[PL] A fixed-length for loop is used instead of an undefined while + # [PL] A fixed-length for loop is used instead of an undefined while # loop to avoid DoS attacks: for i in range(nb_sectors): # Sector index may be ENDOFCHAIN, but only if size was unknown @@ -745,9 +752,9 @@ class _OleStream(io.BytesIO): debug('sect=ENDOFCHAIN before expected size') raise IOError('incomplete OLE stream') # sector index should be within FAT: - if sect<0 or sect>=len(fat): + if sect < 0 or sect >= len(fat): debug('sect=%d (%X) / len(fat)=%d' % (sect, sect, len(fat))) - debug('i=%d / nb_sectors=%d' %(i, nb_sectors)) + debug('i=%d / nb_sectors=%d' % (i, nb_sectors)) ## tmp_data = b"".join(data) ## f = open('test_debug.bin', 'wb') ## f.write(tmp_data) @@ -767,7 +774,7 @@ class _OleStream(io.BytesIO): # Note: if sector is the last of the file, sometimes it is not a # complete sector (of 512 or 4K), so we may read less than # sectorsize. - if len(sector_data)!=sectorsize and sect!=(len(fat)-1): + if len(sector_data) != sectorsize and sect != (len(fat)-1): debug('sect=%d / len(fat)=%d, seek=%d / filesize=%d, len read=%d' % (sect, len(fat), offset+sectorsize*sect, filesize, len(sector_data))) debug('seek+len(read)=%d' % (offset+sectorsize*sect+len(sector_data))) @@ -779,7 +786,7 @@ class _OleStream(io.BytesIO): except IndexError: # [PL] if pointer is out of the FAT an exception is raised raise IOError('incorrect OLE FAT, sector index out of range') - #[PL] Last sector should be a "end of chain" marker: + # [PL] Last sector should be a "end of chain" marker: if sect != ENDOFCHAIN: raise IOError('incorrect last sector index in OLE stream') data = b"".join(data) @@ -808,7 +815,7 @@ class _OleDirectoryEntry(object): """ OLE2 Directory Entry """ - #[PL] parsing code moved from OleFileIO.loaddirectory + # [PL] parsing code moved from OleFileIO.loaddirectory # struct to parse directory entries: # <: little-endian byte order, standard sizes @@ -833,7 +840,6 @@ class _OleDirectoryEntry(object): DIRENTRY_SIZE = 128 assert struct.calcsize(STRUCT_DIRENTRY) == DIRENTRY_SIZE - def __init__(self, entry, sid, olefile): """ Constructor for an _OleDirectoryEntry object. @@ -883,7 +889,7 @@ class _OleDirectoryEntry(object): #debug (struct.unpack(fmt_entry, entry[:len_entry])) # name should be at most 31 unicode characters + null character, # so 64 bytes in total (31*2 + 2): - if namelength>64: + if namelength > 64: olefile.raise_defect(DEFECT_INCORRECT, 'incorrect DirEntry name length') # if exception not raised, namelength is set to the maximum value: namelength = 64 @@ -911,7 +917,7 @@ class _OleDirectoryEntry(object): olefile.raise_defect(DEFECT_UNSURE, 'incorrect OLE stream size') self.size = sizeLow else: - self.size = sizeLow + (long(sizeHigh)<<32) + self.size = sizeLow + (long(sizeHigh) << 32) debug(' - size: %d (sizeLow=%d, sizeHigh=%d)' % (self.size, sizeLow, sizeHigh)) self.clsid = _clsid(clsid) @@ -920,17 +926,15 @@ class _OleDirectoryEntry(object): if self.entry_type == STGTY_STORAGE and self.size != 0: olefile.raise_defect(DEFECT_POTENTIAL, 'OLE storage with size>0') # check if stream is not already referenced elsewhere: - if self.entry_type in (STGTY_ROOT, STGTY_STREAM) and self.size>0: + if self.entry_type in (STGTY_ROOT, STGTY_STREAM) and self.size > 0: if self.size < olefile.minisectorcutoff \ - and self.entry_type==STGTY_STREAM: # only streams can be in MiniFAT + and self.entry_type == STGTY_STREAM: # only streams can be in MiniFAT # ministream object minifat = True else: minifat = False olefile._check_duplicate_stream(self.isectStart, minifat) - - def build_storage_tree(self): """ Read and build the red-black tree attached to this _OleDirectoryEntry @@ -954,7 +958,6 @@ class _OleDirectoryEntry(object): # (see rich comparison methods in this class) self.kids.sort() - def append_kids(self, child_sid): """ Walk through red-black tree of children of this directory entry to add @@ -963,13 +966,13 @@ class _OleDirectoryEntry(object): :param child_sid : index of child directory entry to use, or None when called first time for the root. (only used during recursion) """ - #[PL] this method was added to use simple recursion instead of a complex + # [PL] this method was added to use simple recursion instead of a complex # algorithm. # if this is not a storage or a leaf of the tree, nothing to do: if child_sid == NOSTREAM: return # check if child SID is in the proper range: - if child_sid<0 or child_sid>=len(self.olefile.direntries): + if child_sid < 0 or child_sid >= len(self.olefile.direntries): self.olefile.raise_defect(DEFECT_FATAL, 'OLE DirEntry index out of range') # get child direntry: child = self.olefile._load_direntry(child_sid) #direntries[child_sid] @@ -998,7 +1001,6 @@ class _OleDirectoryEntry(object): # Afterwards build kid's own tree if it's also a storage: child.build_storage_tree() - def __eq__(self, other): "Compare entries by name" return self.name == other.name @@ -1018,7 +1020,6 @@ class _OleDirectoryEntry(object): #TODO: replace by the same function as MS implementation ? # (order by name length first, then case-insensitive order) - def dump(self, tab = 0): "Dump this entry, and all its subentries (for debug purposes only)" TYPES = ["(invalid)", "(storage)", "(stream)", "(lockbytes)", @@ -1033,7 +1034,6 @@ class _OleDirectoryEntry(object): for kid in self.kids: kid.dump(tab + 2) - def getmtime(self): """ Return modification time of a directory entry. @@ -1047,7 +1047,6 @@ class _OleDirectoryEntry(object): return None return filetime2datetime(self.modifyTime) - def getctime(self): """ Return creation time of a directory entry. @@ -1134,7 +1133,6 @@ class OleFileIO(object): if filename: self.open(filename, write_mode=write_mode) - def raise_defect(self, defect_level, message, exception_type=IOError): """ This method should be called for any defect found during file parsing. @@ -1158,7 +1156,6 @@ class OleFileIO(object): # just record the issue, no exception raised: self.parsing_issues.append((exception_type, message)) - def _decode_utf16_str(self, utf16_str, errors='replace'): """ Decode a string encoded in UTF-16 LE format, as found in the OLE @@ -1177,7 +1174,6 @@ class OleFileIO(object): # path_encoding=None, return the Unicode string as-is: return unicode_str - def open(self, filename, write_mode=False): """ Open an OLE2 file in read-only or read/write mode. @@ -1196,7 +1192,7 @@ class OleFileIO(object): of read-only by default. (ignored if filename is not a path) """ self.write_mode = write_mode - #[PL] check if filename is a string-like or file-like object: + # [PL] check if filename is a string-like or file-like object: # (it is better to check for a read() method) if hasattr(filename, 'read'): #TODO: also check seek and tell methods? @@ -1221,7 +1217,7 @@ class OleFileIO(object): # file-like objects: #TODO: do it above, using getsize with filename when possible? #TODO: fix code to fail with clear exception when filesize cannot be obtained - filesize=0 + filesize = 0 self.fp.seek(0, os.SEEK_END) try: filesize = self.fp.tell() @@ -1278,7 +1274,7 @@ class OleFileIO(object): # '<' indicates little-endian byte ordering for Intel (cf. struct module help) fmt_header = '<8s16sHHHHHHLLLLLLLLLL' header_size = struct.calcsize(fmt_header) - debug( "fmt_header size = %d, +FAT = %d" % (header_size, header_size + 109*4) ) + debug("fmt_header size = %d, +FAT = %d" % (header_size, header_size + 109*4)) header1 = header[:header_size] ( self.Sig, @@ -1299,7 +1295,7 @@ class OleFileIO(object): self.sectDifStart, self.csectDif ) = struct.unpack(fmt_header, header1) - debug( struct.unpack(fmt_header, header1)) + debug(struct.unpack(fmt_header, header1)) if self.Sig != MAGIC: # OLE signature should always be present @@ -1307,47 +1303,47 @@ class OleFileIO(object): if self.clsid != bytearray(16): # according to AAF specs, CLSID should always be zero self.raise_defect(DEFECT_INCORRECT, "incorrect CLSID in OLE header") - debug( "MinorVersion = %d" % self.MinorVersion ) - debug( "DllVersion = %d" % self.DllVersion ) + debug("MinorVersion = %d" % self.MinorVersion) + debug("DllVersion = %d" % self.DllVersion) if self.DllVersion not in [3, 4]: # version 3: usual format, 512 bytes per sector # version 4: large format, 4K per sector self.raise_defect(DEFECT_INCORRECT, "incorrect DllVersion in OLE header") - debug( "ByteOrder = %X" % self.ByteOrder ) + debug("ByteOrder = %X" % self.ByteOrder) if self.ByteOrder != 0xFFFE: # For now only common little-endian documents are handled correctly self.raise_defect(DEFECT_FATAL, "incorrect ByteOrder in OLE header") # TODO: add big-endian support for documents created on Mac ? # But according to [MS-CFB] ? v20140502, ByteOrder MUST be 0xFFFE. self.SectorSize = 2**self.SectorShift - debug( "SectorSize = %d" % self.SectorSize ) + debug("SectorSize = %d" % self.SectorSize) if self.SectorSize not in [512, 4096]: self.raise_defect(DEFECT_INCORRECT, "incorrect SectorSize in OLE header") - if (self.DllVersion==3 and self.SectorSize!=512) \ - or (self.DllVersion==4 and self.SectorSize!=4096): + if (self.DllVersion == 3 and self.SectorSize != 512) \ + or (self.DllVersion == 4 and self.SectorSize != 4096): self.raise_defect(DEFECT_INCORRECT, "SectorSize does not match DllVersion in OLE header") self.MiniSectorSize = 2**self.MiniSectorShift - debug( "MiniSectorSize = %d" % self.MiniSectorSize ) + debug("MiniSectorSize = %d" % self.MiniSectorSize) if self.MiniSectorSize not in [64]: self.raise_defect(DEFECT_INCORRECT, "incorrect MiniSectorSize in OLE header") if self.Reserved != 0 or self.Reserved1 != 0: self.raise_defect(DEFECT_INCORRECT, "incorrect OLE header (non-null reserved bytes)") - debug( "csectDir = %d" % self.csectDir ) + debug("csectDir = %d" % self.csectDir) # Number of directory sectors (only allowed if DllVersion != 3) - if self.SectorSize==512 and self.csectDir!=0: + if self.SectorSize == 512 and self.csectDir != 0: self.raise_defect(DEFECT_INCORRECT, "incorrect csectDir in OLE header") - debug( "csectFat = %d" % self.csectFat ) + debug("csectFat = %d" % self.csectFat) # csectFat = number of FAT sectors in the file - debug( "sectDirStart = %X" % self.sectDirStart ) + debug("sectDirStart = %X" % self.sectDirStart) # sectDirStart = 1st sector containing the directory - debug( "signature = %d" % self.signature ) + debug("signature = %d" % self.signature) # Signature should be zero, BUT some implementations do not follow this # rule => only a potential defect: # (according to MS-CFB, may be != 0 for applications supporting file # transactions) if self.signature != 0: self.raise_defect(DEFECT_POTENTIAL, "incorrect OLE header (signature>0)") - debug( "MiniSectorCutoff = %d" % self.MiniSectorCutoff ) + debug("MiniSectorCutoff = %d" % self.MiniSectorCutoff) # MS-CFB: This integer field MUST be set to 0x00001000. This field # specifies the maximum size of a user-defined data stream allocated # from the mini FAT and mini stream, and that cutoff is 4096 bytes. @@ -1355,15 +1351,15 @@ class OleFileIO(object): # must be allocated as normal sectors from the FAT. if self.MiniSectorCutoff != 0x1000: self.raise_defect(DEFECT_INCORRECT, "incorrect MiniSectorCutoff in OLE header") - debug( "MiniFatStart = %X" % self.MiniFatStart ) - debug( "csectMiniFat = %d" % self.csectMiniFat ) - debug( "sectDifStart = %X" % self.sectDifStart ) - debug( "csectDif = %d" % self.csectDif ) + debug("MiniFatStart = %X" % self.MiniFatStart) + debug("csectMiniFat = %d" % self.csectMiniFat) + debug("sectDifStart = %X" % self.sectDifStart) + debug("csectDif = %d" % self.csectDif) # calculate the number of sectors in the file # (-1 because header doesn't count) - self.nb_sect = ( (filesize + self.SectorSize-1) // self.SectorSize) - 1 - debug( "Number of sectors in the file: %d" % self.nb_sect ) + self.nb_sect = ((filesize + self.SectorSize-1) // self.SectorSize) - 1 + debug("Number of sectors in the file: %d" % self.nb_sect) #TODO: change this test, because an OLE file MAY contain other data # after the last sector. @@ -1393,14 +1389,12 @@ class OleFileIO(object): self.ministream = None self.minifatsect = self.MiniFatStart #i32(header, 60) - def close(self): """ close the OLE file, to release the file object """ self.fp.close() - def _check_duplicate_stream(self, first_sect, minifat=False): """ Checks if a stream has not been already referenced elsewhere. @@ -1416,7 +1410,7 @@ class OleFileIO(object): else: debug('_check_duplicate_stream: sect=%d in FAT' % first_sect) # some values can be safely ignored (not a real stream): - if first_sect in (DIFSECT,FATSECT,ENDOFCHAIN,FREESECT): + if first_sect in (DIFSECT, FATSECT, ENDOFCHAIN, FREESECT): return used_streams = self._used_streams_fat #TODO: would it be more efficient using a dict or hash values, instead @@ -1426,7 +1420,6 @@ class OleFileIO(object): else: used_streams.append(first_sect) - def dumpfat(self, fat, firstindex=0): "Displays a part of FAT in human-readable form for debugging purpose" # [PL] added only for debug @@ -1450,7 +1443,7 @@ class OleFileIO(object): index = l*VPL print("%8X:" % (firstindex+index), end=" ") for i in range(index, index+VPL): - if i>=nbsect: + if i >= nbsect: break sect = fat[i] aux = sect & 0xFFFFFFFF # JYTHON-WORKAROUND @@ -1464,12 +1457,11 @@ class OleFileIO(object): print(name, end=" ") print() - def dumpsect(self, sector, firstindex=0): "Displays a sector in a human-readable form, for debugging purpose." if not DEBUG_MODE: return - VPL=8 # number of values per line (8+1 * 8+1 = 81) + VPL = 8 # number of values per line (8+1 * 8+1 = 81) tab = array.array(UINT32, sector) if sys.byteorder == 'big': tab.byteswap() @@ -1483,7 +1475,7 @@ class OleFileIO(object): index = l*VPL print("%8X:" % (firstindex+index), end=" ") for i in range(index, index+VPL): - if i>=nbsect: + if i >= nbsect: break sect = tab[i] name = "%8X" % sect @@ -1501,7 +1493,6 @@ class OleFileIO(object): a.byteswap() return a - def loadfat_sect(self, sect): """ Adds the indexes of the given sector to the FAT @@ -1533,7 +1524,6 @@ class OleFileIO(object): self.fat = self.fat + nextfat return isect - def loadfat(self, header): """ Load the FAT table. @@ -1544,7 +1534,7 @@ class OleFileIO(object): # Additional sectors are described by DIF blocks sect = header[76:512] - debug( "len(sect)=%d, so %d integers" % (len(sect), len(sect)//4) ) + debug("len(sect)=%d, so %d integers" % (len(sect), len(sect)//4)) #fat = [] # [PL] FAT is an array of 32 bits unsigned ints, it's more effective # to use an array than a list in Python. @@ -1554,7 +1544,7 @@ class OleFileIO(object): #self.dumpfat(self.fat) ## for i in range(0, len(sect), 4): ## ix = i32(sect, i) -## #[PL] if ix == -2 or ix == -1: # ix == 0xFFFFFFFE or ix == 0xFFFFFFFF: +## # [PL] if ix == -2 or ix == -1: # ix == 0xFFFFFFFE or ix == 0xFFFFFFFF: ## if ix == 0xFFFFFFFE or ix == 0xFFFFFFFF: ## break ## s = self.getsect(ix) @@ -1570,19 +1560,19 @@ class OleFileIO(object): if self.sectDifStart >= self.nb_sect: # initial DIFAT block index must be valid self.raise_defect(DEFECT_FATAL, 'incorrect DIFAT, first index out of range') - debug( "DIFAT analysis..." ) + debug("DIFAT analysis...") # We compute the necessary number of DIFAT sectors : # Number of pointers per DIFAT sector = (sectorsize/4)-1 # (-1 because the last pointer is the next DIFAT sector number) nb_difat_sectors = (self.sectorsize//4)-1 # (if 512 bytes: each DIFAT sector = 127 pointers + 1 towards next DIFAT sector) nb_difat = (self.csectFat-109 + nb_difat_sectors-1)//nb_difat_sectors - debug( "nb_difat = %d" % nb_difat ) + debug("nb_difat = %d" % nb_difat) if self.csectDif != nb_difat: raise IOError('incorrect DIFAT') isect_difat = self.sectDifStart for i in iterrange(nb_difat): - debug( "DIFAT block %d, sector %X" % (i, isect_difat) ) + debug("DIFAT block %d, sector %X" % (i, isect_difat)) #TODO: check if corresponding FAT SID = DIFSECT sector_difat = self.getsect(isect_difat) difat = self.sect2array(sector_difat) @@ -1590,7 +1580,7 @@ class OleFileIO(object): self.loadfat_sect(difat[:nb_difat_sectors]) # last DIFAT pointer is next DIFAT sector: isect_difat = difat[nb_difat_sectors] - debug( "next DIFAT sector: %X" % isect_difat ) + debug("next DIFAT sector: %X" % isect_difat) # checks: if isect_difat not in [ENDOFCHAIN, FREESECT]: # last DIFAT pointer value must be ENDOFCHAIN or FREESECT @@ -1608,7 +1598,6 @@ class OleFileIO(object): debug('\nFAT:') self.dumpfat(self.fat) - def loadminifat(self): """ Load the MiniFAT table. @@ -1633,8 +1622,8 @@ class OleFileIO(object): self.raise_defect(DEFECT_INCORRECT, 'OLE MiniStream is larger than MiniFAT') # In any case, first read stream_size: s = self._open(self.minifatsect, stream_size, force_FAT=True).read() - #[PL] Old code replaced by an array: - #self.minifat = [i32(s, i) for i in range(0, len(s), 4)] + # [PL] Old code replaced by an array: + # self.minifat = [i32(s, i) for i in range(0, len(s), 4)] self.minifat = self.sect2array(s) # Then shrink the array to used size, to avoid indexes out of MiniStream: debug('MiniFAT shrunk from %d to %d sectors' % (len(self.minifat), nb_minisectors)) @@ -1658,9 +1647,9 @@ class OleFileIO(object): # [PL] the original code in PIL was wrong when sectors are 4KB instead of # 512 bytes: - #self.fp.seek(512 + self.sectorsize * sect) - #[PL]: added safety checks: - #print("getsect(%X)" % sect) + # self.fp.seek(512 + self.sectorsize * sect) + # [PL]: added safety checks: + # print("getsect(%X)" % sect) try: self.fp.seek(self.sectorsize * (sect+1)) except: @@ -1674,7 +1663,6 @@ class OleFileIO(object): self.raise_defect(DEFECT_FATAL, 'incomplete OLE sector') return sector - def write_sect(self, sect, data, padding=b'\x00'): """ Write given sector to file on disk. @@ -1685,7 +1673,7 @@ class OleFileIO(object): """ if not isinstance(data, bytes): raise TypeError("write_sect: data must be a bytes string") - if not isinstance(padding, bytes) or len(padding)!=1: + if not isinstance(padding, bytes) or len(padding) != 1: raise TypeError("write_sect: padding must be a bytes string of 1 char") #TODO: we could allow padding=None for no padding at all try: @@ -1701,7 +1689,6 @@ class OleFileIO(object): raise ValueError("Data is larger than sector size") self.fp.write(data) - def loaddirectory(self, sect): """ Load the directory. @@ -1715,14 +1702,14 @@ class OleFileIO(object): # (stream size is not known in advance) self.directory_fp = self._open(sect) - #[PL] to detect malformed documents and avoid DoS attacks, the maximum + # [PL] to detect malformed documents and avoid DoS attacks, the maximum # number of directory entries can be calculated: max_entries = self.directory_fp.size // 128 debug('loaddirectory: size=%d, max_entries=%d' % (self.directory_fp.size, max_entries)) # Create list of directory entries - #self.direntries = [] + # self.direntries = [] # We start with a list of "None" object self.direntries = [None] * max_entries ## for sid in iterrange(max_entries): @@ -1737,8 +1724,7 @@ class OleFileIO(object): # read and build all storage trees, starting from the root: self.root.build_storage_tree() - - def _load_direntry (self, sid): + def _load_direntry(self, sid): """ Load a directory entry from the directory. This method should only be called once for each storage/stream when @@ -1750,7 +1736,7 @@ class OleFileIO(object): :exception IOError: if the entry has always been referenced. """ # check if SID is OK: - if sid<0 or sid>=len(self.direntries): + if sid < 0 or sid >= len(self.direntries): self.raise_defect(DEFECT_FATAL, "OLE directory index out of range") # check if entry was already referenced: if self.direntries[sid] is not None: @@ -1763,14 +1749,12 @@ class OleFileIO(object): self.direntries[sid] = _OleDirectoryEntry(entry, sid, self) return self.direntries[sid] - def dumpdirectory(self): """ Dump directory (for debugging only) """ self.root.dump() - def _open(self, start, size = 0x7FFFFFFF, force_FAT=False): """ Open a stream, either in FAT or MiniFAT according to its size. @@ -1806,7 +1790,6 @@ class OleFileIO(object): sectorsize=self.sectorsize, fat=self.fat, filesize=self._filesize) - def _list(self, files, prefix, node, streams=True, storages=False): """ listdir helper @@ -1835,7 +1818,6 @@ class OleFileIO(object): else: self.raise_defect(DEFECT_INCORRECT, 'The directory tree contains an entry which is not a stream nor a storage.') - def listdir(self, streams=True, storages=False): """ Return a list of streams and/or storages stored in this file @@ -1849,7 +1831,6 @@ class OleFileIO(object): self._list(files, [], self.root, streams, storages) return files - def _find(self, filename): """ Returns directory entry of given filename. (openstream helper) @@ -1881,7 +1862,6 @@ class OleFileIO(object): node = kid return node.sid - def openstream(self, filename): """ Open a stream as a read-only file object (BytesIO). @@ -1903,7 +1883,6 @@ class OleFileIO(object): raise IOError("this file is not a stream") return self._open(entry.isectStart, entry.size) - def write_stream(self, stream_name, data): """ Write a stream to disk. For now, it is only possible to replace an @@ -1942,29 +1921,28 @@ class OleFileIO(object): # (sect, offset+self.sectorsize*sect)) # raise IOError('OLE sector index out of range') # extract one sector from data, the last one being smaller: - if i<(nb_sectors-1): - data_sector = data [i*self.sectorsize : (i+1)*self.sectorsize] + if i < (nb_sectors-1): + data_sector = data[i*self.sectorsize:(i+1)*self.sectorsize] #TODO: comment this if it works - assert(len(data_sector)==self.sectorsize) + assert(len(data_sector) == self.sectorsize) else: - data_sector = data [i*self.sectorsize:] - #TODO: comment this if it works + data_sector = data[i*self.sectorsize:] + # TODO: comment this if it works debug('write_stream: size=%d sectorsize=%d data_sector=%d size%%sectorsize=%d' % (size, self.sectorsize, len(data_sector), size % self.sectorsize)) - assert(len(data_sector) % self.sectorsize==size % self.sectorsize) + assert(len(data_sector) % self.sectorsize == size % self.sectorsize) self.write_sect(sect, data_sector) -## self.fp.write(data_sector) +# self.fp.write(data_sector) # jump to next sector in the FAT: try: sect = self.fat[sect] except IndexError: # [PL] if pointer is out of the FAT an exception is raised raise IOError('incorrect OLE FAT, sector index out of range') - #[PL] Last sector should be a "end of chain" marker: + # [PL] Last sector should be a "end of chain" marker: if sect != ENDOFCHAIN: raise IOError('incorrect last sector index in OLE stream') - def get_type(self, filename): """ Test if given filename exists as a stream or a storage in the OLE @@ -1984,7 +1962,6 @@ class OleFileIO(object): except: return False - def getmtime(self, filename): """ Return modification time of a stream/storage. @@ -2000,7 +1977,6 @@ class OleFileIO(object): entry = self.direntries[sid] return entry.getmtime() - def getctime(self, filename): """ Return creation time of a stream/storage. @@ -2016,7 +1992,6 @@ class OleFileIO(object): entry = self.direntries[sid] return entry.getctime() - def exists(self, filename): """ Test if given filename exists as a stream or a storage in the OLE @@ -2032,7 +2007,6 @@ class OleFileIO(object): except: return False - def get_size(self, filename): """ Return size of a stream in the OLE container, in bytes. @@ -2049,7 +2023,6 @@ class OleFileIO(object): raise TypeError('object is not an OLE stream') return entry.size - def get_rootentry_name(self): """ Return root entry name. Should usually be 'Root Entry' or 'R' in most @@ -2057,7 +2030,6 @@ class OleFileIO(object): """ return self.root.name - def getproperties(self, filename, convert_time=False, no_conversion=None): """ Return properties described in substream. @@ -2069,7 +2041,7 @@ class OleFileIO(object): :returns: a dictionary of values indexed by id (integer) """ - #REFERENCE: [MS-OLEPS] https://msdn.microsoft.com/en-us/library/dd942421.aspx + # REFERENCE: [MS-OLEPS] https://msdn.microsoft.com/en-us/library/dd942421.aspx # make sure no_conversion is a list, just to simplify code below: if no_conversion is None: no_conversion = [] @@ -2112,7 +2084,7 @@ class OleFileIO(object): offset = i32(s, 12+i*8) type = i32(s, offset) - debug ('property id=%d: type=%d offset=%X' % (id, type, offset)) + debug('property id=%d: type=%d offset=%X' % (id, type, offset)) # test for common types first (should perhaps use # a dictionary instead?) @@ -2121,14 +2093,14 @@ class OleFileIO(object): value = i16(s, offset+4) if value >= 32768: value = value - 65536 - elif type == VT_UI2: # 2-byte unsigned integer + elif type == VT_UI2: # 2-byte unsigned integer value = i16(s, offset+4) elif type in (VT_I4, VT_INT, VT_ERROR): # VT_I4: 32-bit signed integer # VT_ERROR: HRESULT, similar to 32-bit signed integer, # see http://msdn.microsoft.com/en-us/library/cc230330.aspx value = i32(s, offset+4) - elif type in (VT_UI4, VT_UINT): # 4-byte unsigned integer + elif type in (VT_UI4, VT_UINT): # 4-byte unsigned integer value = i32(s, offset+4) # FIXME elif type in (VT_BSTR, VT_LPSTR): # CodePageString, see http://msdn.microsoft.com/en-us/library/dd942354.aspx @@ -2152,12 +2124,12 @@ class OleFileIO(object): count = i32(s, offset+4) value = self._decode_utf16_str(s[offset+8:offset+8+count*2]) elif type == VT_FILETIME: - value = long(i32(s, offset+4)) + (long(i32(s, offset+8))<<32) + value = long(i32(s, offset+4)) + (long(i32(s, offset+8)) << 32) # FILETIME is a 64-bit int: "number of 100ns periods # since Jan 1,1601". if convert_time and id not in no_conversion: debug('Converting property #%d to python datetime, value=%d=%fs' - %(id, value, float(value)/10000000)) + % (id, value, float(value) / 10000000)) # convert FILETIME to Python datetime.datetime # inspired from http://code.activestate.com/recipes/511425-filetime-to-datetime/ _FILETIME_null_date = datetime.datetime(1601, 1, 1, 0, 0, 0) @@ -2182,7 +2154,7 @@ class OleFileIO(object): value = bool(i16(s, offset+4)) else: value = None # everything else yields "None" - debug ('property id=%d: type=%d not implemented in parser yet' % (id, type)) + debug('property id=%d: type=%d not implemented in parser yet' % (id, type)) # missing: VT_EMPTY, VT_NULL, VT_R4, VT_R8, VT_CY, VT_DATE, # VT_DECIMAL, VT_I1, VT_I8, VT_UI8, @@ -2194,8 +2166,8 @@ class OleFileIO(object): # type of items, e.g. VT_VECTOR|VT_BSTR # see http://msdn.microsoft.com/en-us/library/dd942011.aspx - #print("%08x" % id, repr(value), end=" ") - #print("(%s)" % VT[i32(s, offset) & 0xFFF]) + # print("%08x" % id, repr(value), end=" ") + # print("(%s)" % VT[i32(s, offset) & 0xFFF]) data[id] = value except BaseException as exc: @@ -2267,14 +2239,14 @@ For more information, see http://www.decalage.info/olefile props = ole.getproperties(streamname, convert_time=True) props = sorted(props.items()) for k, v in props: - #[PL]: avoid to display too large or binary values: + # [PL]: avoid to display too large or binary values: if isinstance(v, (basestring, bytes)): if len(v) > 50: v = v[:50] if isinstance(v, bytes): # quick and dirty binary check: - for c in (1,2,3,4,5,6,7,11,12,14,15,16,17,18,19,20, - 21,22,23,24,25,26,27,28,29,30,31): + for c in (1, 2, 3, 4, 5, 6, 7, 11, 12, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31): if c in bytearray(v): v = '(binary data)' break @@ -2285,7 +2257,7 @@ For more information, see http://www.decalage.info/olefile print('\nChecking streams...') for streamname in ole.listdir(): # print name using repr() to convert binary chars to \xNN: - print('-', repr('/'.join(streamname)),'-', end=' ') + print('-', repr('/'.join(streamname)), '-', end=' ') st_type = ole.get_type(streamname) if st_type == STGTY_STREAM: print('size %d' % ole.get_size(streamname)) @@ -2295,11 +2267,11 @@ For more information, see http://www.decalage.info/olefile print('NOT a stream : type=%d' % st_type) print() -## for streamname in ole.listdir(): -## # print name using repr() to convert binary chars to \xNN: -## print('-', repr('/'.join(streamname)),'-', end=' ') -## print(ole.getmtime(streamname)) -## print() +# for streamname in ole.listdir(): +# # print name using repr() to convert binary chars to \xNN: +# print('-', repr('/'.join(streamname)),'-', end=' ') +# print(ole.getmtime(streamname)) +# print() print('Modification/Creation times of all directory entries:') for entry in ole.direntries: @@ -2312,7 +2284,7 @@ For more information, see http://www.decalage.info/olefile meta = ole.get_metadata() meta.dump() print() - #[PL] Test a few new methods: + # [PL] Test a few new methods: root = ole.get_rootentry_name() print('Root entry name: "%s"' % root) if ole.exists('worddocument'): @@ -2332,4 +2304,4 @@ For more information, see http://www.decalage.info/olefile ## except IOError as v: ## print("***", "cannot read", file, "-", v) -# this code was developed while listening to The Wedding Present "Sea Monsters" \ No newline at end of file +# this code was developed while listening to The Wedding Present "Sea Monsters" From 29a3de6ccc36eba8678dbc45176db7262cde8825 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 11 May 2015 00:16:35 +1000 Subject: [PATCH 503/532] Doc cleanup from wiredfool --- PIL/OleFileIO.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index 877599add..f51ac4bc0 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -1068,7 +1068,8 @@ class OleFileIO(object): OLE container object This class encapsulates the interface to an OLE 2 structured - storage file. Use the listdir and openstream methods to + storage file. Use the :py:meth:`~PIL.OleFileIO.OleFileIO.listdir` and + :py:meth:`~PIL.OleFileIO.OleFileIO.openstream` methods to access the contents of this file. Object names are given as a list of strings, one for each subentry @@ -2037,7 +2038,7 @@ class OleFileIO(object): :param filename: path of stream in storage tree (see openstream for syntax) :param convert_time: bool, if True timestamps will be converted to Python datetime :param no_conversion: None or list of int, timestamps not to be converted - (for example total editing time is not a real timestamp) + (for example total editing time is not a real timestamp) :returns: a dictionary of values indexed by id (integer) """ From cfedc8093c19b9b09c82b7b21c4396cbe442a8d4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 28 May 2015 21:04:10 +1000 Subject: [PATCH 504/532] Fixed typo --- PIL/OleFileIO.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index f51ac4bc0..f4cbc8fc6 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -1384,7 +1384,7 @@ class OleFileIO(object): # Load file allocation tables self.loadfat(header) - # Load direcory. This sets both the direntries list (ordered by sid) + # Load directory. This sets both the direntries list (ordered by sid) # and the root (ordered by hierarchy) members. self.loaddirectory(self.sectDirStart)#i32(header, 48)) self.ministream = None From a662a94316d31f719c7d8786febbf94bc3620dcf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 28 May 2015 23:11:51 +1000 Subject: [PATCH 505/532] Updated i16 and i32 to be in sync with _binary --- PIL/OleFileIO.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index f4cbc8fc6..4cf106d97 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -477,23 +477,20 @@ def i16(c, o = 0): """ Converts a 2-bytes (16 bits) string to an integer. - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string + c: string containing bytes to convert + o: offset of bytes to convert in string """ - return i8(c[o]) | (i8(c[o+1])<<8) + return struct.unpack(" Date: Fri, 29 May 2015 14:59:54 +1000 Subject: [PATCH 506/532] Fixed various typos --- PIL/Image.py | 2 +- PIL/ImageCms.py | 12 ++++++------ PIL/JpegImagePlugin.py | 2 +- PIL/TiffImagePlugin.py | 6 +++--- Tests/test_image_resize.py | 2 +- Tests/test_imagedraw.py | 20 ++++++++++---------- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 274e7ee0e..1c95bfca0 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1810,7 +1810,7 @@ class Image(object): self.readonly = 0 self.pyaccess = None - # FIXME: the different tranform methods need further explanation + # FIXME: the different transform methods need further explanation # instead of bloating the method docs, add a separate chapter. def transform(self, size, method, data=None, resample=NEAREST, fill=1): """ diff --git a/PIL/ImageCms.py b/PIL/ImageCms.py index 6cd2f5d2d..ebf127df3 100644 --- a/PIL/ImageCms.py +++ b/PIL/ImageCms.py @@ -64,7 +64,7 @@ pyCMS 0.0.2 alpha Jan 6, 2002 - Added try/except statements arount type() checks of + Added try/except statements around type() checks of potential CObjects... Python won't let you use type() on them, and raises a TypeError (stupid, if you ask me!) @@ -123,8 +123,8 @@ FLAGS = { "NOTCACHE": 64, # Inhibit 1-pixel cache "NOTPRECALC": 256, "NULLTRANSFORM": 512, # Don't transform anyway - "HIGHRESPRECALC": 1024, # Use more memory to give better accurancy - "LOWRESPRECALC": 2048, # Use less memory to minimize resouces + "HIGHRESPRECALC": 1024, # Use more memory to give better accuracy + "LOWRESPRECALC": 2048, # Use less memory to minimize resources "WHITEBLACKCOMPENSATION": 8192, "BLACKPOINTCOMPENSATION": 8192, "GAMUTCHECK": 4096, # Out of Gamut alarm @@ -573,7 +573,7 @@ def applyTransform(im, transform, inPlace=0): This function applies a pre-calculated transform (from ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) to an image. The transform can be used for multiple images, saving - considerable calcuation time if doing the same conversion multiple times. + considerable calculation time if doing the same conversion multiple times. If you want to modify im in-place instead of receiving a new image as the return value, set inPlace to TRUE. This can only be done if @@ -858,7 +858,7 @@ def getDefaultIntent(profile): If an error occurs while trying to obtain the default intent, a PyCMSError is raised. - Use this function to determine the default (and usually best optomized) + Use this function to determine the default (and usually best optimized) rendering intent for this profile. Most profiles support multiple rendering intents, but are intended mostly for one type of conversion. If you wish to use a different intent than returned, use @@ -914,7 +914,7 @@ def isIntentSupported(profile, intent, direction): see the pyCMS documentation for details on rendering intents and what they do. - :param direction: Integer specifing if the profile is to be used for input, + :param direction: Integer specifying if the profile is to be used for input, output, or proof INPUT = 0 (or use ImageCms.DIRECTION_INPUT) diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index e15042504..5cae90073 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -4,7 +4,7 @@ # # JPEG (JFIF) file handling # -# See "Digital Compression and Coding of Continous-Tone Still Images, +# See "Digital Compression and Coding of Continuous-Tone Still Images, # Part 1, Requirements and Guidelines" (CCITT T.81 / ISO 10918-1) # # History: diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index ad085451b..f89c5b784 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -294,7 +294,7 @@ class ImageFileDirectory(collections.MutableMapping): def named(self): """ - Returns the complete tag dictionary, with named tags where posible. + Returns the complete tag dictionary, with named tags where possible. """ from PIL import TiffTags result = {} @@ -749,7 +749,7 @@ class TiffImageFile(ImageFile.ImageFile): # # Rearranging for supporting byteio items, since they have a fileno # that returns an IOError if there's no underlying fp. Easier to - # dea. with here by reordering. + # deal with here by reordering. if Image.DEBUG: print("have getvalue. just sending in a string from getvalue") n, err = decoder.decode(self.fp.getvalue()) @@ -985,7 +985,7 @@ class TiffImageFile(ImageFile.ImageFile): # Write TIFF files # little endian is default except for image modes with -# explict big endian byte-order +# explicit big endian byte-order SAVE_INFO = { # mode => rawmode, byteorder, photometrics, diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py index 414758529..d59f8ba14 100644 --- a/Tests/test_image_resize.py +++ b/Tests/test_image_resize.py @@ -54,7 +54,7 @@ class TestImagingCoreResize(PillowTestCase): # Make an image with one colored pixel, in one channel. # When resized, that channel should be the same as a GS image. # Other channels should be unaffected. - # The R and A channels should not swap, which is indicitive of + # The R and A channels should not swap, which is indicative of # an endianness issues. samples = { diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 3b9919834..a1ed20a3a 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -300,32 +300,32 @@ class TestImageDraw(PillowTestCase): img, draw = self.create_base_image_draw((20, 20)) draw.line((5, 5, 14, 5), BLACK, 2) self.assert_image_equal( - img, expected, 'line straigth horizontal normal 2px wide failed') + img, expected, 'line straight horizontal normal 2px wide failed') expected = Image.open(os.path.join(IMAGES_PATH, 'line_horizontal_w2px_inverted.png')) expected.load() img, draw = self.create_base_image_draw((20, 20)) draw.line((14, 5, 5, 5), BLACK, 2) self.assert_image_equal( - img, expected, 'line straigth horizontal inverted 2px wide failed') + img, expected, 'line straight horizontal inverted 2px wide failed') expected = Image.open(os.path.join(IMAGES_PATH, 'line_horizontal_w3px.png')) expected.load() img, draw = self.create_base_image_draw((20, 20)) draw.line((5, 5, 14, 5), BLACK, 3) self.assert_image_equal( - img, expected, 'line straigth horizontal normal 3px wide failed') + img, expected, 'line straight horizontal normal 3px wide failed') img, draw = self.create_base_image_draw((20, 20)) draw.line((14, 5, 5, 5), BLACK, 3) self.assert_image_equal( - img, expected, 'line straigth horizontal inverted 3px wide failed') + img, expected, 'line straight horizontal inverted 3px wide failed') expected = Image.open(os.path.join(IMAGES_PATH, 'line_horizontal_w101px.png')) expected.load() img, draw = self.create_base_image_draw((200, 110)) draw.line((5, 55, 195, 55), BLACK, 101) self.assert_image_equal( - img, expected, 'line straigth horizontal 101px wide failed') + img, expected, 'line straight horizontal 101px wide failed') def test_line_h_s1_w2(self): self.skipTest('failing') @@ -344,32 +344,32 @@ class TestImageDraw(PillowTestCase): img, draw = self.create_base_image_draw((20, 20)) draw.line((5, 5, 5, 14), BLACK, 2) self.assert_image_equal( - img, expected, 'line straigth vertical normal 2px wide failed') + img, expected, 'line straight vertical normal 2px wide failed') expected = Image.open(os.path.join(IMAGES_PATH, 'line_vertical_w2px_inverted.png')) expected.load() img, draw = self.create_base_image_draw((20, 20)) draw.line((5, 14, 5, 5), BLACK, 2) self.assert_image_equal( - img, expected, 'line straigth vertical inverted 2px wide failed') + img, expected, 'line straight vertical inverted 2px wide failed') expected = Image.open(os.path.join(IMAGES_PATH, 'line_vertical_w3px.png')) expected.load() img, draw = self.create_base_image_draw((20, 20)) draw.line((5, 5, 5, 14), BLACK, 3) self.assert_image_equal( - img, expected, 'line straigth vertical normal 3px wide failed') + img, expected, 'line straight vertical normal 3px wide failed') img, draw = self.create_base_image_draw((20, 20)) draw.line((5, 14, 5, 5), BLACK, 3) self.assert_image_equal( - img, expected, 'line straigth vertical inverted 3px wide failed') + img, expected, 'line straight vertical inverted 3px wide failed') expected = Image.open(os.path.join(IMAGES_PATH, 'line_vertical_w101px.png')) expected.load() img, draw = self.create_base_image_draw((110, 200)) draw.line((55, 5, 55, 195), BLACK, 101) self.assert_image_equal(img, expected, - 'line straigth vertical 101px wide failed') + 'line straight vertical 101px wide failed') expected = Image.open(os.path.join(IMAGES_PATH, 'line_vertical_slope1px_w2px.png')) expected.load() From 6c12205aea963aa9f656048ab2959489713baf0d Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 29 May 2015 08:12:39 +0300 Subject: [PATCH 507/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 2bd4ff0a0..15ab14fb3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.9.0 (Unreleased) ------------------ +- Upgrade olefile from 0.30 to 0.42b #1226 + [radarhere, decalage2] + - Setting transparency value to 0 when the tRNS contains only null byte(s) #1239 [juztin] From e58a773c29838e3a59a9245cb7113992dcce195e Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 29 May 2015 18:30:57 +0300 Subject: [PATCH 508/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 15ab14fb3..ae485811d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.9.0 (Unreleased) ------------------ +- Ico files are little endian #1232 + [wiredfool] + - Upgrade olefile from 0.30 to 0.42b #1226 [radarhere, decalage2] From 9f79e4a32048863f7f0e2a10c13d2177d6a3754e Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 4 Jun 2015 13:08:59 +0300 Subject: [PATCH 509/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index ae485811d..9c8c04d1c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.9.0 (Unreleased) ------------------ +- Add duration and loop set to GifImagePlugin #1172 + [radarhere] + - Ico files are little endian #1232 [wiredfool] From ed2cca1e7118b9cfc700c843ea8e05c8efd95b4b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 7 Jun 2015 00:09:54 +1000 Subject: [PATCH 510/532] Fixed Tiff handling of bad EXIF data --- PIL/TiffImagePlugin.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index f89c5b784..41bb26d42 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -426,6 +426,11 @@ class ImageFileDirectory(collections.MutableMapping): for i in range(i16(fp.read(2))): ifd = fp.read(12) + if len(ifd) != 12: + warnings.warn("Possibly corrupt EXIF data. " + "Expecting to read 12 bytes but only got %d." + % (len(ifd))) + continue tag, typ = i16(ifd), i16(ifd, 2) @@ -476,7 +481,14 @@ class ImageFileDirectory(collections.MutableMapping): else: print("- value:", self[tag]) - self.next = i32(fp.read(4)) + ifd = fp.read(4) + if len(ifd) != 4: + warnings.warn("Possibly corrupt EXIF data. " + "Expecting to read 4 bytes but only got %d." + % (len(ifd))) + return + + self.next = i32(ifd) # save primitives From 109ec638d9d251d29d0a05c3885dec083e6a923f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 7 Jun 2015 00:04:39 +1000 Subject: [PATCH 511/532] Added test for bad EXIF data --- Tests/images/hopper_bad_exif.jpg | Bin 0 -> 128826 bytes Tests/test_file_tiff.py | 8 ++++++++ 2 files changed, 8 insertions(+) create mode 100644 Tests/images/hopper_bad_exif.jpg diff --git a/Tests/images/hopper_bad_exif.jpg b/Tests/images/hopper_bad_exif.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4cfeea1dc473e941cae1d28dee5c7936c87a210b GIT binary patch literal 128826 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index c51f46a04..745412324 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -3,6 +3,8 @@ from helper import unittest, PillowTestCase, hopper, py3 from PIL import Image, TiffImagePlugin +import struct + class TestFileTiff(PillowTestCase): @@ -77,6 +79,12 @@ class TestFileTiff(PillowTestCase): im._setup() self.assertEqual(im.info['dpi'], (72., 72.)) + def test_bad_exif(self): + try: + Image.open('Tests/images/hopper_bad_exif.jpg')._getexif() + except struct.error: + self.fail("Bad EXIF data should not pass incorrect values to _binary unpack") + def test_little_endian(self): im = Image.open('Tests/images/16bit.cropped.tif') self.assertEqual(im.getpixel((0, 0)), 480) From b680d863790156a4a57a33c4d178f3d2de6c8a45 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 6 Jun 2015 19:53:56 -0400 Subject: [PATCH 512/532] Add 2.8.2 release info [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 9c8c04d1c..4f32f7e40 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -40,6 +40,12 @@ Changelog (Pillow) - Tiff: allow writing floating point tag values #1113 [bpedersen2] +2.8.2 (2015-06-06) +------------------ + +- Bug fix: Fixed Tiff handling of bad EXIF data + [radarhere] + 2.8.1 (2015-04-02) ------------------ From b4503f6cd45502a01e5c84319d68231ef8d4f79d Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 6 Jun 2015 20:27:09 -0400 Subject: [PATCH 513/532] Make sure we upload a tar.gz too, Part 2 [ci skip] Do a better job: - Add gztar to --format instead of calling setup.py twice - Create same sdists across all targets not just upload --- Makefile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index a729e4088..27ec990b7 100644 --- a/Makefile +++ b/Makefile @@ -67,9 +67,8 @@ docserver: # password: # repository = http://test.pythonpackages.com sdisttest: - python setup.py sdist --format=zip upload -r test + python setup.py sdist --format=gztar,zip upload -r test sdistup: - python setup.py sdist --format=zip upload - python setup.py sdist upload + python setup.py sdist --format=gztar,zip upload sdist: - python setup.py sdist --format=zip + python setup.py sdist --format=gztar,zip From d31c6c7847f242ccd2eef1be01a74ca5abaa3384 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 7 Jun 2015 09:38:09 -0400 Subject: [PATCH 514/532] Clean up Makefile and requirements.txt [ci skip] - Remove relative calls to pip, python (assume virtualenv activated or otherwise "safe" global env) - Full define development and documentation requirements in requirements.txt ``make test-dep`` installs documentation dependencies too, hopefully that's not too annoying. This means development process for documentation and code can begin with: virtualenv . source bin/activate pip install -r requirements.txt --- Makefile | 14 +++++++------- requirements.txt | 7 ++++++- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 27ec990b7..08a147220 100644 --- a/Makefile +++ b/Makefile @@ -14,12 +14,12 @@ help: pre: virtualenv . - bin/pip install -r requirements.txt - bin/python setup.py develop - bin/python selftest.py - bin/nosetests Tests/test_*.py - bin/python setup.py install - bin/python test-installed.py + pip install -r requirements.txt + python setup.py develop + python selftest.py + nosetests Tests/test_*.py + python setup.py install + python test-installed.py check-manifest pyroma . viewdoc @@ -52,7 +52,7 @@ coverage: coverage report test-dep: - pip install coveralls nose nose-cov pep8 pyflakes + pip install -r requirements.txt docs: $(MAKE) -C docs html diff --git a/requirements.txt b/requirements.txt index 86ddbd771..bd37d7ba9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,8 @@ -# Testing reqs +# Testing and documentation requirements -e . +-r docs/requirements.txt +coveralls nose +nose-cov +pep8 +pyflakes From 19432c3e531921a543e49567871272cc1b54d742 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 7 Jun 2015 09:45:26 -0400 Subject: [PATCH 515/532] Clean up Makefile [ci skip] - Clean up test.pythonpackages.com setup description --- Makefile | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 08a147220..6755e9b65 100644 --- a/Makefile +++ b/Makefile @@ -60,12 +60,13 @@ docs: docserver: cd docs/_build/html && python -mSimpleHTTPServer 2> /dev/null& -# Test sdist upload via test.pythonpackages.com, no creds required -# .pypirc: -# [test] -# username: -# password: -# repository = http://test.pythonpackages.com +# Test sdist upload via test.pythonpackages.com. Create .pypirc first: +# +# [test] +# username: +# password: +# repository = http://test.pythonpackages.com +# sdisttest: python setup.py sdist --format=gztar,zip upload -r test sdistup: From 0706f6b50459b8e6f33b1c5da94a01d2761981c7 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 7 Jun 2015 09:50:01 -0400 Subject: [PATCH 516/532] Clean up Makefile [ci skip] - Rename test-dep -> install-req to better describe what target does; keep target name short. --- Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 6755e9b65..2134b3a43 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: pre clean install test inplace coverage test-dep help docs livedocs +.PHONY: pre clean install install-req test inplace coverage help docs livedocs help: @echo "Please use \`make ' where is one of" @@ -10,7 +10,7 @@ help: @echo " coverage run coverage test (in progress)" @echo " docs make html docs" @echo " docserver run an http server on the docs directory" - @echo " test-dep install coveraget and test dependencies" + @echo " install-req install documentation and test dependencies" pre: virtualenv . @@ -34,6 +34,9 @@ install: python setup.py install python selftest.py --installed +install-req: + pip install -r requirements.txt + test: python test-installed.py @@ -51,9 +54,6 @@ coverage: coverage combine coverage report -test-dep: - pip install -r requirements.txt - docs: $(MAKE) -C docs html From 91d5da745ffe77c1b8f1a7f26b82700d2a4c8dec Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 7 Jun 2015 09:54:02 -0400 Subject: [PATCH 517/532] Clean up Makefile [ci skip] - Rename sdistup, sdisttest -> upload, upload-test to better reflect what target does; keep target name short; add targets to help --- Makefile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 2134b3a43..004b807ea 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,8 @@ help: @echo " docs make html docs" @echo " docserver run an http server on the docs directory" @echo " install-req install documentation and test dependencies" + @echo " upload upload sdists to PyPI" + @echo " upload-test upload sdists to test.pythonpackages.com" pre: virtualenv . @@ -67,9 +69,9 @@ docserver: # password: # repository = http://test.pythonpackages.com # -sdisttest: +upload-test: python setup.py sdist --format=gztar,zip upload -r test -sdistup: +upload: python setup.py sdist --format=gztar,zip upload sdist: python setup.py sdist --format=gztar,zip From 99b4da48dce1d4f0585295ca29e883b4486c4782 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 7 Jun 2015 09:59:46 -0400 Subject: [PATCH 518/532] Clean up Makefile [ci skip] - Rename ``pre`` -> ``release-test`` - Remove virtualenv creation and call ``install-req`` from ``release-test`` --- Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 004b807ea..bcc02d13c 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: pre clean install install-req test inplace coverage help docs livedocs +.PHONY: release-test clean install install-req test inplace coverage help docs livedocs help: @echo "Please use \`make ' where is one of" @@ -11,12 +11,12 @@ help: @echo " docs make html docs" @echo " docserver run an http server on the docs directory" @echo " install-req install documentation and test dependencies" - @echo " upload upload sdists to PyPI" - @echo " upload-test upload sdists to test.pythonpackages.com" + @echo " upload build and upload sdists to PyPI" + @echo " upload-test build and upload sdists to test.pythonpackages.com" + @echo " release-test run code and package tests before release" -pre: - virtualenv . - pip install -r requirements.txt +release-test: + $(MAKE) install-req python setup.py develop python selftest.py nosetests Tests/test_*.py From e3d5306bde2f7fe214c5aaf72af8535cc061265d Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 7 Jun 2015 10:03:31 -0400 Subject: [PATCH 519/532] Clean up Makefile [ci skip] - Alpha sort and add missing targets (though we may only need ones that are known to cause target execution issues) --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index bcc02d13c..9c44dfbf2 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,6 @@ -.PHONY: release-test clean install install-req test inplace coverage help docs livedocs +# https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html +# XXX Do we need all these phony targets? +.PHONY: clean coverage docs docserver help inplace install install-req release-test sdist test upload upload-test help: @echo "Please use \`make ' where is one of" From 7dafa9a97e2b4b357a0774c5444e2db866dfa2a1 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 7 Jun 2015 10:08:38 -0400 Subject: [PATCH 520/532] Clean up Makefile [ci skip] - Alpha sort targets and help targets - Add welcome message --- Makefile | 84 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/Makefile b/Makefile index 9c44dfbf2..a5878e486 100644 --- a/Makefile +++ b/Makefile @@ -2,51 +2,12 @@ # XXX Do we need all these phony targets? .PHONY: clean coverage docs docserver help inplace install install-req release-test sdist test upload upload-test -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " clean remove build products" - @echo " install make and install" - @echo " test run tests on installed pillow" - @echo " inplace make inplace extension" - @echo " coverage run coverage test (in progress)" - @echo " docs make html docs" - @echo " docserver run an http server on the docs directory" - @echo " install-req install documentation and test dependencies" - @echo " upload build and upload sdists to PyPI" - @echo " upload-test build and upload sdists to test.pythonpackages.com" - @echo " release-test run code and package tests before release" - -release-test: - $(MAKE) install-req - python setup.py develop - python selftest.py - nosetests Tests/test_*.py - python setup.py install - python test-installed.py - check-manifest - pyroma . - viewdoc - clean: python setup.py clean rm PIL/*.so || true rm -r build || true find . -name __pycache__ | xargs rm -r || true -install: - python setup.py install - python selftest.py --installed - -install-req: - pip install -r requirements.txt - -test: - python test-installed.py - -inplace: clean - python setup.py build_ext --inplace - coverage: # requires nose-cov coverage erase @@ -64,6 +25,48 @@ docs: docserver: cd docs/_build/html && python -mSimpleHTTPServer 2> /dev/null& +help: + @echo "Welcome to Pillow development. Please use \`make ' where is one of" + @echo " clean remove build products" + @echo " coverage run coverage test (in progress)" + @echo " docs make html docs" + @echo " docserver run an http server on the docs directory" + @echo " html to make standalone HTML files" + @echo " inplace make inplace extension" + @echo " install make and install" + @echo " install-req install documentation and test dependencies" + @echo " release-test run code and package tests before release" + @echo " test run tests on installed pillow" + @echo " upload build and upload sdists to PyPI" + @echo " upload-test build and upload sdists to test.pythonpackages.com" + +inplace: clean + python setup.py build_ext --inplace + +install: + python setup.py install + python selftest.py --installed + +install-req: + pip install -r requirements.txt + +release-test: + $(MAKE) install-req + python setup.py develop + python selftest.py + nosetests Tests/test_*.py + python setup.py install + python test-installed.py + check-manifest + pyroma . + viewdoc + +sdist: + python setup.py sdist --format=gztar,zip + +test: + python test-installed.py + # Test sdist upload via test.pythonpackages.com. Create .pypirc first: # # [test] @@ -73,7 +76,6 @@ docserver: # upload-test: python setup.py sdist --format=gztar,zip upload -r test + upload: python setup.py sdist --format=gztar,zip upload -sdist: - python setup.py sdist --format=gztar,zip From 5f4e407927c4d02255d2267d9677efebb826bf1d Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 7 Jun 2015 10:18:31 -0400 Subject: [PATCH 521/532] Clean up Makefile [ci skip] - Rename targets docs, docserver -> doc, docserve; shorten - Rename help and phony targets --- Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index a5878e486..85b644a83 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html # XXX Do we need all these phony targets? -.PHONY: clean coverage docs docserver help inplace install install-req release-test sdist test upload upload-test +.PHONY: clean coverage doc docserve help inplace install install-req release-test sdist test upload upload-test clean: python setup.py clean @@ -19,18 +19,18 @@ coverage: coverage combine coverage report -docs: +doc: $(MAKE) -C docs html -docserver: +docserve: cd docs/_build/html && python -mSimpleHTTPServer 2> /dev/null& help: @echo "Welcome to Pillow development. Please use \`make ' where is one of" @echo " clean remove build products" @echo " coverage run coverage test (in progress)" - @echo " docs make html docs" - @echo " docserver run an http server on the docs directory" + @echo " doc make html docs" + @echo " docserve run an http server on the docs directory" @echo " html to make standalone HTML files" @echo " inplace make inplace extension" @echo " install make and install" From 70b2be6bd5c253478b88f164d69b28db9237327b Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 7 Jun 2015 10:22:15 -0400 Subject: [PATCH 522/532] Clean up Makefile [ci skip] - Remove nose-cov comment: we know from requirements.txt that nose-cov is required. - Phony targets comment: who cares? We'll just keep listing them all for now. URL still helpful. - Coverage report comment: I don't get it. Reformat and add "XXX" to draw attention from someone who does. --- Makefile | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 85b644a83..9a0deb90c 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,4 @@ # https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -# XXX Do we need all these phony targets? .PHONY: clean coverage doc docserve help inplace install install-req release-test sdist test upload upload-test clean: @@ -9,12 +8,10 @@ clean: find . -name __pycache__ | xargs rm -r || true coverage: -# requires nose-cov coverage erase coverage run --parallel-mode --include=PIL/* selftest.py nosetests --with-cov --cov='PIL/' --cov-report=html Tests/test_*.py -# doesn't combine properly before report, -# writing report instead of displaying invalid report +# XXX Doesn't combine properly before report, writing report instead of displaying invalid report. rm -r htmlcov || true coverage combine coverage report @@ -29,8 +26,8 @@ help: @echo "Welcome to Pillow development. Please use \`make ' where is one of" @echo " clean remove build products" @echo " coverage run coverage test (in progress)" - @echo " doc make html docs" - @echo " docserve run an http server on the docs directory" + @echo " doc make html docs" + @echo " docserve run an http server on the docs directory" @echo " html to make standalone HTML files" @echo " inplace make inplace extension" @echo " install make and install" From e69d028b6ee1e92763a23a59fcb2bb8d3bf6254e Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 7 Jun 2015 10:28:40 -0400 Subject: [PATCH 523/532] Clean up Makefile [ci skip] --- Makefile | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 9a0deb90c..bd2d3add3 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ coverage: coverage erase coverage run --parallel-mode --include=PIL/* selftest.py nosetests --with-cov --cov='PIL/' --cov-report=html Tests/test_*.py -# XXX Doesn't combine properly before report, writing report instead of displaying invalid report. +# Doesn't combine properly before report, writing report instead of displaying invalid report. rm -r htmlcov || true coverage combine coverage report @@ -64,14 +64,12 @@ sdist: test: python test-installed.py -# Test sdist upload via test.pythonpackages.com. Create .pypirc first: -# -# [test] -# username: -# password: -# repository = http://test.pythonpackages.com -# +# https://docs.python.org/2/distutils/packageindex.html#the-pypirc-file upload-test: +# [test] +# username: +# password: +# repository = http://test.pythonpackages.com python setup.py sdist --format=gztar,zip upload -r test upload: From 9a333c89968950c1d87f9f82272df86962a57495 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 7 Jun 2015 10:29:52 -0400 Subject: [PATCH 524/532] Clean up --- Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index bd2d3add3..4d96c497d 100644 --- a/Makefile +++ b/Makefile @@ -66,10 +66,10 @@ test: # https://docs.python.org/2/distutils/packageindex.html#the-pypirc-file upload-test: -# [test] -# username: -# password: -# repository = http://test.pythonpackages.com +# [test] +# username: +# password: +# repository = http://test.pythonpackages.com python setup.py sdist --format=gztar,zip upload -r test upload: From 1b80fe5507060e316ad8bc0766c33cef856adc0a Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Tue, 14 Apr 2015 17:43:05 -0700 Subject: [PATCH 525/532] Provide n_frames attribute to multi-frame formats. cf #1190, #1192. Tests missing. --- PIL/DcxImagePlugin.py | 4 ++++ PIL/FliImagePlugin.py | 35 ++++++++++++++++++++++++++++++----- PIL/GifImagePlugin.py | 23 ++++++++++++++++++++++- PIL/ImImagePlugin.py | 4 ++++ PIL/MicImagePlugin.py | 4 ++++ PIL/MpoImagePlugin.py | 4 ++++ PIL/PsdImagePlugin.py | 4 ++++ PIL/SpiderImagePlugin.py | 10 +++++++--- PIL/TiffImagePlugin.py | 33 ++++++++++++++++++++++----------- 9 files changed, 101 insertions(+), 20 deletions(-) diff --git a/PIL/DcxImagePlugin.py b/PIL/DcxImagePlugin.py index 0940b3935..978c90e80 100644 --- a/PIL/DcxImagePlugin.py +++ b/PIL/DcxImagePlugin.py @@ -62,6 +62,10 @@ class DcxImageFile(PcxImageFile): self.__fp = self.fp self.seek(0) + @property + def n_frames(self): + return len(self._offset) + def seek(self, frame): if frame >= len(self._offset): raise EOFError("attempt to seek outside DCX directory") diff --git a/PIL/FliImagePlugin.py b/PIL/FliImagePlugin.py index 4ecaccdc4..1acae31bf 100644 --- a/PIL/FliImagePlugin.py +++ b/PIL/FliImagePlugin.py @@ -86,9 +86,10 @@ class FliImageFile(ImageFile.ImageFile): self.palette = ImagePalette.raw("RGB", b"".join(palette)) # set things up to decode first frame - self.frame = -1 + self.__frame = -1 self.__fp = self.fp - + self.__rewind = self.fp.tell() + self._n_frames = None self.seek(0) def _palette(self, palette, shift): @@ -109,11 +110,35 @@ class FliImageFile(ImageFile.ImageFile): palette[i] = (r, g, b) i += 1 + @property + def n_frames(self): + if self._n_frames is None: + current = self.tell() + try: + while True: + self.seek(self.tell() + 1) + except EOFError: + self._n_frames = self.tell() + 1 + self.seek(current) + return self._n_frames + + def seek(self, frame): + if frame == self.__frame: + return + if frame < self.__frame: + self._seek(0) + for f in range(self.__frame + 1, frame + 1): + self._seek(f) + def seek(self, frame): - if frame != self.frame + 1: + if frame == 0: + self.__frame = -1 + self.__fp.seek(self.__rewind) + + if frame != self.__frame + 1: raise ValueError("cannot seek to frame %d" % frame) - self.frame = frame + self.__frame = frame # move to next frame self.fp = self.__fp @@ -132,7 +157,7 @@ class FliImageFile(ImageFile.ImageFile): def tell(self): - return self.frame + return self.__frame # # registry diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 283300320..150773b67 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -87,9 +87,30 @@ class GifImageFile(ImageFile.ImageFile): self.__fp = self.fp # FIXME: hack self.__rewind = self.fp.tell() - self.seek(0) # get ready to read first frame + self._n_frames = None + self._seek(0) # get ready to read first frame + + @property + def n_frames(self): + if self._n_frames is None: + current = self.tell() + try: + while True: + self.seek(self.tell() + 1) + except EOFError: + self._n_frames = self.tell() + 1 + self.seek(current) + return self._n_frames def seek(self, frame): + if frame == self.__frame: + return + if frame < self.__frame: + self._seek(0) + for f in range(self.__frame + 1, frame + 1): + self._seek(f) + + def _seek(self, frame): if frame == 0: # rewind diff --git a/PIL/ImImagePlugin.py b/PIL/ImImagePlugin.py index c68a3cea4..589928d0e 100644 --- a/PIL/ImImagePlugin.py +++ b/PIL/ImImagePlugin.py @@ -260,6 +260,10 @@ class ImImageFile(ImageFile.ImageFile): self.tile = [("raw", (0, 0)+self.size, offs, (self.rawmode, 0, -1))] + @property + def n_frames(self): + return self.info[FRAMES] + def seek(self, frame): if frame < 0 or frame >= self.info[FRAMES]: diff --git a/PIL/MicImagePlugin.py b/PIL/MicImagePlugin.py index 5aed618ac..aa41bf359 100644 --- a/PIL/MicImagePlugin.py +++ b/PIL/MicImagePlugin.py @@ -71,6 +71,10 @@ class MicImageFile(TiffImagePlugin.TiffImageFile): self.seek(0) + @property + def n_frames(self): + return len(self.images) + def seek(self, frame): try: diff --git a/PIL/MpoImagePlugin.py b/PIL/MpoImagePlugin.py index c345fd327..9d21728b9 100644 --- a/PIL/MpoImagePlugin.py +++ b/PIL/MpoImagePlugin.py @@ -62,6 +62,10 @@ class MpoImageFile(JpegImagePlugin.JpegImageFile): def load_seek(self, pos): self.__fp.seek(pos) + @property + def n_frames(self): + return self.__framecount + def seek(self, frame): if frame < 0 or frame >= self.__framecount: raise EOFError("no more images in MPO file") diff --git a/PIL/PsdImagePlugin.py b/PIL/PsdImagePlugin.py index 02c94a860..d30695adb 100644 --- a/PIL/PsdImagePlugin.py +++ b/PIL/PsdImagePlugin.py @@ -132,6 +132,10 @@ class PsdImageFile(ImageFile.ImageFile): self._fp = self.fp self.frame = 0 + @property + def n_frames(self): + return len(self.layers) + def seek(self, layer): # seek to given layer (1..max) if layer == self.frame: diff --git a/PIL/SpiderImagePlugin.py b/PIL/SpiderImagePlugin.py index f1ccb67f6..7de5156b1 100644 --- a/PIL/SpiderImagePlugin.py +++ b/PIL/SpiderImagePlugin.py @@ -127,12 +127,12 @@ class SpiderImageFile(ImageFile.ImageFile): if self.istack == 0 and self.imgnumber == 0: # stk=0, img=0: a regular 2D image offset = hdrlen - self.nimages = 1 + self._nimages = 1 elif self.istack > 0 and self.imgnumber == 0: # stk>0, img=0: Opening the stack for the first time self.imgbytes = int(h[12]) * int(h[2]) * 4 self.hdrlen = hdrlen - self.nimages = int(h[26]) + self._nimages = int(h[26]) # Point to the first image in the stack offset = hdrlen * 2 self.imgnumber = 1 @@ -154,6 +154,10 @@ class SpiderImageFile(ImageFile.ImageFile): (self.rawmode, 0, 1))] self.__fp = self.fp # FIXME: hack + @property + def n_frames(self): + return self._nimages + # 1st image index is zero (although SPIDER imgnumber starts at 1) def tell(self): if self.imgnumber < 1: @@ -164,7 +168,7 @@ class SpiderImageFile(ImageFile.ImageFile): def seek(self, frame): if self.istack == 0: return - if frame >= self.nimages: + if frame >= self._nimages: raise EOFError("attempt to seek past end of file") self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes) self.fp = self.__fp diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 41bb26d42..8fdca05de 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -648,6 +648,8 @@ class TiffImageFile(ImageFile.ImageFile): self.__first = self.__next = self.ifd.i32(ifh, 4) self.__frame = -1 self.__fp = self.fp + self._frame_pos = [] + self._n_frames = None if Image.DEBUG: print("*** TiffImageFile._open ***") @@ -657,10 +659,22 @@ class TiffImageFile(ImageFile.ImageFile): # and load the first frame self._seek(0) + @property + def n_frames(self): + if self._n_frames is None: + current = self.tell() + try: + while True: + self._seek(self.tell() + 1) + except EOFError: + self._n_frames = self.tell() + 1 + self.seek(current) + return self._n_frames + def seek(self, frame): "Select a given frame as current image" if frame < 0: - frame = 0 + raise ValueError("invalid seek") self._seek(frame) # Create a new core image object on second and # subsequent frames in the image. Image may be @@ -668,17 +682,9 @@ class TiffImageFile(ImageFile.ImageFile): Image._decompression_bomb_check(self.size) self.im = Image.core.new(self.mode, self.size) - def tell(self): - "Return the current frame number" - return self._tell() - def _seek(self, frame): self.fp = self.__fp - if frame < self.__frame: - # rewind file - self.__frame = -1 - self.__next = self.__first - while self.__frame < frame: + while len(self._frame_pos) <= frame: if not self.__next: raise EOFError("no more images in TIFF file") if Image.DEBUG: @@ -688,14 +694,19 @@ class TiffImageFile(ImageFile.ImageFile): # was passed to libtiff, invalidating the buffer self.fp.tell() self.fp.seek(self.__next) + self._frame_pos.append(self.__next) if Image.DEBUG: print("Loading tags, location: %s" % self.fp.tell()) self.tag.load(self.fp) self.__next = self.tag.next self.__frame += 1 + self.fp.seek(self._frame_pos[frame]) + self.tag.load(self.fp) + self.__frame = frame self._setup() - def _tell(self): + def tell(self): + "Return the current frame number" return self.__frame def _decoder(self, rawmode, layer, tile=None): From 51f3560dc45dd39d14d67108ddc5b95b9bd3aa84 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Thu, 23 Apr 2015 01:06:32 -0700 Subject: [PATCH 526/532] Restore negative seeks for TIFF. --- PIL/TiffImagePlugin.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 8fdca05de..59de84273 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -673,9 +673,7 @@ class TiffImageFile(ImageFile.ImageFile): def seek(self, frame): "Select a given frame as current image" - if frame < 0: - raise ValueError("invalid seek") - self._seek(frame) + self._seek(max(frame, 0)) # Questionable backwards compatibility. # Create a new core image object on second and # subsequent frames in the image. Image may be # different size/mode. From 3ad70423add94de5a61fc6ee8f526ad9d0b292d7 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Thu, 23 Apr 2015 11:03:11 -0700 Subject: [PATCH 527/532] Fix typo in FliImagePlugin (seek -> _seek). --- PIL/FliImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/FliImagePlugin.py b/PIL/FliImagePlugin.py index 1acae31bf..178623951 100644 --- a/PIL/FliImagePlugin.py +++ b/PIL/FliImagePlugin.py @@ -130,7 +130,7 @@ class FliImageFile(ImageFile.ImageFile): for f in range(self.__frame + 1, frame + 1): self._seek(f) - def seek(self, frame): + def _seek(self, frame): if frame == 0: self.__frame = -1 From 0c51b7967ed371d3e140d83449ae3910c5b1ea32 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Jun 2015 01:01:50 +1000 Subject: [PATCH 528/532] Fixed seek bug in FliImagePlugin --- PIL/FliImagePlugin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PIL/FliImagePlugin.py b/PIL/FliImagePlugin.py index 178623951..32cd05049 100644 --- a/PIL/FliImagePlugin.py +++ b/PIL/FliImagePlugin.py @@ -135,6 +135,7 @@ class FliImageFile(ImageFile.ImageFile): if frame == 0: self.__frame = -1 self.__fp.seek(self.__rewind) + self.__offset = 128 if frame != self.__frame + 1: raise ValueError("cannot seek to frame %d" % frame) @@ -153,7 +154,7 @@ class FliImageFile(ImageFile.ImageFile): self.decodermaxblock = framesize self.tile = [("fli", (0, 0)+self.size, self.__offset, None)] - self.__offset = self.__offset + framesize + self.__offset += framesize def tell(self): From 46f439604cb0a3d8b034b327d6d99c2bd580f8fc Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Jun 2015 01:01:34 +1000 Subject: [PATCH 529/532] Added tests --- PIL/FliImagePlugin.py | 2 -- Tests/images/hopper.im | Bin 0 -> 49664 bytes Tests/images/hopper_merged.psd | Bin 0 -> 97862 bytes Tests/test_file_dcx.py | 4 ++++ Tests/test_file_fli.py | 4 ++++ Tests/test_file_gif.py | 4 ++++ Tests/test_file_im.py | 33 +++++++++++++++++++++++++++++++++ Tests/test_file_mpo.py | 4 ++++ Tests/test_file_psd.py | 7 +++++++ Tests/test_file_spider.py | 4 ++++ Tests/test_file_tiff.py | 7 +++++++ 11 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 Tests/images/hopper.im create mode 100644 Tests/images/hopper_merged.psd create mode 100644 Tests/test_file_im.py diff --git a/PIL/FliImagePlugin.py b/PIL/FliImagePlugin.py index 32cd05049..0660ddeb6 100644 --- a/PIL/FliImagePlugin.py +++ b/PIL/FliImagePlugin.py @@ -131,7 +131,6 @@ class FliImageFile(ImageFile.ImageFile): self._seek(f) def _seek(self, frame): - if frame == 0: self.__frame = -1 self.__fp.seek(self.__rewind) @@ -157,7 +156,6 @@ class FliImageFile(ImageFile.ImageFile): self.__offset += framesize def tell(self): - return self.__frame # diff --git a/Tests/images/hopper.im b/Tests/images/hopper.im new file mode 100644 index 0000000000000000000000000000000000000000..ceeb01049c98a69b31cd89b5d3f11e327a86d2c0 GIT binary patch literal 49664 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 Aga7~l literal 0 HcmV?d00001 diff --git a/Tests/images/hopper_merged.psd b/Tests/images/hopper_merged.psd new file mode 100644 index 0000000000000000000000000000000000000000..6b5c7ebe1fe8e424b26fa4689d1ba2d6f7f9078b GIT binary patch literal 97862 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_dcx.py b/Tests/test_file_dcx.py index 2acf7b459..7d2ae32d8 100644 --- a/Tests/test_file_dcx.py +++ b/Tests/test_file_dcx.py @@ -30,6 +30,10 @@ class TestFileDcx(PillowTestCase): # Assert self.assertEqual(frame, 0) + def test_n_frames(self): + im = Image.open(TEST_FILE) + self.assertEqual(im.n_frames, 1) + def test_seek_too_far(self): # Arrange im = Image.open(TEST_FILE) diff --git a/Tests/test_file_fli.py b/Tests/test_file_fli.py index e6634c799..04c2006c9 100644 --- a/Tests/test_file_fli.py +++ b/Tests/test_file_fli.py @@ -18,6 +18,10 @@ class TestFileFli(PillowTestCase): self.assertEqual(im.size, (128, 128)) self.assertEqual(im.format, "FLI") + def test_n_frames(self): + im = Image.open(test_file) + self.assertEqual(im.n_frames, 2) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 08b2f10c9..0e9e65a18 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -134,6 +134,10 @@ class TestFileGif(PillowTestCase): except EOFError: self.assertEqual(framecount, 5) + def test_n_frames(self): + im = Image.open("Tests/images/iss634.gif") + self.assertEqual(im.n_frames, 43) + def test_dispose_none(self): img = Image.open("Tests/images/dispose_none.gif") try: diff --git a/Tests/test_file_im.py b/Tests/test_file_im.py new file mode 100644 index 000000000..24e00b2f0 --- /dev/null +++ b/Tests/test_file_im.py @@ -0,0 +1,33 @@ +from helper import unittest, PillowTestCase, hopper + +from PIL import Image + +# sample im +TEST_IM = "Tests/images/hopper.im" + + +class TestFileIm(PillowTestCase): + + def test_sanity(self): + im = Image.open(TEST_IM) + im.load() + self.assertEqual(im.mode, "RGB") + self.assertEqual(im.size, (128, 128)) + self.assertEqual(im.format, "IM") + + def test_n_frames(self): + im = Image.open(TEST_IM) + self.assertEqual(im.n_frames, 1) + + def test_roundtrip(self): + out = self.tempfile('temp.im') + im = hopper() + im.save(out) + reread = Image.open(out) + + self.assert_image_equal(reread, im) + +if __name__ == '__main__': + unittest.main() + +# End of file diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index 7850744af..1a0ebc453 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -95,6 +95,10 @@ class TestFileMpo(PillowTestCase): im.seek(0) self.assertEqual(im.tell(), 0) + def test_n_frames(self): + im = Image.open("Tests/images/sugarshack.mpo") + self.assertEqual(im.n_frames, 2) + def test_image_grab(self): for test_file in test_files: im = Image.open(test_file) diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index 51b8cf3f4..dca3601b2 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -16,6 +16,13 @@ class TestImagePsd(PillowTestCase): self.assertEqual(im.size, (128, 128)) self.assertEqual(im.format, "PSD") + def test_n_frames(self): + im = Image.open("Tests/images/hopper_merged.psd") + self.assertEqual(im.n_frames, 1) + + im = Image.open(test_file) + self.assertEqual(im.n_frames, 2) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_spider.py b/Tests/test_file_spider.py index 7bfedad1a..7d24b2fe5 100644 --- a/Tests/test_file_spider.py +++ b/Tests/test_file_spider.py @@ -42,6 +42,10 @@ class TestImageSpider(PillowTestCase): # Assert self.assertEqual(index, 0) + def test_n_frames(self): + im = Image.open(TEST_FILE) + self.assertEqual(im.n_frames, 1) + def test_loadImageSeries(self): # Arrange not_spider_file = "Tests/images/hopper.ppm" diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 745412324..02a63586c 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -150,6 +150,13 @@ class TestFileTiff(PillowTestCase): self.assertEqual( im.getextrema(), (-3.140936851501465, 3.140684127807617)) + def test_n_frames(self): + im = Image.open('Tests/images/multipage-lastframe.tif') + self.assertEqual(im.n_frames, 1) + + im = Image.open('Tests/images/multipage.tiff') + self.assertEqual(im.n_frames, 3) + def test_multipage(self): # issue #862 im = Image.open('Tests/images/multipage.tiff') From 9e24ae023d67de9822f481d252cdecaa7ded560d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 2 Jun 2015 22:50:22 +1000 Subject: [PATCH 530/532] Fixed various typos --- _imagingcms.c | 2 +- _imagingft.c | 2 +- encode.c | 2 +- libImaging/QuantOctree.c | 4 ++-- libImaging/Resample.c | 2 +- libImaging/TiffDecode.c | 2 +- libImaging/Unpack.c | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/_imagingcms.c b/_imagingcms.c index 3b822006a..cda7c5f1f 100644 --- a/_imagingcms.c +++ b/_imagingcms.c @@ -278,7 +278,7 @@ findLCMStype(char* PILmode) return TYPE_YCbCr_8; } else if (strcmp(PILmode, "LAB") == 0) { - // LabX equvalent like ALab, but not reversed -- no #define in lcms2 + // LabX equivalent like ALab, but not reversed -- no #define in lcms2 return (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)); } diff --git a/_imagingft.c b/_imagingft.c index ad40ee425..d8f6d6338 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -572,7 +572,7 @@ setup_module(PyObject* m) { PyType_Ready(&Font_Type); if (FT_Init_FreeType(&library)) - return 0; /* leave it uninitalized */ + return 0; /* leave it uninitialized */ FT_Library_Version(library, &major, &minor, &patch); diff --git a/encode.c b/encode.c index fef102176..6bdb8c71a 100644 --- a/encode.c +++ b/encode.c @@ -737,7 +737,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) return NULL; } - // While failes on 64 bit machines, complains that pos is an int instead of a Py_ssize_t + // While fails on 64 bit machines, complains that pos is an int instead of a Py_ssize_t // while (PyDict_Next(dir, &pos, &key, &value)) { for (pos=0;pos 64). For a quantization to 256 colors all 64 coarse colors will be used @@ -421,7 +421,7 @@ int quantize_octree(Pixel *pixelData, /* add fine colors to the lookup cube */ add_lookup_buckets(lookupCube, paletteBuckets, nFineColors, nCoarseColors); - /* create result pixles and map palatte indices */ + /* create result pixels and map palette indices */ qp = malloc(sizeof(Pixel)*nPixels); if (!qp) goto error; map_image_pixels(pixelData, nPixels, lookupCube, qp); diff --git a/libImaging/Resample.c b/libImaging/Resample.c index a87f2db83..597fca3e9 100644 --- a/libImaging/Resample.c +++ b/libImaging/Resample.c @@ -2,7 +2,7 @@ * The Python Imaging Library * $Id$ * - * Pillow image resamling support + * Pillow image resampling support * * history: * 2002-03-09 fl Created (for PIL 1.1.3) diff --git a/libImaging/TiffDecode.c b/libImaging/TiffDecode.c index 76bd887a7..25336e7fa 100644 --- a/libImaging/TiffDecode.c +++ b/libImaging/TiffDecode.c @@ -245,7 +245,7 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int // back in. Can't use read encoded stripe. // This thing pretty much requires that I have the whole image in one shot. - // Prehaps a stub version would work better??? + // 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)); diff --git a/libImaging/Unpack.c b/libImaging/Unpack.c index 9db43147f..522e9b04c 100644 --- a/libImaging/Unpack.c +++ b/libImaging/Unpack.c @@ -808,7 +808,7 @@ unpackI12_I16(UINT8* out, const UINT8* in, int pixels){ FillOrder = 2 should be used only when BitsPerSample = 1 and the data is either uncompressed or compressed using CCITT 1D - or 2D compression, to avoid potentially ambigous situations. + or 2D compression, to avoid potentially ambiguous situations. Yeah. I thought so. We'll see how well people read the spec. We've got several fillorder=2 modes in TiffImagePlugin.py From 7ea13e8543e9ebdf72c855912356eb1e85545a0d Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 8 Jun 2015 09:09:25 +0300 Subject: [PATCH 531/532] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 4f32f7e40..518a4244f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.9.0 (Unreleased) ------------------ +- Provide n_frames attribute to multi-frame formats #1261 + [anntzer, radarhere] + - Add duration and loop set to GifImagePlugin #1172 [radarhere] From e9a359ced2da677b14b38c7322f5da0bab089d48 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Mon, 8 Jun 2015 07:24:40 -0400 Subject: [PATCH 532/532] Comment badges Re: #1264 --- README.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 430810f0e..be50c5531 100644 --- a/README.rst +++ b/README.rst @@ -6,15 +6,18 @@ Python Imaging Library (Fork) Pillow is the "friendly PIL fork" by `Alex Clark and Contributors `_. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. -.. image:: https://travis-ci.org/python-pillow/Pillow.svg?branch=master +.. + image:: https://travis-ci.org/python-pillow/Pillow.svg?branch=master :target: https://travis-ci.org/python-pillow/Pillow :alt: Travis CI build status (Linux) -.. image:: https://pypip.in/v/Pillow/badge.png +.. + image:: https://pypip.in/v/Pillow/badge.png :target: https://pypi.python.org/pypi/Pillow/ :alt: Latest PyPI version -.. image:: https://pypip.in/d/Pillow/badge.png +.. + image:: https://pypip.in/d/Pillow/badge.png :target: https://pypi.python.org/pypi/Pillow/ :alt: Number of PyPI downloads