From 4280955385d0ed6222b2a389bb89a18dcbca8347 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 3 Oct 2016 07:08:57 -0700 Subject: [PATCH 001/632] Removed 'MIT-like' from license --- LICENSE | 4 ++-- docs/COPYING | 4 ++-- docs/about.rst | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/LICENSE b/LICENSE index 87743e737..e0e216dea 100644 --- a/LICENSE +++ b/LICENSE @@ -5,9 +5,9 @@ The Python Imaging Library (PIL) is Pillow is the friendly PIL fork. It is - Copyright © 2016 by Alex Clark and contributors + Copyright © 2012-2016 by Alex Clark and contributors -Like PIL, Pillow is licensed under the MIT-like open source PIL Software License: +Like PIL, Pillow is licensed under the open source PIL Software License: By obtaining, using, and/or copying this software and/or its associated documentation, you agree that you have read, understood, and will comply with the following terms and conditions: diff --git a/docs/COPYING b/docs/COPYING index 5d10c7364..6bdbe5b4e 100644 --- a/docs/COPYING +++ b/docs/COPYING @@ -5,9 +5,9 @@ The Python Imaging Library (PIL) is Pillow is the friendly PIL fork. It is - Copyright © 2016 by Alex Clark and contributors + Copyright © 2012-2016 by Alex Clark and contributors -Like PIL, Pillow is licensed under the MIT-like open source PIL +Like PIL, Pillow is licensed under the open source PIL Software License: By obtaining, using, and/or copying this software and/or its diff --git a/docs/about.rst b/docs/about.rst index 2f97020ca..dd6ca9a98 100644 --- a/docs/about.rst +++ b/docs/about.rst @@ -18,7 +18,7 @@ The fork author's goal is to foster and support active development of PIL throug License ------- -Like PIL, Pillow is `licensed under the MIT-like open source PIL Software License `_ +Like PIL, Pillow is `licensed under the open source PIL Software License `_ Why a fork? ----------- From 66de02685f947024a340588fac9f5f2ac35882b0 Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Fri, 4 Nov 2016 16:37:49 +0100 Subject: [PATCH 002/632] Update info.icc_profile when using libtiff reader. --- PIL/TiffImagePlugin.py | 7 ++++--- Tests/test_file_libtiff.py | 12 ++++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 3af38832d..69a216017 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1010,9 +1010,6 @@ class TiffImageFile(ImageFile.ImageFile): # Section 14: Differencing Predictor self.decoderconfig = (self.tag_v2[PREDICTOR],) - if ICCPROFILE in self.tag_v2: - self.info['icc_profile'] = self.tag_v2[ICCPROFILE] - return args def load(self): @@ -1285,6 +1282,10 @@ class TiffImageFile(ImageFile.ImageFile): print("- unsupported data organization") raise SyntaxError("unknown data organization") + # Fix up info. + if ICCPROFILE in self.tag_v2: + self.info['icc_profile'] = self.tag_v2[ICCPROFILE] + # fixup palette descriptor if self.mode == "P": diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 6e40d4b37..229c1e830 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -521,8 +521,16 @@ class TestFileLibTiff(LibTiffTestCase): except: self.fail("Should not get permission error here") - - + def test_read_icc(self): + with Image.open("Tests/images/hopper.iccprofile.tif") as img: + icc = img.info.get('icc_profile') + self.assertNotEqual(icc, None) + TiffImagePlugin.READ_LIBTIFF = True + with Image.open("Tests/images/hopper.iccprofile.tif") as img: + icc_libtiff = img.info.get('icc_profile') + self.assertNotEqual(icc_libtiff, None) + TiffImagePlugin.READ_LIBTIFF = False + self.assertEqual(icc, icc_libtiff) if __name__ == '__main__': unittest.main() From a51dc7dcaf70b56538664bb7d8ead2c68a855434 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 5 Nov 2016 13:32:02 +1100 Subject: [PATCH 003/632] Unified different GIF optimize conditions --- PIL/GifImagePlugin.py | 152 +++++++++++++++++++++--------------------- 1 file changed, 75 insertions(+), 77 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 8b2dfac0a..3e387a670 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -434,18 +434,16 @@ def _get_local_header(fp, im, offset, flags): # optimize the block away if transparent color is not used transparent_color_exists = True - if _get_optimize(im, im.encoderinfo): - used_palette_colors = _get_used_palette_colors(im) - + used_palette_colors = _get_optimize(im, im.encoderinfo) + if used_palette_colors is not None: # 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 + 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) @@ -552,9 +550,28 @@ 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) +# Force optimization so that we can test performance against +# cases where it took lots of memory and time previously. +_FORCE_OPTIMIZE = False +def _get_optimize(im, info): + if im.mode in ("P", "L") and info and info.get("optimize", 0): + # Potentially expensive operation. + + # The palette saves 3 bytes per color not used, but palette + # lengths are restricted to 3*(2**N) bytes. Max saving would + # be 768 -> 6 bytes if we went all the way down to 2 colors. + # * If we're over 128 colors, we can't save any space. + # * If there aren't any holes, it's not worth collapsing. + # * If we have a 'large' image, the palette is in the noise. + + # create the new palette if not every color is used + used_palette_colors = _get_used_palette_colors(im) + if _FORCE_OPTIMIZE or im.mode == 'L' or \ + (len(used_palette_colors) <= 128 and + max(used_palette_colors) > len(used_palette_colors) and + im.width * im.height < 512 * 512): + return used_palette_colors def _get_used_palette_colors(im): used_palette_colors = [] @@ -586,10 +603,6 @@ def _get_header_palette(palette_bytes): palette_bytes += o8(0) * 3 * actual_target_size_diff return palette_bytes -# Force optimization so that we can test performance against -# cases where it took lots of memory and time previously. -_FORCE_OPTIMIZE = False - def _get_palette_bytes(im, palette, info): if im.mode == "P": if palette and isinstance(palette, bytes): @@ -602,79 +615,64 @@ def _get_palette_bytes(im, palette, info): else: source_palette = bytearray([i//3 for i in range(768)]) - used_palette_colors = palette_bytes = None + palette_bytes = None - if _get_optimize(im, info): - used_palette_colors = _get_used_palette_colors(im) + used_palette_colors = _get_optimize(im, info) + if used_palette_colors is not None: + palette_bytes = b"" + new_positions = [0]*256 - # Potentially expensive operation. + # pick only the used colors from the palette + for i, oldPosition in enumerate(used_palette_colors): + palette_bytes += source_palette[oldPosition*3:oldPosition*3+3] + new_positions[oldPosition] = i - # The palette saves 3 bytes per color not used, but palette - # lengths are restricted to 3*(2**N) bytes. Max saving would - # be 768 -> 6 bytes if we went all the way down to 2 colors. - # * If we're over 128 colors, we can't save any space. - # * If there aren't any holes, it's not worth collapsing. - # * If we have a 'large' image, the palette is in the noise. + # replace the palette color id of all pixel with the new id - # create the new palette if not every color is used - if _FORCE_OPTIMIZE or im.mode == 'L' or \ - (len(used_palette_colors) <= 128 and - max(used_palette_colors) > len(used_palette_colors) and - im.width * im.height < 512 * 512): - palette_bytes = b"" - new_positions = [0]*256 + # Palette images are [0..255], mapped through a 1 or 3 + # byte/color map. We need to remap the whole image + # from palette 1 to palette 2. New_positions is + # an array of indexes into palette 1. Palette 2 is + # palette 1 with any holes removed. - # pick only the used colors from the palette - for i, oldPosition in enumerate(used_palette_colors): - palette_bytes += source_palette[oldPosition*3:oldPosition*3+3] - new_positions[oldPosition] = i + # We're going to leverage the convert mechanism to use the + # C code to remap the image from palette 1 to palette 2, + # by forcing the source image into 'L' mode and adding a + # mapping 'L' mode palette, then converting back to 'L' + # sans palette thus converting the image bytes, then + # assigning the optimized RGB palette. - # replace the palette color id of all pixel with the new id + # perf reference, 9500x4000 gif, w/~135 colors + # 14 sec prepatch, 1 sec postpatch with optimization forced. - # Palette images are [0..255], mapped through a 1 or 3 - # byte/color map. We need to remap the whole image - # from palette 1 to palette 2. New_positions is - # an array of indexes into palette 1. Palette 2 is - # palette 1 with any holes removed. + mapping_palette = bytearray(new_positions) - # We're going to leverage the convert mechanism to use the - # C code to remap the image from palette 1 to palette 2, - # by forcing the source image into 'L' mode and adding a - # mapping 'L' mode palette, then converting back to 'L' - # sans palette thus converting the image bytes, then - # assigning the optimized RGB palette. + m_im = im.copy() + m_im.mode = 'P' - # perf reference, 9500x4000 gif, w/~135 colors - # 14 sec prepatch, 1 sec postpatch with optimization forced. + m_im.palette = ImagePalette.ImagePalette("RGB", + palette=mapping_palette*3, + size=768) + #possibly set palette dirty, then + #m_im.putpalette(mapping_palette, 'L') # converts to 'P' + # or just force it. + # UNDONE -- this is part of the general issue with palettes + m_im.im.putpalette(*m_im.palette.getdata()) - mapping_palette = bytearray(new_positions) + m_im = m_im.convert('L') - m_im = im.copy() - m_im.mode = 'P' + # Internally, we require 768 bytes for a palette. + new_palette_bytes = (palette_bytes + + (768 - len(palette_bytes)) * b'\x00') + m_im.putpalette(new_palette_bytes) + m_im.palette = ImagePalette.ImagePalette("RGB", + palette=palette_bytes, + size=len(palette_bytes)) - m_im.palette = ImagePalette.ImagePalette("RGB", - palette=mapping_palette*3, - size=768) - #possibly set palette dirty, then - #m_im.putpalette(mapping_palette, 'L') # converts to 'P' - # or just force it. - # UNDONE -- this is part of the general issue with palettes - m_im.im.putpalette(*m_im.palette.getdata()) - - m_im = m_im.convert('L') - - # Internally, we require 768 bytes for a palette. - new_palette_bytes = (palette_bytes + - (768 - len(palette_bytes)) * b'\x00') - m_im.putpalette(new_palette_bytes) - m_im.palette = ImagePalette.ImagePalette("RGB", - palette=palette_bytes, - size=len(palette_bytes)) + # oh gawd, this is modifying the image in place so I can pass by ref. + # REFACTOR SOONEST + im.frombytes(m_im.tobytes()) - # oh gawd, this is modifying the image in place so I can pass by ref. - # REFACTOR SOONEST - im.frombytes(m_im.tobytes()) - if not palette_bytes: palette_bytes = source_palette From caf53b05ec1d8fdb7b19eb2df6d64a56bcb4c916 Mon Sep 17 00:00:00 2001 From: Clement Skau Date: Mon, 22 Aug 2016 19:47:49 +0900 Subject: [PATCH 004/632] Fixes TIFFImagePlugin ICC color profile saving. In the TIFF code saving icc_profile is conditional on tag_v2 being set which doesn't make sense to me. I believe this is merely an indentation typo. I've been trying to save TIFFs with im.info['icc_profile'] set and compression=raw, but unfortunately this results in TIFFs without ICC color profiles. With the attached patch TIFFs with said conditions will be saved with the profile set in im.info['icc_profile']. Note: There are a number of different conditions that need to be met for code to succeed in saving with the profile since it branches between using libtiff and ImageFile._save(..), and the libtiff code does not currently save the ICC color profile. For instance setting compression=tiff_lzw will result in using libtiff and no profile will be saved. --- PIL/TiffImagePlugin.py | 8 ++++---- Tests/test_file_tiff.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 3af38832d..4aae05032 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1366,10 +1366,10 @@ def _save(im, fp, filename): ifd[key] = im.tag_v2[key] ifd.tagtype[key] = im.tag_v2.tagtype[key] - # preserve ICC profile (should also work when saving other formats - # which support profiles as TIFF) -- 2008-06-06 Florian Hoech - if "icc_profile" in im.info: - ifd[ICCPROFILE] = im.info["icc_profile"] + # preserve ICC profile (should also work when saving other formats + # which support profiles as TIFF) -- 2008-06-06 Florian Hoech + if "icc_profile" in im.info: + ifd[ICCPROFILE] = im.info["icc_profile"] for key, name in [(IMAGEDESCRIPTION, "description"), (X_RESOLUTION, "resolution"), diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 9913860ad..76fe8f930 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -499,5 +499,21 @@ class TestFileTiff(PillowTestCase): with Image.open(mp) as im: self.assertEqual(im.n_frames, 3) + def test_saving_icc_profile(self): + # Tests saving TIFF with icc_profile set. + # At the time of writing this will only work for non-compressed tiffs + # as libtiff does not support embedded ICC profiles, ImageFile._save(..) + # however does. + im = Image.new('RGB', (1, 1)) + im.info['icc_profile'] = 'Dummy value' + + # Try save-load round trip to make sure both handle icc_profile. + tmpfile = self.tempfile('temp.tif') + im.save(tmpfile, 'TIFF', compression='raw') + reloaded = Image.open(tmpfile) + + self.assertEqual(b'Dummy value', reloaded.info['icc_profile']) + + if __name__ == '__main__': unittest.main() From 2ba2763f0bd0a7c0d860a14404b04adc40b8d453 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 5 Nov 2016 19:09:14 +1100 Subject: [PATCH 005/632] Replaced range(len()) with enumerate --- PIL/GifImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 3e387a670..fc96da9f4 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -437,8 +437,8 @@ def _get_local_header(fp, im, offset, flags): used_palette_colors = _get_optimize(im, im.encoderinfo) if used_palette_colors is not None: # adjust the transparency index after optimize - for i in range(len(used_palette_colors)): - if used_palette_colors[i] == transparency: + for i, palette_color in enumerate(used_palette_colors): + if palette_color == transparency: transparency = i transparent_color_exists = True break From a5d6519d74322e07cfd83323a9e1ab2c3822f91e Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Sun, 13 Nov 2016 10:08:47 -0800 Subject: [PATCH 006/632] Remove long deprecated ImageDraw methods Deprecated in 89ccf66ff7f2646c3e649d6a3bba0a7e1c38a99e since Sep 29, 2015, version 3.0.0. --- PIL/ImageDraw.py | 15 --------------- Tests/test_imagedraw.py | 8 -------- 2 files changed, 23 deletions(-) diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 720403920..6c4cdbd69 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -31,7 +31,6 @@ # import numbers -import warnings from PIL import Image, ImageColor from PIL._util import isStringType @@ -87,20 +86,6 @@ class ImageDraw(object): self.fill = 0 self.font = None - def setink(self, ink): - raise NotImplementedError("setink() has been removed. " + - "Please use keyword arguments instead.") - - def setfill(self, onoff): - raise NotImplementedError("setfill() has been removed. " + - "Please use keyword arguments instead.") - - def setfont(self, font): - warnings.warn("setfont() is deprecated. " + - "Please set the attribute directly instead.") - # compatibility - self.font = font - def getfont(self): """Get the current default font.""" if not self.font: diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 6f92ac3a0..2dae5feda 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -44,14 +44,6 @@ class TestImageDraw(PillowTestCase): draw.polygon(list(range(100))) draw.rectangle(list(range(4))) - def test_removed_methods(self): - im = hopper() - - draw = ImageDraw.Draw(im) - - self.assertRaises(Exception, lambda: draw.setink(0)) - self.assertRaises(Exception, lambda: draw.setfill(0)) - def test_valueerror(self): im = Image.open("Tests/images/chi.gif") From 90760a5f3020ada06bf752ae6e98dbfafc0aeb48 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 14 Nov 2016 07:47:02 -0800 Subject: [PATCH 007/632] Removed the handles_eof flag in the decoder, as there are no users of it --- PIL/ImageFile.py | 2 +- decode.c | 14 -------------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 55cb701a1..207dcfd00 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -210,7 +210,7 @@ class ImageFile(Image.Image): else: raise IOError("image file is truncated") - if not s and not decoder.handles_eof: # truncated jpeg + if not s: # truncated jpeg self.tile = [] # JpegDecode needs to clean things up here either way diff --git a/decode.c b/decode.c index f700747e1..91de1075e 100644 --- a/decode.c +++ b/decode.c @@ -52,7 +52,6 @@ typedef struct { struct ImagingCodecStateInstance state; Imaging im; PyObject* lock; - int handles_eof; int pulls_fd; } ImagingDecoderObject; @@ -95,9 +94,6 @@ PyImaging_DecoderNew(int contextsize) /* Initialize the cleanup function pointer */ decoder->cleanup = NULL; - /* Most decoders don't want to handle EOF themselves */ - decoder->handles_eof = 0; - /* set if the decoder needs to pull data from the fd, instead of having it pushed */ decoder->pulls_fd = 0; @@ -239,12 +235,6 @@ _setfd(ImagingDecoderObject* decoder, PyObject* args) } -static PyObject * -_get_handles_eof(ImagingDecoderObject *decoder) -{ - return PyBool_FromLong(decoder->handles_eof); -} - static PyObject * _get_pulls_fd(ImagingDecoderObject *decoder) { @@ -260,9 +250,6 @@ static struct PyMethodDef methods[] = { }; static struct PyGetSetDef getseters[] = { - {"handles_eof", (getter)_get_handles_eof, NULL, - "True if this decoder expects to handle EOF itself.", - NULL}, {"pulls_fd", (getter)_get_pulls_fd, NULL, "True if this decoder expects to pull from self.fd itself.", NULL}, @@ -918,7 +905,6 @@ PyImaging_Jpeg2KDecoderNew(PyObject* self, PyObject* args) if (decoder == NULL) return NULL; - decoder->handles_eof = 1; decoder->pulls_fd = 1; decoder->decode = ImagingJpeg2KDecode; decoder->cleanup = ImagingJpeg2KDecodeCleanup; From 52b1f46b12433bcc4a4c02396b0875f800866787 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Sat, 5 Nov 2016 11:11:30 -0700 Subject: [PATCH 008/632] Deprecate vendored version of olefile Python package in favor of upstream Pillow now requires the olefile Python package through setup.py. This removes Pillow's maintenance of this library by instead relying on and reusing the upstream version. No longer need to regularly update the vendored package and docs. olefile bug fixes and features can go directly upstream. During travis tests, now installs Pillow package before tests; this will also install all dependencies (currently, only olefile). --- .travis.yml | 2 + PIL/FpxImagePlugin.py | 11 +- PIL/MicImagePlugin.py | 7 +- PIL/OleFileIO-README.md | 180 --- PIL/OleFileIO.py | 2307 +--------------------------------- Tests/test_olefileio.py | 147 --- docs/reference/OleFileIO.rst | 364 ------ docs/reference/index.rst | 1 - setup.py | 1 + 9 files changed, 22 insertions(+), 2998 deletions(-) delete mode 100644 PIL/OleFileIO-README.md delete mode 100644 Tests/test_olefileio.py delete mode 100644 docs/reference/OleFileIO.rst diff --git a/.travis.yml b/.travis.yml index 952714b5f..7225fc825 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,6 +42,8 @@ install: # libimagequant - pushd depends && ./install_imagequant.sh && popd + - travis_retry pip install -e . + before_script: # Qt needs a display for some of the tests, and it's only run on the system site packages install - "export DISPLAY=:99.0" diff --git a/PIL/FpxImagePlugin.py b/PIL/FpxImagePlugin.py index a4a9098a7..861f4bf01 100644 --- a/PIL/FpxImagePlugin.py +++ b/PIL/FpxImagePlugin.py @@ -16,11 +16,14 @@ # -from PIL import Image, ImageFile -from PIL.OleFileIO import i8, i32, MAGIC, OleFileIO +from PIL import Image, ImageFile, _binary + +import olefile __version__ = "0.1" +i32 = _binary.i32le +i8 = _binary.i8 # we map from colour field tuples to (mode, rawmode) descriptors MODES = { @@ -42,7 +45,7 @@ MODES = { # -------------------------------------------------------------------- def _accept(prefix): - return prefix[:8] == MAGIC + return prefix[:8] == olefile.MAGIC ## @@ -59,7 +62,7 @@ class FpxImageFile(ImageFile.ImageFile): # to be a FlashPix file try: - self.ole = OleFileIO(self.fp) + self.ole = olefile.OleFileIO(self.fp) except IOError: raise SyntaxError("not an FPX file; invalid OLE file") diff --git a/PIL/MicImagePlugin.py b/PIL/MicImagePlugin.py index 3c912442b..125e297ac 100644 --- a/PIL/MicImagePlugin.py +++ b/PIL/MicImagePlugin.py @@ -18,7 +18,8 @@ from PIL import Image, TiffImagePlugin -from PIL.OleFileIO import MAGIC, OleFileIO + +import olefile __version__ = "0.1" @@ -28,7 +29,7 @@ __version__ = "0.1" def _accept(prefix): - return prefix[:8] == MAGIC + return prefix[:8] == olefile.MAGIC ## @@ -45,7 +46,7 @@ class MicImageFile(TiffImagePlugin.TiffImageFile): # to be a Microsoft Image Composer file try: - self.ole = OleFileIO(self.fp) + self.ole = olefile.OleFileIO(self.fp) except IOError: raise SyntaxError("not an MIC file; invalid OLE file") diff --git a/PIL/OleFileIO-README.md b/PIL/OleFileIO-README.md deleted file mode 100644 index 35e028265..000000000 --- a/PIL/OleFileIO-README.md +++ /dev/null @@ -1,180 +0,0 @@ -olefile (formerly OleFileIO_PL) -=============================== - -[olefile](http://www.decalage.info/olefile) is a Python package to parse, read and write -[Microsoft OLE2 files](http://en.wikipedia.org/wiki/Compound_File_Binary_Format) -(also called Structured Storage, Compound File Binary Format or Compound Document File Format), -such as Microsoft Office 97-2003 documents, vbaProject.bin in MS Office 2007+ files, Image Composer -and FlashPix files, Outlook messages, StickyNotes, several Microscopy file formats, McAfee antivirus quarantine files, -etc. - - -**Quick links:** [Home page](http://www.decalage.info/olefile) - -[Download/Install](https://bitbucket.org/decalage/olefileio_pl/wiki/Install) - -[Documentation](https://bitbucket.org/decalage/olefileio_pl/wiki) - -[Report Issues/Suggestions/Questions](https://bitbucket.org/decalage/olefileio_pl/issues?status=new&status=open) - -[Contact the author](http://decalage.info/contact) - -[Repository](https://bitbucket.org/decalage/olefileio_pl) - -[Updates on Twitter](https://twitter.com/decalage2) - - -News ----- - -Follow all updates and news on Twitter: - -- **2015-01-25 v0.42**: improved handling of special characters in stream/storage names on Python 2.x (using UTF-8 - instead of Latin-1), fixed bug in listdir with empty storages. -- 2014-11-25 v0.41: OleFileIO.open and isOleFile now support OLE files stored in byte strings, fixed installer for - python 3, added support for Jython (Niko Ehrenfeuchter) -- 2014-10-01 v0.40: renamed OleFileIO_PL to olefile, added initial write support for streams >4K, updated doc and - license, improved the setup script. -- 2014-07-27 v0.31: fixed support for large files with 4K sectors, thanks to Niko Ehrenfeuchter, Martijn Berger and - Dave Jones. Added test scripts from Pillow (by hugovk). Fixed setup for Python 3 (Martin Panter) -- 2014-02-04 v0.30: now compatible with Python 3.x, thanks to Martin Panter who did most of the hard work. -- 2013-07-24 v0.26: added methods to parse stream/storage timestamps, improved listdir to include storages, fixed - parsing of direntry timestamps -- 2013-05-27 v0.25: improved metadata extraction, properties parsing and exception handling, fixed - [issue #12](https://bitbucket.org/decalage/olefileio_pl/issue/12/error-when-converting-timestamps-in-ole) -- 2013-05-07 v0.24: new features to extract metadata (get\_metadata method and OleMetadata class), improved - getproperties to convert timestamps to Python datetime -- 2012-10-09: published [python-oletools](http://www.decalage.info/python/oletools), a package of analysis tools based - on OleFileIO_PL -- 2012-09-11 v0.23: added support for file-like objects, fixed [issue #8](https://bitbucket.org/decalage/olefileio_pl/issue/8/bug-with-file-object) -- 2012-02-17 v0.22: fixed issues #7 (bug in getproperties) and #2 (added close method) -- 2011-10-20: code hosted on bitbucket to ease contributions and bug tracking -- 2010-01-24 v0.21: fixed support for big-endian CPUs, such as PowerPC Macs. -- 2009-12-11 v0.20: small bugfix in OleFileIO.open when filename is not plain str. -- 2009-12-10 v0.19: fixed support for 64 bits platforms (thanks to Ben G. and Martijn for reporting the bug) -- see changelog in source code for more info. - -Download/Install ----------------- - -If you have pip or setuptools installed (pip is included in Python 2.7.9+), you may simply run **pip install olefile** -or **easy_install olefile** for the first installation. - -To update olefile, run **pip install -U olefile**. - -Otherwise, see https://bitbucket.org/decalage/olefileio_pl/wiki/Install - -Features --------- - -- Parse, read and write any OLE file such as Microsoft Office 97-2003 legacy document formats (Word .doc, Excel .xls, - PowerPoint .ppt, Visio .vsd, Project .mpp), Image Composer and FlashPix files, Outlook messages, StickyNotes, - Zeiss AxioVision ZVI files, Olympus FluoView OIB files, etc -- List all the streams and storages contained in an OLE file -- Open streams as files -- Parse and read property streams, containing metadata of the file -- Portable, pure Python module, no dependency - -olefile can be used as an independent package or with PIL/Pillow. - -olefile is mostly meant for developers. If you are looking for tools to analyze OLE files or to extract data (especially -for security purposes such as malware analysis and forensics), then please also check my -[python-oletools](http://www.decalage.info/python/oletools), which are built upon olefile and provide a higher-level interface. - - -History -------- - -olefile is based on the OleFileIO module from [PIL](http://www.pythonware.com/products/pil/index.htm), the excellent -Python Imaging Library, created and maintained by Fredrik Lundh. The olefile API is still compatible with PIL, but -since 2005 I have improved the internal implementation significantly, with new features, bugfixes and a more robust -design. From 2005 to 2014 the project was called OleFileIO_PL, and in 2014 I changed its name to olefile to celebrate -its 9 years and its new write features. - -As far as I know, olefile is the most complete and robust Python implementation to read MS OLE2 files, portable on -several operating systems. (please tell me if you know other similar Python modules) - -Since 2014 olefile/OleFileIO_PL has been integrated into [Pillow](http://python-pillow.org), the friendly fork -of PIL. olefile will continue to be improved as a separate project, and new versions will be merged into Pillow -regularly. - - -Main improvements over the original version of OleFileIO in PIL: ----------------------------------------------------------------- - -- Compatible with Python 3.x and 2.6+ -- Many bug fixes -- Support for files larger than 6.8MB -- Support for 64 bits platforms and big-endian CPUs -- Robust: many checks to detect malformed files -- Runtime option to choose if malformed files should be parsed or raise exceptions -- Improved API -- Metadata extraction, stream/storage timestamps (e.g. for document forensics) -- Can open file-like objects -- Added setup.py and install.bat to ease installation -- More convenient slash-based syntax for stream paths -- Write features - -Documentation -------------- - -Please see the [online documentation](https://bitbucket.org/decalage/olefileio_pl/wiki) for more information, -especially the [OLE overview](https://bitbucket.org/decalage/olefileio_pl/wiki/OLE_Overview) and the -[API page](https://bitbucket.org/decalage/olefileio_pl/wiki/API) which describe how to use olefile in Python applications. -A copy of the same documentation is also provided in the doc subfolder of the olefile package. - - -## Real-life examples ## - -A real-life example: [using OleFileIO_PL for malware analysis and forensics](http://blog.gregback.net/2011/03/using-remnux-for-forensic-puzzle-6/). - -See also [this paper](https://computer-forensics.sans.org/community/papers/gcfa/grow-forensic-tools-taxonomy-python-libraries-helpful-forensic-analysis_6879) about python tools for forensics, which features olefile. - - -License -------- - -olefile (formerly OleFileIO_PL) is copyright (c) 2005-2015 Philippe Lagadec -([http://www.decalage.info](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. - - ----------- - -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 © 1997-2011 by Secret Labs AB - Copyright © 1995-2011 by Fredrik Lundh - -By obtaining, using, and/or copying this software and/or its associated documentation, you agree that you have read, -understood, and will comply with the following terms and conditions: - -Permission to use, copy, modify, and distribute this software and its associated documentation for any purpose and -without fee is hereby granted, provided that the above copyright notice appears in all copies, and that both that -copyright notice and this permission notice appear in supporting documentation, and that the name of Secret Labs AB or -the author not be used in advertising or publicity pertaining to distribution of the software without specific, written -prior permission. - -SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF -CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index 1998e3c10..c4e23b86b 100755 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -1,2305 +1,14 @@ #!/usr/bin/env python -# 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. +import warnings +warnings.warn( + 'PIL.OleFileIO is deprecated. Use the olefile Python package ' + 'instead. This module will be removed in a future version.', + DeprecationWarning +) -# 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 olefile requires Python 2.6+ or 3.x. - - -__author__ = "Philippe Lagadec" -__date__ = "2015-01-25" -__version__ = '0.42b' - -#--- LICENSE ------------------------------------------------------------------ - -# 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 -# -# By obtaining, using, and/or copying this software and/or its associated -# documentation, you agree that you have read, understood, and will comply with -# the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and its -# associated documentation for any purpose and without fee is hereby granted, -# provided that the above copyright notice appears in all copies, and that both -# that copyright notice and this permission notice appear in supporting -# documentation, and that the name of Secret Labs AB or the author(s) not be used -# in advertising or publicity pertaining to distribution of the software -# without specific, written prior permission. -# -# SECRET LABS AB AND THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -# IN NO EVENT SHALL SECRET LABS AB OR THE AUTHORS BE LIABLE FOR ANY SPECIAL, -# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -# PERFORMANCE OF THIS SOFTWARE. - -#----------------------------------------------------------------------------- -# 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 -# exceptions in _OleStream.__init__() -# 2006-06-09 v0.12 PL: - fixes for files above 6.8MB (DIFAT in loadfat) -# - added some constants -# - added header values checks -# - added some docstrings -# - getsect: bugfix in case sectors >512 bytes -# - getsect: added conformity checks -# - DEBUG_MODE constant to activate debug display -# 2007-09-04 v0.13 PL: - improved/translated (lots of) comments -# - updated license -# - converted tabs to 4 spaces -# 2007-11-19 v0.14 PL: - added OleFileIO._raise_defect() to adapt sensitivity -# - improved _unicode() to use Python 2.x unicode support -# - fixed bug in _OleDirectoryEntry -# 2007-11-25 v0.15 PL: - added safety checks to detect FAT loops -# - fixed _OleStream which didn't check stream size -# - added/improved many docstrings and comments -# - moved helper functions _unicode and _clsid out of -# OleFileIO class -# - improved OleFileIO._find() to add Unix path syntax -# - OleFileIO._find() is now case-insensitive -# - added get_type() and get_rootentry_name() -# - rewritten loaddirectory and _OleDirectoryEntry -# 2007-11-27 v0.16 PL: - added _OleDirectoryEntry.kids_dict -# - added detection of duplicate filenames in storages -# - added detection of duplicate references to streams -# - added get_size() and exists() to _OleDirectoryEntry -# - added isOleFile to check header before parsing -# - added __all__ list to control public keywords in pydoc -# 2007-12-04 v0.17 PL: - added _load_direntry to fix a bug in loaddirectory -# - improved _unicode(), added workarounds for Python <2.3 -# - added set_debug_mode and -d option to set debug mode -# - fixed bugs in OleFileIO.open and _OleDirectoryEntry -# - added safety check in main for large or binary -# properties -# - allow size>0 for storages for some implementations -# 2007-12-05 v0.18 PL: - fixed several bugs in handling of FAT, MiniFAT and -# streams -# - added option '-c' in main to check all streams -# 2009-12-10 v0.19 PL: - bugfix for 32 bit arrays on 64 bits platforms -# (thanks to Ben G. and Martijn for reporting the bug) -# 2009-12-11 v0.20 PL: - bugfix in OleFileIO.open when filename is not plain str -# 2010-01-22 v0.21 PL: - added support for big-endian CPUs such as PowerPC Macs -# 2012-02-16 v0.22 PL: - fixed bug in getproperties, patch by chuckleberryfinn -# (https://bitbucket.org/decalage/olefileio_pl/issue/7) -# - added close method to OleFileIO (fixed issue #2) -# 2012-07-25 v0.23 PL: - added support for file-like objects (patch by mete0r_kr) -# 2013-05-05 v0.24 PL: - getproperties: added conversion from filetime to python -# datetime -# - main: displays properties with date format -# - new class OleMetadata to parse standard properties -# - added get_metadata method -# 2013-05-07 v0.24 PL: - a few improvements in OleMetadata -# 2013-05-24 v0.25 PL: - getproperties: option to not convert some timestamps -# - OleMetaData: total_edit_time is now a number of seconds, -# not a timestamp -# - getproperties: added support for VT_BOOL, VT_INT, V_UINT -# - getproperties: filter out null chars from strings -# - getproperties: raise non-fatal defects instead of -# exceptions when properties cannot be parsed properly -# 2013-05-27 PL: - getproperties: improved exception handling -# - _raise_defect: added option to set exception type -# - all non-fatal issues are now recorded, and displayed -# when run as a script -# 2013-07-11 v0.26 PL: - added methods to get modification and creation times -# of a directory entry or a storage/stream -# - fixed parsing of direntry timestamps -# 2013-07-24 PL: - new options in listdir to list storages and/or streams -# 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): -# + 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) -# - TESTS with Linux, MacOSX, Python 1.5.2, various files, PIL, ... -# - add underscore to each private method, to avoid their display in -# pydoc/epydoc documentation - Remove it for classes to be documented -# - replace all raised exceptions with _raise_defect (at least in OleFileIO) -# - merge code from _OleStream and OleFileIO.getsect to read sectors -# (maybe add a class for FAT and MiniFAT ?) -# - add method to check all streams (follow sectors chains without storing all -# stream in memory, and report anomalies) -# - use _OleDirectoryEntry.kids_dict to improve _find and _list ? -# - fix Unicode names handling (find some way to stay compatible with Py1.5.2) -# => if possible avoid converting names to Latin-1 -# - review DIFAT code: fix handling of DIFSECT blocks in FAT (not stop) -# - rewrite OleFileIO.getproperties -# - improve docstrings to show more sample uses -# - see also original notes and FIXME below -# - remove all obsolete FIXMEs -# - OleMetadata: fix version attrib according to -# http://msdn.microsoft.com/en-us/library/dd945671%28v=office.12%29.aspx - -# IDEAS: -# - in OleFileIO._open and _OleStream, use size=None instead of 0x7FFFFFFF for -# streams with unknown size -# - use arrays of int instead of long integers for FAT/MiniFAT, to improve -# performance and reduce memory usage ? (possible issue with values >2^31) -# - provide tests with unittest (may need write support to create samples) -# - 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 big endian byte order ? -# - create a simple OLE explorer with wxPython - -# FUTURE EVOLUTIONS to add write support: -# 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: - -# History: -# 1997-01-20 fl Created -# 1997-01-22 fl Fixed 64-bit portability quirk -# 2003-09-09 fl Fixed typo in OleFileIO.loadfat (noted by Daniel Haertle) -# 2004-02-29 fl Changed long hex constants to signed integers -# -# Notes: -# FIXME: sort out sign problem (eliminate long hex constants) -# FIXME: change filename to use "a/b/c" instead of ["a", "b", "c"] -# FIXME: provide a glob mechanism function (using fnmatchcase) -# -# Literature: -# -# "FlashPix Format Specification, Appendix A", Kodak and Microsoft, -# September 1996. -# -# Quotes: -# -# "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 - -#------------------------------------------------------------------------------ - - -import io +import olefile import sys -import struct -import array -import os.path -import datetime -#=== COMPATIBILITY WORKAROUNDS ================================================ - -# [PL] Define explicitly the public API to avoid private objects in pydoc: -#TODO: add more -# __all__ = ['OleFileIO', 'isOleFile', 'MAGIC'] - -# For Python 3.x, need to redefine long as int: -if str is not bytes: - long = int - -# Need to make sure we use xrange both on Python 2 and 3.x: -try: - # on Python 2 we need xrange: - iterrange = xrange -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: -if array.array('L').itemsize == 4: - # on 32 bits platforms, long integers in an array are 32 bits: - UINT32 = 'L' -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/) -try: - basestring -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 = 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. - :param mode: True or False - """ - global DEBUG_MODE, debug - DEBUG_MODE = debug_mode - if debug_mode: - debug = debug_print - 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 # (-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] 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; - -# map property id to name (for debugging purposes) - -VT = {} -for keyword, var in list(vars().items()): - if keyword[:3] == "VT_": - VT[var] = keyword - -# -# -------------------------------------------------------------------- -# Some common document types (root.clsid fields) - -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 - -# 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) - - -#=== FUNCTIONS =============================================================== - -def isOleFile(filename): - """ - 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. - - :returns: True if OLE, False otherwise. - """ - # 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: - return False - - -if bytes is str: - # version for Python 2.x - def i8(c): - return ord(c) -else: - # version for Python 3.x - def i8(c): - return c if c.__class__ is int else c[0] - - -#TODO: replace i16 and i32 with more readable struct.unpack equivalent? - -def i16(c, o = 0): - """ - Converts a 2-bytes (16 bits) string to an integer. - - c: string containing bytes to convert - o: offset of bytes to convert in string - """ - return struct.unpack(" len(fat): - raise IOError('malformed OLE document, stream too large') - # optimization(?): data is first a list of strings, and join() is called - # at the end to concatenate all in one string. - # (this may not be really useful with recent Python versions) - data = [] - # if size is zero, then first sector index should be ENDOFCHAIN: - 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 - # loop to avoid DoS attacks: - for i in range(nb_sectors): - # Sector index may be ENDOFCHAIN, but only if size was unknown - if sect == ENDOFCHAIN: - if unknown_size: - break - else: - # else this means that the stream is smaller than declared: - debug('sect=ENDOFCHAIN before expected size') - raise IOError('incomplete OLE stream') - # sector index should be within 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)) -## tmp_data = b"".join(data) -## f = open('test_debug.bin', 'wb') -## f.write(tmp_data) -## f.close() -## debug('data read so far: %d bytes' % len(tmp_data)) - raise IOError('incorrect OLE FAT, sector index out of range') - #TODO: merge this code with OleFileIO.getsect() ? - #TODO: check if this works with 4K sectors: - try: - fp.seek(offset + sectorsize * sect) - except: - debug('sect=%d, seek=%d, filesize=%d' % - (sect, offset+sectorsize*sect, filesize)) - raise IOError('OLE sector index out of range') - sector_data = fp.read(sectorsize) - # [PL] check if there was enough data: - # 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): - 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))) - raise IOError('incomplete OLE sector') - data.append(sector_data) - # jump to next sector in the FAT: - try: - 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') - # [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) - # Data is truncated to the actual stream size: - if len(data) >= size: - data = data[:size] - # actual stream size is stored for future use: - self.size = size - elif unknown_size: - # actual stream size was not known, now we know the size of read - # data: - self.size = len(data) - else: - # read data is less than expected: - debug('len(data)=%d, size=%d' % (len(data), size)) - raise IOError('OLE stream size is less than declared') - # when all data is read in memory, BytesIO constructor is called - io.BytesIO.__init__(self, data) - # Then the _OleStream object can be used as a read-only file object. - - -#--- _OleDirectoryEntry ------------------------------------------------------- - -class _OleDirectoryEntry(object): - - """ - OLE2 Directory Entry - """ - # [PL] parsing code moved from OleFileIO.loaddirectory - - # struct to parse directory entries: - # <: little-endian byte order, standard sizes - # (note: this should guarantee that Q returns a 64 bits int) - # 64s: string containing entry name in unicode (max 31 chars) + null char - # H: uint16, number of bytes used in name buffer, including null = (len+1)*2 - # B: uint8, dir entry type (between 0 and 5) - # B: uint8, color: 0=black, 1=red - # I: uint32, index of left child node in the red-black tree, NOSTREAM if none - # I: uint32, index of right child node in the red-black tree, NOSTREAM if none - # I: uint32, index of child root node if it is a storage, else NOSTREAM - # 16s: CLSID, unique identifier (only used if it is a storage) - # I: uint32, user flags - # Q (was 8s): uint64, creation timestamp or zero - # Q (was 8s): uint64, modification timestamp or zero - # I: uint32, SID of first sector if stream or ministream, SID of 1st sector - # of stream containing ministreams if root entry, 0 otherwise - # I: uint32, total stream size in bytes if stream (low 32 bits), 0 otherwise - # I: uint32, total stream size in bytes if stream (high 32 bits), 0 otherwise - STRUCT_DIRENTRY = '<64sHBBIII16sIQQIII' - # size of a directory entry: 128 bytes - DIRENTRY_SIZE = 128 - assert struct.calcsize(STRUCT_DIRENTRY) == DIRENTRY_SIZE - - def __init__(self, entry, sid, olefile): - """ - Constructor for an _OleDirectoryEntry object. - Parses a 128-bytes entry from the OLE Directory stream. - - :param entry : string (must be 128 bytes long) - :param sid : index of this directory entry in the OLE file directory - :param olefile: OleFileIO containing this directory entry - """ - self.sid = sid - # ref to olefile is stored for future use - self.olefile = olefile - # kids is a list of children entries, if this entry is a storage: - # (list of _OleDirectoryEntry objects) - self.kids = [] - # kids_dict is a dictionary of children entries, indexed by their - # name in lowercase: used to quickly find an entry, and to detect - # duplicates - self.kids_dict = {} - # flag used to detect if the entry is referenced more than once in - # directory: - self.used = False - # decode DirEntry - ( - name, - namelength, - self.entry_type, - self.color, - self.sid_left, - self.sid_right, - self.sid_child, - clsid, - self.dwUserFlags, - self.createTime, - self.modifyTime, - self.isectStart, - sizeLow, - 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') - # 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') - if sid == 0 and self.entry_type != STGTY_ROOT: - 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') - # if exception not raised, namelength is set to the maximum value: - namelength = 64 - # only characters without ending null char are kept: - name = name[:(namelength-2)] - #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) - debug(' - sect: %d' % self.isectStart) - debug(' - SID left: %d, right: %d, child: %d' % (self.sid_left, - self.sid_right, self.sid_child)) - - # sizeHigh is only used for 4K sectors, it should be zero for 512 bytes - # sectors, BUT apparently some implementations set it as 0xFFFFFFFF, 1 - # or some other value so it cannot be raised as a defect in general: - if olefile.sectorsize == 512: - 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') - self.size = sizeLow - else: - self.size = sizeLow + (long(sizeHigh) << 32) - debug(' - size: %d (sizeLow=%d, sizeHigh=%d)' % (self.size, sizeLow, sizeHigh)) - - self.clsid = _clsid(clsid) - # 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') - # 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 \ - 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 - object, if it is a storage. - Note that this method builds a tree of all subentries, so it should - only be called for the root object once. - """ - debug('build_storage_tree: SID=%d - %s - sid_child=%d' - % (self.sid, repr(self.name), self.sid_child)) - if self.sid_child != NOSTREAM: - # if child SID is not NOSTREAM, then this entry is a storage. - # Let's walk through the tree of children to fill the kids list: - self.append_kids(self.sid_child) - - # Note from OpenOffice documentation: the safest way is to - # recreate the tree because some implementations may store broken - # red-black trees... - - # in the OLE file, entries are sorted on (length, name). - # for convenience, we sort them on name instead: - # (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) - - :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 - # 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): - 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' - % (child.sid, repr(child.name), child.sid_left, child.sid_right, child.sid_child)) - # the directory entries are organized as a red-black tree. - # (cf. Wikipedia for details) - # First walk through left side of the tree: - self.append_kids(child.sid_left) - # 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, - "Duplicate filename in OLE storage") - # Then the child_sid _OleDirectoryEntry object is appended to the - # kids list and dictionary: - self.kids.append(child) - 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, - 'OLE Entry referenced more than once') - child.used = True - # Finally walk through right side of the tree: - self.append_kids(child.sid_right) - # 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 - - def __lt__(self, other): - "Compare entries by name" - return self.name < other.name - - def __ne__(self, other): - return not self.__eq__(other) - - def __le__(self, other): - return self.__eq__(other) or self.__lt__(other) - - # Reflected __lt__() and __le__() will be used for __gt__() and __ge__() - - #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)", - "(property)", "(root)"] - print(" "*tab + repr(self.name), TYPES[self.entry_type], end=' ') - if self.entry_type in (STGTY_STREAM, STGTY_ROOT): - print(self.size, "bytes", end=' ') - print() - if self.entry_type in (STGTY_STORAGE, STGTY_ROOT) and self.clsid: - print(" "*tab + "{%s}" % self.clsid) - - 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) - - new in version 0.26 - """ - if self.modifyTime == 0: - 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) - - new in version 0.26 - """ - if self.createTime == 0: - return None - return filetime2datetime(self.createTime) - - -#--- OleFileIO ---------------------------------------------------------------- - -class OleFileIO(object): - """ - 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 - access the contents of this file. - - Object names are given as a list of strings, one for each subentry - level. The root entry should be omitted. For example, the following - code extracts all image streams from a Microsoft Image Composer file:: - - ole = OleFileIO("fan.mic") - - for entry in ole.listdir(): - if entry[1:2] == "Image": - fin = ole.openstream(entry) - fout = open(entry[0:1], "wb") - while True: - s = fin.read(8192) - if not s: - break - fout.write(s) - - You can use the viewer application provided with the Python Imaging - Library to view the resulting files (which happens to be standard - TIFF files). - """ - - def __init__(self, filename=None, raise_defects=DEFECT_FATAL, - write_mode=False, debug=False, path_encoding=DEFAULT_PATH_ENCODING): - """ - 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) - - :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, 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. - It may raise an IOError exception according to the minimal level chosen - 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 - - :param message: string describing the defect, used with raised exception. - :param exception_type: exception class to be raised, IOError by default - """ - # added by [PL] - if defect_level >= self._raise_defects_level: - raise exception_type(message) - else: - # 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 - 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'): - #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 - 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() - finally: - self.fp.seek(0) - self._filesize = filesize - - # lists of streams in FAT and MiniFAT, to detect duplicate references - # (list of indexes of first sectors of each stream) - self._used_streams_fat = [] - self._used_streams_minifat = [] - - header = self.fp.read(512) - - if len(header) != 512 or header[:8] != MAGIC: - self.raise_defect(DEFECT_FATAL, "not an OLE2 structured storage file") - - # [PL] header structure according to AAF specifications: - ##Header - ##struct StructuredStorageHeader { // [offset from start (bytes), length (bytes)] - ##BYTE _abSig[8]; // [00H,08] {0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, - ## // 0x1a, 0xe1} for current version - ##CLSID _clsid; // [08H,16] reserved must be zero (WriteClassStg/ - ## // GetClassFile uses root directory class id) - ##USHORT _uMinorVersion; // [18H,02] minor version of the format: 33 is - ## // written by reference implementation - ##USHORT _uDllVersion; // [1AH,02] major version of the dll/format: 3 for - ## // 512-byte sectors, 4 for 4 KB sectors - ##USHORT _uByteOrder; // [1CH,02] 0xFFFE: indicates Intel byte-ordering - ##USHORT _uSectorShift; // [1EH,02] size of sectors in power-of-two; - ## // typically 9 indicating 512-byte sectors - ##USHORT _uMiniSectorShift; // [20H,02] size of mini-sectors in power-of-two; - ## // typically 6 indicating 64-byte mini-sectors - ##USHORT _usReserved; // [22H,02] reserved, must be zero - ##ULONG _ulReserved1; // [24H,04] reserved, must be zero - ##FSINDEX _csectDir; // [28H,04] must be zero for 512-byte sectors, - ## // number of SECTs in directory chain for 4 KB - ## // sectors - ##FSINDEX _csectFat; // [2CH,04] number of SECTs in the FAT chain - ##SECT _sectDirStart; // [30H,04] first SECT in the directory chain - ##DFSIGNATURE _signature; // [34H,04] signature used for transactions; must - ## // be zero. The reference implementation - ## // does not support transactions - ##ULONG _ulMiniSectorCutoff; // [38H,04] maximum size for a mini stream; - ## // typically 4096 bytes - ##SECT _sectMiniFatStart; // [3CH,04] first SECT in the MiniFAT chain - ##FSINDEX _csectMiniFat; // [40H,04] number of SECTs in the MiniFAT chain - ##SECT _sectDifStart; // [44H,04] first SECT in the DIFAT chain - ##FSINDEX _csectDif; // [48H,04] number of SECTs in the DIFAT chain - ##SECT _sectFat[109]; // [4CH,436] the SECTs of first 109 FAT sectors - ##}; - - # [PL] header decoding: - # '<' 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)) - header1 = header[:header_size] - ( - self.Sig, - self.clsid, - self.MinorVersion, - self.DllVersion, - self.ByteOrder, - self.SectorShift, - self.MiniSectorShift, - self.Reserved, self.Reserved1, - self.csectDir, - self.csectFat, - self.sectDirStart, - self.signature, - self.MiniSectorCutoff, - self.MiniFatStart, - self.csectMiniFat, - self.sectDifStart, - self.csectDif - ) = struct.unpack(fmt_header, header1) - debug(struct.unpack(fmt_header, header1)) - - if self.Sig != MAGIC: - # OLE signature should always be present - 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") - 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) - 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) - 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): - 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") - 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) - # 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 - 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) - - # check known streams for duplicate references (these are always in FAT, - # never in MiniFAT): - self._check_duplicate_stream(self.sectDirStart) - # check MiniFAT only if it is not empty: - if self.csectMiniFat: - self._check_duplicate_stream(self.MiniFatStart) - # check DIFAT only if it is not empty: - if self.csectDif: - self._check_duplicate_stream(self.sectDifStart) - - # Load file allocation tables - self.loadfat(header) - # 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 - 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: 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) - used_streams = self._used_streams_minifat - 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): - return - used_streams = self._used_streams_fat - #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') - 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 # values per line (8+1 * 8+1 = 81) - fatnames = { - FREESECT: "..free..", - ENDOFCHAIN: "[ END. ]", - FATSECT: "FATSECT ", - DIFSECT: "DIFSECT " - } - nbsect = len(fat) - nlines = (nbsect+VPL-1)//VPL - print("index", end=" ") - for i in range(VPL): - print("%8X" % i, end=" ") - print() - for l in range(nlines): - index = l*VPL - print("%8X:" % (firstindex+index), end=" ") - for i in range(index, index+VPL): - if i >= nbsect: - break - sect = fat[i] - aux = sect & 0xFFFFFFFF # JYTHON-WORKAROUND - if aux in fatnames: - name = fatnames[aux] - else: - if sect == i+1: - name = " --->" - else: - 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=" ") - for i in range(VPL): - print("%8X" % i, end=" ") - print() - for l in range(nlines): - index = l*VPL - print("%8X:" % (firstindex+index), end=" ") - for i in range(index, index+VPL): - if i >= nbsect: - break - sect = tab[i] - name = "%8X" % sect - print(name, end=" ") - print() - - def sect2array(self, sect): - """ - convert a sector to an array of 32 bits unsigned integers, - swapping bytes on big endian CPUs such as PowerPC (old Macs) - """ - a = array.array(UINT32, sect) - # if CPU is big endian, swap bytes: - if sys.byteorder == 'big': - 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. - """ - # a FAT sector is an array of ulong integers. - if isinstance(sect, array.array): - # if sect is already an array it is directly used - fat1 = sect - else: - # if it's a raw sector, it is parsed in an array - fat1 = self.sect2array(sect) - self.dumpsect(sect) - # The FAT is a sector chain starting at the first index of itself. - for isect in fat1: - 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) - # parse it as an array of 32 bits integers, and add it to the - # global FAT array - nextfat = self.sect2array(s) - self.fat = self.fat + nextfat - return isect - - def loadfat(self, header): - """ - Load the FAT table. - """ - # 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)) - #fat = [] - # [PL] FAT is an array of 32 bits unsigned ints, it's more effective - # to use an array than a list in Python. - # It's initialized as empty first: - self.fat = array.array(UINT32) - self.loadfat_sect(sect) - #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: -## if ix == 0xFFFFFFFE or ix == 0xFFFFFFFF: -## break -## s = self.getsect(ix) -## #fat = fat + [i32(s, i) for i in range(0, len(s), 4)] -## fat = fat + array.array(UINT32, s) - if self.csectDif != 0: - # [PL] There's a DIFAT because file is larger than 6.8MB - # some checks just in case: - 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') - 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...") - # 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) - 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)) - #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[:nb_difat_sectors]) - # last DIFAT pointer is next DIFAT sector: - 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 - raise IOError('incorrect end of DIFAT') -## if len(self.fat) != self.csectFat: -## # FAT should contain csectFat blocks -## print("FAT length: %d instead of %d" % (len(self.fat), self.csectFat)) -## raise IOError('incorrect DIFAT') - # since FAT is read from fixed-size sectors, it may contain more values - # than the actual number of sectors in the file. - # Keep only the relevant sector indexes: - if len(self.fat) > self.nb_sect: - debug('len(fat)=%d, shrunk to nb_sect=%d' % (len(self.fat), self.nb_sect)) - self.fat = self.fat[:self.nb_sect] - debug('\nFAT:') - self.dumpfat(self.fat) - - def loadminifat(self): - """ - Load the MiniFAT table. - """ - # MiniFAT is stored in a standard sub-stream, pointed to by a header - # field. - # NOTE: there are two sizes to take into account for this stream: - # 1) Stream size is calculated according to the number of sectors - # declared in the OLE header. This allocated stream may be more than - # needed to store the actual sector indexes. - # (self.csectMiniFat is the number of sectors of size self.SectorSize) - stream_size = self.csectMiniFat * self.SectorSize - # 2) Actually used size is calculated by dividing the MiniStream size - # (given by root entry size) by the size of mini sectors, *4 for - # 32 bits indexes: - nb_minisectors = (self.root.size + self.MiniSectorSize-1) // self.MiniSectorSize - used_size = nb_minisectors * 4 - debug('loadminifat(): minifatsect=%d, nb FAT sectors=%d, used_size=%d, stream_size=%d, nb MiniSectors=%d' % - (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') - # 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)] - 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)) - self.minifat = self.minifat[:nb_minisectors] - debug('loadminifat(): len=%d' % len(self.minifat)) - debug('\nMiniFAT:') - self.dumpfat(self.minifat) - - def getsect(self, sect): - """ - Read given sector from file on disk. - - :param sect: int, sector index - :returns: a string containing the sector data. - """ - # 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: - # print("getsect(%X)" % sect) - try: - self.fp.seek(self.sectorsize * (sect+1)) - 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') - 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') - 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. - - :param sect: sector index of directory stream. - """ - # The directory is stored in a standard - # substream, independent of its size. - - # open directory stream as a read-only file: - # (stream size is not known in advance) - self.directory_fp = self._open(sect) - - # [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 = [] - # We start with a list of "None" object - self.direntries = [None] * max_entries -## for sid in iterrange(max_entries): -## entry = fp.read(128) -## if not entry: -## break -## self.direntries.append(_OleDirectoryEntry(entry, sid, self)) - # load root entry: - 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. - This method should only be called once for each storage/stream when - loading the directory. - - :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: - 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: - self.raise_defect(DEFECT_INCORRECT, - "double reference for OLE stream/storage") - # if exception not raised, return the object - return self.direntries[sid] - self.directory_fp.seek(sid * 128) - entry = self.directory_fp.read(128) - 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. - (openstream helper) - - :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. - """ - debug('OleFileIO.open(): sect=%d, size=%d, force_FAT=%s' % - (start, size, str(force_FAT))) - # stream size is compared to the MiniSectorCutoff threshold: - if size < self.minisectorcutoff and not force_FAT: - # ministream object - if not self.ministream: - # load MiniFAT if it wasn't already done: - self.loadminifat() - # The first sector index of the miniFAT stream is stored in the - # root directory entry: - size_ministream = self.root.size - debug('Opening MiniStream: sect=%d, size=%d' % - (self.root.isectStart, size_ministream)) - self.ministream = self._open(self.root.isectStart, - size_ministream, force_FAT=True) - 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(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 - - :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) - """ - prefix = prefix + [node.name] - for entry in node.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) - 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 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) - 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' - - or a list of storage filenames, path to the desired stream/storage. - Example: ['storage_1', 'storage_1.2', 'stream'] - - :returns: sid of requested filename - :exception IOError: if file not found - """ - - # if filename is a string instead of a list, split it on slashes to - # convert to a list: - if isinstance(filename, basestring): - filename = filename.split('/') - # walk across storage tree, following given path: - node = self.root - for name in filename: - for kid in node.kids: - if kid.name.lower() == name.lower(): - break - else: - raise IOError("file not found") - 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' - - or 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. - """ - sid = self._find(filename) - entry = self.direntries[sid] - if entry.entry_type != STGTY_STREAM: - 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 - container, and return its type. - - :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 - """ - try: - sid = self._find(filename) - entry = self.direntries[sid] - return entry.entry_type - except: - return False - - def getmtime(self, filename): - """ - Return modification time of a stream/storage. - - :param filename: path of stream/storage in storage tree. (see openstream for - syntax) - :returns: None if modification time is null, a python datetime object - otherwise (UTC timezone) - - new in version 0.26 - """ - sid = self._find(filename) - entry = self.direntries[sid] - return entry.getmtime() - - def getctime(self, filename): - """ - Return creation time of a stream/storage. - - :param filename: path of stream/storage in storage tree. (see openstream for - syntax) - :returns: None if creation time is null, a python datetime object - otherwise (UTC timezone) - - new in version 0.26 - """ - sid = self._find(filename) - 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: - 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. - - :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. - """ - sid = self._find(filename) - entry = self.direntries[sid] - if entry.entry_type != STGTY_STREAM: - #TODO: Should it return zero instead of raising an exception ? - 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 - implementations. - """ - return self.root.name - - def getproperties(self, filename, convert_time=False, no_conversion=None): - """ - Return properties described in substream. - - :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) - - :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: - no_conversion = [] - # stream path as a string to report exceptions: - streampath = filename - if not isinstance(streampath, str): - streampath = '/'.join(streampath) - - fp = self.openstream(filename) - - data = {} - - try: - # header - s = fp.read(28) - clsid = _clsid(s[8:24]) - - # format id - s = fp.read(20) - fmtid = _clsid(s[:16]) - fp.seek(i32(s, 16)) - - # get section - s = b"****" + fp.read(i32(fp.read(4))-4) - # number of properties: - num_props = i32(s, 4) - except BaseException as exc: - # catch exception while parsing property header, and only raise - # a DEFECT_INCORRECT then return an empty dict, because this is not - # 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)) - return data - - for i in range(num_props): - try: - 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)) - - # test for common types first (should perhaps use - # a dictionary instead?) - - 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 - 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_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 - count = i32(s, offset+4) - value = s[offset+8:offset+8+count-1] - # remove all null chars: - value = value.replace(b'\x00', b'') - elif type == VT_BLOB: - # binary large object (BLOB) - # see http://msdn.microsoft.com/en-us/library/dd942282.aspx - count = i32(s, offset+4) - value = s[offset+8:offset+8+count] - elif type == VT_LPWSTR: - # UnicodeString - # see http://msdn.microsoft.com/en-us/library/dd942313.aspx - # "the string should NOT contain embedded or additional trailing - # null characters." - 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) - # 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)) - # 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) - debug('timedelta days=%d' % (value//(10*1000000*3600*24))) - value = _FILETIME_null_date + datetime.timedelta(microseconds=value//10) - 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 = i8(s[offset+4]) - elif type == VT_CLSID: - value = _clsid(s[offset+4:offset+20]) - elif type == VT_CF: - # PropertyIdentifier or ClipboardData?? - # see http://msdn.microsoft.com/en-us/library/dd941945.aspx - count = i32(s, offset+4) - value = s[offset+8:offset+8+count] - elif type == VT_BOOL: - # VARIANT_BOOL, 16 bits bool, 0x0000=Fals, 0xFFFF=True - # 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)) - - # missing: VT_EMPTY, VT_NULL, VT_R4, VT_R8, VT_CY, VT_DATE, - # VT_DECIMAL, VT_I1, VT_I8, VT_UI8, - # see http://msdn.microsoft.com/en-us/library/dd942033.aspx - - # FIXME: add support for VT_VECTOR - # VT_VECTOR is a 32 uint giving the number of items, followed by - # the items in sequence. The VT_VECTOR value is combined with the - # 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]) - - data[id] = value - except BaseException as exc: - # catch exception while parsing each property, and only raise - # 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)) - - return data - - def get_metadata(self): - """ - Parse standard properties streams, return an OleMetadata object - containing all the available metadata. - (also stored in the metadata attribute of the OleFileIO object) - - new in version 0.25 - """ - self.metadata = OleMetadata() - self.metadata.parse_properties(self) - return self.metadata - -# -# -------------------------------------------------------------------- -# This script can be used to dump the directory of any OLE2 structured -# storage file. - -if __name__ == "__main__": - - # [PL] display quick usage info if launched from command-line - if len(sys.argv) <= 1: - print('olefile version %s %s - %s' % (__version__, __date__, __author__)) - print( -""" -Launched from the command line, this script parses OLE files and prints info. - -Usage: olefile.py [-d] [-c] [file2 ...] - -Options: --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 - - 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(): - # 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() - - # 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) - -# this code was developed while listening to The Wedding Present "Sea Monsters" +sys.modules[__name__] = olefile diff --git a/Tests/test_olefileio.py b/Tests/test_olefileio.py deleted file mode 100644 index cb0496db4..000000000 --- a/Tests/test_olefileio.py +++ /dev/null @@ -1,147 +0,0 @@ -from helper import unittest, PillowTestCase - -import datetime - -import PIL.OleFileIO as OleFileIO - - -class TestOleFileIo(PillowTestCase): - - def test_isOleFile(self): - ole_file = "Tests/images/test-ole-file.doc" - - self.assertTrue(OleFileIO.isOleFile(ole_file)) - with open(ole_file, 'rb') as fp: - self.assertTrue(OleFileIO.isOleFile(fp)) - self.assertTrue(OleFileIO.isOleFile(fp.read())) - - non_ole_file = "Tests/images/flower.jpg" - - self.assertFalse(OleFileIO.isOleFile(non_ole_file)) - with open(non_ole_file, 'rb') as fp: - self.assertFalse(OleFileIO.isOleFile(fp)) - self.assertFalse(OleFileIO.isOleFile(fp.read())) - - def test_exists_worddocument(self): - # Arrange - ole_file = "Tests/images/test-ole-file.doc" - ole = OleFileIO.OleFileIO(ole_file) - - # Act - exists = ole.exists('worddocument') - - # Assert - self.assertTrue(exists) - ole.close() - - def test_exists_no_vba_macros(self): - # Arrange - ole_file = "Tests/images/test-ole-file.doc" - ole = OleFileIO.OleFileIO(ole_file) - - # Act - exists = ole.exists('macros/vba') - - # Assert - self.assertFalse(exists) - ole.close() - - def test_get_type(self): - # Arrange - ole_file = "Tests/images/test-ole-file.doc" - ole = OleFileIO.OleFileIO(ole_file) - - # Act - entry_type = ole.get_type('worddocument') - - # Assert - self.assertEqual(entry_type, OleFileIO.STGTY_STREAM) - ole.close() - - def test_get_size(self): - # Arrange - ole_file = "Tests/images/test-ole-file.doc" - ole = OleFileIO.OleFileIO(ole_file) - - # Act - size = ole.get_size('worddocument') - - # Assert - self.assertGreater(size, 0) - ole.close() - - def test_get_rootentry_name(self): - # Arrange - ole_file = "Tests/images/test-ole-file.doc" - ole = OleFileIO.OleFileIO(ole_file) - - # Act - root = ole.get_rootentry_name() - - # Assert - self.assertEqual(root, "Root Entry") - ole.close() - - def test_meta(self): - # Arrange - ole_file = "Tests/images/test-ole-file.doc" - ole = OleFileIO.OleFileIO(ole_file) - - # Act - meta = ole.get_metadata() - - # Assert - self.assertEqual(meta.author, b"Laurence Ipsum") - self.assertEqual(meta.num_pages, 1) - ole.close() - - def test_gettimes(self): - # Arrange - ole_file = "Tests/images/test-ole-file.doc" - ole = OleFileIO.OleFileIO(ole_file) - root_entry = ole.direntries[0] - - # Act - ctime = root_entry.getctime() - mtime = root_entry.getmtime() - - # Assert - self.assertIsNone(ctime) - self.assertIsInstance(mtime, datetime.datetime) - self.assertEqual(mtime.year, 2014) - ole.close() - - def test_listdir(self): - # Arrange - ole_file = "Tests/images/test-ole-file.doc" - ole = OleFileIO.OleFileIO(ole_file) - - # Act - dirlist = ole.listdir() - - # Assert - self.assertIn(['WordDocument'], dirlist) - ole.close() - - def test_debug(self): - # Arrange - ole_file = "Tests/images/test-ole-file.doc" - ole = OleFileIO.OleFileIO(ole_file) - meta = ole.get_metadata() - - # Act - OleFileIO.set_debug_mode(True) - ole.dumpdirectory() - meta.dump() - - OleFileIO.set_debug_mode(False) - ole.dumpdirectory() - meta.dump() - - # Assert - # No assert, just check they run ok - ole.close() - - -if __name__ == '__main__': - unittest.main() diff --git a/docs/reference/OleFileIO.rst b/docs/reference/OleFileIO.rst deleted file mode 100644 index 791cb5ff3..000000000 --- a/docs/reference/OleFileIO.rst +++ /dev/null @@ -1,364 +0,0 @@ -.. py:module:: PIL.OleFileIO -.. py:currentmodule:: PIL.OleFileIO - -:py:mod:`OleFileIO` Module -=========================== - -The :py:mod:`OleFileIO` module reads Microsoft OLE2 files (also called -Structured Storage or Microsoft Compound Document File Format), such -as Microsoft Office documents, Image Composer and FlashPix files, and -Outlook messages. - -This module is the `OleFileIO\_PL`_ project by Philippe Lagadec, v0.42, -merged back into Pillow. - -.. _OleFileIO\_PL: http://www.decalage.info/python/olefileio - -How to use this module ----------------------- - -For more information, see also the file **PIL/OleFileIO.py**, sample -code at the end of the module itself, and docstrings within the code. - -About the structure of OLE files -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -An OLE file can be seen as a mini file system or a Zip archive: It -contains **streams** of data that look like files embedded within the -OLE file. Each stream has a name. For example, the main stream of a MS -Word document containing its text is named "WordDocument". - -An OLE file can also contain **storages**. A storage is a folder that -contains streams or other storages. For example, a MS Word document with -VBA macros has a storage called "Macros". - -Special streams can contain **properties**. A property is a specific -value that can be used to store information such as the metadata of a -document (title, author, creation date, etc). Property stream names -usually start with the character '05'. - -For example, a typical MS Word document may look like this: - -:: - - \x05DocumentSummaryInformation (stream) - \x05SummaryInformation (stream) - WordDocument (stream) - Macros (storage) - PROJECT (stream) - PROJECTwm (stream) - VBA (storage) - Module1 (stream) - ThisDocument (stream) - _VBA_PROJECT (stream) - dir (stream) - ObjectPool (storage) - -Test if a file is an OLE container -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Use isOleFile to check if the first bytes of the file contain the Magic -for OLE files, before opening it. isOleFile returns True if it is an OLE -file, False otherwise. - -.. code-block:: python - - assert OleFileIO.isOleFile('myfile.doc') - -Open an OLE file from disk -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Create an OleFileIO object with the file path as parameter: - -.. code-block:: python - - ole = OleFileIO.OleFileIO('myfile.doc') - -Open an OLE file from a file-like object -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This is useful if the file is not on disk, e.g. already stored in a -string or as a file-like object. - -.. code-block:: python - - ole = OleFileIO.OleFileIO(f) - -For example the code below reads a file into a string, then uses BytesIO -to turn it into a file-like object. - -.. code-block:: python - - data = open('myfile.doc', 'rb').read() - f = io.BytesIO(data) # or StringIO.StringIO for Python 2.x - ole = OleFileIO.OleFileIO(f) - -How to handle malformed OLE files -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -By default, the parser is configured to be as robust and permissive as -possible, allowing to parse most malformed OLE files. Only fatal errors -will raise an exception. It is possible to tell the parser to be more -strict in order to raise exceptions for files that do not fully conform -to the OLE specifications, using the raise\_defect option: - -.. code-block:: python - - ole = OleFileIO.OleFileIO('myfile.doc', raise_defects=DEFECT_INCORRECT) - -When the parsing is done, the list of non-fatal issues detected is -available as a list in the parsing\_issues attribute of the OleFileIO -object: - -.. code-block:: python - - print('Non-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') - -Syntax for stream and storage path -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Two different syntaxes are allowed for methods that need or return the -path of streams and storages: - -1) Either a **list of strings** including all the storages from the root - up to the stream/storage name. For example a stream called - "WordDocument" at the root will have ['WordDocument'] as full path. A - stream called "ThisDocument" located in the storage "Macros/VBA" will - be ['Macros', 'VBA', 'ThisDocument']. This is the original syntax - from PIL. While hard to read and not very convenient, this syntax - works in all cases. - -2) Or a **single string with slashes** to separate storage and stream - names (similar to the Unix path syntax). The previous examples would - be 'WordDocument' and 'Macros/VBA/ThisDocument'. This syntax is - easier, but may fail if a stream or storage name contains a slash. - -Both are case-insensitive. - -Switching between the two is easy: - -.. code-block:: python - - slash_path = '/'.join(list_path) - list_path = slash_path.split('/') - -Get the list of streams -~~~~~~~~~~~~~~~~~~~~~~~ - -listdir() returns a list of all the streams contained in the OLE file, -including those stored in storages. Each stream is listed itself as a -list, as described above. - -.. code-block:: python - - print(ole.listdir()) - -Sample result: - -.. code-block:: python - - [['\x01CompObj'], ['\x05DocumentSummaryInformation'], ['\x05SummaryInformation'] - , ['1Table'], ['Macros', 'PROJECT'], ['Macros', 'PROJECTwm'], ['Macros', 'VBA', - 'Module1'], ['Macros', 'VBA', 'ThisDocument'], ['Macros', 'VBA', '_VBA_PROJECT'] - , ['Macros', 'VBA', 'dir'], ['ObjectPool'], ['WordDocument']] - -As an option it is possible to choose if storages should also be listed, -with or without streams: - -.. code-block:: python - - ole.listdir (streams=False, storages=True) - -Test if known streams/storages exist: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -exists(path) checks if a given stream or storage exists in the OLE file. - -.. code-block:: python - - if ole.exists('worddocument'): - print("This is a Word document.") - if ole.exists('macros/vba'): - print("This document seems to contain VBA macros.") - -Read data from a stream -~~~~~~~~~~~~~~~~~~~~~~~ - -openstream(path) opens a stream as a file-like object. - -The following example extracts the "Pictures" stream from a PPT file: - -.. code-block:: python - - pics = ole.openstream('Pictures') - data = pics.read() - - -Get information about a stream/storage -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Several methods can provide the size, type and timestamps of a given -stream/storage: - -get\_size(path) returns the size of a stream in bytes: - -.. code-block:: python - - s = ole.get_size('WordDocument') - -get\_type(path) returns the type of a stream/storage, as one of the -following constants: STGTY\_STREAM for a stream, STGTY\_STORAGE for a -storage, STGTY\_ROOT for the root entry, and False for a non existing -path. - -.. code-block:: python - - t = ole.get_type('WordDocument') - -get\_ctime(path) and get\_mtime(path) return the creation and -modification timestamps of a stream/storage, as a Python datetime object -with UTC timezone. Please note that these timestamps are only present if -the application that created the OLE file explicitly stored them, which -is rarely the case. When not present, these methods return None. - -.. code-block:: python - - c = ole.get_ctime('WordDocument') - m = ole.get_mtime('WordDocument') - -The root storage is a special case: You can get its creation and -modification timestamps using the OleFileIO.root attribute: - -.. code-block:: python - - c = ole.root.getctime() - m = ole.root.getmtime() - -Extract metadata -~~~~~~~~~~~~~~~~ - -get\_metadata() will check if standard property streams exist, parse all -the properties they contain, and return an OleMetadata object with the -found properties as attributes. - -.. code-block:: python - - meta = ole.get_metadata() - print('Author:', meta.author) - print('Title:', meta.title) - print('Creation date:', meta.create_time) - # print all metadata: - meta.dump() - -Available attributes include: - -:: - - codepage, title, subject, author, keywords, comments, template, - last_saved_by, revision_number, total_edit_time, last_printed, create_time, - last_saved_time, num_pages, num_words, num_chars, thumbnail, - creating_application, security, codepage_doc, category, presentation_target, - bytes, lines, paragraphs, slides, notes, hidden_slides, mm_clips, - scale_crop, heading_pairs, titles_of_parts, manager, company, links_dirty, - chars_with_spaces, unused, shared_doc, link_base, hlinks, hlinks_changed, - version, dig_sig, content_type, content_status, language, doc_version - -See the source code of the OleMetadata class for more information. - -Parse a property stream -~~~~~~~~~~~~~~~~~~~~~~~ - -get\_properties(path) can be used to parse any property stream that is -not handled by get\_metadata. It returns a dictionary indexed by -integers. Each integer is the index of the property, pointing to its -value. For example in the standard property stream -'05SummaryInformation', the document title is property #2, and the -subject is #3. - -.. code-block:: python - - p = ole.getproperties('specialprops') - -By default as in the original PIL version, timestamp properties are -converted into a number of seconds since Jan 1,1601. With the option -convert\_time, you can obtain more convenient Python datetime objects -(UTC timezone). If some time properties should not be converted (such as -total editing time in '05SummaryInformation'), the list of indexes can -be passed as no\_conversion: - -.. code-block:: python - - p = ole.getproperties('specialprops', convert_time=True, no_conversion=[10]) - -Close the OLE file -~~~~~~~~~~~~~~~~~~ - -Unless your application is a simple script that terminates after -processing an OLE file, do not forget to close each OleFileIO object -after parsing to close the file on disk. - -.. code-block:: python - - ole.close() - -Use OleFileIO as a script -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -OleFileIO can also be used as a script from the command-line to -display the structure of an OLE file and its metadata, for example: - -:: - - PIL/OleFileIO.py myfile.doc - -You can use the option -c to check that all streams can be read fully, -and -d to generate very verbose debugging information. - -How to contribute ------------------ - -The code is available in `a Mercurial repository on -bitbucket `_. You may use -it to submit enhancements or to report any issue. - -If you would like to help us improve this module, or simply provide -feedback, please `contact me `_. You can -help in many ways: - -- test this module on different platforms / Python versions -- find and report bugs -- improve documentation, code samples, docstrings -- write unittest test cases -- provide tricky malformed files - -How to report bugs ------------------- - -To report a bug, for example a normal file which is not parsed -correctly, please use the `issue reporting -page `_, -or if you prefer to do it privately, use this `contact -form `_. Please provide all the -information about the context and how to reproduce the bug. - -If possible please join the debugging output of OleFileIO. For this, -launch the following command : - -:: - - PIL/OleFileIO.py -d -c file >debug.txt - - -Classes and Methods -------------------- - -.. automodule:: PIL.OleFileIO - :members: - :undoc-members: - :show-inheritance: - :noindex: diff --git a/docs/reference/index.rst b/docs/reference/index.rst index 555bd2a57..940b4b9b6 100644 --- a/docs/reference/index.rst +++ b/docs/reference/index.rst @@ -27,7 +27,6 @@ Reference ImageWin ExifTags TiffTags - OleFileIO PSDraw PixelAccess PyAccess diff --git a/setup.py b/setup.py index 808ec728a..d49a1ec59 100644 --- a/setup.py +++ b/setup.py @@ -770,6 +770,7 @@ try: include_package_data=True, packages=find_packages(), scripts=glob.glob("Scripts/*.py"), + install_requires=['olefile'], test_suite='nose.collector', keywords=["Imaging", ], license='Standard PIL License', From 5773fd8396a74ca86e713225df2bc483940c76ff Mon Sep 17 00:00:00 2001 From: homm Date: Wed, 23 Nov 2016 14:41:43 +0300 Subject: [PATCH 009/632] =?UTF-8?q?=5Fmakeself=20=E2=86=92=20=5Fnew?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PIL/Image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/Image.py b/PIL/Image.py index 368186f81..4fd2dcfc7 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -997,7 +997,7 @@ class Image(object): "only RGB or L mode images can be quantized to a palette" ) im = self.im.convert("P", 1, palette.im) - return self._makeself(im) + return self._new(im) return self._new(self.im.quantize(colors, method, kmeans)) From 76b1eb242ef54aaa3e3b50ba07051f7534bc0438 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 23 Nov 2016 06:14:06 -0800 Subject: [PATCH 010/632] Fix for issue #2206 --- libImaging/TiffDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libImaging/TiffDecode.c b/libImaging/TiffDecode.c index 8793f2b34..f292da388 100644 --- a/libImaging/TiffDecode.c +++ b/libImaging/TiffDecode.c @@ -58,7 +58,7 @@ tsize_t _tiffWriteProc(thandle_t hdata, tdata_t buf, tsize_t size) { tdata_t new; tsize_t newsize=state->size; while (newsize < (size + state->size)) { - if (newsize > (tsize_t)SIZE_MAX - 64*1024){ + if (newsize > INT_MAX - 64*1024){ return 0; } newsize += 64*1024; From ce3432f5f42c86eef9823cd780be3c1b4a165bb3 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 23 Nov 2016 06:24:40 -0800 Subject: [PATCH 011/632] Test for issue #2206 --- Tests/test_file_libtiff.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 2d1b33154..bc2149dd6 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -39,6 +39,8 @@ class LibTiffTestCase(PillowTestCase): out = self.tempfile("temp.png") im.save(out) + out_bytes = io.BytesIO() + im.save(out_bytes, format='tiff', compression='group4') class TestFileLibTiff(LibTiffTestCase): From 14734b1d971f76d195cd8de6cae2de12970b33fb Mon Sep 17 00:00:00 2001 From: homm Date: Thu, 24 Nov 2016 03:03:31 +0300 Subject: [PATCH 012/632] remove _makeself deprecated method --- PIL/Image.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 4fd2dcfc7..b808aa2e5 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -530,8 +530,6 @@ class Image(object): new.info = self.info.copy() return new - _makeself = _new # compatibility - # Context Manager Support def __enter__(self): return self From 06895b6fa4db8da510c8161a15e57b43e5e7af58 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 24 Nov 2016 08:37:52 +0200 Subject: [PATCH 013/632] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3e29eac3f..0af77f439 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Use Image._new() instead of _makeself() #2248 + [homm] + - SunImagePlugin fixes #2241 [wiredfool] From 378dbb2f9f059ef555598c533fe87e7382b454c3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 26 Nov 2016 10:57:51 +1100 Subject: [PATCH 014/632] Improved description of method parameter --- PIL/ImageOps.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PIL/ImageOps.py b/PIL/ImageOps.py index 8580ec5fb..182f3c3d2 100644 --- a/PIL/ImageOps.py +++ b/PIL/ImageOps.py @@ -206,7 +206,8 @@ def deform(image, deformer, resample=Image.BILINEAR): :param image: The image to deform. :param deformer: A deformer object. Any object that implements a **getmesh** method can be used. - :param resample: What resampling filter to use. + :param resample: An optional resampling filter. Same values possible as + in the PIL.Image.transform function. :return: An image. """ return image.transform( From 4ed31e8ef78f7e8aa31823ed5599c71037361b2f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 19 Nov 2016 11:19:43 +1100 Subject: [PATCH 015/632] Updated comments to use print as a function --- PIL/BdfFontFile.py | 4 ++-- PIL/CurImagePlugin.py | 16 ++++++++-------- PIL/FontFile.py | 2 +- PIL/FpxImagePlugin.py | 4 ++-- PIL/Image.py | 2 +- PIL/ImageMorph.py | 4 ++-- PIL/IptcImagePlugin.py | 2 +- PIL/JpegImagePlugin.py | 2 +- PIL/SpiderImagePlugin.py | 2 +- PIL/TiffImagePlugin.py | 6 +++--- PIL/WmfImagePlugin.py | 2 +- Tests/make_hash.py | 4 ++-- Tests/test_bmp_reference.py | 4 ++-- Tests/test_format_hsv.py | 24 ++++++++++++------------ Tests/test_image_resample.py | 6 +++--- Tests/test_locale.py | 6 +++--- Tests/test_numpy.py | 2 +- 17 files changed, 46 insertions(+), 46 deletions(-) diff --git a/PIL/BdfFontFile.py b/PIL/BdfFontFile.py index e6cc22f91..d663b55f9 100644 --- a/PIL/BdfFontFile.py +++ b/PIL/BdfFontFile.py @@ -119,9 +119,9 @@ class BdfFontFile(FontFile.FontFile): # fontname = ";".join(font[1:]) - # print "#", fontname + # print("#", fontname) # for i in comments: - # print "#", i + # print("#", i) while True: c = bdf_char(fp) diff --git a/PIL/CurImagePlugin.py b/PIL/CurImagePlugin.py index 4db4c4073..39b3fd9a3 100644 --- a/PIL/CurImagePlugin.py +++ b/PIL/CurImagePlugin.py @@ -58,14 +58,14 @@ class CurImageFile(BmpImagePlugin.BmpImageFile): m = s elif i8(s[0]) > i8(m[0]) and i8(s[1]) > i8(m[1]): m = s - # print "width", i8(s[0]) - # print "height", i8(s[1]) - # print "colors", i8(s[2]) - # print "reserved", i8(s[3]) - # print "hotspot x", i16(s[4:]) - # print "hotspot y", i16(s[6:]) - # print "bytes", i32(s[8:]) - # print "offset", i32(s[12:]) + # print("width", i8(s[0])) + # print("height", i8(s[1])) + # print("colors", i8(s[2])) + # print("reserved", i8(s[3])) + # print("hotspot x", i16(s[4:])) + # print("hotspot y", i16(s[6:])) + # print("bytes", i32(s[8:])) + # print("offset", i32(s[12:])) if not m: raise TypeError("No cursors were found") diff --git a/PIL/FontFile.py b/PIL/FontFile.py index d86f9b3ab..c8860a905 100644 --- a/PIL/FontFile.py +++ b/PIL/FontFile.py @@ -88,7 +88,7 @@ class FontFile(object): x = xx s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 self.bitmap.paste(im.crop(src), s) - # print chr(i), dst, s + # print(chr(i), dst, s) self.metrics[i] = d, dst, s def save(self, filename): diff --git a/PIL/FpxImagePlugin.py b/PIL/FpxImagePlugin.py index a4a9098a7..6595a08bb 100644 --- a/PIL/FpxImagePlugin.py +++ b/PIL/FpxImagePlugin.py @@ -112,7 +112,7 @@ class FpxImageFile(ImageFile.ImageFile): if id in prop: self.jpeg[i] = prop[id] - # print len(self.jpeg), "tables loaded" + # print(len(self.jpeg), "tables loaded") self._open_subimage(1, self.maxid) @@ -141,7 +141,7 @@ class FpxImageFile(ImageFile.ImageFile): offset = i32(s, 28) length = i32(s, 32) - # print size, self.mode, self.rawmode + # print(size, self.mode, self.rawmode) if size != self.size: raise IOError("subimage mismatch") diff --git a/PIL/Image.py b/PIL/Image.py index cabc10743..c086dfcd7 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -2161,7 +2161,7 @@ def fromarray(obj, mode=None): typekey = (1, 1) + shape[2:], arr['typestr'] mode, rawmode = _fromarray_typemap[typekey] except KeyError: - # print typekey + # print(typekey) raise TypeError("Cannot handle this data type") else: rawmode = mode diff --git a/PIL/ImageMorph.py b/PIL/ImageMorph.py index 0bbfbb42b..2f7d762c4 100644 --- a/PIL/ImageMorph.py +++ b/PIL/ImageMorph.py @@ -152,8 +152,8 @@ class LutBuilder(object): # # Debugging # for p,r in patterns: -# print p,r -# print '--' +# print(p,r) +# print('--') # compile the patterns into regular expressions for speed for i, pattern in enumerate(patterns): diff --git a/PIL/IptcImagePlugin.py b/PIL/IptcImagePlugin.py index 1de17cbba..319e6abfe 100644 --- a/PIL/IptcImagePlugin.py +++ b/PIL/IptcImagePlugin.py @@ -107,7 +107,7 @@ class IptcImageFile(ImageFile.ImageFile): else: self.info[tag] = tagdata - # print tag, self.info[tag] + # print(tag, self.info[tag]) # mode layers = i8(self.info[(3, 60)][0]) diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 221bf6495..360c4c9d8 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -316,7 +316,7 @@ class JpegImageFile(ImageFile.ImageFile): if i in MARKER: name, description, handler = MARKER[i] - # print hex(i), name, description + # print(hex(i), name, description) if handler is not None: handler(self, i) if i == 0xFFDA: # start of scan diff --git a/PIL/SpiderImagePlugin.py b/PIL/SpiderImagePlugin.py index 08726f90c..5c4d1bb3b 100644 --- a/PIL/SpiderImagePlugin.py +++ b/PIL/SpiderImagePlugin.py @@ -75,7 +75,7 @@ def isSpiderHeader(t): labrec = int(h[13]) # no. records in file header labbyt = int(h[22]) # total no. of bytes in header lenbyt = int(h[23]) # record length in bytes - # print "labrec = %d, labbyt = %d, lenbyt = %d" % (labrec,labbyt,lenbyt) + # print("labrec = %d, labbyt = %d, lenbyt = %d" % (labrec,labbyt,lenbyt)) if labbyt != (labrec * lenbyt): return 0 # looks like a valid header diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index f1860e4aa..956bdc137 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -338,7 +338,7 @@ class IFDRational(Rational): 'rfloordiv','mod','rmod', 'pow','rpow', 'pos', 'neg', 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'nonzero', 'ceil', 'floor', 'round'] - print "\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a) + print("\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a)) """ __add__ = _delegate('__add__') @@ -800,7 +800,7 @@ class ImageFileDirectory_v1(ImageFileDirectory_v2): ifd = ImageFileDirectory_v1() ifd[key] = 'Some Data' ifd.tagtype[key] = 2 - print ifd[key] + print(ifd[key]) ('Some Data',) Also contains a dictionary of tag types as read from the tiff image file, @@ -1197,7 +1197,7 @@ class TiffImageFile(ImageFile.ImageFile): "tiff_sgilog24", "tiff_raw_16"]: # if DEBUG: - # print "Activating g4 compression for whole file" + # print("Activating g4 compression for whole file") # Decoder expects entire file as one tile. # There's a buffer size limit in load (64k) diff --git a/PIL/WmfImagePlugin.py b/PIL/WmfImagePlugin.py index 9416035c0..e1391c2bb 100644 --- a/PIL/WmfImagePlugin.py +++ b/PIL/WmfImagePlugin.py @@ -111,7 +111,7 @@ class WmfStubImageFile(ImageFile.StubImageFile): self.info["dpi"] = 72 - # print self.mode, self.size, self.info + # print(self.mode, self.size, self.info) # sanity check (standard metafile header) if s[22:26] != b"\x01\x00\t\x00": diff --git a/Tests/make_hash.py b/Tests/make_hash.py index 6d700addf..4412f65be 100644 --- a/Tests/make_hash.py +++ b/Tests/make_hash.py @@ -51,10 +51,10 @@ for i0 in range(65556): print() -# print check(min_size, min_start) +# print(check(min_size, min_start)) print("#define ACCESS_TABLE_SIZE", min_size) print("#define ACCESS_TABLE_HASH", min_start) # for m in modes: -# print m, "=>", hash(m, min_start) % min_size +# print(m, "=>", hash(m, min_start) % min_size) diff --git a/Tests/test_bmp_reference.py b/Tests/test_bmp_reference.py index 0f98d8374..3b20d4a43 100644 --- a/Tests/test_bmp_reference.py +++ b/Tests/test_bmp_reference.py @@ -21,7 +21,7 @@ class TestBmpReference(PillowTestCase): im.load() except Exception: # as msg: pass - # print ("Bad Image %s: %s" %(f,msg)) + # print("Bad Image %s: %s" %(f,msg)) def test_questionable(self): """ These shouldn't crash/dos, but it's not well defined that these @@ -46,7 +46,7 @@ class TestBmpReference(PillowTestCase): except Exception: # as msg: if os.path.basename(f) in supported: raise - # print ("Bad Image %s: %s" %(f,msg)) + # print("Bad Image %s: %s" %(f,msg)) def test_good(self): """ These should all work. There's a set of target files in the diff --git a/Tests/test_format_hsv.py b/Tests/test_format_hsv.py index e32f1c047..eea29b3f1 100644 --- a/Tests/test_format_hsv.py +++ b/Tests/test_format_hsv.py @@ -47,9 +47,9 @@ class TestFormatHSV(PillowTestCase): img = Image.merge('RGB', (r, g, b)) - # print (("%d, %d -> "% (int(1.75*px),int(.25*px))) + \ - # "(%s, %s, %s)"%img.getpixel((1.75*px, .25*px))) - # print (("%d, %d -> "% (int(.75*px),int(.25*px))) + \ + # print(("%d, %d -> "% (int(1.75*px),int(.25*px))) + \ + # "(%s, %s, %s)"%img.getpixel((1.75*px, .25*px))) + # print(("%d, %d -> "% (int(.75*px),int(.25*px))) + \ # "(%s, %s, %s)"%img.getpixel((.75*px, .25*px))) return img @@ -95,8 +95,8 @@ class TestFormatHSV(PillowTestCase): im = src.convert('HSV') comparable = self.to_hsv_colorsys(src) - # print (im.getpixel((448, 64))) - # print (comparable.getpixel((448, 64))) + # print(im.getpixel((448, 64))) + # print(comparable.getpixel((448, 64))) # print(im.split()[0].histogram()) # print(comparable.split()[0].histogram()) @@ -111,15 +111,15 @@ class TestFormatHSV(PillowTestCase): self.assert_image_similar(im.split()[2], comparable.split()[2], 1, "Value conversion is wrong") - # print (im.getpixel((192, 64))) + # print(im.getpixel((192, 64))) comparable = src im = im.convert('RGB') # im.split()[0].show() # comparable.split()[0].show() - # print (im.getpixel((192, 64))) - # print (comparable.getpixel((192, 64))) + # print(im.getpixel((192, 64))) + # print(comparable.getpixel((192, 64))) self.assert_image_similar(im.split()[0], comparable.split()[0], 3, "R conversion is wrong") @@ -132,8 +132,8 @@ class TestFormatHSV(PillowTestCase): im = hopper('RGB').convert('HSV') comparable = self.to_hsv_colorsys(hopper('RGB')) -# print ([ord(x) for x in im.split()[0].tobytes()[:80]]) -# print ([ord(x) for x in comparable.split()[0].tobytes()[:80]]) +# print([ord(x) for x in im.split()[0].tobytes()[:80]]) +# print([ord(x) for x in comparable.split()[0].tobytes()[:80]]) # print(im.split()[0].histogram()) # print(comparable.split()[0].histogram()) @@ -153,8 +153,8 @@ class TestFormatHSV(PillowTestCase): # print(converted.split()[1].histogram()) # print(target.split()[1].histogram()) - # print ([ord(x) for x in target.split()[1].tobytes()[:80]]) - # print ([ord(x) for x in converted.split()[1].tobytes()[:80]]) + # print([ord(x) for x in target.split()[1].tobytes()[:80]]) + # print([ord(x) for x in converted.split()[1].tobytes()[:80]]) self.assert_image_similar(converted.split()[0], comparable.split()[0], 3, "R conversion is wrong") diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index ebc1ac6e4..ac58eafa0 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -323,10 +323,10 @@ class CoreResamplePassesTest(PillowTestCase): class CoreResampleCoefficientsTest(PillowTestCase): def test_reduce(self): test_color = 254 - # print '' + # print() for size in range(400000, 400010, 2): - # print '\r', size, + # print(size) i = Image.new('L', (size, 1), 0) draw = ImageDraw.Draw(i) draw.rectangle((0, 0, i.size[0] // 2 - 1, 0), test_color) @@ -334,7 +334,7 @@ class CoreResampleCoefficientsTest(PillowTestCase): px = i.resize((5, i.size[1]), Image.BICUBIC).load() if px[2, 0] != test_color // 2: self.assertEqual(test_color // 2, px[2, 0]) - # print '\r>', size, test_color // 2, px[2, 0] + # print('>', size, test_color // 2, px[2, 0]) def test_nonzero_coefficients(self): # regression test for the wrong coefficients calculation diff --git a/Tests/test_locale.py b/Tests/test_locale.py index 3f6ce0ade..3fa7c3e67 100644 --- a/Tests/test_locale.py +++ b/Tests/test_locale.py @@ -8,10 +8,10 @@ import locale # on windows, in polish locale: # import locale -# print locale.setlocale(locale.LC_ALL, 'polish') +# print(locale.setlocale(locale.LC_ALL, 'polish')) # import string -# print len(string.whitespace) -# print ord(string.whitespace[6]) +# print(len(string.whitespace)) +# print(ord(string.whitespace[6])) # Polish_Poland.1250 # 7 diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 370b8c1f9..02ae5e50b 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -54,7 +54,7 @@ class TestNumpy(PillowTestCase): i = Image.fromarray(a) if list(i.split()[0].getdata()) != list(range(100)): print("data mismatch for", dtype) - # print dtype, list(i.getdata()) + # print(dtype, list(i.getdata())) return i # Check supported 1-bit integer formats From 67be3a9eda142270eec8b92801bc883a0ac704d5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 26 Nov 2016 11:05:56 +1100 Subject: [PATCH 016/632] Added future print_function imports --- PIL/BdfFontFile.py | 2 ++ PIL/CurImagePlugin.py | 1 + PIL/FontFile.py | 2 ++ PIL/FpxImagePlugin.py | 1 + PIL/ImageMorph.py | 2 ++ PIL/JpegImagePlugin.py | 2 ++ PIL/WmfImagePlugin.py | 2 ++ Tests/test_bmp_reference.py | 1 + Tests/test_image_resample.py | 1 + Tests/test_locale.py | 1 + 10 files changed, 15 insertions(+) diff --git a/PIL/BdfFontFile.py b/PIL/BdfFontFile.py index d663b55f9..b02c44fd2 100644 --- a/PIL/BdfFontFile.py +++ b/PIL/BdfFontFile.py @@ -17,6 +17,8 @@ # See the README file for information on usage and redistribution. # +from __future__ import print_function + from PIL import Image from PIL import FontFile diff --git a/PIL/CurImagePlugin.py b/PIL/CurImagePlugin.py index 39b3fd9a3..3a9a10e01 100644 --- a/PIL/CurImagePlugin.py +++ b/PIL/CurImagePlugin.py @@ -16,6 +16,7 @@ # See the README file for information on usage and redistribution. # +from __future__ import print_function from PIL import Image, BmpImagePlugin, _binary diff --git a/PIL/FontFile.py b/PIL/FontFile.py index c8860a905..807984a8c 100644 --- a/PIL/FontFile.py +++ b/PIL/FontFile.py @@ -14,6 +14,8 @@ # See the README file for information on usage and redistribution. # +from __future__ import print_function + import os from PIL import Image, _binary diff --git a/PIL/FpxImagePlugin.py b/PIL/FpxImagePlugin.py index 6595a08bb..59240718f 100644 --- a/PIL/FpxImagePlugin.py +++ b/PIL/FpxImagePlugin.py @@ -15,6 +15,7 @@ # See the README file for information on usage and redistribution. # +from __future__ import print_function from PIL import Image, ImageFile from PIL.OleFileIO import i8, i32, MAGIC, OleFileIO diff --git a/PIL/ImageMorph.py b/PIL/ImageMorph.py index 2f7d762c4..3ad708291 100644 --- a/PIL/ImageMorph.py +++ b/PIL/ImageMorph.py @@ -5,6 +5,8 @@ # # Copyright (c) 2014 Dov Grobgeld +from __future__ import print_function + from PIL import Image from PIL import _imagingmorph import re diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 360c4c9d8..1e2504888 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -32,6 +32,8 @@ # See the README file for information on usage and redistribution. # +from __future__ import print_function + import array import struct import io diff --git a/PIL/WmfImagePlugin.py b/PIL/WmfImagePlugin.py index e1391c2bb..ff4819a66 100644 --- a/PIL/WmfImagePlugin.py +++ b/PIL/WmfImagePlugin.py @@ -15,6 +15,8 @@ # See the README file for information on usage and redistribution. # +from __future__ import print_function + from PIL import Image, ImageFile, _binary __version__ = "0.2" diff --git a/Tests/test_bmp_reference.py b/Tests/test_bmp_reference.py index 3b20d4a43..fa4571e60 100644 --- a/Tests/test_bmp_reference.py +++ b/Tests/test_bmp_reference.py @@ -1,3 +1,4 @@ +from __future__ import print_function from helper import unittest, PillowTestCase from PIL import Image diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index ac58eafa0..7ae687e2f 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -1,3 +1,4 @@ +from __future__ import print_function from helper import unittest, PillowTestCase, hopper from PIL import Image, ImageDraw, ImageMode diff --git a/Tests/test_locale.py b/Tests/test_locale.py index 3fa7c3e67..142753791 100644 --- a/Tests/test_locale.py +++ b/Tests/test_locale.py @@ -1,3 +1,4 @@ +from __future__ import print_function from helper import unittest, PillowTestCase from PIL import Image From 87de178e0b285956dc1ad262ca487357ced47b6b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 26 Nov 2016 11:29:20 +1100 Subject: [PATCH 017/632] Added context manager when opening files in WalImageFile --- PIL/WalImageFile.py | 51 +++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/PIL/WalImageFile.py b/PIL/WalImageFile.py index b0b1e684a..fac1dc1a8 100644 --- a/PIL/WalImageFile.py +++ b/PIL/WalImageFile.py @@ -47,33 +47,34 @@ def open(filename): # FIXME: modify to return a WalImageFile instance instead of # plain Image object ? + def imopen(fp): + # read header fields + header = fp.read(32+24+32+12) + size = i32(header, 32), i32(header, 36) + offset = i32(header, 40) + + # load pixel data + fp.seek(offset) + + im = Image.frombytes("P", size, fp.read(size[0] * size[1])) + im.putpalette(quake2palette) + + im.format = "WAL" + im.format_description = "Quake2 Texture" + + # strings are null-terminated + im.info["name"] = header[:32].split(b"\0", 1)[0] + next_name = header[56:56+32].split(b"\0", 1)[0] + if next_name: + im.info["next_name"] = next_name + + return im + if hasattr(filename, "read"): - fp = filename + return imopen(filename) else: - fp = builtins.open(filename, "rb") - - # read header fields - header = fp.read(32+24+32+12) - size = i32(header, 32), i32(header, 36) - offset = i32(header, 40) - - # load pixel data - fp.seek(offset) - - im = Image.frombytes("P", size, fp.read(size[0] * size[1])) - im.putpalette(quake2palette) - - im.format = "WAL" - im.format_description = "Quake2 Texture" - - # strings are null-terminated - im.info["name"] = header[:32].split(b"\0", 1)[0] - next_name = header[56:56+32].split(b"\0", 1)[0] - if next_name: - im.info["next_name"] = next_name - - return im - + with builtins.open(filename, "rb") as fp: + return imopen(fp) quake2palette = ( # default palette taken from piffo 0.93 by Hans Häggström From 14cfec0b49c4fd1e69e2c50bca6558e1363d3467 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 26 Nov 2016 11:50:56 +1100 Subject: [PATCH 018/632] Added decompression bomb check to WalImageFile --- PIL/WalImageFile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/PIL/WalImageFile.py b/PIL/WalImageFile.py index fac1dc1a8..1167fa739 100644 --- a/PIL/WalImageFile.py +++ b/PIL/WalImageFile.py @@ -56,6 +56,7 @@ def open(filename): # load pixel data fp.seek(offset) + Image._decompression_bomb_check(size) im = Image.frombytes("P", size, fp.read(size[0] * size[1])) im.putpalette(quake2palette) From 0116c9240efd6e6ba12f357b81a8c5290d64474c Mon Sep 17 00:00:00 2001 From: glexey Date: Sun, 27 Nov 2016 08:03:51 -0800 Subject: [PATCH 019/632] EMF: support negative bounding box coordinates (#2249) * EMF: support negative bounding box coordinates Similar to placeable WMF, bounding box coordinates should be interpreted as signed integer, otherwise opening EMF file with negative (x0,y0) fails. * Basic load tests for WMF and EMF formats * WMF/WMF tests: just test open(), not load() Not sure why load() fails on Debian build. Well, at least we can test open(). * WMF/EMF: Unpack signed integers using unpack() * WMF/EMF: Compare to reference PNG rendering * EMF/WMF comparison: use assert_image_similar() * Use similarity epsilon 0.5 for WMF, as vector rendering looks different across Windows platforms * Trigger rebuild --- PIL/WmfImagePlugin.py | 25 +++++++++++-------------- PIL/_binary.py | 22 ++++++++++++++++++++-- Tests/images/drawing.emf | Bin 0 -> 876 bytes Tests/images/drawing.wmf | Bin 0 -> 610 bytes Tests/images/drawing_emf_ref.png | Bin 0 -> 20304 bytes Tests/images/drawing_wmf_ref.png | Bin 0 -> 531 bytes Tests/test_file_wmf.py | 31 +++++++++++++++++++++++++++++++ 7 files changed, 62 insertions(+), 16 deletions(-) create mode 100644 Tests/images/drawing.emf create mode 100644 Tests/images/drawing.wmf create mode 100644 Tests/images/drawing_emf_ref.png create mode 100644 Tests/images/drawing_wmf_ref.png create mode 100644 Tests/test_file_wmf.py diff --git a/PIL/WmfImagePlugin.py b/PIL/WmfImagePlugin.py index 9416035c0..1dbd9f964 100644 --- a/PIL/WmfImagePlugin.py +++ b/PIL/WmfImagePlugin.py @@ -14,6 +14,10 @@ # # See the README file for information on usage and redistribution. # +# WMF/EMF reference documentation: +# https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf +# http://wvware.sourceforge.net/caolan/index.html +# http://wvware.sourceforge.net/caolan/ora-wmf.html from PIL import Image, ImageFile, _binary @@ -56,16 +60,9 @@ if hasattr(Image.core, "drawwmf"): # -------------------------------------------------------------------- word = _binary.i16le - - -def short(c, o=0): - v = word(c, o) - if v >= 32768: - v -= 65536 - return v - +short = _binary.si16le dword = _binary.i32le - +_long = _binary.si32le # # -------------------------------------------------------------------- @@ -121,13 +118,13 @@ class WmfStubImageFile(ImageFile.StubImageFile): # enhanced metafile # get bounding box - x0 = dword(s, 8) - y0 = dword(s, 12) - x1 = dword(s, 16) - y1 = dword(s, 20) + x0 = _long(s, 8) + y0 = _long(s, 12) + x1 = _long(s, 16) + y1 = _long(s, 20) # get frame (in 0.01 millimeter units) - frame = dword(s, 24), dword(s, 28), dword(s, 32), dword(s, 36) + frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36) # normalize size to 72 dots per inch size = x1 - x0, y1 - y0 diff --git a/PIL/_binary.py b/PIL/_binary.py index 1cbe59dea..9760b86cd 100644 --- a/PIL/_binary.py +++ b/PIL/_binary.py @@ -31,23 +31,41 @@ else: # TODO: replace with more readable struct.unpack equivalent def i16le(c, o=0): """ - Converts a 2-bytes (16 bits) string to an integer. + Converts a 2-bytes (16 bits) string to an unsigned integer. c: string containing bytes to convert o: offset of bytes to convert in string """ return unpack("H", c[o:o+2])[0] diff --git a/Tests/images/drawing.emf b/Tests/images/drawing.emf new file mode 100644 index 0000000000000000000000000000000000000000..ef751cd51a4d542c949802f6ca0d6824cf0ba8bb GIT binary patch literal 876 zcmaiz-AV#c6ouEM{g4&?Q9%$xB^8LxPo`E9K?N0EdDT^jnMf*P7tT%Ki}Wr%LYLn3 zEVkBgjzNKK_|D$5&)WN(nRCVg@JTQn4#mSHAgq;BfN-zwuK@?m1hBLxb~m*4NO&^Ju{(Msvg=y9S_t&d}ITJi!cK3K`;(aM?t>WYQlbri{ddB7qUSVaG)H^)Y-kPm{@DBnRtU< zNF!S%isuPGXFR9(kPXQcNt53_rFkR;qW*tu+lhPHy!u$P{Zw~C)H_K|$qd;fizMWo zc&A8L5tA rUx_*8&y3ea(V1AY@0Vsm--hM=eG{|I=sehCl-IXhAUaQL`ft7g7R6_K literal 0 HcmV?d00001 diff --git a/Tests/images/drawing.wmf b/Tests/images/drawing.wmf new file mode 100644 index 0000000000000000000000000000000000000000..d9cfda453d9fcb68f45c5b7aa775599a859c374f GIT binary patch literal 610 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 Dw?19& literal 0 HcmV?d00001 diff --git a/Tests/images/drawing_wmf_ref.png b/Tests/images/drawing_wmf_ref.png new file mode 100644 index 0000000000000000000000000000000000000000..207160de0d33ec60eb038a5bc7988c6bc28ddc70 GIT binary patch literal 531 zcmV+u0_^>XP)Y0005nNklTSrsyoowwgOkt~`U?tyz;LPi1#*)}+gm*e1-HMENz_ zkXe%=zhIj)YcAz6wo$VtE&Kgpt#LL}oXr$xGo_<{ z&_5OdrVv8mgAkTOI^@n~inE#GY^Kn$1qdNb00{3`=-SqBvq|P$zRx0ax6PIxd-yq* z#nblmZDZ)dW&OhnZyUg%h0E?YG~V_%gB8B78fR?}BR@35hkTm>3O}nF@wQFNBW7F< zxlwuCjFiu|Ir*g-iC<}kqE$F`@^_PCWhXf6IWu!Gj|8vX5;_7BUZ V=6D`xo3j7_002ovPDHLkV1n2=1BU Date: Sun, 27 Nov 2016 16:07:37 +0000 Subject: [PATCH 020/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 0af77f439..aa1d8f355 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- EMF: support negative bounding box coordinates #2249 + [glexey] + +- Close file if opened in WalImageFile #2216 + [radarhere] + - Use Image._new() instead of _makeself() #2248 [homm] From 6145a7216be04d3dbad764cfd61d55b94d7870af Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 27 Nov 2016 16:29:05 +0000 Subject: [PATCH 021/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index aa1d8f355..8762f4db8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Doc: Improved description of ImageOps.deform resample parameter #2256 + [radarhere] + - EMF: support negative bounding box coordinates #2249 [glexey] From 01392fcb2e72e839e0f38cf3e28dd990b989e858 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 29 Nov 2016 19:35:53 +0000 Subject: [PATCH 022/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 8762f4db8..7d26efb5d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Fix TIFFImagePlugin ICC color profile saving. #2087 + [cskau] + - Doc: Improved description of ImageOps.deform resample parameter #2256 [radarhere] From 4d6c2d5601956fca2984f7378ab1d156886479aa Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 30 Nov 2016 14:37:50 +0200 Subject: [PATCH 023/632] Test saving 256x256 icons --- Tests/test_file_ico.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 94b8c44e3..dc5c041b2 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -48,6 +48,19 @@ class TestFileIco(PillowTestCase): self.assert_image_equal(reloaded, hopper().resize((32, 32), Image.LANCZOS)) + def test_save_256x256(self): + """Issue #2264 https://github.com/python-pillow/Pillow/issues/2264""" + # Arrange + im = Image.open("Tests/images/hopper_256x256.ico") + outfile = self.tempfile("temp_saved_hopper_256x256.ico") + + # Act + im.save(outfile) + im_saved = Image.open(outfile) + + # Assert + self.assertEqual(im_saved.size, (256, 256)) + if __name__ == '__main__': unittest.main() From 4061c3836c4435171c70c53eda6d1dd2264f133a Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 30 Nov 2016 14:38:04 +0200 Subject: [PATCH 024/632] Created with IrfanView --- Tests/images/hopper_256x256.ico | Bin 0 -> 204862 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/hopper_256x256.ico diff --git a/Tests/images/hopper_256x256.ico b/Tests/images/hopper_256x256.ico new file mode 100644 index 0000000000000000000000000000000000000000..2c08b1f3cf7179379929016b53cb635bf78174aa GIT binary patch literal 204862 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≻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 Date: Wed, 30 Nov 2016 14:50:53 +0200 Subject: [PATCH 025/632] Fix saving 256x256 icons --- PIL/IcoImagePlugin.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index b278a85bf..c48465620 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -44,7 +44,7 @@ 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)]) + (64, 64), (128, 128), (256, 256)]) 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) @@ -52,8 +52,9 @@ def _save(im, fp, filename): 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) + # 0 means 256 + fp.write(struct.pack("B", width if width < 256 else 0)) # bWidth(1) + fp.write(struct.pack("B", height if height < 256 else 0)) # bHeight(1) fp.write(b"\0") # bColorCount(1) fp.write(b"\0") # bReserved(1) fp.write(b"\0\0") # wPlanes(2) From 43fc9c9b597b11796452ff6d243b1544ace36d62 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 30 Nov 2016 14:51:30 +0200 Subject: [PATCH 026/632] flake8 --- PIL/IcoImagePlugin.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index c48465620..9d4ebb6e8 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -216,13 +216,13 @@ class IcoFile(object): total_bytes = int((w * im.size[1]) / 8) self.buf.seek(and_mask_offset) - maskData = self.buf.read(total_bytes) + mask_data = self.buf.read(total_bytes) # convert raw data to image mask = Image.frombuffer( '1', # 1 bpp im.size, # (w, h) - maskData, # source chars + mask_data, # source chars 'raw', # raw decoder ('1;I', int(w/8), -1) # 1bpp inverted, padded, reversed ) @@ -279,6 +279,7 @@ class IcoImageFile(ImageFile.ImageFile): # # -------------------------------------------------------------------- + Image.register_open(IcoImageFile.format, IcoImageFile, _accept) Image.register_save(IcoImageFile.format, _save) Image.register_extension(IcoImageFile.format, ".ico") From b341898c7f53d5cc776bd601961500c95e0c54a9 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 30 Nov 2016 16:00:14 +0200 Subject: [PATCH 027/632] Allow 256x256 sizes --- PIL/IcoImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index 9d4ebb6e8..5dbf31f9f 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -47,7 +47,7 @@ def _save(im, fp, filename): (64, 64), (128, 128), (256, 256)]) 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) + x[0] > 256 or x[1] > 256) else True, sizes) fp.write(struct.pack(" Date: Wed, 30 Nov 2016 16:36:04 +0200 Subject: [PATCH 028/632] Test case for #2266 --- Tests/test_file_ico.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index dc5c041b2..3904340f3 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -61,6 +61,24 @@ class TestFileIco(PillowTestCase): # Assert self.assertEqual(im_saved.size, (256, 256)) + def test_only_save_relevant_sizes(self): + """Issue #2266 https://github.com/python-pillow/Pillow/issues/2266 + Should save in 16x16, 24x24, 32x32, 48x48 sizes + and not in 16x16, 24x24, 32x32, 48x48, 48x48, 48x48, 48x48 sizes + """ + # Arrange + im = Image.open("Tests/images/python.ico") # 16x16, 32x32, 48x48 + outfile = self.tempfile("temp_saved_python.ico") + + # Act + im.save(outfile) + im_saved = Image.open(outfile) + + # Assert + self.assertEqual( + im_saved.info['sizes'], + set([(16, 16), (24, 24), (32, 32), (48, 48)])) + if __name__ == '__main__': unittest.main() From 880464f46c231e4e1c74abf61613af1306be1128 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 30 Nov 2016 16:41:43 +0200 Subject: [PATCH 029/632] Only save relevant sizes --- PIL/IcoImagePlugin.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index 5dbf31f9f..195bbe42e 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -46,8 +46,9 @@ def _save(im, fp, filename): [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)]) width, height = im.size - filter(lambda x: False if (x[0] > width or x[1] > height or - x[0] > 256 or x[1] > 256) else True, sizes) + sizes = filter(lambda x: False if (x[0] > width or x[1] > height or + x[0] > 256 or x[1] > 256) else True, + sizes) fp.write(struct.pack(" Date: Wed, 30 Nov 2016 16:50:44 +0200 Subject: [PATCH 030/632] Python 3 compatibility --- PIL/IcoImagePlugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index 195bbe42e..3436ae84f 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -49,6 +49,7 @@ def _save(im, fp, filename): sizes = filter(lambda x: False if (x[0] > width or x[1] > height or x[0] > 256 or x[1] > 256) else True, sizes) + sizes = list(sizes) fp.write(struct.pack(" Date: Mon, 14 Nov 2016 07:00:17 -0800 Subject: [PATCH 031/632] design docs for file closing --- docs/reference/index.rst | 1 + docs/reference/internal_design.rst | 7 ++ docs/reference/open_files.rst | 124 +++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 docs/reference/internal_design.rst create mode 100644 docs/reference/open_files.rst diff --git a/docs/reference/index.rst b/docs/reference/index.rst index 555bd2a57..1dffcc9e2 100644 --- a/docs/reference/index.rst +++ b/docs/reference/index.rst @@ -33,3 +33,4 @@ Reference PyAccess ../PIL plugins + internal_design diff --git a/docs/reference/internal_design.rst b/docs/reference/internal_design.rst new file mode 100644 index 000000000..4672d1886 --- /dev/null +++ b/docs/reference/internal_design.rst @@ -0,0 +1,7 @@ +Internal Reference Docs +======================= + +.. toctree:: + :maxdepth: 2 + + open_files diff --git a/docs/reference/open_files.rst b/docs/reference/open_files.rst new file mode 100644 index 000000000..76130fbca --- /dev/null +++ b/docs/reference/open_files.rst @@ -0,0 +1,124 @@ +File Handling in Pillow +======================= + +When opening a file as an image, Pillow requires a filename, +pathlib.Path object, or a file-like object. Pillow uses the filename +or Path to open a file, so for the rest of this article, they will all +be treated as a file-like object. + +The first four of these items are equivalent, the last is dangerous +and may fail:: + + from PIL import Image + import io + import pathlib + + im = Image.open('test.jpg') + + im2 = Image.open(pathlib.Path('test.jpg')) + + f = open('test.jpg', 'rb') + im3 = Image.open(f) + + with open('test.jpg', 'rb') as f: + im4 = Image.open(io.BytesIO(f.read())) + + # Dangerous FAIL: + with open('test.jpg', 'rb') as f: + im5 = Image.open(f) + im5.load() # FAILS, closed file + +The documentation specifies that the file will be closed after the +``Image.Image.load()`` method is called. This is an aspirational +specification rather than an accurate reflection of the state of the +code. + +Pillow cannot in general close and reopen a file, so any access to +that file needs to be prior to the close. + +Issues +------ + +The current open file handling is inconsistent at best: + +* Most of the image plugins do not close the input file. +* Multi-frame images behave badly when seeking through the file, as + it's legal to seek backward in the file until the last image is + read, and then it's not. +* Using the file context manager to provide a file-like object to + Pillow is dangerous unless the context of the image is limited to + the context of the file. + +Image Lifecycle +--------------- + +* ``Image.open()`` called. Path-like objects are opened as a + file. Metadata is read from the open file. The file is left open for + further usage. + +* ``Image.Image.load()`` when the pixel data from the image is + required, ``load()`` is called. The current frame is read into + memory. The image can now be used independently of the underlying + image file. + +* ``Image.Image.seek()`` in the case of multi-frame images + (e.g. multipage TIFF and animated GIF) the image file left open so + that seek can load the appropriate frame. When the last frame is + read, the image file is closed, and no more seeks can occur. + +* ``Image.Image.close()`` Closes the file pointer and destroys the + core image object. This is used in the Pillow context manager + support. e.g.:: + + with Image.open('test.jpg') as img: + ... # image operations here. + + +The lifecycle of a single frame image is relatively simple. The file +must remain open until the ``load()`` or ``close()`` function is +called. + +Multi-frame images are more complicated. The ``load()`` method is not +a terminal method, so it should not close the underlying file. The +current behavior of ``seek()`` closing the underlying file on +accessing the last frame is presumably a heuristic for closing the +file after iterating through the entire sequence. In general, Pillow +does not know if there are going to be any requests for additional +data until the caller has explicitly closed the image. + + +Complications +------------- + +* TiffImagePlugin has some code to pass the underlying file descriptor + into libtiff (if working on an actual file). Since libtiff closes + the file descriptor internally, it is duplicated prior to passing it + into libtiff. + +* ``decoder.handles_eof`` This slightly misnamed flag indicates that + the decoder wants to be called with a 0 length buffer when reads are + done. Despite the comments in ``ImageFile.load()``, the only decoder + that actually uses this flag is the Jpeg2K decoder. The use of this + flag in Jpeg2K predated the change to the decoder that added the + pulls_fd flag, and is therefore not used. + +* I don't think that there's any way to make this safe without + changing the lazy loading:: + + # Dangerous FAIL: + with open('test.jpg', 'rb') as f: + im5 = Image.open(f) + im5.load() # FAILS, closed file + + +Proposed File Handling +---------------------- + +* ``Image.Image.load()`` should close the image file, unless there are + multiple frames. + +* ``Image.Image.seek()`` should never close the image file. + +* Users of the library should call ``Image.Image.close()`` on any + multi-frame image to ensure that the underlying file is closed. + From cf85e8f1c760d338ba63d985d739b7e985787fed Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 14 Nov 2016 07:26:52 -0800 Subject: [PATCH 032/632] design docs for file closing --- docs/reference/open_files.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/reference/open_files.rst b/docs/reference/open_files.rst index 76130fbca..143eb7209 100644 --- a/docs/reference/open_files.rst +++ b/docs/reference/open_files.rst @@ -64,7 +64,8 @@ Image Lifecycle * ``Image.Image.seek()`` in the case of multi-frame images (e.g. multipage TIFF and animated GIF) the image file left open so that seek can load the appropriate frame. When the last frame is - read, the image file is closed, and no more seeks can occur. + read, the image file is closed (at least in some image plugins), and + no more seeks can occur. * ``Image.Image.close()`` Closes the file pointer and destroys the core image object. This is used in the Pillow context manager From 711e95e3612b7feb1dceae5d6bf776d136304063 Mon Sep 17 00:00:00 2001 From: Chris Hogan Date: Thu, 1 Dec 2016 11:10:03 -0600 Subject: [PATCH 033/632] Fix bug in test_idf_rational_save A boolean wrapped in parentheses is still a boolean, not a tuple. The comma makes this an actual tuple so it can be iterated on in the for loop. --- Tests/test_tiff_ifdrational.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_tiff_ifdrational.py b/Tests/test_tiff_ifdrational.py index 7e2c908b5..ffd4f9eac 100644 --- a/Tests/test_tiff_ifdrational.py +++ b/Tests/test_tiff_ifdrational.py @@ -47,7 +47,7 @@ class Test_IFDRational(PillowTestCase): def test_ifd_rational_save(self): methods = (True, False) if 'libtiff_encoder' not in dir(Image.core): - methods = (False) + methods = (False,) for libtiff in methods: TiffImagePlugin.WRITE_LIBTIFF = libtiff From 937199e54556dae5882e3d2a65d804365a8cca67 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 1 Dec 2016 09:11:04 -0800 Subject: [PATCH 034/632] document limits --- docs/reference/internal_design.rst | 1 + docs/reference/limits.rst | 41 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 docs/reference/limits.rst diff --git a/docs/reference/internal_design.rst b/docs/reference/internal_design.rst index 4672d1886..a8d6e2284 100644 --- a/docs/reference/internal_design.rst +++ b/docs/reference/internal_design.rst @@ -5,3 +5,4 @@ Internal Reference Docs :maxdepth: 2 open_files + limits diff --git a/docs/reference/limits.rst b/docs/reference/limits.rst new file mode 100644 index 000000000..6f81c9e65 --- /dev/null +++ b/docs/reference/limits.rst @@ -0,0 +1,41 @@ +Limits +------ + +This page is documentation to the various fundamental size limits in +the Pillow implementation. + +Internal Limits +=============== + +* Image sizes cannot be negative. These are checked both in + ``Storage.c`` and ``Image.py`` + +* Image sizes may be 0. (At least, prior to 3.4) + +* Maximum pixel dimensions are limited to INT32, or 2^31 by the sizes + in the image header. + +* Individual allocations are limited to 2GB in ``Storage.c`` + +* The 2GB allocation puts an upper limit to the xsize of the image of + either 2^31 for 'L' or 2^29 for 'RGB' + +* Individual memory mapped segments are limited to 2GB in map.c based + on the overflow checks. This requires that any memory mapped image + is smaller than 2GB, as calculated by ``y*stride`` (so 2Gpx for 'L' + images, and .5Gpx for 'RGB' + +* Any call to internal python size functions for buffers or strings + are currently returned as int32, not py_ssize_t. This limits the + maximum buffer to 2GB for operations like frombytes and frombuffer. + +* This also limits the size of buffers converted using a + decoder. (decode.c:127) + +Format Size Limits +================== + +* ICO: Max size is 256x256 + +* Webp: 16383x16383 (underlying library size limit: + https://developers.google.com/speed/webp/docs/api) From 132412fdf39f5a79e570d703d19691b485db5cca Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 1 Dec 2016 17:19:36 +0000 Subject: [PATCH 035/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 7d26efb5d..fa8b07d44 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- ICO: Only save relevant sizes #2267 + [hugovk] + +- ICO: Allow saving .ico files of 256x256 instead of 255x255 #2265 + [hugovk] + - Fix TIFFImagePlugin ICC color profile saving. #2087 [cskau] From e4623c425e64dd2fa97fe02db96fa37256ef8197 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 2 Dec 2016 09:01:00 +1100 Subject: [PATCH 036/632] Fixed typo --- Tk/_tkmini.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tk/_tkmini.h b/Tk/_tkmini.h index 348425e41..adc470532 100644 --- a/Tk/_tkmini.h +++ b/Tk/_tkmini.h @@ -59,7 +59,7 @@ /* * Unless otherwise noted, these definitions are stable from Tcl / Tk 8.4 - * through Tck / Tk master as of 21 May 2016 + * through Tcl / Tk master as of 21 May 2016 */ #ifdef __cplusplus From 15347b6703ea804f68de4fd2762462ced45b2cff Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 2 Dec 2016 10:27:38 +1100 Subject: [PATCH 037/632] Fixed typo [ci skip] --- docs/reference/TiffTags.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/TiffTags.rst b/docs/reference/TiffTags.rst index 9518461dd..3b261625a 100644 --- a/docs/reference/TiffTags.rst +++ b/docs/reference/TiffTags.rst @@ -4,7 +4,7 @@ :py:mod:`TiffTags` Module ========================= -The :py:mod:`TiffTags` module exposes many of the stantard TIFF +The :py:mod:`TiffTags` module exposes many of the standard TIFF metadata tag numbers, names, and type information. .. method:: lookup(tag) From d48dabfd9714b77a7fdd2e9648797ae52fd1af40 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 3 Dec 2016 13:39:24 +0000 Subject: [PATCH 038/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index fa8b07d44..8687c0fc8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Test: Fix bug in test_ifd_rational_save when libtiff is not available #2270 + [ChristopherHogan] + - ICO: Only save relevant sizes #2267 [hugovk] From 8e7dd8ef1edaddc881da2da063df37d4383601ae Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 3 Dec 2016 13:45:26 +0000 Subject: [PATCH 039/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 8687c0fc8..22cd34ca7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Tiff: Update info.icc_profile when using libtiff reader. #2193 + [lambdafu] + - Test: Fix bug in test_ifd_rational_save when libtiff is not available #2270 [ChristopherHogan] From b3f8b5fa7d6acac15b57692e73a76de5cbf0edcd Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 3 Dec 2016 14:07:49 +0000 Subject: [PATCH 040/632] tabs->spaces --- libImaging/Pack.c | 422 +++++++++++++++++++++++----------------------- 1 file changed, 211 insertions(+), 211 deletions(-) diff --git a/libImaging/Pack.c b/libImaging/Pack.c index 8a0fcc004..c768bc27d 100644 --- a/libImaging/Pack.c +++ b/libImaging/Pack.c @@ -1,4 +1,4 @@ -/* + /* * The Python Imaging Library. * $Id$ * @@ -28,16 +28,16 @@ #include "Imaging.h" -#define R 0 -#define G 1 -#define B 2 -#define X 3 -#define A 3 +#define R 0 +#define G 1 +#define B 2 +#define X 3 +#define A 3 -#define C 0 -#define M 1 -#define Y 2 -#define K 3 +#define C 0 +#define M 1 +#define Y 2 +#define K 3 /* byte swapping macros */ @@ -83,16 +83,16 @@ pack1(UINT8* out, const UINT8* in, int pixels) /* bilevel (black is 0) */ b = 0; m = 128; for (i = 0; i < pixels; i++) { - if (in[i] != 0) - b |= m; - m >>= 1; - if (m == 0) { - *out++ = b; - b = 0; m = 128; - } + if (in[i] != 0) + b |= m; + m >>= 1; + if (m == 0) { + *out++ = b; + b = 0; m = 128; + } } if (m != 128) - *out++ = b; + *out++ = b; } static void @@ -102,16 +102,16 @@ pack1I(UINT8* out, const UINT8* in, int pixels) /* bilevel (black is 1) */ b = 0; m = 128; for (i = 0; i < pixels; i++) { - if (in[i] == 0) - b |= m; - m >>= 1; - if (m == 0) { - *out++ = b; - b = 0; m = 128; - } + if (in[i] == 0) + b |= m; + m >>= 1; + if (m == 0) { + *out++ = b; + b = 0; m = 128; + } } if (m != 128) - *out++ = b; + *out++ = b; } static void @@ -121,16 +121,16 @@ pack1R(UINT8* out, const UINT8* in, int pixels) /* bilevel, lsb first (black is 0) */ b = 0; m = 1; for (i = 0; i < pixels; i++) { - if (in[i] != 0) - b |= m; - m <<= 1; - if (m == 256){ - *out++ = b; - b = 0; m = 1; - } + if (in[i] != 0) + b |= m; + m <<= 1; + if (m == 256){ + *out++ = b; + b = 0; m = 1; + } } if (m != 1) - *out++ = b; + *out++ = b; } static void @@ -140,16 +140,16 @@ pack1IR(UINT8* out, const UINT8* in, int pixels) /* bilevel, lsb first (black is 1) */ b = 0; m = 1; for (i = 0; i < pixels; i++) { - if (in[i] == 0) - b |= m; - m <<= 1; - if (m == 256){ - *out++ = b; - b = 0; m = 1; - } + if (in[i] == 0) + b |= m; + m <<= 1; + if (m == 256){ + *out++ = b; + b = 0; m = 1; + } } if (m != 1) - *out++ = b; + *out++ = b; } static void @@ -158,44 +158,44 @@ pack1L(UINT8* out, const UINT8* in, int pixels) int i; /* bilevel, stored as bytes */ for (i = 0; i < pixels; i++) - out[i] = (in[i] != 0) ? 255 : 0; + out[i] = (in[i] != 0) ? 255 : 0; } static void packP4(UINT8* out, const UINT8* in, int pixels) { while (pixels >= 2) { - *out++ = (in[0] << 4) | - (in[1] & 15); - in += 2; pixels -= 2; + *out++ = (in[0] << 4) | + (in[1] & 15); + in += 2; pixels -= 2; } if (pixels) - out[0] = (in[0] << 4); + out[0] = (in[0] << 4); } static void packP2(UINT8* out, const UINT8* in, int pixels) { while (pixels >= 4) { - *out++ = (in[0] << 6) | - ((in[1] & 3) << 4) | - ((in[2] & 3) << 2) | - (in[3] & 3); - in += 4; pixels -= 4; + *out++ = (in[0] << 6) | + ((in[1] & 3) << 4) | + ((in[2] & 3) << 2) | + (in[3] & 3); + in += 4; pixels -= 4; } switch (pixels) { case 3: - out[0] = (in[0] << 6) | - ((in[1] & 3) << 4) | - ((in[2] & 3) << 2); - break; + out[0] = (in[0] << 6) | + ((in[1] & 3) << 4) | + ((in[2] & 3) << 2); + break; case 2: - out[0] = (in[0] << 6) | - ((in[1] & 3) << 4); + out[0] = (in[0] << 6) | + ((in[1] & 3) << 4); case 1: - out[0] = (in[0] << 6); + out[0] = (in[0] << 6); } } @@ -205,9 +205,9 @@ packLA(UINT8* out, const UINT8* in, int pixels) int i; /* LA, pixel interleaved */ for (i = 0; i < pixels; i++) { - out[0] = in[R]; - out[1] = in[A]; - out += 2; in += 4; + out[0] = in[R]; + out[1] = in[A]; + out += 2; in += 4; } } @@ -217,9 +217,9 @@ packLAL(UINT8* out, const UINT8* in, int pixels) int i; /* LA, line interleaved */ for (i = 0; i < pixels; i++) { - out[i] = in[R]; - out[i+pixels] = in[A]; - in += 4; + out[i] = in[R]; + out[i+pixels] = in[A]; + in += 4; } } @@ -229,10 +229,10 @@ ImagingPackRGB(UINT8* out, const UINT8* in, int pixels) int i; /* RGB triplets */ for (i = 0; i < pixels; i++) { - out[0] = in[R]; - out[1] = in[G]; - out[2] = in[B]; - out += 3; in += 4; + out[0] = in[R]; + out[1] = in[G]; + out[2] = in[B]; + out += 3; in += 4; } } @@ -242,11 +242,11 @@ ImagingPackXRGB(UINT8* out, const UINT8* in, int pixels) int i; /* XRGB, triplets with left padding */ for (i = 0; i < pixels; i++) { - out[0] = 0; - out[1] = in[R]; - out[2] = in[G]; - out[3] = in[B]; - out += 4; in += 4; + out[0] = 0; + out[1] = in[R]; + out[2] = in[G]; + out[3] = in[B]; + out += 4; in += 4; } } @@ -256,10 +256,10 @@ ImagingPackBGR(UINT8* out, const UINT8* in, int pixels) int i; /* RGB, reversed bytes */ for (i = 0; i < pixels; i++) { - out[0] = in[B]; - out[1] = in[G]; - out[2] = in[R]; - out += 3; in += 4; + out[0] = in[B]; + out[1] = in[G]; + out[2] = in[R]; + out += 3; in += 4; } } @@ -269,11 +269,11 @@ ImagingPackBGRX(UINT8* out, const UINT8* in, int pixels) int i; /* BGRX, reversed bytes with right padding */ for (i = 0; i < pixels; i++) { - out[0] = in[B]; - out[1] = in[G]; - out[2] = in[R]; - out[3] = 0; - out += 4; in += 4; + out[0] = in[B]; + out[1] = in[G]; + out[2] = in[R]; + out[3] = 0; + out += 4; in += 4; } } @@ -283,11 +283,11 @@ ImagingPackXBGR(UINT8* out, const UINT8* in, int pixels) int i; /* XBGR, reversed bytes with left padding */ for (i = 0; i < pixels; i++) { - out[0] = 0; - out[1] = in[B]; - out[2] = in[G]; - out[3] = in[R]; - out += 4; in += 4; + out[0] = 0; + out[1] = in[B]; + out[2] = in[G]; + out[3] = in[R]; + out += 4; in += 4; } } @@ -297,11 +297,11 @@ ImagingPackBGRA(UINT8* out, const UINT8* in, int pixels) int i; /* BGRX, reversed bytes with right padding */ for (i = 0; i < pixels; i++) { - out[0] = in[B]; - out[1] = in[G]; - out[2] = in[R]; - out[3] = in[A]; - out += 4; in += 4; + out[0] = in[B]; + out[1] = in[G]; + out[2] = in[R]; + out[3] = in[A]; + out += 4; in += 4; } } @@ -311,11 +311,11 @@ ImagingPackABGR(UINT8* out, const UINT8* in, int pixels) int i; /* XBGR, reversed bytes with left padding */ for (i = 0; i < pixels; i++) { - out[0] = in[A]; - out[1] = in[B]; - out[2] = in[G]; - out[3] = in[R]; - out += 4; in += 4; + out[0] = in[A]; + out[1] = in[B]; + out[2] = in[G]; + out[3] = in[R]; + out += 4; in += 4; } } @@ -340,10 +340,10 @@ packRGBL(UINT8* out, const UINT8* in, int pixels) int i; /* RGB, line interleaved */ for (i = 0; i < pixels; i++) { - out[i] = in[R]; - out[i+pixels] = in[G]; - out[i+pixels+pixels] = in[B]; - in += 4; + out[i] = in[R]; + out[i+pixels] = in[G]; + out[i+pixels+pixels] = in[B]; + in += 4; } } @@ -353,11 +353,11 @@ packRGBXL(UINT8* out, const UINT8* in, int pixels) int i; /* RGBX, line interleaved */ for (i = 0; i < pixels; i++) { - out[i] = in[R]; - out[i+pixels] = in[G]; - out[i+pixels+pixels] = in[B]; - out[i+pixels+pixels+pixels] = in[X]; - in += 4; + out[i] = in[R]; + out[i+pixels] = in[G]; + out[i+pixels+pixels] = in[B]; + out[i+pixels+pixels+pixels] = in[X]; + in += 4; } } @@ -376,7 +376,7 @@ packI16B(UINT8* out, const UINT8* in_, int pixels) else tmp_ = in[0]; C16B; - out += 2; in++; + out += 2; in++; } } @@ -386,7 +386,7 @@ packI16N_I16B(UINT8* out, const UINT8* in, int pixels){ UINT8* tmp = (UINT8*) in; for (i = 0; i < pixels; i++) { C16B; - out += 2; tmp += 2; + out += 2; tmp += 2; } } @@ -396,7 +396,7 @@ packI16N_I16(UINT8* out, const UINT8* in, int pixels){ UINT8* tmp = (UINT8*) in; for (i = 0; i < pixels; i++) { C16L; - out += 2; tmp += 2; + out += 2; tmp += 2; } } @@ -408,7 +408,7 @@ packI32S(UINT8* out, const UINT8* in, int pixels) UINT8* tmp = (UINT8*) in; for (i = 0; i < pixels; i++) { C32L; - out += 4; tmp += 4; + out += 4; tmp += 4; } } @@ -418,10 +418,10 @@ ImagingPackLAB(UINT8* out, const UINT8* in, int pixels) int i; /* LAB triplets */ for (i = 0; i < pixels; i++) { - out[0] = in[0]; - out[1] = in[1] ^ 128; /* signed in outside world */ - out[2] = in[2] ^ 128; - out += 3; in += 4; + out[0] = in[0]; + out[1] = in[1] ^ 128; /* signed in outside world */ + out[2] = in[2] ^ 128; + out += 3; in += 4; } } @@ -459,7 +459,7 @@ copy4I(UINT8* out, const UINT8* in, int pixels) /* RGBA, CMYK quadruples, inverted */ int i; for (i = 0; i < pixels*4; i++) - out[i] = ~in[i]; + out[i] = ~in[i]; } static void @@ -467,7 +467,7 @@ band0(UINT8* out, const UINT8* in, int pixels) { int i; for (i = 0; i < pixels; i++, in += 4) - out[i] = in[0]; + out[i] = in[0]; } static void @@ -475,7 +475,7 @@ band1(UINT8* out, const UINT8* in, int pixels) { int i; for (i = 0; i < pixels; i++, in += 4) - out[i] = in[1]; + out[i] = in[1]; } static void @@ -483,7 +483,7 @@ band2(UINT8* out, const UINT8* in, int pixels) { int i; for (i = 0; i < pixels; i++, in += 4) - out[i] = in[2]; + out[i] = in[2]; } static void @@ -491,7 +491,7 @@ band3(UINT8* out, const UINT8* in, int pixels) { int i; for (i = 0; i < pixels; i++, in += 4) - out[i] = in[3]; + out[i] = in[3]; } static struct { @@ -502,122 +502,122 @@ static struct { } packers[] = { /* bilevel */ - {"1", "1", 1, pack1}, - {"1", "1;I", 1, pack1I}, - {"1", "1;R", 1, pack1R}, - {"1", "1;IR", 1, pack1IR}, - {"1", "L", 8, pack1L}, + {"1", "1", 1, pack1}, + {"1", "1;I", 1, pack1I}, + {"1", "1;R", 1, pack1R}, + {"1", "1;IR", 1, pack1IR}, + {"1", "L", 8, pack1L}, /* greyscale */ - {"L", "L", 8, copy1}, + {"L", "L", 8, copy1}, /* greyscale w. alpha */ - {"LA", "LA", 16, packLA}, - {"LA", "LA;L", 16, packLAL}, + {"LA", "LA", 16, packLA}, + {"LA", "LA;L", 16, packLAL}, /* palette */ - {"P", "P;1", 1, pack1}, - {"P", "P;2", 2, packP2}, - {"P", "P;4", 4, packP4}, - {"P", "P", 8, copy1}, + {"P", "P;1", 1, pack1}, + {"P", "P;2", 2, packP2}, + {"P", "P;4", 4, packP4}, + {"P", "P", 8, copy1}, /* palette w. alpha */ - {"PA", "PA", 16, packLA}, - {"PA", "PA;L", 16, packLAL}, + {"PA", "PA", 16, packLA}, + {"PA", "PA;L", 16, packLAL}, /* true colour */ - {"RGB", "RGB", 24, ImagingPackRGB}, - {"RGB", "RGBX", 32, copy4}, - {"RGB", "XRGB", 32, ImagingPackXRGB}, - {"RGB", "BGR", 24, ImagingPackBGR}, - {"RGB", "BGRX", 32, ImagingPackBGRX}, - {"RGB", "XBGR", 32, ImagingPackXBGR}, - {"RGB", "RGB;L", 24, packRGBL}, - {"RGB", "R", 8, band0}, - {"RGB", "G", 8, band1}, - {"RGB", "B", 8, band2}, + {"RGB", "RGB", 24, ImagingPackRGB}, + {"RGB", "RGBX", 32, copy4}, + {"RGB", "XRGB", 32, ImagingPackXRGB}, + {"RGB", "BGR", 24, ImagingPackBGR}, + {"RGB", "BGRX", 32, ImagingPackBGRX}, + {"RGB", "XBGR", 32, ImagingPackXBGR}, + {"RGB", "RGB;L", 24, packRGBL}, + {"RGB", "R", 8, band0}, + {"RGB", "G", 8, band1}, + {"RGB", "B", 8, band2}, /* true colour w. alpha */ - {"RGBA", "RGBA", 32, copy4}, - {"RGBA", "RGBA;L", 32, packRGBXL}, - {"RGBA", "RGB", 24, ImagingPackRGB}, - {"RGBA", "BGR", 24, ImagingPackBGR}, - {"RGBA", "BGRA", 32, ImagingPackBGRA}, - {"RGBA", "ABGR", 32, ImagingPackABGR}, - {"RGBA", "BGRa", 32, ImagingPackBGRa}, - {"RGBA", "R", 8, band0}, - {"RGBA", "G", 8, band1}, - {"RGBA", "B", 8, band2}, - {"RGBA", "A", 8, band3}, + {"RGBA", "RGBA", 32, copy4}, + {"RGBA", "RGBA;L", 32, packRGBXL}, + {"RGBA", "RGB", 24, ImagingPackRGB}, + {"RGBA", "BGR", 24, ImagingPackBGR}, + {"RGBA", "BGRA", 32, ImagingPackBGRA}, + {"RGBA", "ABGR", 32, ImagingPackABGR}, + {"RGBA", "BGRa", 32, ImagingPackBGRa}, + {"RGBA", "R", 8, band0}, + {"RGBA", "G", 8, band1}, + {"RGBA", "B", 8, band2}, + {"RGBA", "A", 8, band3}, /* true colour w. alpha premultiplied */ - {"RGBa", "RGBa", 32, copy4}, - {"RGBa", "BGRa", 32, ImagingPackBGRA}, - {"RGBa", "aBGR", 32, ImagingPackABGR}, + {"RGBa", "RGBa", 32, copy4}, + {"RGBa", "BGRa", 32, ImagingPackBGRA}, + {"RGBa", "aBGR", 32, ImagingPackABGR}, /* true colour w. padding */ - {"RGBX", "RGBX", 32, copy4}, - {"RGBX", "RGBX;L", 32, packRGBXL}, - {"RGBX", "RGB", 32, ImagingPackRGB}, - {"RGBX", "BGR", 32, ImagingPackBGR}, - {"RGBX", "BGRX", 32, ImagingPackBGRX}, - {"RGBX", "XBGR", 32, ImagingPackXBGR}, - {"RGBX", "R", 8, band0}, - {"RGBX", "G", 8, band1}, - {"RGBX", "B", 8, band2}, - {"RGBX", "X", 8, band3}, + {"RGBX", "RGBX", 32, copy4}, + {"RGBX", "RGBX;L", 32, packRGBXL}, + {"RGBX", "RGB", 32, ImagingPackRGB}, + {"RGBX", "BGR", 32, ImagingPackBGR}, + {"RGBX", "BGRX", 32, ImagingPackBGRX}, + {"RGBX", "XBGR", 32, ImagingPackXBGR}, + {"RGBX", "R", 8, band0}, + {"RGBX", "G", 8, band1}, + {"RGBX", "B", 8, band2}, + {"RGBX", "X", 8, band3}, /* colour separation */ - {"CMYK", "CMYK", 32, copy4}, - {"CMYK", "CMYK;I", 32, copy4I}, - {"CMYK", "CMYK;L", 32, packRGBXL}, - {"CMYK", "C", 8, band0}, - {"CMYK", "M", 8, band1}, - {"CMYK", "Y", 8, band2}, - {"CMYK", "K", 8, band3}, + {"CMYK", "CMYK", 32, copy4}, + {"CMYK", "CMYK;I", 32, copy4I}, + {"CMYK", "CMYK;L", 32, packRGBXL}, + {"CMYK", "C", 8, band0}, + {"CMYK", "M", 8, band1}, + {"CMYK", "Y", 8, band2}, + {"CMYK", "K", 8, band3}, /* video (YCbCr) */ - {"YCbCr", "YCbCr", 24, ImagingPackRGB}, - {"YCbCr", "YCbCr;L", 24, packRGBL}, - {"YCbCr", "YCbCrX", 32, copy4}, - {"YCbCr", "YCbCrK", 32, copy4}, - {"YCbCr", "Y", 8, band0}, - {"YCbCr", "Cb", 8, band1}, - {"YCbCr", "Cr", 8, band2}, + {"YCbCr", "YCbCr", 24, ImagingPackRGB}, + {"YCbCr", "YCbCr;L", 24, packRGBL}, + {"YCbCr", "YCbCrX", 32, copy4}, + {"YCbCr", "YCbCrK", 32, copy4}, + {"YCbCr", "Y", 8, band0}, + {"YCbCr", "Cb", 8, band1}, + {"YCbCr", "Cr", 8, band2}, /* LAB Color */ - {"LAB", "LAB", 24, ImagingPackLAB}, - {"LAB", "L", 8, band0}, - {"LAB", "A", 8, band1}, - {"LAB", "B", 8, band2}, + {"LAB", "LAB", 24, ImagingPackLAB}, + {"LAB", "L", 8, band0}, + {"LAB", "A", 8, band1}, + {"LAB", "B", 8, band2}, /* HSV */ - {"HSV", "HSV", 24, ImagingPackRGB}, - {"HSV", "H", 8, band0}, - {"HSV", "S", 8, band1}, - {"HSV", "V", 8, band2}, + {"HSV", "HSV", 24, ImagingPackRGB}, + {"HSV", "H", 8, band0}, + {"HSV", "S", 8, band1}, + {"HSV", "V", 8, band2}, /* integer */ - {"I", "I", 32, copy4}, - {"I", "I;16B", 16, packI16B}, - {"I", "I;32S", 32, packI32S}, - {"I", "I;32NS", 32, copy4}, + {"I", "I", 32, copy4}, + {"I", "I;16B", 16, packI16B}, + {"I", "I;32S", 32, packI32S}, + {"I", "I;32NS", 32, copy4}, /* floating point */ - {"F", "F", 32, copy4}, - {"F", "F;32F", 32, packI32S}, - {"F", "F;32NF", 32, copy4}, + {"F", "F", 32, copy4}, + {"F", "F;32F", 32, packI32S}, + {"F", "F;32NF", 32, copy4}, /* storage modes */ - {"I;16", "I;16", 16, copy2}, - {"I;16B", "I;16B", 16, copy2}, - {"I;16L", "I;16L", 16, copy2}, - {"I;16", "I;16N", 16, packI16N_I16}, // LibTiff native->image endian. - {"I;16L", "I;16N", 16, packI16N_I16}, - {"I;16B", "I;16N", 16, packI16N_I16B}, - {"BGR;15", "BGR;15", 16, copy2}, - {"BGR;16", "BGR;16", 16, copy2}, - {"BGR;24", "BGR;24", 24, copy3}, + {"I;16", "I;16", 16, copy2}, + {"I;16B", "I;16B", 16, copy2}, + {"I;16L", "I;16L", 16, copy2}, + {"I;16", "I;16N", 16, packI16N_I16}, // LibTiff native->image endian. + {"I;16L", "I;16N", 16, packI16N_I16}, + {"I;16B", "I;16N", 16, packI16N_I16B}, + {"BGR;15", "BGR;15", 16, copy2}, + {"BGR;16", "BGR;16", 16, copy2}, + {"BGR;24", "BGR;24", 24, copy3}, {NULL} /* sentinel */ }; @@ -630,11 +630,11 @@ ImagingFindPacker(const char* mode, const char* rawmode, int* bits_out) /* find a suitable pixel packer */ for (i = 0; packers[i].rawmode; i++) - if (strcmp(packers[i].mode, mode) == 0 && + if (strcmp(packers[i].mode, mode) == 0 && strcmp(packers[i].rawmode, rawmode) == 0) { - if (bits_out) - *bits_out = packers[i].bits; - return packers[i].pack; - } + if (bits_out) + *bits_out = packers[i].bits; + return packers[i].pack; + } return NULL; } From 88c43b61b7d5339292be31bcd70c0f707a3a76ae Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 3 Dec 2016 14:08:59 +0000 Subject: [PATCH 041/632] Fix for #2258, 2 bit palette images corrupted --- Tests/test_imagepalette.py | 15 ++++++++++++++- libImaging/Pack.c | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Tests/test_imagepalette.py b/Tests/test_imagepalette.py index e26c242b0..b8e74d99e 100644 --- a/Tests/test_imagepalette.py +++ b/Tests/test_imagepalette.py @@ -1,6 +1,6 @@ from helper import unittest, PillowTestCase -from PIL import ImagePalette +from PIL import ImagePalette, Image ImagePalette = ImagePalette.ImagePalette @@ -125,6 +125,19 @@ class TestImagePalette(PillowTestCase): self.assertEqual(rawmode, "RGB") self.assertEqual(data_in, data_out) + def test_2bit_palette(self): + # issue #2258, 2 bit palettes are corrupted. + outfile = self.tempfile('temp.png') + + rgb = b'\x00' * 2 + b'\x01' * 2 + b'\x02' * 2 + img = Image.frombytes('P', (6, 1), rgb) + img.putpalette('\xFF\x00\x00' '\x00\xFF\x00' '\x00\x00\xFF') # RGB + img.save(outfile, format='PNG') + + reloaded = Image.open(outfile) + + self.assert_image_equal(img, reloaded) + if __name__ == '__main__': unittest.main() diff --git a/libImaging/Pack.c b/libImaging/Pack.c index c768bc27d..621936351 100644 --- a/libImaging/Pack.c +++ b/libImaging/Pack.c @@ -194,6 +194,7 @@ packP2(UINT8* out, const UINT8* in, int pixels) case 2: out[0] = (in[0] << 6) | ((in[1] & 3) << 4); + break; case 1: out[0] = (in[0] << 6); } From 4b57345683891de2c1e83a07a14e516caf68bd2c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 3 Dec 2016 14:45:05 +0000 Subject: [PATCH 042/632] Refactor random image --- Tests/test_file_jpeg.py | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 1b34b42c6..7cbb96c2e 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -1,7 +1,6 @@ from helper import unittest, PillowTestCase, hopper, py3 from helper import djpeg_available, cjpeg_available -import random from io import BytesIO import os @@ -29,6 +28,15 @@ class TestFileJpeg(PillowTestCase): im.bytes = test_bytes # for testing only return im + def gen_random_image(self, size, mode='RGB'): + """ Generates a very hard to compress file + :param size: tuple + :param mode: optional image mode + + """ + return Image.frombytes(mode, size, + os.urandom(size[0]*size[1]*len(mode))) + def test_sanity(self): # internal version number @@ -159,12 +167,7 @@ class TestFileJpeg(PillowTestCase): def test_progressive_large_buffer_highest_quality(self): f = self.tempfile('temp.jpg') - if py3: - a = bytes(random.randint(0, 255) for _ in range(256 * 256 * 3)) - else: - a = b''.join(chr(random.randint(0, 255)) for _ in range( - 256 * 256 * 3)) - im = Image.frombuffer("RGB", (256, 256), a, "raw", "RGB", 0, 1) + im = self.gen_random_image((255,255)) # this requires more bytes than pixels in the image im.save(f, format="JPEG", progressive=True, quality=100) @@ -436,14 +439,7 @@ class TestFileJpeg(PillowTestCase): 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)) + im = self.gen_random_image((512, 512)) f = self.tempfile("temp.jpeg") im.save(f, quality=100, optimize=True) From 7e2bd28a7cbc7fd7a01fc5bcef7956279ed99d85 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 3 Dec 2016 14:45:45 +0000 Subject: [PATCH 043/632] Fix for issue 2272, CMYK images miss the heuristic for the maxblock buffer scaling --- PIL/JpegImagePlugin.py | 5 ++++- Tests/test_file_jpeg.py | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 221bf6495..4daf67aad 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -716,8 +716,11 @@ def _save(im, fp, filename): # https://github.com/matthewwithanm/django-imagekit/issues/50 bufsize = 0 if optimize or progressive: + # CMYK can be bigger + if im.mode == 'CMYK': + bufsize = 4 * im.size[0] * im.size[1] # keep sets quality to 0, but the actual value may be high. - if quality >= 95 or quality == 0: + elif 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 7cbb96c2e..b703598c5 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -171,6 +171,12 @@ class TestFileJpeg(PillowTestCase): # this requires more bytes than pixels in the image im.save(f, format="JPEG", progressive=True, quality=100) + def test_progressive_cmyk_buffer(self): + # Issue 2272, quality 90 cmyk image is tripping the large buffer bug. + f = BytesIO() + im = self.gen_random_image((256,256), 'CMYK') + im.save(f, format='JPEG', progressive=True, quality=94) + def test_large_exif(self): # https://github.com/python-pillow/Pillow/issues/148 f = self.tempfile('temp.jpg') From d983aead74fc9d2ece607020009ddccee5e34417 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 3 Dec 2016 14:49:44 +0000 Subject: [PATCH 044/632] Py3 bytes --- Tests/test_imagepalette.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imagepalette.py b/Tests/test_imagepalette.py index b8e74d99e..f80fa34c8 100644 --- a/Tests/test_imagepalette.py +++ b/Tests/test_imagepalette.py @@ -131,7 +131,7 @@ class TestImagePalette(PillowTestCase): rgb = b'\x00' * 2 + b'\x01' * 2 + b'\x02' * 2 img = Image.frombytes('P', (6, 1), rgb) - img.putpalette('\xFF\x00\x00' '\x00\xFF\x00' '\x00\x00\xFF') # RGB + img.putpalette(b'\xFF\x00\x00\x00\xFF\x00\x00\x00\xFF') # RGB img.save(outfile, format='PNG') reloaded = Image.open(outfile) From b1017b29030170234b36df343415bc3517a6154b Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 4 Dec 2016 12:33:08 +0200 Subject: [PATCH 045/632] Update CHANGES.rst [CI skip] --- CHANGES.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 22cd34ca7..8321dc293 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,9 +4,12 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Fix for 2-bit palette corruption #2274 + [pdknsk, wiredfool] + - Tiff: Update info.icc_profile when using libtiff reader. #2193 [lambdafu] - + - Test: Fix bug in test_ifd_rational_save when libtiff is not available #2270 [ChristopherHogan] From 194ebd4e0a3f63161768f9bcbdac4df050c65a70 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 4 Dec 2016 18:41:39 +0300 Subject: [PATCH 046/632] remove depreciated internal "stretch" method --- _imaging.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/_imaging.c b/_imaging.c index e2320d862..b72aa552a 100644 --- a/_imaging.c +++ b/_imaging.c @@ -2977,9 +2977,6 @@ static struct PyMethodDef methods[] = { {"rankfilter", (PyCFunction)_rankfilter, 1}, #endif {"resize", (PyCFunction)_resize, 1}, - // There were two methods for image resize before. - // Starting from Pillow 2.7.0 stretch is depreciated. - {"stretch", (PyCFunction)_resize, 1}, {"transpose", (PyCFunction)_transpose, 1}, {"transform2", (PyCFunction)_transform2, 1}, From 9c38253733196b77d7eb0151e347dfeeeb80605b Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 4 Dec 2016 18:59:53 +0300 Subject: [PATCH 047/632] set executable flag on setup.py and add shebang --- setup.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) mode change 100644 => 100755 setup.py diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 index 808ec728a..72dc11baa --- a/setup.py +++ b/setup.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # > pyroma . # ------------------------------ # Checking . @@ -89,7 +90,7 @@ def _lib_include(root): def _cmd_exists(cmd): return any( - os.access(os.path.join(path, cmd), os.X_OK) + os.access(os.path.join(path, cmd), os.X_OK) for path in os.environ["PATH"].split(os.pathsep) ) @@ -547,7 +548,7 @@ class pil_build_ext(build_ext): if f in ('jpeg', 'zlib'): raise RequiredDependencyException(f) raise DependencyException(f) - + # # core library From 87840374638a9deb2c9f539edb60a7fe8d9a1fc0 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 4 Dec 2016 22:00:51 +0200 Subject: [PATCH 048/632] Update [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 8321dc293..07c775ee5 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Update Maxblock heuristic #2275 + [wiredfool] + - Fix for 2-bit palette corruption #2274 [pdknsk, wiredfool] From aa247dbb60ffb0689c2500e24686636d073c2562 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 3 Dec 2016 13:37:31 +0000 Subject: [PATCH 049/632] Moving tests requiring libtiff to test_file_libtiff --- Tests/test_file_libtiff.py | 45 ++++++++++++++++++++++++++++++++++++++ Tests/test_file_tiff.py | 44 ------------------------------------- 2 files changed, 45 insertions(+), 44 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 3a8c0b1c2..95a4d27c2 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -532,5 +532,50 @@ class TestFileLibTiff(LibTiffTestCase): TiffImagePlugin.READ_LIBTIFF = False self.assertEqual(icc, icc_libtiff) + def test_multipage_compression(self): + im = Image.open('Tests/images/compression.tif') + + im.seek(0) + self.assertEqual(im._compression, 'tiff_ccitt') + self.assertEqual(im.size, (10, 10)) + + im.seek(1) + self.assertEqual(im._compression, 'packbits') + self.assertEqual(im.size, (10, 10)) + im.load() + + im.seek(0) + self.assertEqual(im._compression, 'tiff_ccitt') + self.assertEqual(im.size, (10, 10)) + im.load() + + def test_save_tiff_with_jpegtables(self): + # Arrange + outfile = self.tempfile("temp.tif") + + # Created with ImageMagick: convert hopper.jpg hopper_jpg.tif + # Contains JPEGTables (347) tag + infile = "Tests/images/hopper_jpg.tif" + im = Image.open(infile) + + # Act / Assert + # Should not raise UnicodeDecodeError or anything else + im.save(outfile) + + 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. + 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) + # Should not divide by zero + im.save(outfile) + + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 76fe8f930..bf19947a1 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -382,20 +382,6 @@ class TestFileTiff(PillowTestCase): self.assertEqual(im2.mode, "L") self.assert_image_equal(im, im2) - 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. - 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) - # Should not divide by zero - im.save(outfile) - def test_with_underscores(self): kwargs = {'resolution_unit': 'inch', 'x_resolution': 72, @@ -432,36 +418,6 @@ class TestFileTiff(PillowTestCase): self.assertEqual(im.tag_v2[X_RESOLUTION], 36) self.assertEqual(im.tag_v2[Y_RESOLUTION], 72) - def test_multipage_compression(self): - im = Image.open('Tests/images/compression.tif') - - im.seek(0) - self.assertEqual(im._compression, 'tiff_ccitt') - self.assertEqual(im.size, (10, 10)) - - im.seek(1) - self.assertEqual(im._compression, 'packbits') - self.assertEqual(im.size, (10, 10)) - im.load() - - im.seek(0) - self.assertEqual(im._compression, 'tiff_ccitt') - self.assertEqual(im.size, (10, 10)) - im.load() - - def test_save_tiff_with_jpegtables(self): - # Arrange - outfile = self.tempfile("temp.tif") - - # Created with ImageMagick: convert hopper.jpg hopper_jpg.tif - # Contains JPEGTables (347) tag - infile = "Tests/images/hopper_jpg.tif" - im = Image.open(infile) - - # Act / Assert - # Should not raise UnicodeDecodeError or anything else - im.save(outfile) - def test_lzw(self): # Act im = Image.open("Tests/images/hopper_lzw.tif") From 8967a20ad70f9af67f2aa89f22dca54dbbbd1754 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 7 Dec 2016 03:07:20 +0300 Subject: [PATCH 050/632] test new assert_image_similar implementation --- Tests/helper.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Tests/helper.py b/Tests/helper.py index 7b8bdcce4..f42de8bb2 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -7,6 +7,18 @@ import tempfile import os import unittest +from PIL import Image, ImageMath + + +def convert_to_comparable(a, b): + new_a, new_b = a, b + if a.mode == 'P': + new_a = Image.new('L', a.size) + new_b = Image.new('L', b.size) + new_a.putdata(a.getdata()) + new_b.putdata(b.getdata()) + return new_a, new_b + class PillowTestCase(unittest.TestCase): @@ -88,6 +100,16 @@ class PillowTestCase(unittest.TestCase): except: for abyte, bbyte in zip(a.tobytes(), b.tobytes()): diff += abs(abyte-bbyte) + + a, b = convert_to_comparable(a, b) + + new_diff = 0 + for ach, bch in zip(a.split(), b.split()): + chdiff = ImageMath.eval("abs(a - b)", a=ach, b=bch).convert('L') + new_diff += sum(i * num for i, num in enumerate(chdiff.histogram())) + + self.assertEqual(diff, new_diff) + ave_diff = float(diff)/(a.size[0]*a.size[1]) self.assertGreaterEqual( epsilon, ave_diff, From 52c8e2050ed50c5861db447ab89bdcb3ab8ccfc0 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 7 Dec 2016 03:09:13 +0300 Subject: [PATCH 051/632] replace test "1"-mode image --- Tests/images/hopper.msp | Bin 2080 -> 2080 bytes Tests/test_file_msp.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/images/hopper.msp b/Tests/images/hopper.msp index 91d9a147ff0a7d2a27f89c66405e9011a464d359..18215f1aff7d85bf066a4f12cb16542c48ad18c2 100644 GIT binary patch literal 2080 zcmXX{Z)_Y#6@N3gPS!S2_e|{%AT{gb9O6x(wogYQJZzV4i1T{$k~L$&V3 zm1xpXwRmj&!Sxp$%L`H@#L4(1-)uHDsC!kNq&^@>C46zLtP}YX$Bl#(91I7t+fWjl zw+DNto%zkY_j`Zl&D-S5r%wnFK>q&==iy^KTN}bxB>%0)Q>l3PPfNsmCfVa~K08%3 z3-C^>Hp<=thno&>i%mBHC?a|4f-+UebWJ-PKuwI7*T21-Zg1xqDIukU=tz9}Po8$# z+T$q=2#K*DE&jXMp2|#56#$qf&fouzvNc<1@8o7I1$6umAOEMi;~3M$cH}TuuZthCi7B8faB!x10Z(z4Nyqqd#rufl4DE~HHym9ic@pPJZ zz4f_+x>$gr*Pq&O+uBoyc8;%ij8_kST1{+C&lQZ>D|^dj@p99T&B=ewIOeQ#bpN$e zGpT=wV{d-lN~fJn^rU!Iz%RF+tbMJmCtfsOc&=O>htH>4I>pq9Oo3~AU%V}J%+h_} zG0EfFo{wM43(Uei%*qtz@8|G95E#`#%M^_wk1N_a0g8qiX-r@o6u346Aq2@&rc^-) zp&+8P4b$i7lTAV(BpUFvIaLG-wG&g2kEi9Vg83^mAUg6%DY>QrOM=s-{PHD_UeF;q(6R!QRve}LL)6TR2D4$qd z{K@Jr~b=I$4xX^gKhLg8P#Y9J<*Gxuh zxcrz3rw(M1UJpWkI7i`nPptP8w~bJs>v)@*GMe4XHEE285iv36oegp_6z8N%u=BjH z_v*^6Y$a!xG*ID>hxz7;YomsX^{YdJ%)UEx_r;pL8UyXm*~Q8y55I3o*OIybc7f;a z4PKQ&&bNI$4VrUL@@@MnM}h!U4KCaMv4u;BJkC|D_q+bA8~A-$Bkl(lRI+X6*`r*UUgdf@;EQ?sh|AE)P`95w3+?-(}r&rsS-Ry-4 zua8T&EWpoYJbirAsww2Da(RJnIcH1gyye?BRJat>XV=`mmcS0AM|67TgT$FZAD#7( zGAi`120gBcQ}2KIqkYz#FP$8>eV^NypCcRck~{dG%d>LTgIN6+tvR{&B+L6OG=Y_W z!Z+QVoAG3TM*yO!B{03-x6xVd<^};^BH)?Tl>=4@UAhR$+<|}>IZtN;>7%|*8+lK+ z%s*{le14X|WWoORDQLLZP^zFspbA}{`3?S^3qvpm^~IM^s2c$1opWM?L^g==g@=#l^Cs>!8Y!S}z*@ zY=2q9)G_~BxDCVNsZj<3dr%%2t`EbP1vU}}d>x3cYe!=d6;vd&=P97W-^5iMAoi6x zJYawqfB@480b@xhh&33;cT$Bz^WnBYFNjKT)_fauRioH1RqS{=d|?j5!3g&+u~07B zxPxRCV|CuY{_W05$z!{-Cfu4 zW@2sKfKV+uJOhjgQ0fKaj&4s^#j#aVmu+>fJ3_Nqo z0(ezPwn+b#@x4pXv9L*KMu&cR^LdC4P^dE$h+|jfO#)~h!>K*v+b?}I50P>Ws0S(S w2?`n;WuUTfNrf?tREgvf>5Ksm;YX)l;2xfX0Q^vd)8D~}5{{4nCIrO(3pB#RqW}N^ 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 diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py index f7c518379..e174d0061 100644 --- a/Tests/test_file_msp.py +++ b/Tests/test_file_msp.py @@ -31,7 +31,7 @@ class TestFileMsp(PillowTestCase): # Assert self.assertEqual(im.size, (128, 128)) - self.assert_image_similar(im, hopper("1"), 4) + self.assert_image_equal(im, hopper("1"), 4) def test_cannot_save_wrong_mode(self): # Arrange From ba92896a53e4f86fa2e03eeb022676ef32a3752f Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 7 Dec 2016 04:39:36 +0300 Subject: [PATCH 052/632] remove old version --- Tests/helper.py | 15 ++------------- Tests/test_imagecms.py | 6 +++--- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index f42de8bb2..3cf51185b 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -92,23 +92,12 @@ class PillowTestCase(unittest.TestCase): a.size, b.size, msg or "got size %r, expected %r" % (a.size, b.size)) - diff = 0 - try: - ord(b'0') - for abyte, bbyte in zip(a.tobytes(), b.tobytes()): - diff += abs(ord(abyte)-ord(bbyte)) - except: - for abyte, bbyte in zip(a.tobytes(), b.tobytes()): - diff += abs(abyte-bbyte) - a, b = convert_to_comparable(a, b) - new_diff = 0 + diff = 0 for ach, bch in zip(a.split(), b.split()): chdiff = ImageMath.eval("abs(a - b)", a=ach, b=bch).convert('L') - new_diff += sum(i * num for i, num in enumerate(chdiff.histogram())) - - self.assertEqual(diff, new_diff) + diff += sum(i * num for i, num in enumerate(chdiff.histogram())) ave_diff = float(diff)/(a.size[0]*a.size[1]) self.assertGreaterEqual( diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index e1a3e0af5..136590667 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -205,7 +205,7 @@ class TestImageCms(PillowTestCase): target = Image.open('Tests/images/hopper.Lab.tif') - self.assert_image_similar(i, target, 30) + self.assert_image_similar(i, target, 3.5) def test_lab_srgb(self): psRGB = ImageCms.createProfile("sRGB") @@ -326,12 +326,12 @@ class TestImageCms(PillowTestCase): prepatch, these would segfault, postpatch they should emit a typeerror """ - + with self.assertRaises(TypeError): ImageCms.ImageCmsProfile(0).tobytes() with self.assertRaises(TypeError): ImageCms.ImageCmsProfile(1).tobytes() - + if __name__ == '__main__': unittest.main() From 9ee1f58215d29913e3a1578522ab793fab3ca50c Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 7 Dec 2016 05:16:10 +0300 Subject: [PATCH 053/632] fix I;16 mode --- Tests/helper.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tests/helper.py b/Tests/helper.py index 3cf51185b..c5ec253ca 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -17,6 +17,9 @@ def convert_to_comparable(a, b): new_b = Image.new('L', b.size) new_a.putdata(a.getdata()) new_b.putdata(b.getdata()) + elif a.mode == 'I;16': + new_a = a.convert('I') + new_b = b.convert('I') return new_a, new_b From badbff1b99a939c05b3651db7e4aea11181e5bd7 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 9 Dec 2016 11:26:22 +0200 Subject: [PATCH 054/632] [CI skip] --- CHANGES.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 07c775ee5..ca66a89eb 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,15 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Tiff: Fix for writing Tiff to BytesIO using libtiff #2263 + [wiredfool] + +- Doc: Design docs #2269 + [wiredfool] + +- Test: Move tests requiring libtiff to test_file_libtiff #2273 + [wiredfool] + - Update Maxblock heuristic #2275 [wiredfool] From 41e492b0261d21d702c7aad1aa40dac9a0aa3b61 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 1 Apr 2016 21:47:28 +1100 Subject: [PATCH 055/632] Removed use of spaces in TIFF kwargs, deprecated in 2.7 --- PIL/TiffImagePlugin.py | 5 ----- Tests/test_file_tiff.py | 23 ++--------------------- 2 files changed, 2 insertions(+), 26 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 9bbcd03fe..7d608c0ce 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1378,11 +1378,6 @@ def _save(im, fp, filename): (DATE_TIME, "date_time"), (ARTIST, "artist"), (COPYRIGHT, "copyright")]: - 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] = im.encoderinfo[name.replace("_", " ")] if name in im.encoderinfo: ifd[key] = im.encoderinfo[name] diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index bf19947a1..a9bc15e16 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -399,25 +399,6 @@ class TestFileTiff(PillowTestCase): self.assertEqual(im.tag_v2[X_RESOLUTION], 72) self.assertEqual(im.tag_v2[Y_RESOLUTION], 36) - def test_deprecation_warning_with_spaces(self): - kwargs = {'resolution unit': 'inch', - 'x resolution': 36, - 'y resolution': 72} - filename = self.tempfile("temp.tif") - self.assert_warning(DeprecationWarning, - lambda: hopper("RGB").save(filename, **kwargs)) - from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION - - im = Image.open(filename) - - # legacy interface - self.assertEqual(im.tag[X_RESOLUTION][0][0], 36) - self.assertEqual(im.tag[Y_RESOLUTION][0][0], 72) - - # v2 interface - self.assertEqual(im.tag_v2[X_RESOLUTION], 36) - self.assertEqual(im.tag_v2[Y_RESOLUTION], 72) - def test_lzw(self): # Act im = Image.open("Tests/images/hopper_lzw.tif") @@ -462,12 +443,12 @@ class TestFileTiff(PillowTestCase): # however does. im = Image.new('RGB', (1, 1)) im.info['icc_profile'] = 'Dummy value' - + # Try save-load round trip to make sure both handle icc_profile. tmpfile = self.tempfile('temp.tif') im.save(tmpfile, 'TIFF', compression='raw') reloaded = Image.open(tmpfile) - + self.assertEqual(b'Dummy value', reloaded.info['icc_profile']) From 57bab081b9f74e9397fdef32f9be3a1f642e5928 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 11 Dec 2016 12:30:11 +1100 Subject: [PATCH 056/632] Set executable flag on selftest.py and added shebang line --- selftest.py | 1 + 1 file changed, 1 insertion(+) mode change 100644 => 100755 selftest.py diff --git a/selftest.py b/selftest.py old mode 100644 new mode 100755 index 7829bae5b..067db4d79 --- a/selftest.py +++ b/selftest.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # minimal sanity check from __future__ import print_function From acf68c835c93ba144f83198306aa7e6082a43f43 Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 12 Dec 2016 15:16:43 +0200 Subject: [PATCH 057/632] Increase epsilon for FreeType 2.7 --- Tests/test_imagefont.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index de89ac929..5207dce38 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -125,7 +125,9 @@ try: target = 'Tests/images/rectangle_surrounding_text.png' target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) + + # Epsilon ~.5 fails with FreeType 2.7 + self.assert_image_similar(im, target_img, 2.5) def test_render_multiline(self): im = Image.new(mode='RGB', size=(300, 100)) @@ -144,7 +146,7 @@ try: # some versions of freetype have different horizontal spacing. # setting a tight epsilon, I'm showing the original test failure # at epsilon = ~38. - self.assert_image_similar(im, target_img, .5) + self.assert_image_similar(im, target_img, 6.2) def test_render_multiline_text(self): ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) @@ -158,7 +160,8 @@ try: target = 'Tests/images/multiline_text.png' target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) + # Epsilon ~.5 fails with FreeType 2.7 + self.assert_image_similar(im, target_img, 6.2) # Test that text() can pass on additional arguments # to multiline_text() @@ -178,7 +181,8 @@ try: target = 'Tests/images/multiline_text'+ext+'.png' target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) + # Epsilon ~.5 fails with FreeType 2.7 + self.assert_image_similar(im, target_img, 6.2) def test_unknown_align(self): im = Image.new(mode='RGB', size=(300, 100)) @@ -227,7 +231,8 @@ try: target = 'Tests/images/multiline_text_spacing.png' target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) + # Epsilon ~.5 fails with FreeType 2.7 + self.assert_image_similar(im, target_img, 6.2) def test_rotated_transposed_font(self): img_grey = Image.new("L", (100, 100)) From 4b6de04882d501aa1dd32f4316010e636aa9a3a1 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Dec 2016 20:05:38 +0000 Subject: [PATCH 058/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index ca66a89eb..81060e2a2 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,24 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Updated comments to use print as a function #2234 + [radarhere] + +- Set executable flag on selftest.py, setup.py and added shebang line #2282, #2277 + [radarhere, homm] + +- Test: Increase epsilon for FreeType 2.7 as rendering is slightly different. #2286 + [hugovk] + +- Test: Faster assert_image_similar #2279 + [homm] + +- Removed depreciated internal "stretch" method #2276 + [homm] + +- Removed the handles_eof flag in decode.c #2223 + [wiredfool] + - Tiff: Fix for writing Tiff to BytesIO using libtiff #2263 [wiredfool] From 3f372ef54a7efde311b9bf51cbba8d6248c7cde5 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Dec 2016 20:13:00 +0000 Subject: [PATCH 059/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 81060e2a2..6108600ff 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Remove vendored version of olefile Python package in favor of upstream #2199 + [jdufresne] + - Updated comments to use print as a function #2234 [radarhere] From 574c0a4f5be456a27ad5d8c4dad30a945d607b6e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 17 Dec 2016 22:16:33 +1100 Subject: [PATCH 060/632] Updated freetype to 2.7 --- winbuild/config.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/winbuild/config.py b/winbuild/config.py index 344c0be35..4690d2a2e 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -37,10 +37,10 @@ libs = { 'dir': 'tiff-4.0.6', }, 'freetype': { - 'url': 'http://download.savannah.gnu.org/releases/freetype/freetype-2.6.5.tar.gz', - 'filename': PILLOW_DEPENDS_DIR + 'freetype-2.6.5.tar.gz', - 'hash': 'md5:31b2276515d9ee1c7f37d9c9f4f3145a', - 'dir': 'freetype-2.6.5', + 'url': 'http://download.savannah.gnu.org/releases/freetype/freetype-2.7.tar.gz', + 'filename': PILLOW_DEPENDS_DIR + 'freetype-2.7.tar.gz', + 'hash': 'md5:337139e5c7c5bd645fe130608e0fa8b5', + 'dir': 'freetype-2.7', }, 'lcms': { 'url': SF_MIRROR+'/project/lcms/lcms/2.7/lcms2-2.7.zip', From 980785952f697e9267304c3bc0213903fc15109c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 19 Dec 2016 14:15:06 -0800 Subject: [PATCH 061/632] Makefile entries for debug symbols, clean build, and highlight errors --- Makefile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Makefile b/Makefile index 493364cd8..60f4aa421 100644 --- a/Makefile +++ b/Makefile @@ -58,6 +58,13 @@ install: python setup.py install python selftest.py --installed +debug: +# make a debug version if we don't have a -dbg python. Leaves in symbols +# for our stuff, kills optimization, and redirects to dev null so we +# see any build failures. + make clean > /dev/null + CFLAGS='-g -O0' python setup.py build_ext install > /dev/null + install-req: pip install -r requirements.txt From 01e31bfd84ad70264b6b5a903c88020f0d2cf671 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 19 Dec 2016 14:16:06 -0800 Subject: [PATCH 062/632] Workaround for 'PyPy does not yet implement the new buffer interface' bug --- _imaging.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_imaging.c b/_imaging.c index e2320d862..a82aa493c 100644 --- a/_imaging.c +++ b/_imaging.c @@ -251,7 +251,9 @@ int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view) /* Use new buffer protocol if available (mmap doesn't support this in 2.7, go figure) */ if (PyObject_CheckBuffer(buffer)) { - return PyObject_GetBuffer(buffer, view, PyBUF_SIMPLE); + int success = PyObject_GetBuffer(buffer, view, PyBUF_SIMPLE); + if (!success) { return success; } + PyErr_Clear(); } /* Pretend we support the new protocol; PyBuffer_Release happily ignores From c994f86684009205efaff6e693ee1d47ef5a53f2 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Thu, 15 Dec 2016 09:33:03 +0400 Subject: [PATCH 063/632] switch to ubuntu trusty 14.04 --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 0d0b76146..732647555 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,8 @@ python: - 3.4 - nightly +dist: trusty + install: - "travis_retry sudo apt-get update" - "travis_retry sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake imagemagick" From 954fc5287777bee35c6d987472f44d29cd43925b Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 21 Dec 2016 08:53:10 +0200 Subject: [PATCH 064/632] [CI skip] --- CHANGES.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 6108600ff..22ff283fe 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,11 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- PyPy: Buffer interface workaround #2294 + [wiredfool] + +- Test: Switch to Ubuntu Trusty 14.04 on Travis CI #2294 + - Remove vendored version of olefile Python package in favor of upstream #2199 [jdufresne] From 50408568cb592b6779ab00fde2543b82827f7ceb Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 21 Dec 2016 21:55:45 +0200 Subject: [PATCH 065/632] Don't pip install -e . --- .travis.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index b88dc5ff2..2b3b49d99 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,7 @@ python: - nightly dist: trusty - + install: - "travis_retry sudo apt-get update" - "travis_retry sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake imagemagick" @@ -43,12 +43,10 @@ install: # libimagequant - pushd depends && ./install_imagequant.sh && popd - - # extra test images - - pushd depends && ./install_extra_test_images.sh && popd - - - travis_retry pip install -e . + # extra test images + - pushd depends && ./install_extra_test_images.sh && popd + before_script: # Qt needs a display for some of the tests, and it's only run on the system site packages install From a8c6df563e56d3f62a98c16d85c46d9c0ee1eedc Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 21 Dec 2016 22:01:55 +0200 Subject: [PATCH 066/632] pip install olefile --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 2b3b49d99..4e655f81c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,6 +24,7 @@ install: - "travis_retry pip install cffi" - "travis_retry pip install nose" - "travis_retry pip install check-manifest" + - "travis_retry pip install olefile" # Pyroma tests sometimes hang on PyPy; skip - if [ $TRAVIS_PYTHON_VERSION != "pypy" ]; then travis_retry pip install pyroma; fi From e2c2251cabb1fbd52903ccf247f054eb5cfe615a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 22 Dec 2016 19:40:06 +1100 Subject: [PATCH 067/632] Updated libwebp to 0.5.2 --- depends/install_webp.sh | 10 +++++----- winbuild/config.py | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/depends/install_webp.sh b/depends/install_webp.sh index 356c6e552..a1a28b524 100755 --- a/depends/install_webp.sh +++ b/depends/install_webp.sh @@ -1,14 +1,14 @@ #!/bin/bash # install webp -if [ ! -f libwebp-0.5.1.tar.gz ]; then - wget -O 'libwebp-0.5.1.tar.gz' 'https://github.com/python-pillow/pillow-depends/blob/master/libwebp-0.5.1.tar.gz?raw=true' +if [ ! -f libwebp-0.5.2.tar.gz ]; then + wget -O 'libwebp-0.5.2.tar.gz' 'https://github.com/python-pillow/pillow-depends/blob/master/libwebp-0.5.2.tar.gz?raw=true' fi -rm -r libwebp-0.5.1 -tar -xvzf libwebp-0.5.1.tar.gz +rm -r libwebp-0.5.2 +tar -xvzf libwebp-0.5.2.tar.gz -pushd libwebp-0.5.1 +pushd libwebp-0.5.2 ./configure --prefix=/usr --enable-libwebpmux --enable-libwebpdemux && make -j4 && sudo make -j4 install diff --git a/winbuild/config.py b/winbuild/config.py index 344c0be35..18fd82995 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -75,10 +75,10 @@ libs = { 'version': '8.6.6', }, 'webp': { - 'url': 'http://downloads.webmproject.org/releases/webp/libwebp-0.5.1.tar.gz', - 'filename': PILLOW_DEPENDS_DIR + 'libwebp-0.5.1.tar.gz', - 'hash': 'sha1:66efb2213015ad3460bef64b4fb218fdc10ce83f', - 'dir': 'libwebp-0.5.1', + 'url': 'http://downloads.webmproject.org/releases/webp/libwebp-0.5.2.tar.gz', + 'filename': PILLOW_DEPENDS_DIR + 'libwebp-0.5.2.tar.gz', + 'hash': 'sha1:c3adfa47f96a3909fb05e41636fdcbe3826edfbd', + 'dir': 'libwebp-0.5.2', }, 'openjpeg': { 'url': SF_MIRROR+'/project/openjpeg/openjpeg/2.1.2/openjpeg-2.1.2.tar.gz', From 0cfd2caa0c03c54d3d89d9a9a127dcc0b0199a5e Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 24 Dec 2016 14:40:05 +0200 Subject: [PATCH 068/632] [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 22ff283fe..673098e1d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Update libwebp to 0.5.2 #2302 + [radarhere] + - PyPy: Buffer interface workaround #2294 [wiredfool] From a7b6b197eb6794cada7147fdc6933f1e765e1091 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 25 Dec 2016 00:33:17 +1100 Subject: [PATCH 069/632] Merged two changelog entries [ci skip] --- CHANGES.rst | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 673098e1d..ed7cf92da 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,9 +4,6 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ -- Update libwebp to 0.5.2 #2302 - [radarhere] - - PyPy: Buffer interface workaround #2294 [wiredfool] @@ -29,7 +26,7 @@ Changelog (Pillow) - Removed depreciated internal "stretch" method #2276 [homm] - + - Removed the handles_eof flag in decode.c #2223 [wiredfool] @@ -52,20 +49,20 @@ Changelog (Pillow) [lambdafu] - Test: Fix bug in test_ifd_rational_save when libtiff is not available #2270 - [ChristopherHogan] + [ChristopherHogan] - ICO: Only save relevant sizes #2267 [hugovk] - + - ICO: Allow saving .ico files of 256x256 instead of 255x255 #2265 [hugovk] - Fix TIFFImagePlugin ICC color profile saving. #2087 [cskau] - + - Doc: Improved description of ImageOps.deform resample parameter #2256 [radarhere] - + - EMF: support negative bounding box coordinates #2249 [glexey] @@ -81,7 +78,7 @@ Changelog (Pillow) - Use minimal scale for jpeg drafts #2240 [homm] -- Updated dependency scripts to use Webp 0.5.1, OpenJpeg 2.1.2, and TclTk 8.6.6 #2235, #2236, #2237 +- Updated dependency scripts to use Webp 0.5.2, OpenJpeg 2.1.2, and TclTk 8.6.6 #2235, #2236, #2237, #2302 [radarhere] - Fix "invalid escape sequence" bytestring warnings in Python 3.6 #2186 @@ -101,10 +98,10 @@ Changelog (Pillow) - Use a context manager in ImageFont._load_pilfont() to ensure file is always closed #2232 [jdufresne] - + - Use generator expressions instead of list comprehension #2225 [jdufresne] - + - Close file after reading in ImagePalette.load() #2215 [jdufresne] @@ -130,7 +127,7 @@ Changelog (Pillow) [garbas] - Search for tkinter first in builtins #2210 - [matthew-brett] + [matthew-brett] - Tests: Replace try/except/fail pattern with TestCase.assertRaises() #2200 [jdufresne] @@ -143,7 +140,7 @@ Changelog (Pillow) - Doc: Move ICO out of the list of read-only file formats #2180 [alexwlchan] - + - Doc: Fix formatting, too-short title underlines and malformed table #2175 [hugovk] From d764a4c985b715c063a246bcb1fa8571e8ebb9a7 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 24 Dec 2016 19:16:11 +0200 Subject: [PATCH 070/632] Refactor to avoid repeated version number --- depends/download-and-extract.sh | 12 ++++++++++++ depends/install_openjpeg.sh | 13 +++---------- depends/install_webp.sh | 9 +++------ 3 files changed, 18 insertions(+), 16 deletions(-) create mode 100755 depends/download-and-extract.sh diff --git a/depends/download-and-extract.sh b/depends/download-and-extract.sh new file mode 100755 index 000000000..9f82877db --- /dev/null +++ b/depends/download-and-extract.sh @@ -0,0 +1,12 @@ +#!/bin/bash +# Usage: ./download-and-extract.sh something.tar.gz https://example.com/something.tar.gz + +archive=$1 +url=$2 + +if [ ! -f $archive.tar.gz ]; then + wget -O $archive.tar.gz $url +fi + +rm -r $archive +tar -xvzf $archive.tar.gz diff --git a/depends/install_openjpeg.sh b/depends/install_openjpeg.sh index 8d5f5c010..d307a127e 100755 --- a/depends/install_openjpeg.sh +++ b/depends/install_openjpeg.sh @@ -1,19 +1,12 @@ #!/bin/bash # install openjpeg +archive=openjpeg-2.1.2 -if [ ! -f openjpeg-2.1.2.tar.gz ]; then - wget -O 'openjpeg-2.1.2.tar.gz' 'https://github.com/python-pillow/pillow-depends/blob/master/openjpeg-2.1.2.tar.gz?raw=true' +./download-and-extract.sh $archive https://github.com/python-pillow/pillow-depends/blob/master/$archive.tar.gz?raw=true -fi - -rm -r openjpeg-2.1.2 -tar -xvzf openjpeg-2.1.2.tar.gz - - -pushd openjpeg-2.1.2 +pushd $archive cmake -DCMAKE_INSTALL_PREFIX=/usr . && make -j4 && sudo make -j4 install popd - diff --git a/depends/install_webp.sh b/depends/install_webp.sh index a1a28b524..8bb664116 100755 --- a/depends/install_webp.sh +++ b/depends/install_webp.sh @@ -1,14 +1,11 @@ #!/bin/bash # install webp -if [ ! -f libwebp-0.5.2.tar.gz ]; then - wget -O 'libwebp-0.5.2.tar.gz' 'https://github.com/python-pillow/pillow-depends/blob/master/libwebp-0.5.2.tar.gz?raw=true' -fi +archive=libwebp-0.5.2 -rm -r libwebp-0.5.2 -tar -xvzf libwebp-0.5.2.tar.gz +./download-and-extract.sh $archive https://github.com/python-pillow/pillow-depends/blob/master/$archive.tar.gz?raw=true -pushd libwebp-0.5.2 +pushd $archive ./configure --prefix=/usr --enable-libwebpmux --enable-libwebpdemux && make -j4 && sudo make -j4 install From a927a7d4e0011ecdeec5cf9b3574dfb8a49a4062 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 24 Dec 2016 19:31:45 +0200 Subject: [PATCH 071/632] Install libimagequant from pillow-depends --- depends/install_imagequant.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index dd497dc3c..8ddf7c991 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,9 +1,11 @@ #!/bin/bash # install libimagequant -git clone -b 2.6.0 https://github.com/pornel/pngquant +archive=pngquant-2.6.0 -pushd pngquant +./download-and-extract.sh $archive https://github.com/python-pillow/pillow-depends/blob/master/$archive.tar.gz?raw=true + +pushd $archive make -C lib shared sudo cp lib/libimagequant.so* /usr/lib/ From 9e6cbbe0e6c1d6d7537d2a91b13651da39f4fbce Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 24 Dec 2016 22:19:00 +0200 Subject: [PATCH 072/632] Use effective URLs to avoid resolving twice --- depends/install_imagequant.sh | 2 +- depends/install_openjpeg.sh | 2 +- depends/install_webp.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index 8ddf7c991..c7774d5cb 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -3,7 +3,7 @@ archive=pngquant-2.6.0 -./download-and-extract.sh $archive https://github.com/python-pillow/pillow-depends/blob/master/$archive.tar.gz?raw=true +./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz pushd $archive diff --git a/depends/install_openjpeg.sh b/depends/install_openjpeg.sh index d307a127e..cac86dbbb 100755 --- a/depends/install_openjpeg.sh +++ b/depends/install_openjpeg.sh @@ -3,7 +3,7 @@ archive=openjpeg-2.1.2 -./download-and-extract.sh $archive https://github.com/python-pillow/pillow-depends/blob/master/$archive.tar.gz?raw=true +./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz pushd $archive diff --git a/depends/install_webp.sh b/depends/install_webp.sh index 8bb664116..8f700901c 100755 --- a/depends/install_webp.sh +++ b/depends/install_webp.sh @@ -3,7 +3,7 @@ archive=libwebp-0.5.2 -./download-and-extract.sh $archive https://github.com/python-pillow/pillow-depends/blob/master/$archive.tar.gz?raw=true +./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz pushd $archive From ee1143095bc00160f57fa40b3d83e41af9c8ef86 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 25 Dec 2016 11:18:32 +0200 Subject: [PATCH 073/632] [CI skip] --- CHANGES.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index ed7cf92da..f762c56c8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -78,9 +78,9 @@ Changelog (Pillow) - Use minimal scale for jpeg drafts #2240 [homm] -- Updated dependency scripts to use Webp 0.5.2, OpenJpeg 2.1.2, and TclTk 8.6.6 #2235, #2236, #2237, #2302 +- Updated dependency scripts to use FreeType 2.7, OpenJpeg 2.1.2, WebP 0.5.2 and Tcl/Tk 8.6.6 #2235, #2236, #2237, #2290, #2302 [radarhere] - + - Fix "invalid escape sequence" bytestring warnings in Python 3.6 #2186 [timgraham] From 8524c18329f28f5b912ec8ffb3c3f66abdbc428c Mon Sep 17 00:00:00 2001 From: Jakub Wilk Date: Sun, 25 Dec 2016 11:56:12 +0100 Subject: [PATCH 074/632] Remove executable bit from OleFileIO.py --- PIL/OleFileIO.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 PIL/OleFileIO.py diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py old mode 100755 new mode 100644 From 8c2a857c2edc2b04f68416e6030bf5302d488229 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 25 Dec 2016 22:14:29 +1100 Subject: [PATCH 075/632] Removed shebang line from OleFileIO --- PIL/OleFileIO.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index c4e23b86b..2d6aeb85c 100644 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python - import warnings warnings.warn( From 3089dd18d814d80e062d191be5a3829fa544157e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 26 Dec 2016 12:15:23 +1100 Subject: [PATCH 076/632] Updated copyright year --- LICENSE | 2 +- docs/COPYING | 2 +- docs/conf.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/LICENSE b/LICENSE index 87743e737..22a4445f9 100644 --- a/LICENSE +++ b/LICENSE @@ -5,7 +5,7 @@ The Python Imaging Library (PIL) is Pillow is the friendly PIL fork. It is - Copyright © 2016 by Alex Clark and contributors + Copyright © 2017 by Alex Clark and contributors Like PIL, Pillow is licensed under the MIT-like open source PIL Software License: diff --git a/docs/COPYING b/docs/COPYING index 5d10c7364..ee8a7f807 100644 --- a/docs/COPYING +++ b/docs/COPYING @@ -5,7 +5,7 @@ The Python Imaging Library (PIL) is Pillow is the friendly PIL fork. It is - Copyright © 2016 by Alex Clark and contributors + Copyright © 2017 by Alex Clark and contributors Like PIL, Pillow is licensed under the MIT-like open source PIL Software License: diff --git a/docs/conf.py b/docs/conf.py index f66bea521..33dd6a4f7 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -48,8 +48,8 @@ master_doc = 'index' # General information about the project. project = u'Pillow (PIL Fork)' -copyright = u'1995-2016, Fredrik Lundh and Contributors, Alex Clark and Contributors' -author = u'Fredrik Lundh and Contributors, Alex Clark and Contributors' +copyright = u'1995-2011 Fredrik Lundh, 2010-2017 Alex Clark and Contributors' +author = u'Fredrik Lundh, 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 9e0d8b20c9529dd4b2043066c2aa07a67c795676 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 26 Dec 2016 13:01:09 +0200 Subject: [PATCH 077/632] [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f762c56c8..e316f7680 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Remove executable bit and shebang from OleFileIO.py #2308 + [jwilk, radarhere] + - PyPy: Buffer interface workaround #2294 [wiredfool] From 5f9f12a208fbb5103b1f73cfb65777cec68647a3 Mon Sep 17 00:00:00 2001 From: hugovk Date: Fri, 23 Dec 2016 22:42:21 +0200 Subject: [PATCH 078/632] Python 3.6 is out --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4e655f81c..3478d0aa0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,11 +9,12 @@ notifications: python: - "pypy" - "pypy3" - - 3.5 + - 3.6 - 2.7 - "2.7_with_system_site_packages" # For PyQt4 - - 3.3 + - 3.5 - 3.4 + - 3.3 - nightly dist: trusty From d4a6e073679a3b8785d8fb68566336e73a1c45fc Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 24 Dec 2016 11:38:13 +1100 Subject: [PATCH 079/632] Added documentation for Python 3.6 support --- docs/installation.rst | 2 +- setup.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index 2724886bb..f2b27da42 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -17,7 +17,7 @@ Notes .. note:: Pillow >= 2.0.0 < 3.5.0 supports Python versions 2.6, 2.7, 3.2, 3.3, 3.4, 3.5 -.. note:: Pillow >= 3.5.0 supports Python versions 2.7, 3.3, 3.4, 3.5 +.. note:: Pillow >= 3.5.0 supports Python versions 2.7, 3.3, 3.4, 3.5, 3.6 Basic Installation ------------------ diff --git a/setup.py b/setup.py index c34b8ed47..c35d4357c 100755 --- a/setup.py +++ b/setup.py @@ -763,6 +763,7 @@ try: "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', ], From 3e2f9478cb3787968b77104c69da0f44df6a4b18 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 25 Dec 2016 22:03:04 +1100 Subject: [PATCH 080/632] Added py36 to tox envlist --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 4d63febd0..a4a21e697 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ # and then run "tox" from this directory. [tox] -envlist = py27, py33, py34, py35 +envlist = py27, py33, py34, py35, py36 [testenv] commands = From 87092ad4f8e55444ec3134ed857e4de5d19cd175 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 27 Dec 2016 02:42:58 -0800 Subject: [PATCH 081/632] can pass list of integer to set different duration for each frame when saving GIF --- PIL/GifImagePlugin.py | 8 ++++++++ Tests/test_file_gif.py | 24 ++++++++++++++++++++++++ docs/handbook/image-file-formats.rst | 4 +++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 2775a00f1..60d6f49e4 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -352,10 +352,18 @@ def _save(im, fp, filename, save_all=False): first_frame = None append_images = im.encoderinfo.get("append_images", []) + if "duration" in im.encoderinfo: + duration = im.encoderinfo["duration"] + else: + duration = None + frame_count = 0 for imSequence in [im]+append_images: for im_frame in ImageSequence.Iterator(imSequence): encoderinfo = im.encoderinfo.copy() im_frame = _convert_mode(im_frame) + if isinstance(duration, list): + encoderinfo["duration"] = duration[frame_count] + frame_count += 1 # To specify duration, add the time in milliseconds to getdata(), # e.g. getdata(im_frame, duration=1000) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 1672a14f0..fdc7d9d55 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -281,6 +281,30 @@ class TestFileGif(PillowTestCase): self.assertEqual(reread.info['duration'], duration) + def test_multiple_duration(self): + duration_list = [1000, 2000, 3000] + + out = self.tempfile('temp.gif') + im_list = [ + Image.new('L', (100, 100), '#000'), + Image.new('L', (100, 100), '#111'), + Image.new('L', (100, 100), '#222'), + ] + im_list[0].save( + out, + save_all=True, + append_images=im_list[1:], + duration=duration_list + ) + reread = Image.open(out) + + for duration in duration_list: + self.assertEqual(reread.info['duration'], duration) + try: + reread.seek(reread.tell() + 1) + except EOFError: + pass + def test_number_of_loops(self): number_of_loops = 2 diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 11486c76b..36513efd5 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -111,7 +111,9 @@ additional frames when saving, the ``append_images`` parameter works with If present, the ``loop`` parameter can be used to set the number of times the GIF should loop, and the ``duration`` parameter can set the number of -milliseconds between each frame. +milliseconds between each frame. The ``duration`` parameter can be either an +integer or a list of integers. Passing a list to the ``duration``parameter +will set the ``duration`` of each frame respectively. Reading local images ~~~~~~~~~~~~~~~~~~~~ From e530f2a228978413e7b3f08b866b50c109e90510 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 27 Dec 2016 03:04:37 -0800 Subject: [PATCH 082/632] Added tuple option for durations --- PIL/GifImagePlugin.py | 2 +- Tests/test_file_gif.py | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 60d6f49e4..6cf7a4f22 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -361,7 +361,7 @@ def _save(im, fp, filename, save_all=False): for im_frame in ImageSequence.Iterator(imSequence): encoderinfo = im.encoderinfo.copy() im_frame = _convert_mode(im_frame) - if isinstance(duration, list): + if isinstance(duration, (list, tuple)): encoderinfo["duration"] = duration[frame_count] frame_count += 1 diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index fdc7d9d55..cfaeb54ed 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -290,6 +290,8 @@ class TestFileGif(PillowTestCase): Image.new('L', (100, 100), '#111'), Image.new('L', (100, 100), '#222'), ] + + #duration as list im_list[0].save( out, save_all=True, @@ -305,6 +307,24 @@ class TestFileGif(PillowTestCase): except EOFError: pass + # duration as tuple + im_list[0].save( + out, + save_all=True, + append_images=im_list[1:], + duration=tuple(duration_list) + ) + reread = Image.open(out) + + for duration in duration_list: + self.assertEqual(reread.info['duration'], duration) + try: + reread.seek(reread.tell() + 1) + except EOFError: + pass + + + def test_number_of_loops(self): number_of_loops = 2 From 978047274255a153046039a9c4b17e7ff0422422 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 27 Dec 2016 11:06:56 +0000 Subject: [PATCH 083/632] Update Changes.rst [ci skip] --- CHANGES.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e316f7680..a282dbfee 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,15 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Build: Refactor dependency installation #2305 + [hugovk] + +- Test: Add python 3.6 to travis, tox #2304 + [hugovk] + +- Test: Fix coveralls coverage for Python+C #2300 + [hugovk] + - Remove executable bit and shebang from OleFileIO.py #2308 [jwilk, radarhere] From 55e068d52e20864a33825732ce685ca8f8223df8 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 27 Dec 2016 03:09:55 -0800 Subject: [PATCH 084/632] Removed duplicate open duration, clarified, listed all save options, added tuple for duration --- docs/handbook/image-file-formats.rst | 48 +++++++++++++++++----------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 36513efd5..cfb19a97a 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -72,9 +72,6 @@ The :py:meth:`~PIL.Image.Image.open` method sets the following **background** Default background color (a palette color index). -**duration** - Time between frames in an animation (in milliseconds). - **transparency** Transparency color index. This key is omitted if the image is not transparent. @@ -82,9 +79,9 @@ The :py:meth:`~PIL.Image.Image.open` method sets the following **version** Version (either ``GIF87a`` or ``GIF89a``). -**duration** - May not be present. The time to display each frame of the GIF, in - milliseconds. +**duration** + May not be present. The time to display the current frame + of the GIF, in milliseconds. **loop** May not be present. The number of times the GIF should loop. @@ -98,22 +95,37 @@ the file by seeking to the first frame. Random access is not supported. ``im.seek()`` raises an ``EOFError`` if you try to seek after the last frame. -Saving sequences -~~~~~~~~~~~~~~~~ +Saving +~~~~~~ -When calling :py:meth:`~PIL.Image.Image.save`, if a multiframe image is used, -by default only the first frame will be saved. To save all frames, the -``save_all`` parameter must be present and set to ``True``. To append -additional frames when saving, the ``append_images`` parameter works with -``save_all`` to append a list of images containing the extra frames:: +When calling :py:meth:`~PIL.Image.Image.save`, the following options +are available:: im.save(out, save_all=True, append_images=[im1, im2, ...]) -If present, the ``loop`` parameter can be used to set the number of times -the GIF should loop, and the ``duration`` parameter can set the number of -milliseconds between each frame. The ``duration`` parameter can be either an -integer or a list of integers. Passing a list to the ``duration``parameter -will set the ``duration`` of each frame respectively. +**save_all** + If present and true, all frames of the image will be saved. If + not, then only the first frame of a multiframe image will be saved. + +**append_images** + A list of images to append as additional frames. Each of the + images in the list can be single or multiframe images. + +**duration** + The display duration of each frame of the multiframe gif, in + milliseconds. Pass a single integer for a constant duration, or a + list or tuple to set the duration for each frame separately. + +**loop** + Integer number of times the GIF should loop. + +**optimize** + If present and true, attempt to compress the palette by + eliminating unused colors. This is only useful if the palette can + be compressed to the next smaller power of 2 elements. + +**palette** + Use the specified palette for the saved image. Reading local images ~~~~~~~~~~~~~~~~~~~~ From 915270ef6f04ac41f1d29cf33f73b2400f276c93 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 27 Dec 2016 03:30:47 -0800 Subject: [PATCH 085/632] test for issue #2195 --- Tests/test_file_gif.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 83318366b..5d26e71c0 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -362,5 +362,28 @@ class TestFileGif(PillowTestCase): reread = Image.open(out) self.assertEqual(reread.n_frames, 10) + def test_transparent_optimize(self): + # from issue #2195, if the transparent color is incorrectly + # optimized out, gif loses transparency Need a palette that + # isn't using the 0 color, and one that's > 128 items where + # the transparent color is actually the top palette entry to + # trigger the bug. + + from PIL import ImagePalette + + data = bytes(bytearray(range(1,254))) + palette = ImagePalette.ImagePalette("RGB", list(range(256))*3) + + im = Image.new('L', (253,1)) + im.frombytes(data) + im.putpalette(palette) + + out = self.tempfile('temp.gif') + im.save(out, transparency=253) + reloaded = Image.open(out) + + self.assertEqual(reloaded.info['transparency'], 253) + + if __name__ == '__main__': unittest.main() From 2aef31be6744db41e04e7dfb684c89ac5756cba3 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 27 Dec 2016 12:02:16 +0000 Subject: [PATCH 086/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index a282dbfee..ccf17b064 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Allow passing a list or tuple of individual frame durations when saving a GIF #2298 + [Xdynix] + +- Unified different GIF optimize conditions #2196 + [radarhere] + - Build: Refactor dependency installation #2305 [hugovk] From a06dd59df757d9c9cef0b132c4b123d85dcbe3c0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 28 Dec 2016 09:54:10 +1100 Subject: [PATCH 087/632] Added context managers --- PIL/GifImagePlugin.py | 22 ++++++++++------------ PIL/IcnsImagePlugin.py | 4 ++-- PIL/SpiderImagePlugin.py | 5 ++--- Tests/helper.py | 2 +- Tests/test_file_gif.py | 26 ++++++++++++-------------- Tests/test_file_ppm.py | 9 ++++----- Tests/test_image.py | 10 +++++----- Tests/test_psdraw.py | 10 ++++------ setup.py | 5 ++--- 9 files changed, 42 insertions(+), 51 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 41d6dcc1d..a50af6c02 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -521,22 +521,20 @@ def _save_netpbm(im, fp, filename): import tempfile file = im._dump() - if im.mode != "RGB": - with open(filename, 'wb') as f: - stderr = tempfile.TemporaryFile() - check_call(["ppmtogif", file], stdout=f, stderr=stderr) - else: - with open(filename, 'wb') as f: - + with open(filename, 'wb') as f: + if im.mode != "RGB": + with tempfile.TemporaryFile() as stderr: + check_call(["ppmtogif", file], stdout=f, stderr=stderr) + else: # Pipe ppmquant output into ppmtogif # "ppmquant 256 %s | ppmtogif > %s" % (file, filename) quant_cmd = ["ppmquant", "256", file] togif_cmd = ["ppmtogif"] - stderr = tempfile.TemporaryFile() - quant_proc = Popen(quant_cmd, stdout=PIPE, stderr=stderr) - stderr = tempfile.TemporaryFile() - togif_proc = Popen(togif_cmd, stdin=quant_proc.stdout, stdout=f, - stderr=stderr) + with tempfile.TemporaryFile() as stderr: + quant_proc = Popen(quant_cmd, stdout=PIPE, stderr=stderr) + with tempfile.TemporaryFile() as stderr: + togif_proc = Popen(togif_cmd, stdin=quant_proc.stdout, + stdout=f, stderr=stderr) # Allow ppmquant to receive SIGPIPE if ppmtogif exits quant_proc.stdout.close() diff --git a/PIL/IcnsImagePlugin.py b/PIL/IcnsImagePlugin.py index d93e0de04..089fc2a44 100644 --- a/PIL/IcnsImagePlugin.py +++ b/PIL/IcnsImagePlugin.py @@ -330,8 +330,8 @@ def _save(im, fp, filename): 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) + with tempfile.TemporaryFile() as stderr: + convert_proc = Popen(convert_cmd, stdout=PIPE, stderr=stderr) convert_proc.stdout.close() diff --git a/PIL/SpiderImagePlugin.py b/PIL/SpiderImagePlugin.py index 5c4d1bb3b..aa332bf02 100644 --- a/PIL/SpiderImagePlugin.py +++ b/PIL/SpiderImagePlugin.py @@ -83,9 +83,8 @@ def isSpiderHeader(t): def isSpiderImage(filename): - fp = open(filename, 'rb') - f = fp.read(92) # read 23 * 4 bytes - fp.close() + with open(filename, 'rb') as fp: + f = fp.read(92) # read 23 * 4 bytes t = struct.unpack('>23f', f) # try big-endian first hdrlen = isSpiderHeader(t) if hdrlen == 0: diff --git a/Tests/helper.py b/Tests/helper.py index c5ec253ca..f4b6b52cf 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -151,7 +151,7 @@ class PillowTestCase(unittest.TestCase): def tempfile(self, template): assert template[:5] in ("temp.", "temp_") - (fd, path) = tempfile.mkstemp(template[4:], template[:4]) + fd, path = tempfile.mkstemp(template[4:], template[:4]) os.close(fd) self.addCleanup(self.delete_tempfile, path) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 94a8ea92c..d987f6851 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -56,7 +56,7 @@ class TestFileGif(PillowTestCase): # 256 color Palette image, posterize to > 128 and < 128 levels # Size bigger and smaller than 512x512 # Check the palette for number of colors allocated. - # Check for correctness after conversion back to RGB + # Check for correctness after conversion back to RGB def check(colors, size, expected_palette_length): # make an image with empty colors in the start of the palette range im = Image.frombytes('P', (colors,colors), @@ -70,7 +70,7 @@ class TestFileGif(PillowTestCase): # check palette length palette_length = max(i+1 for i,v in enumerate(reloaded.histogram()) if v) self.assertEqual(expected_palette_length, palette_length) - + self.assert_image_equal(im.convert('RGB'), reloaded.convert('RGB')) @@ -271,12 +271,11 @@ class TestFileGif(PillowTestCase): 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() + with open(out, "wb") as fp: + 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";") reread = Image.open(out) self.assertEqual(reread.info['duration'], duration) @@ -329,12 +328,11 @@ class TestFileGif(PillowTestCase): 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() + with open(out, "wb") as fp: + 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";") reread = Image.open(out) self.assertEqual(reread.info['loop'], number_of_loops) diff --git a/Tests/test_file_ppm.py b/Tests/test_file_ppm.py index e7428f88d..a798466b7 100644 --- a/Tests/test_file_ppm.py +++ b/Tests/test_file_ppm.py @@ -36,9 +36,8 @@ class TestFilePpm(PillowTestCase): def test_truncated_file(self): path = self.tempfile('temp.pgm') - f = open(path, 'w') - f.write('P6') - f.close() + with open(path, 'w') as f: + f.write('P6') self.assertRaises(ValueError, lambda: Image.open(path)) @@ -47,8 +46,8 @@ class TestFilePpm(PillowTestCase): # Storage.c accepted negative values for xsize, ysize. the # internal open_ppm function didn't check for sanity but it # has been removed. The default opener doesn't accept negative - # sizes. - + # sizes. + with self.assertRaises(IOError): Image.open('Tests/images/negative_size.ppm') diff --git a/Tests/test_image.py b/Tests/test_image.py index ef9aa16af..8515a030a 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -80,11 +80,11 @@ class TestImage(PillowTestCase): # Will error out on save on 3.0.0 import tempfile im = hopper() - fp = tempfile.TemporaryFile() - im.save(fp, 'JPEG') - fp.seek(0) - reloaded = Image.open(fp) - self.assert_image_similar(im, reloaded, 20) + with tempfile.TemporaryFile() as fp: + im.save(fp, 'JPEG') + fp.seek(0) + reloaded = Image.open(fp) + self.assert_image_similar(im, reloaded, 20) def test_internals(self): diff --git a/Tests/test_psdraw.py b/Tests/test_psdraw.py index 31a2de33d..50e8763e2 100644 --- a/Tests/test_psdraw.py +++ b/Tests/test_psdraw.py @@ -35,12 +35,10 @@ class TestPsDraw(PillowTestCase): # Arrange tempfile = self.tempfile('temp.ps') - fp = open(tempfile, "wb") - - # Act - ps = PSDraw.PSDraw(fp) - self._create_document(ps) - fp.close() + with open(tempfile, "wb") as fp: + # Act + ps = PSDraw.PSDraw(fp) + self._create_document(ps) # Assert # Check non-zero file was created diff --git a/setup.py b/setup.py index c35d4357c..e93514366 100755 --- a/setup.py +++ b/setup.py @@ -728,9 +728,8 @@ class pil_build_ext(build_ext): return try: if ret >> 8 == 0: - fp = open(tmpfile, 'r') - multiarch_path_component = fp.readline().strip() - fp.close() + with open(tmpfile, 'r') as fp: + multiarch_path_component = fp.readline().strip() _add_directory(self.compiler.library_dirs, '/usr/lib/' + multiarch_path_component) _add_directory(self.compiler.include_dirs, From 3585a965e1369f4de026d331b5b4dd98a9a42233 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 30 Dec 2016 10:33:56 +1100 Subject: [PATCH 088/632] Updated pngquant to 2.8.2 --- depends/install_imagequant.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index c7774d5cb..21386557b 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=pngquant-2.6.0 +archive=pngquant-2.8.2 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz From 1e409e2dc8f2a1c897e81af15e5559eb84f98342 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 30 Dec 2016 10:42:29 +1100 Subject: [PATCH 089/632] Added missing PR number to Changes.rst [ci skip] --- CHANGES.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index ccf17b064..197aa0dc9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -98,7 +98,7 @@ Changelog (Pillow) - Updated dependency scripts to use FreeType 2.7, OpenJpeg 2.1.2, WebP 0.5.2 and Tcl/Tk 8.6.6 #2235, #2236, #2237, #2290, #2302 [radarhere] - + - Fix "invalid escape sequence" bytestring warnings in Python 3.6 #2186 [timgraham] @@ -647,7 +647,7 @@ Changelog (Pillow) - ImageSequence Iterator is now an iterator #1649 [radarhere] -- Updated windows test builds to jpeg9b +- Updated windows test builds to jpeg9b #1673 [radarhere] - Fixed support for .gbr version 1 images, added support for version 2 in GbrImagePlugin #1653 From 8c6bc07124511c4ed38db74337e53e477b2ad6c1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 30 Dec 2016 10:47:05 +1100 Subject: [PATCH 090/632] Updated tested versions of libjpeg [ci skip] --- docs/installation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index f2b27da42..5eb12c69c 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -126,8 +126,8 @@ Many of Pillow's features require external libraries: * **libjpeg** provides JPEG functionality. - * Pillow has been tested with libjpeg versions **6b**, **8**, **9**, and - **9a** and libjpeg-turbo version **8**. + * Pillow has been tested with libjpeg versions **6b**, **8**, **9**, **9a**, + and **9b** and libjpeg-turbo version **8**. * Starting with Pillow 3.0.0, libjpeg is required by default, but may be disabled with the ``--disable-jpeg`` flag. From f94183065c99dada8cf40c0b038afdc13d01190f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 30 Dec 2016 20:46:03 +1100 Subject: [PATCH 091/632] Added missing PR numbers to Changes.rst [ci skip] --- CHANGES.rst | 310 +++++++++++++++++++++++++++------------------------- 1 file changed, 161 insertions(+), 149 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 197aa0dc9..bfb669e18 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -461,7 +461,7 @@ Changelog (Pillow) - Fix typos in TIFF tags #1918 [radarhere] -- Skip tests that require libtiff if it is not installed, fixes #1866 +- Skip tests that require libtiff if it is not installed #1893 (fixes #1866) [wiredfool] - Skip test when icc profile is not available, fixes #1887 @@ -488,7 +488,7 @@ Changelog (Pillow) - Combined duplicate code in ImageTk #1856 [radarhere] -- Added --disable-platform-guessing option to setup.py build extension, #1861 +- Added --disable-platform-guessing option to setup.py build extension #1861 [angeloc] - Fixed loading Transparent PNGs with a transparent black color #1840 @@ -554,7 +554,7 @@ Changelog (Pillow) - SpiderImagePlugin: raise an error when seeking in a non-stack file #1794 [radarhere, jmichalon] -- Added Support for 2/4 bpp Tiff Grayscale Images #1789 +- Added support for 2/4 bpp Tiff grayscale images #1789 [zwhfly] - Removed unused variable from selftest #1788 @@ -581,7 +581,7 @@ Changelog (Pillow) - Added __copy__ method to Image #1772 [radarhere] -- Updated dates in PIL license in OleFileIO README #1787 +- Updated dates in PIL license in OleFileIO README #1787 [radarhere] - Corrected Tiff tag names #1786 @@ -605,16 +605,16 @@ Changelog (Pillow) - Documentation changes, URL update, transpose, release checklist [radarhere] -- Fixed saving to nonexistant files specified by pathlib.Path objects, fixes #1747 +- Fixed saving to nonexistant files specified by pathlib.Path objects #1748 (fixes #1747) [radarhere] -- Round Image.crop arguments to the nearest integer, fixes #1744 +- Round Image.crop arguments to the nearest integer #1745 (fixes #1744) [hugovk] -- Fix uninitialized variable warning in _imaging.c:getink, fixes #486 +- Fix uninitialized variable warning in _imaging.c:getink #1663 (fixes #486) [wiredfool] -- Disable multiprocessing install on cygwin, fixes #1690 +- Disable multiprocessing install on cygwin #1700 (fixes #1690) [wiredfool] - Fix the error reported when libz is not found #1764 @@ -629,7 +629,7 @@ Changelog (Pillow) - Fix EXIF tag name typos #1736 [zarlant, radarhere] -- Updated freetype to 2.6.3, Tk/Tcl to 8.6.5 and 8.5.19 +- Updated freetype to 2.6.3, Tk/Tcl to 8.6.5 and 8.5.19 #1725, #1752 [radarhere] - Add a loader for the FTEX format from Independence War 2: Edge of Chaos #1688 @@ -721,7 +721,7 @@ Changelog (Pillow) - Let EditorConfig take care of some basic formatting #1489 [hugovk] -- Restore gpsexif data to the v1 form +- Restore gpsexif data to the v1 form #1619 [wiredfool] - Add /usr/local include and library directories for freebsd #1613 @@ -820,16 +820,16 @@ Changelog (Pillow) - Added some requirements for make release-test #1451 [wiredfool] -- Flatten tiff metadata value SAMPLEFORMAT to initial value, fixes #1466 +- Flatten tiff metadata value SAMPLEFORMAT to initial value #1467 (fixes #1466) [wiredfool] -- Fix handling of pathlib in Image.save. Fixes #1460 +- Fix handling of pathlib in Image.save #1464 (fixes #1460) [wiredfool] - Make tests more robust #1469 [hugovk] -- Use correctly sized pointers for windows handle types. #1458 +- Use correctly sized pointers for windows handle types #1458 [nu744] 3.0.0 (2015-10-01) @@ -886,7 +886,7 @@ Changelog (Pillow) - Fix loading of truncated images with LOAD_TRUNCATED_IMAGES enabled #1366 [homm] -- Documentation update for concepts: bands +- Documentation update for concepts: bands #1406 [merriam] - Add Solaris/SmartOS include and library directories #1356 @@ -895,7 +895,7 @@ Changelog (Pillow) - Improved handling of getink color #1387 [radarhere] -- Disable compiler optimizations for topalette and tobilevel functions for all msvc versions, fixes #1357 +- Disable compiler optimizations for topalette and tobilevel functions for all msvc versions #1402 (fixes #1357) [cgohlke] - Skip ImageFont_bitmap test if _imagingft C module is not installed #1409 @@ -1075,16 +1075,16 @@ Changelog (Pillow) 2.8.0 (2015-04-01) ------------------ -- Fix 32-bit BMP loading (RGBA or RGBX) +- Fix 32-bit BMP loading (RGBA or RGBX) #1125 [artscoop] - Fix UnboundLocalError in ImageFile #1131 [davarisg] -- Re-enable test image caching +- Re-enable test image caching #982 [hugovk, homm] -- Fix: Cannot identify EPS images, fixes #1104 +- Fix: Cannot identify EPS images #1152 (fixes #1104) [hugovk] - Configure setuptools to run nosetests, fixes #729 @@ -1093,7 +1093,7 @@ Changelog (Pillow) - Style/health fixes [radarhere, hugovk] -- Add support for HTTP response objects to Image.open() +- Add support for HTTP response objects to Image.open() #1151 [mfitzp] - Improve reference docs for PIL.ImageDraw.Draw.pieslice() #1145 @@ -1105,7 +1105,7 @@ Changelog (Pillow) - Fix ImagingEffectNoise #1128 [hugovk] -- Remove unreachable code +- Remove unreachable code #1126 [hugovk] - Let Python do the endian stuff + tests #1121 @@ -1126,10 +1126,10 @@ Changelog (Pillow) - iPython display hook #1091 [wiredfool] -- Adjust buffer size when quality=keep, fixes #148 (again) +- Adjust buffer size when quality=keep #1079 (fixes #148 again) [wiredfool] -- Fix for corrupted bitmaps embedded in truetype fonts. #1072 +- Fix for corrupted bitmaps embedded in truetype fonts #1072 [jackyyf, wiredfool] 2.7.0 (2015-01-01) @@ -1138,19 +1138,19 @@ Changelog (Pillow) - Split Sane into a separate repo: https://github.com/python-pillow/Sane [hugovk] -- Look for OS X and Linux fonts in common places. #1054 +- Look for OS X and Linux fonts in common places #1054 [charleslaw] - Fix CVE-2014-9601, potential PNG decompression DOS #1060 [wiredfool] -- Use underscores, not spaces, in TIFF tag kwargs. #1044, #1058 +- Use underscores, not spaces, in TIFF tag kwargs #1044, #1058 [anntzer, hugovk] -- Update PSDraw for Python3, add tests. #1055 +- Update PSDraw for Python3, add tests #1055 [hugovk] -- Use Bicubic filtering by default for thumbnails. Don't use Jpeg Draft mode for thumbnails. #1029 +- 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 @@ -1162,7 +1162,7 @@ Changelog (Pillow) - The GIF Palette optimization algorithm is only applicable to mode='P' or 'L' #993 [moriyoshi] -- Use PySide as an alternative to PyQt4/5. +- Use PySide as an alternative to PyQt4/5 #1024 [holg] - Replace affine-based im.resize implementation with convolution-based im.stretch #997 @@ -1186,13 +1186,13 @@ Changelog (Pillow) - Ico save, additional tests #1007 [exherb] -- Use PyQt4 if it has already been imported, otherwise prefer PyQt5. #1003 +- Use PyQt4 if it has already been imported, otherwise prefer PyQt5 #1003 [AurelienBallier] -- Speedup resample 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 +- Speed up rotation by using cache aware loops, added transpose to rotations #994 [homm] - Fix Bicubic interpolation #970 @@ -1234,7 +1234,7 @@ Changelog (Pillow) 2.6.0 (2014-10-01) ------------------ -- Relax precision of ImageDraw tests for x86, GimpGradient for PPC +- Relax precision of ImageDraw tests for x86, GimpGradient for PPC #930 [wiredfool] 2.6.0-rc1 (2014-09-29) @@ -1249,7 +1249,7 @@ Changelog (Pillow) - Additional documentation for JPEG info and save options #890 [wiredfool] -- Fix JPEG Encoding memory leak when exif or qtables were specified +- Fix JPEG Encoding memory leak when exif or qtables were specified #921 [wiredfool] - Image.tobytes() and Image.tostring() documentation update #916 #917 @@ -1315,7 +1315,7 @@ Changelog (Pillow) - PyPy performance improvements #821 [wiredfool] -- Added support for reading MPO files +- Added support for reading MPO files #822 [Feneric] - Added support for encoding and decoding iTXt chunks #818 @@ -1333,16 +1333,16 @@ Changelog (Pillow) - Doc cleanup [wiredfool] -- Fix `ImageStat` docs +- Fix `ImageStat` docs #796 [akx] -- Added docs for ExifTags +- Added docs for ExifTags #794 [Wintermute3] - More tests for CurImagePlugin, DcxImagePlugin, Effects.c, GimpGradientFile, ImageFont, ImageMath, ImagePalette, IptcImagePlugin, SpiderImagePlugin, SgiImagePlugin, XpmImagePlugin and _util [hugovk] -- Fix return value of FreeTypeFont.textsize() does not include font offsets +- Fix return value of FreeTypeFont.textsize() does not include font offsets #784 [tk0miya] - Fix dispose calculations for animated GIFs #765 @@ -1367,7 +1367,6 @@ Changelog (Pillow) - Fixed CVE-2014-3589, a DOS in the IcnsImagePlugin (backport) [Andrew Drake] - 2.5.1 (2014-07-10) ------------------ @@ -1380,10 +1379,10 @@ Changelog (Pillow) 2.5.0 (2014-07-01) ------------------ -- Imagedraw rewrite +- Imagedraw rewrite #737 [terseus, wiredfool] -- Add support for multithreaded test execution +- Add support for multithreaded test execution #755 [wiredfool] - Prevent shell injection #748 @@ -1392,7 +1391,7 @@ Changelog (Pillow) - Support for Resolution in BMP files #734 [gcq] -- Fix error in setup.py for Python 3 +- Fix error in setup.py for Python 3 #744 [matthew-brett] - Pyroma fix and add Python 3.4 to setup metadata #742 @@ -1401,7 +1400,7 @@ Changelog (Pillow) - Top level flake8 fixes #741 [aclark4life] -- Remove obsolete Animated Raster Graphics (ARG) support +- Remove obsolete Animated Raster Graphics (ARG) support #736 [hugovk] - Fix test_imagedraw failures #727 @@ -1416,28 +1415,28 @@ Changelog (Pillow) - Cleanup #654 [dvska, hugovk, wiredfool] -- 16-bit monochrome support for JPEG2000 +- 16-bit monochrome support for JPEG2000 #730 [videan42] - Fixed ImagePalette.save [brightpisces] -- Support JPEG qtables +- Support JPEG qtables #677 [csinchok] - Add binary morphology addon [dov, wiredfool] -- Decompression bomb protection +- Decompression bomb protection #674 [hugovk] -- Put images in a single directory +- Put images in a single directory #708 [hugovk] -- Support OpenJpeg 2.1 - [al45tair] +- Support OpenJpeg 2.1 #681 + [al45tair, wiredfool] -- Remove unistd.h #include for all platforms +- Remove unistd.h #include for all platforms #704 [wiredfool] - Use unittest for tests @@ -1452,19 +1451,19 @@ Changelog (Pillow) - Added tests for Spider files [hugovk] -- Use libtiff to write any compressed tiff files +- Use libtiff to write any compressed tiff files #669 [wiredfool] - Support for pickling Image objects [hugovk] -- Fixed resolution handling for EPS thumbnails +- Fixed resolution handling for EPS thumbnails #619 [eliempje] - Fixed rendering of some binary EPS files (Issue #302) [eliempje] -- Rename variables not to use built-in function names +- Rename variables not to use built-in function names #670 [hugovk] - Ignore junk JPEG markers @@ -1479,19 +1478,19 @@ Changelog (Pillow) - Remove transparency resource after P->RGBA conversion [hugovk] -- Clean up preprocessor cruft for Windows +- Clean up preprocessor cruft for Windows #652 [CounterPillow] -- Adjust Homebrew freetype detection logic +- Adjust Homebrew freetype detection logic #656 [jacknagel] -- Added Image.close, context manager support. +- Added Image.close, context manager support [wiredfool] -- Added support for 16 bit PGM files. +- Added support for 16 bit PGM files [wiredfool] -- Updated OleFileIO to version 0.30 from upstream +- Updated OleFileIO to version 0.30 from upstream #618 [hugovk] - Added support for additional TIFF floating point format @@ -1500,64 +1499,64 @@ Changelog (Pillow) - Have the tempfile use a suffix with a dot [wiredfool] -- Fix variable name used for transparency manipulations +- Fix variable name used for transparency manipulations #604 [nijel] 2.4.0 (2014-04-01) ------------------ -- Indexed Transparency handled for conversions between L, RGB, and P modes. Fixes #510 +- Indexed Transparency handled for conversions between L, RGB, and P modes #574 (fixes #510) [wiredfool] -- Conversions enabled from RGBA->P, Fixes #544 +- Conversions enabled from RGBA->P #574 (fixes #544) [wiredfool] -- Improved icns support +- Improved icns support #565 [al45tair] -- Fix libtiff leaking open files, fixes #580 +- Fix libtiff leaking open files #580 (fixes #526) [wiredfool] -- Fixes for Jpeg encoding in Python 3, fixes #577 +- Fixes for Jpeg encoding in Python 3 #578 (fixes #577) [wiredfool] -- Added support for JPEG 2000 +- Added support for JPEG 2000 #547 [al45tair] -- Add more detailed error messages to Image.py +- Add more detailed error messages to Image.py #566 [larsmans] - Avoid conflicting _expand functions in PIL & MINGW, fixes #538 [aclark4life] -- Merge from Philippe Lagadec’s OleFileIO_PL fork +- Merge from Philippe Lagadec’s OleFileIO_PL fork #512 [vadmium] -- Fix ImageColor.getcolor +- Fix ImageColor.getcolor #534 [homm] -- Make ICO files work with the ImageFile.Parser interface, fixes #522 +- Make ICO files work with the ImageFile.Parser interface #525 (fixes #522) [wiredfool] -- Handle 32bit compiled python on 64bit architecture +- Handle 32bit compiled python on 64bit architecture #521 [choppsv1] -- Fix support for characters >128 using .pcf or .pil fonts in Py3k. Fixes #505 +- Fix support for characters >128 using .pcf or .pil fonts in Py3k #517 (fixes #505) [wiredfool] -- Skip CFFI test earlier if it's not installed +- Skip CFFI test earlier if it's not installed #516 [wiredfool] -- Fixed opening and saving odd sized .pcx files, fixes #523 +- Fixed opening and saving odd sized .pcx files #535 (fixes #523) [wiredfool] - Fixed palette handling when converting from mode P->RGB->P - [d_schmidt] + [d-schmidt] - Fixed saving mode P image as a PNG with transparency = palette color 0 [d-schmidt] -- Improve heuristic used when saving progressive and optimized JPEGs with high quality values +- Improve heuristic used when saving progressive and optimized JPEGs with high quality values #504 [e98cuenc] - Fixed DOS with invalid palette size or invalid image size in BMP file @@ -1569,7 +1568,7 @@ Changelog (Pillow) - Fix segfault in getfont when passed a memory resident font [wiredfool] -- Fix crash on Saving a PNG when icc-profile is None +- Fix crash on Saving a PNG when icc-profile is None #496 [brutasse] - Cffi+Python implementation of the PixelAccess object @@ -1578,13 +1577,13 @@ Changelog (Pillow) - PixelAccess returns unsigned ints for I16 mode [wiredfool] -- Minor patch on booleans + Travis +- Minor patch on booleans + Travis #474 [sciunto] -- Look in multiarch paths in GNU platforms +- Look in multiarch paths in GNU platforms #511 [pinotree] -- Add arch support for pcc64, s390, s390x, armv7l, aarch64 +- Add arch support for pcc64, s390, s390x, armv7l, aarch64 #475 [manisandro] - Add arch support for ppc @@ -1593,7 +1592,7 @@ Changelog (Pillow) - Correctly quote file names for WindowsViewer command [cgohlke] -- Prefer homebrew freetype over X11 freetype (but still allow both) +- Prefer homebrew freetype over X11 freetype (but still allow both) #466 [dmckeone] 2.3.2 (2014-08-13) @@ -1611,76 +1610,76 @@ Changelog (Pillow) 2.3.0 (2014-01-01) ------------------ -- Stop leaking filename parameter passed to getfont +- Stop leaking filename parameter passed to getfont #459 [jpharvey] - Report availability of LIBTIFF during setup and selftest [cgohlke] -- Fix msvc build error C1189: "No Target Architecture" +- Fix msvc build error C1189: "No Target Architecture" #460 [cgohlke] - Fix memory leak in font_getsize [wiredfool] -- Correctly prioritize include and library paths +- Correctly prioritize include and library paths #442 [ohanar] -- Image.point fixes for numpy.array and docs +- Image.point fixes for numpy.array and docs #441 [wiredfool] -- Save the transparency header by default for PNGs +- Save the transparency header by default for PNGs #424 [wiredfool] -- Support for PNG tRNS header when converting from RGB->RGBA +- Support for PNG tRNS header when converting from RGB->RGBA #423 [wiredfool] -- PyQT5 Support +- PyQT5 Support #418 [wiredfool] -- Updates for saving color tiffs w/compression using libtiff +- Updates for saving color tiffs w/compression using libtiff #417 [wiredfool] - 2gigapix image fixes and redux [wiredfool] -- Save arbitrary tags in Tiff image files +- Save arbitrary tags in Tiff image files #369 [wiredfool] -- Quote filenames and title before using on command line +- Quote filenames and title before using on command line #398 [tmccombs] -- Fixed Viewer.show to return properly +- Fixed Viewer.show to return properly #399 [tmccombs] - Documentation fixes [wiredfool] -- Fixed memory leak saving images as webp when webpmux is available +- Fixed memory leak saving images as webp when webpmux is available #429 [cezarsa] -- Fix compiling with FreeType 2.5.1 +- Fix compiling with FreeType 2.5.1 #427 [stromnov] -- Adds directories for NetBSD. +- Adds directories for NetBSD #411 [deepy] -- Support RGBA TIFF with missing ExtraSamples tag +- Support RGBA TIFF with missing ExtraSamples tag #393 [cgohlke] -- Lossless WEBP Support +- Lossless WEBP Support #390 [wiredfool] -- Take compression as an option in the save call for tiffs +- Take compression as an option in the save call for tiffs #389 [wiredfool] -- Add support for saving lossless WebP. Just pass 'lossless=True' to save() +- Add support for saving lossless WebP. Just pass 'lossless=True' to save() #386 [liftoff] -- LCMS support upgraded from version 1 to version 2, fixes #343 +- LCMS support upgraded from version 1 to version 2 #380 (fixes #343) [wiredfool] -- Added more raw decoder 16 bit pixel formats +- Added more raw decoder 16 bit pixel formats #379 [svanheulen] - Document remaining Image* modules listed in PIL handbook @@ -1701,34 +1700,34 @@ Changelog (Pillow) - Port PIL Handbook tutorial and appendices [irksep] -- Alpha Premultiplication support for transform and resize +- Alpha Premultiplication support for transform and resize #364 [wiredfool] -- Fixes to make Pypy 2.1.0 work on Ubuntu 12.04/64 +- Fixes to make Pypy 2.1.0 work on Ubuntu 12.04/64 #359 [wiredfool] 2.2.2 (2013-12-11) ------------------ -- Fix #427: compiling with FreeType 2.5.1 +- Fix compiling with FreeType 2.5.1 #427 [stromnov] 2.2.1 (2013-10-02) ------------------ -- Fix #356: Error installing Pillow 2.2.0 on Mac OS X (due to hard dep on brew) +- Error installing Pillow 2.2.0 on Mac OS X (due to hard dep on brew) #357 (fixes #356) [wiredfool] 2.2.0 (2013-10-02) ------------------ -- Fix #254: Bug in image transformations resulting from uninitialized memory +- Bug in image transformations resulting from uninitialized memory #348 (fixes #254) [nikmolnar] -- Fix for encoding of b_whitespace, similar to closed issue #272 +- Fix for encoding of b_whitespace #346 (similar to closed issue #272) [mhogg] -- Fix #273: Add numpy array interface support for 16 and 32 bit integer modes +- Add numpy array interface support for 16 and 32 bit integer modes #347 (fixes #273) [cgohlke] - Partial fix for #290: Add preliminary support for TIFF tags. @@ -1737,91 +1736,93 @@ Changelog (Pillow) - Fix #251 and #326: circumvent classification of pngtest_bad.png as malware [cgohlke] -- Add typedef uint64_t for MSVC. +- Add typedef uint64_t for MSVC #339 [cgohlke] -- Fix #329: setup.py: better support for C_INCLUDE_PATH, LD_RUN_PATH, etc. +- setup.py: better support for C_INCLUDE_PATH, LD_RUN_PATH, etc. #336 (fixes #329) [nu774] -- Fix #328: _imagingcms.c: include windef.h to fix build issue on MSVC +- _imagingcms.c: include windef.h to fix build issue on MSVC #335 (fixes #328) [nu774] -- Automatically discover homebrew include/ and lib/ paths on OS X +- Automatically discover homebrew include/ and lib/ paths on OS X #330 [donspaulding] -- Fix bytes which should be bytearray +- Fix bytes which should be bytearray #325 [manisandro] - Add respective paths for C_INCLUDE_PATH, LD_RUN_PATH (rpath) to build - if specified as environment variables. + if specified as environment variables #324 [seanupton] - Fix #312 + gif optimize improvement [d-schmidt] -- Be more tolerant of tag read failures +- Be more tolerant of tag read failures #320 [ericbuehl] -- Fix #318: Catch truncated zTXt errors. +- Catch truncated zTXt errors #321 (fixes #318) [vytisb] -- Fix IOError when saving progressive JPEGs. +- Fix IOError when saving progressive JPEGs #313 [e98cuenc] -- Add RGBA support to ImageColor +- Add RGBA support to ImageColor #309 [yoavweiss] -- Fix #304: test for `str`, not `"utf-8"`. +- Test for `str`, not `"utf-8"` #306 (fixes #304) [mjpieters] -- Fix missing import os in _util.py. +- Fix missing import os in _util.py #303 [mnowotka] -- Added missing exif tags. +- Added missing exif tags #300 [freyes] -- Fail on all import errors, fixes #298. +- Fail on all import errors #298, #299 (fixes #297) [macfreek, wiredfool] -- Fixed Windows fallback (wasn't using correct file in Windows fonts). +- Fixed Windows fallback (wasn't using correct file in Windows fonts) #295 [lmollea] -- Moved ImageFile and ImageFileIO comments to docstrings. +- Moved ImageFile and ImageFileIO comments to docstrings #293 [freyes] -- Restore compatibility with ISO C. +- Restore compatibility with ISO C #289 [cgohlke] -- Use correct format character for C int type. +- Use correct format character for C int type #288 [cgohlke] -- Allocate enough memory to hold pointers in encode.c. +- Allocate enough memory to hold pointers in encode.c #287 [cgohlke] -- Fix #279, fillorder double shuffling bug when FillOrder ==2 and decoding using libtiff. +- Fillorder double shuffling bug when FillOrder ==2 and decoding using libtiff #284 (fixes #279) [wiredfool] - Moved Image module comments to docstrings. [freyes] -- Add 16-bit TIFF support, fixes #274. +- Add 16-bit TIFF support #277 (fixes #274) [wiredfool] -- Ignore high ascii characters in string.whitespace, fixes #272. +- Ignore high ascii characters in string.whitespace #276 (fixes #272) [wiredfool] -- Added clean/build to tox to make it behave like travis. +- Added clean/build to tox to make it behave like Travis #275 [freyes] -- Adding support for metadata in webp images. +- Adding support for metadata in webp images #271 [heynemann] 2.1.0 (2013-07-02) ------------------ -- Add /usr/bin/env python shebangs to all scripts in /Scripts. +- Add /usr/bin/env python shebangs to all scripts in /Scripts #197 + [mgorny] -- Add several TIFF decoders and encoders. +- Add several TIFF decoders and encoders #268 + [megabuz] - Added support for alpha transparent webp images. @@ -1829,15 +1830,17 @@ Changelog (Pillow) - Adding Python3 basestring compatibility without changing basestring. -- Fix webp encode errors on win-amd64. +- Fix webp encode errors on win-amd64 #259 + [cgohlke] -- Better fix for ZeroDivisionError in ImageOps.fit for image.size height is 1. +- Better fix for ZeroDivisionError in ImageOps.fit for image.size height is 1 #267 + [chrispbailey] - Better support for ICO images. -- Changed PY_VERSION_HEX, fixes #166. +- Changed PY_VERSION_HEX #190 (fixes #166) -- Changes to put everything under the PIL namespace. +- Changes to put everything under the PIL namespace #191 [wiredfool] - Changing StringIO to BytesIO. @@ -1848,35 +1851,44 @@ Changelog (Pillow) - Don't skip 'import site' on initialization when running tests for inplace builds. [cgohlke] -- Enable warnings for test suite. +- Enable warnings for test suite #227 + [wiredfool] -- Fix for ZeroDivisionError in ImageOps.fit for image.size == (1,1) +- Fix for ZeroDivisionError in ImageOps.fit for image.size == (1,1) #255 + [pterk] - Fix for if isinstance(filter, collections.Callable) crash. Python bug #7624 on <2.6.6 -- Fix #193: remove double typedef declaration. +- Remove double typedef declaration #194 (fixes #193) + [evertrol] - Fix msvc compile errors (#230). -- Fix rendered characters have been chipped for some TrueType fonts. +- Fix rendered characters have been chipped for some TrueType fonts + [tk0miya] -- Fix usage of pilfont.py script. +- Fix usage of pilfont.py script #184 + [fabiomcosta] - Fresh start for docs, generated by sphinx-apidoc. - Introduce --enable-x and fail if it is given and x is not available. -- Partial work to add a wrapper for WebPGetFeatures to correctly support #204. +- Partial work to add a wrapper for WebPGetFeatures to correctly support #220 (fixes #204) -- Significant performance improvement of `alpha_composite` function. +- Significant performance improvement of `alpha_composite` function #156 + [homm] -- Support explicitly disabling features via --disable-* options. +- Support explicitly disabling features via --disable-* options #240 + [mgorny] -- Support selftest.py --installed, fixes #263. +- Support selftest.py --installed, fixes #263 -- Transparent WebP Support, #204 +- Transparent WebP Support #220 (fixes #204) + [euangoddard, wiredfool] -- Use PyCapsule for py3.1, fixes #237. +- Use PyCapsule for py3.1 #238 (fixes #237) + [wiredfool] - Workaround for: http://bugs.python.org/issue16754 in 3.2.x < 3.2.4 and 3.3.0. @@ -1890,15 +1902,15 @@ Changelog (Pillow) - Add Python 3 support. (Pillow >= 2.0.0 supports Python 2.6, 2.7, 3.2, 3.3. Pillow < 2.0.0 supports Python 2.4, 2.5, 2.6, 2.7.) [fluggo] -- Add PyPy support (experimental, please see: https://github.com/python-pillow/Pillow/issues/67) +- Add PyPy support (experimental, please see #67) -- Add WebP support. +- Add WebP support #96 [lqs] - Add Tiff G3/G4 support (experimental) [wiredfool] -- Backport PIL's PNG/Zip improvements. +- Backport PIL's PNG/Zip improvements #95, #97 [olt] - Various 64-bit and Windows fixes. From 95888466c8a66558dd383c235672b9c7dbcda824 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 30 Dec 2016 22:20:46 +0000 Subject: [PATCH 092/632] Added correctness tests for opening SGI images --- Tests/images/hopper.bw | Bin 7864 -> 16896 bytes Tests/images/hopper.rgb | Bin 52077 -> 49664 bytes Tests/images/hopper.sgi | Bin 0 -> 52077 bytes Tests/images/transparent.sgi | Bin 43896 -> 120512 bytes Tests/test_file_sgi.py | 34 ++++++++++++++++++++-------------- 5 files changed, 20 insertions(+), 14 deletions(-) create mode 100644 Tests/images/hopper.sgi diff --git a/Tests/images/hopper.bw b/Tests/images/hopper.bw index c9dabf64a5ac21508032138fdbd6a6427bc750ec..1503168ab9caff1c119c51a3d79ecd17d456c81a 100644 GIT binary patch literal 16896 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 Q-~{1dAB=;0)Zoeg2Xf8R;{X5v literal 7864 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 BY8n6l diff --git a/Tests/images/hopper.rgb b/Tests/images/hopper.rgb index a72fc5b1514d6fbb1a11800cdbecdcaf10833c86..7c6d4ce189dde4c74f3c5e8c3f636730843340df 100644 GIT binary patch delta 17403 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%0A=Kb(XR$)2%d`HGA{p`2h` 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 l^XKZ$)MK{|`wxGIjs} delta 19254 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 ctk;vKcb6u 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 diff --git a/Tests/images/hopper.sgi b/Tests/images/hopper.sgi new file mode 100644 index 0000000000000000000000000000000000000000..a72fc5b1514d6fbb1a11800cdbecdcaf10833c86 GIT binary patch literal 52077 zcmeFZg<}-g-amYn+1;#-?aa>lZag8lOR=^?P=LcK`Bj7n4+t@*5hAMzvEXd=BgB?Vh=V7@SxtyLfDq3vLj3y>5^$1`peG3l zZXzV~Swh0zA*AyZLL!b5($z{xw>(06s0itqMM!TAA$>9k>H8BQ{i6sO&`ijnp@a-R zLdXyYAwx?E87>eqqJWSmL_(fiPsk{YHTqRT#&jiQ>^4Hi_aI~f?w>S(kjZBVc^YF+ z#e1e>%x7*B@@yC(GuIOG+((4W8bQblcy!GuI@AS7BLB&LXvIE)`(NXRlRA&JR^tN?9RrVz5~J3`jXCM4-PA?q;rg zcxHVJAsc=mWFwy4^e;lTj3H#}HA1#OMaZjH3E7G7yDkv22W#GYk&yingdD)!UjuCp zf!>E7C*%ldacm|b$KNC5#6m(&enZIVctXyA=5Hnta_$d8E-WMDBF>j)5pwwxLaw|* z$kp!&;V^gp9w8#mQYY{~lMn^-v*r+DH-i6|zYBbFZzsgt1^hooNFZnsbcv7<&_DDp zA>q@(|3*T(U~XMY2-3`67p0y_`j2oaky{%Awnkh1OKt!DH!`{j5Tc%_zzmo09~G~1^<60 zYvJmfG1o}mWfd5+vS!x6SF^^al{Kq^J z4B$WJocIv@2k%$@NyzGj;Qw2Mti{~dVeToR;6Heu?gIadz<;bS8|%w?n~=Pxz<OH^l9+_T|(ZN3;zF`kW-k;=^qI>3mJIx z7edZ21OIVu!1YTX64E#y{QruOYti68)+ek1|J%X;4Cp>&K*8DO2mWKeP6_<4hwg)3 zUW^$q5d41=x{o=A+=lKy3;wr4_lJT1SZ_BD{KxY>HQ+zi*$3yoiQxY?(EXXPw(ETak z{}J$B58Yn`{$GRcLoa57Cvz~~+!5eEWM_Ui@E>zufZrB^ev9$m$nDU55BOgN-RHso zV(3233EAL(J0Z)H!FvMTj|cxhhVFyLYcX~*=901vx{qhmYruQRde$oN|8wa6H1PjC zbiW7qk8z6a;6L71iuaXgLibtlAKz;r3$-vVbw5D&W59pBf72}RzZtrZwQU3MUmXMf zUxn_E1po2Qy-$MwhoSqBy@Pw8`3jS zAfN?F!a;vuha&|CB_zFv{!Wc5{hWYfH4gfYj>I>!I_c2mMUv zMAt)~p$Gj;pXpd*$Nls-`V76Fe(qQY9gn`h<9Z4{)BET>^jW%2`a3<-qhmfP_}noT zT??fTeP_o(uXT(;KhyW6;GplIW75x*{`4MtjXs}(gN{wV)6X3=qTf5{(J>aiMxUkM z=|Ml!gI=d=p?sz9r{mIt-qSG$x-R;;gZFgI4jOjQn!bz9i9Sc)Ne}u=#~A+{pWfFo z2ISnwXF4`LI^>{(|0%fEaW6f0j7QIuw)7gEf5&|3wSUs2gP-&oy^o&hJt;UST|0Qv z!GHQYeWv3*9ek$ipks9KpWfHO7y4`pj(_r>e(#to{Y(#fAH7E3^H2VF@RFV>ojPdP zaW6g7>y$Pre;*ys(C;1Z`{!@;8l7{;(J@}fb^4ti9b-}6()rOf(Y4d@=_NdEr_=7R^H$l)ix!KSGa6W-i z2B^|W+2;KICeDOmS(Ay5!E%1QhAU-RQ739elWgSZ%Z(;AdxjT8vt%)vWW6BCifk4I z{KiUlhs|bpI0VsV^9Y>eba+HgcG;X}t%)<}j4a1#c+RZhbMd%rl1ye+HA%IFlohV+ zqA_u1v&pE}8(6bM7oH&qX0xBTSvJagMYIc&DELM-ae`#A*=-J%w{upPhjE?q5AeF| zHoMDVv)i4)_+|}oIIK=r*U-S=uA;}^?jIBq92yepWm!&fI_!3b+w1j+HYvD^YPISP zsk!+2^Dc!m7!5|A=Qx&?IK7{N6-$XhUiYN9HI zWYiZ8GcsHTxMySxc}COU6W}y#5ooUKWELc?K?Gma##9r-zR3%qASdx6%UevMKq(_x zWQ$_4$dcJ(mR(-ABuH+%V0L?Dt66l~T`rF(*-X5igJdyWE-y;B1J9~nR&69TdF%S9 zO?anKuk+Iz@ird?LD9qH9>7+v^|dZ+CYNwJLUJh|A#)ae0EQ7DyI21$KG;-4>e^)KgWWx=D&I z9AD&AM4iz{g`ZdZW@r{LTQegSm_^2Juo^#;V6ocl zW}cH=!JQ)%r#r;o;R%cI+8qA=4%y}j4L5XB>D_LR*^c!<{v?4lnv75n7M&;XkYztV)?n0{(!eH&=oQS4Gjn>yAV_9RTC~_G{UyPu zS1haq&9I1~&FhpDuT2tN7XLuIjWu;*b+Q75;aFaj&60#gs8UsRWLI|jpXcyjcp#|DiaJ@N?)W5l{FvdA;WOtWm^G^!NUYEoZQGe>LS z4FZf0gq`ICQFt`I3EvrGp21``7_1zmL}NNn=L93gvb>QGvIzzWG!mg*Hk-waN!Z+j zr;YB%8q9(H9}nynGQtzm!=KZ1(&;sRgs~e9W-BA)^FAI+W{_P~rK%Ada>G}BBke*$~hIAg;RfcePQj>Cv$!wDxxXtQxdmJ{4J)pPhlB$*DHJmGQilUx1 zuxdV&;~<6_zJ!B@LtF%zldRwk4^H^R6Ly#3u0Z)Mp-+wA9g^A)b7lpzEGy3N;j@>& z_5Rswr&?d%`0DYQg&RJM%iFV|YIoDMlgCe=I(oE+S|xGt0+L|Rn_wDPttuN@kXO4t zR_DhXMA&&_rU@#7iIjrOumWJVQDfjV8iPS?%r;>{a8hdSBx^7^hxF6Ho=Xsai_PV+ z%N%P78?^kjeL2BW(A>?J7S^o4KKZ518PE5NaJV~n3m+I0BpY;`R>+2mi55XpZBnf# zc__(QB}o+6c&Q5~o2kpVTWp;N_Ki%8?A&iu=FWzxHOD_4HvLBZ3y(iFG}sa7^1kc| zwHxURtPaMRDa)?l;i@LpZL+`V+>xHLOjl2>951k<#2Z*!P(+_$Cur^j}>M>!em+2?DPh9?j2wE+Tp{u_SDuMtk2Hbo>j9d zVa@KtZEwB%VauTdLs$a`G4rv36JR#{JFO%6o9Zg;dcjDI3&XDGcpcD-Mkjefx(*mQ z^~I=Vsrkial~uV;17k{M8O~2Q#Y;2t9`E;@A4ic8g+$a22s)j~Idsg>?qj+RomZF~ zv!Zy;oSenuMn`mUv7)p0E6z@OAOJ?BXvi!|qSQlG3l{9o$;=e}AnuSj6J*3?IM%h%&$l8{~jVlI(unM~xjD zH)}!KuIl8}iUpB}FYI@AUnfZ+ou0^O%- z0131VnwOZ6m|js?xB1oG`;WYF@b!Ir_iW!10-wO&fL(YbMzYO%_H^>B4gIJ9Vp@s> zXCc|0?!c~dD|UX_{#pI5$ipeMsYlmTMJK=4*m~pNAHLgiK03_Cu^<_A%EXBZ$9M0v zhGcE2*%)9Hw5ClI?ecwQMMo`Jm6u;qwSLpKUHi7ax@q&Kx@r&n4a23eCbe))gs7Mf z?v5Ih8w~4hFmh&Daaq9!QIG_C*Rk8aEFYgZ`{>H-=*{ykB+cKP@O(Fa=Y+JHr&L-6 zmK>M}c*rcX@(@)ec$9C`Av18}fO(8z# zOqBxEc6(fQ`N;m*3B_F{C-5jtkvGKcaJm6FHQp!ZpKd>!v~f*S$)>c!iJvEpuSs9p zKce%Pc}dUpbP+3L)?#(I?TXzJ{vx>WHp#x;cxHxEVi{qx&-$>+w49?~eY_#HXv_B9 z`;Hzyed_p;gNOHS3I(1MZa_CDb5<%jR|t_e5^4pMZ)7xF7)CWb%k}Cc_=q zlZR>9`F#y=e2<(klw?x+YoC8myDontB=PmvP8>aSV9#s2>q99o7QvY{yST* zoq4x3d&lvM7cQPUfBw`PhfY;Y))=9WHPo6wq$S15rCqrFdTQ0_v1Uo3v)U~Ivx6Dd zV1>25P&@mDNh4k!`&7TDyDvt}8iszPYLS()BAB&K|$GVFs)z1)}h*HmBPg7^vhmzI`ln zL&MXafMEY%Ch!;qq+XBP3Df78Rlg)*;q$4{%NAw4^lC92_6tM04wyW7`uOg40(FFc zge6m4t}c11R@HkXuchH!HUc%EF-AB6>&W*xbn%04ZtbZ#aPq?0^JgxcJ$mTq=4n=# zBe*T_OJXI_;8crWQ(a_fLO+SMa zFtD@BW3w5E$!ak10EQ+5j4;nFP_0rWklYP5>!S=5n`%wR*-oL`kKOp-a((`mJ+B`) zwEy+Pdv@%rnjj!Bfy1U60g#NSuk*pP|GK+9DLWm2L$(2Z?}X=sm9|-IZkRkdzh7uj zShp@=K@nx)PJw7uos1@jRZkIjCTybs+?meGD|`SoFEu&$B`pAn87Q!x7tQ)^d(XW6 zdGq$NT}Mv8aq9T#6R+(%v~ijhNI)&O!LrM4cR-l8=kW_4yt6Z{s4y@fC?M1m92^)F z6zK2oc6kEAp_xM2#0e88K0R&v%#_z{MyD)x0!TJ_gKUHX015v2uPAz|5P*j*A}hilNDEJW+Wy;z zTN6^l08|vg>aaWTR%mvhWcG#|blbMwY&(7YjSF|K{*1Ibi||J_%R15tUX-RgkQ(55 zqqtJFTop%}H&)eV=!`T^K_df})w=S}|Mq9gilXwe4OJh3K zO&Yew>6h`w{rf)^mQ-&%c=*_k+KhGcCa@|i;uJt7Q!8hZjEW?=tKR(buiwABTRVS- zgGvD|(I6Kz@>4|4thh%8c!E234haeidI7%FsuzHL1q6l`tPv>!=obVpunH=Hz&UMg zT9(>?fc|erxb<15+S`9EDX-gh^u+0Xn{v_?Op*ND7DiH=TLFnAf3G{d{_;2NfBxsa zEs=8q14E$?0RdiIMs_H$M|e=6(=}n>&=F6J95r&xj6^|lctxiyv9iN~w3RQ?w>vR! z&+rD-ZPmvl_pK{u4u>K1<<-J|)?_e>S%t-G<6nGs!k}(8EJ#73#At&bqhTC?E$cvv z#W~@`dw($Pg@4_tP3&WZ!;uiqFpfje6`R-Qa=>FcU5Y~q@yZUbM6+u_!B*aEv+{a9 z1!lLsa9(rsd|Zik>xXbe}N5N1X`gtd(>COdA2% z5Z74^g6x@a?5!Vu`|JL%Z52zq$%@qjQBYeBL15u~X#Nc=krg#kRVt(!U5X#0XTb%H z4ojeHfB`@rqgRcp2Ekii`r5R7PKS&TEYo`EgVvOqleaSFh3RAZb(YPn!Gc_i$<895 zvm1C9QHRIuaEDDl^ZqY?LK^R`Upc_-@q~d39^hF!B4dBMgR$=fH3Gw2;o+gO!)ilr z&*lP!tO(HIs;OymfD`^t12L&SBPVWOKX7G_8~_z+KaZQ4**6Qtt|-~_czoNoq3FQk{ZAo<4Y{fw*yCWql$=nWj5 znk^vt;(HJ7-@E_dr#n?kJfg(`i;GoS%)kz!#qB^)1vxV5kOg(HP6LQe!%xa=nkGhI z4o)BvdZH4(x`ymZPRY!3>uF2@UrF;seg>Of?>1o73Y9`cJ%Yojb1^bwP6za6?AHP! zvaf#9-u|Gy{rC5_t_VkV&hGZQ9l$KWrLrA72@LRhoemi>l}8ChYRm4j!_QOP3L}mP z((Z8C9f2=5s@_$7N>1HqYB>71BpHDre2g&Y&1&RmL^wx@8gjiANgiH8HWfMn!)jq2 zRz<2g|9SfZrv2Pse}2_EA;_!n7)Qo+i_I*!%q)@>va?%&Lu>EuQV=%iH5xxiq$EM2 zeZGh$v^jBX8c+iC8{1HT0kkoR?;EBf$;ZuwjWP%inzs=4#s*n%2!pLL#l3)fa z+*W&V+-23jV4U)AG+a0`)u|w)H>tS{%#Ty^`Eah(7E#er17}oF!~!<(ezMak_O80| zU3>d|roG_Tme&-ATYxs&tc)cC-p8)C?X=Sr8xJsuI2Xasqx1}{ugUjD6OTNA(J(zp z6$4jY{%YNZib2RFKtvzODjmQ0AL9emfo}%_CFrnd+^(h!wzqtExi>Q-~}zPi2eLHoBiC&1qMf*Zz?s_3l6K=3kX zDOhN<0(59j1wzb#^P?aI>2qLKzn535;#9FDcjv|p6{C>ShvC<<>Hiou$0w>Fx!P3r z$W-w%lGbJ}ytL`Jd(6YqKOcPEHV)|=j0|JwbIm0*mNWzR@yM7`gv|)4SVsvW6G)HA zphM=EW#cOlL)Va;yv*#(VOk^4nA7MaGby1dl(k4A!{=ZsKEkU-wYf-=5G`1oc1!n~ zwtJAf(m&dNxHH+|^devHcF~Frv2>JI&{hCO8zNf~d1Xs)f~X8T6Z))loPCxvz(z7R?AUlmR@^a2QiP%4(w7VH3sPTi$#4*B=ib{{H>vdn{%;Fc7Jwj#8Yakt7;9!;bqb zCCxb^<(E!1hRgF29QHiByi*k^$3!OveGblL(ffPYTLQAY*bNj@Sg2UrY!0VW<0wJAA{bf4 z?Nv+~DdK1gpwBH*a=YdHk!;)wh)sbRR;%T*AGtnISJcj0Az z_+$hPQ)$=^(4ny~av5w4B{5GUKT2WQtQJe~35$iF6wIhqCa+Y*QWEdnT2mhBM>C|X z2ITyo5h;Py+;)f|(wnSR;T4DU@|8axK6v=ogL~h7G#nTW?hvVCi&Z06Vk9~|HQ%rx z7zY4bQ1jXJ6V}5RvN#jxEiHo`sU(Ft*=ZT`)X0W_?Z~|`$n<7YqY0}?39Od3!NSOP z#p3lSZh!ltra#*sQi=NM^HEqC5<-wyhuU5Z#Ea0_AAr+kMQ{uF3j({HYD!@n%0aNe zGOM!;K2OE?F3F=}T<*2W0?L7@CJlmf3Z*lsz0`3#Fgm8o@vML~Se%^M`}zlfQ|%A# zfA_&MJ10Zu%v6%oEXV*<(gZPJCfpg7V;DZr0=6#`Mv(>x+3?Ivx3w!&(bRVA*iuuv z9Ayw%nuMp&|F5AbrT5b4iqaamL=+I(3Xc8nL6RT-@%uOLCD>3Qr3?m%=^#QbY?UuH ziizZ6IGRi_BY$3k7?+ZpCY)Krz~Ty3sj8af=47R%Mx&+#BZCyLA1F?3O$H@DB{y)3 z#F)=WGBOQzR9gV!4t)rd4VnJ&<5eEn0kJ|o*kNH~F}2cIAzgXiqovYPh#DGQj>{Zxz#4g*U34gm zoB#7b-G2I~4`(@$0>(;x+6!bv^8gSz%mo1!vgihL% z-J8~zu4c8gm_`kkkLpGLGd8u=8upq`*;pWI!D{1e^1|ys{PpnRy?Z~t|GXWj80N`G zb*la#7$$%;JL>e*bWxtuVmeqyY01(ukKwueGElvS6z6AVrpD;CsKVkYl(<0lBFZaz zEB@it8pulsxB6qT2OP8+gYFuCJHABGC|SPOw@RC z^_2FQ55OF&2ZrQR_g;CswJpm5 zcw)CP)^x}^;M^fK;T$^?%;n7}x*91f3D0qo2+n=M`H-)uz)^&TmGyYcF=ik^1h z(noWEv={ogKv4_LwWv)yeD;xA9heX&$J>o)rm%=M*4jBBvdy$H!h|!CF2?W~~hj-YCOU($J-XZyS8ZVwK4hcZ* z3-S-l1S-SeLm1UuCd>g!9;SV$!&0Dy$WAc^L<+KGLMNKTvXE&AZLCEIW+~a>^l1*6fn6yE z2dD#q`7@6#D=q>H%1KU9MowO&UeqvL4!sj^q?RAjuNF?yo8f!$7OE1kqc*1y8e_3r zc~s9}b$L+JW)p%OZsboKNc2#@>p*43%LEn$P~b?rRNT}EG0=%(x6AFc!sANz@W|5* z*E_vS^4l6O?#&5BvWI#m%z(-sqM}E}0JMiuz~`;JU~-TAVL7VNg3*E~SK?6tGJExi ziUoi4S6MAOCDqETk$YtMhqPL z%Nna7$h;lh3o_bm?3O^*;R&z=I~iN5!Z@;kYd~8jV5>he1^!5D`uhh4LHKFx1V7-m zOB`nj?y==;V-o_S4@lmPhHLvHLm@6^Em|vlN(TOd02*Yzq2gHfZp@dGLvSbm)cz83 z5eP3~VXY8k*%-);v~eyZ4(%YhR$*-U&^ljd00_<~mDJ&4?KC$4IB3vXl9$EDsTLz` znY(x6j^at8nuRMbqH;(T{GVfkBDDX(XP$E%Nk2T8D=QL^P$lYYaLl~kpMBEGI*~oG zA`I48Qqhc)PixPBR&-Pb@Dlc(I(f=aD!0KEC1n+=0;C0UDsrnb#t9Twls=+5b=kO? z9vVIqbD>qeRK!MmU?2k0e`|jQ86gU@WVHK0+PM&EtXuNOY8@6Q;!jF>CLkXqccHNg z76)vo^haTNeJ_}+26Q^Z!AE`aH zG~8C6w}v(S=g;=}oM=-_Xfi_V;Izxa^e=iLsfpl3VzBmHICP)Cmvxp(DtA!zziF;# z#w9L`0ampQp1AwLTDGqnFAZY{r%xQR{j(z2PDtdowA!dZq3Ow+H1C zAH8`1EgIjag9yG93*^cN%lJ{huP3apa;>Z)6RqgrzQ+Er@)?a~QD)>l_I0*)uPlv#vEs2_XxKL_XpplHUMRu;is{d+# zkl-{1C|I>12U>c(*Z$`hUERp>VmNy?yd?r9ui8J;9m+B`yI z(DTkm4QQatKZnG~=`a937p?64`p2Ih{QlsN?1@kH@^``wb0JNCJpAk7G6m2{lr<8f z12rslCR_%!*m)=h{4L>#?}Z$mo0e6UUsk3nQdN-hZ54x5XwCJfS_eOl>7hN=r`Xhd zFycnYHh!@vo`XMOsSny86ik~q082$%YUdkBYiF-=LiEiR#+G467^?O#-b_?ysj05< zdSJSJ(v515M=^=PDOcXQa`_^<0^3MV+tyI@X}TWMnKLMb)f@sLHJSi@l`xuS%BMCJ zkzKd2?*4E8`RdzG&g|u2NTE%$%F3m{|xAVijeMnpb3%ejv{B^(xogT;tq zWUB>bqPWD^xW&<`MSz2ON07@g=*8Xu%R&~CQ2(#dXsqckT-!620%ino$;^2>`V08UCs z&aNb_9);NfNEm>yKJbKQuQZxL&Y|Heg(~Rc#0gajd&Iln{i$g$`17ZKW9{2}+lGJg zkZCXZ>s{0(6pp5ue2EsuTLh=*bo%>1Ia*{NK|$H+kHnTa=s?rWn-?yrF2JVTx$p#9 zT@7-oza*RdIGev(FTf_75g4K7z?<~6LW88UPUGjNN5h6Z=Re=v|Mdq1!>8Lmg&%4E z@+@kxzy8tQes2~C2mej$1B|$XVg#CsgRD>%pn((};aHD3KI?*-1MN!(&{4*J^s%~qEZ5;e@E^*A)WMks0v-aN`+IF1BDRR0F&F=b_B8{Y7TL(#UyZaGY@A-Qp_>D# z9h7!WSuhAX4H~e|P?1IL3f1vTpa19ghwbghcQ(Is`PlY1_w3%AeIKU%!Cw!)?S%$) zBCG=>-sgJb?J+E-hG}m$Y!rOL41ae|YcbhY#;R{H6zr zMKr;QDIiBm8BaUnkYuO9Hw}oX(Ki}h=tGv)6cv{g6&Aq$K>E8X&Hx06rPB>Me;ekn zkuzZR0pfOH3j℞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 UXPQh9zY&8g)WjC8#oV{~H#!+T*8l(j literal 0 HcmV?d00001 diff --git a/Tests/images/transparent.sgi b/Tests/images/transparent.sgi index 482572df5561858412faa3e2980ad57548206cf7..0003cf33f8c74a2e173a6eaf578e8252bb1cd702 100644 GIT binary patch literal 120512 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 literal 43896 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 diff --git a/Tests/test_file_sgi.py b/Tests/test_file_sgi.py index 870e57ed8..af40ac848 100644 --- a/Tests/test_file_sgi.py +++ b/Tests/test_file_sgi.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase +from helper import unittest, PillowTestCase, hopper from PIL import Image, SgiImagePlugin @@ -6,31 +6,37 @@ from PIL import Image, SgiImagePlugin class TestFileSgi(PillowTestCase): def test_rgb(self): - # Arrange # Created with ImageMagick then renamed: - # convert hopper.ppm hopper.sgi + # convert hopper.ppm -compress None sgi:hopper.rgb test_file = "Tests/images/hopper.rgb" - # Act / Assert - self.assertRaises(ValueError, lambda: Image.open(test_file)) + im = Image.open(test_file) + self.assert_image_equal(im, hopper()) def test_l(self): - # Arrange - # Created with ImageMagick then renamed: - # convert hopper.ppm -monochrome hopper.sgi + # Created with ImageMagick + # convert hopper.ppm -monochrome -compress None sgi:hopper.bw test_file = "Tests/images/hopper.bw" - # Act / Assert - self.assertRaises(ValueError, lambda: Image.open(test_file)) + im = Image.open(test_file) + self.assert_image_similar(im, hopper('L'), 2) def test_rgba(self): - # Arrange # Created with ImageMagick: - # convert transparent.png transparent.sgi + # convert transparent.png -compress None transparent.sgi test_file = "Tests/images/transparent.sgi" + + im = Image.open(test_file) + target = Image.open('Tests/images/transparent.png') + self.assert_image_equal(im, target) - # Act / Assert - self.assertRaises(ValueError, lambda: Image.open(test_file)) + def test_rle(self): + # convert hopper.ppm hopper.sgi + # We don't support RLE compression, this should throw a value error + test_file = "Tests/images/hopper.sgi" + + with self.assertRaises(ValueError): + Image.open(test_file) def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" From 39c01eb039994e3b0cdf2da38b3de164a54324ea Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 30 Dec 2016 23:47:47 +0000 Subject: [PATCH 093/632] Update Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index bfb669e18..af46309f4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Test: Added correctness tests for opening SGI images #2324 + [wiredfool] + - Allow passing a list or tuple of individual frame durations when saving a GIF #2298 [Xdynix] From 41c97af15c179859472b1cf138b4203bd2393e24 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 30 Dec 2016 23:54:20 +0000 Subject: [PATCH 094/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index af46309f4..b8c0fa313 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Depends: Updated pngquant to 2.8.2 #2319 + [radarhere] + - Test: Added correctness tests for opening SGI images #2324 [wiredfool] From 597ab45d4d9f0f6af5a164b902317e2692401553 Mon Sep 17 00:00:00 2001 From: Mickael B Date: Sat, 17 Sep 2016 04:03:40 -0400 Subject: [PATCH 095/632] [SGI] Save uncompressed SGI/BW/RGB/RGBA files Save feature added to SgiImagePlugin.py, uncompressed method only --- PIL/SgiImagePlugin.py | 80 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/PIL/SgiImagePlugin.py b/PIL/SgiImagePlugin.py index d2efd3e25..17b8efd17 100644 --- a/PIL/SgiImagePlugin.py +++ b/PIL/SgiImagePlugin.py @@ -7,9 +7,12 @@ # See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. # # +# # History: +# 2016-16-10 mb Add save method without compression # 1995-09-10 fl Created # +# Copyright (c) 2016 by Mickael Bonfill. # Copyright (c) 2008 by Karsten Hiddemann. # Copyright (c) 1997 by Secret Labs AB. # Copyright (c) 1995 by Fredrik Lundh. @@ -19,8 +22,10 @@ from PIL import Image, ImageFile, _binary +import struct +import os -__version__ = "0.2" +__version__ = "0.3" i8 = _binary.i8 i16 = _binary.i16be @@ -76,12 +81,83 @@ class SgiImageFile(ImageFile.ImageFile): elif compression == 1: raise ValueError("SGI RLE encoding not supported") + +def _save(im, fp, filename): + if im.mode != "RGB" and im.mode != "RGBA" and im.mode != "L": + raise ValueError("Unsupported SGI image mode") + + # Flip the image, since the origin of SGI file is the bottom-left corner + im = im.transpose(Image.FLIP_TOP_BOTTOM) + # Define the file as SGI File Format + magicNumber = 474 + # Run-Length Encoding Compression - Unsupported at this time + rle = 0 + # Byte-per-pixel precision, 1 = 8bits per pixel + bpc = 1 + # Number of dimensions (x,y,z) + dim = 3 + # X Dimension = width / Y Dimension = height + x, y = im.size + if im.mode == "L" and y == 1: + dim = 1 + elif im.mode == "L": + dim = 2 + # Z Dimension: Number of channels + z = len(im.mode) + if dim == 1 or dim == 2: + z = 1 + # Minimum Byte value + pinmin = 0 + # Maximum Byte value (255 = 8bits per pixel) + pinmax = 255 + # Image name (79 characters max) + imgName = os.path.splitext(os.path.basename(filename))[0][0:78] + # Standard representation of pixel in the file + colormap = 0 + channels = [] + for channelIndex in range(0, z): + channelData = list(im.getdata(channelIndex)) + channels.append(channelData) + fp.write(struct.pack('>h', magicNumber)) + fp.write(struct.pack('c', chr(rle))) + fp.write(struct.pack('c', chr(bpc))) + fp.write(struct.pack('>H', dim)) + fp.write(struct.pack('>H', x)) + fp.write(struct.pack('>H', y)) + fp.write(struct.pack('>H', z)) + fp.write(struct.pack('>l', pinmin)) + fp.write(struct.pack('>l', pinmax)) + for i in range(0, 4): + fp.write(struct.pack('c', chr(0))) + for c in imgName: + fp.write(struct.pack('c', c)) + fp.write(struct.pack('c', chr(0))) + if len(imgName) < 78: + charIndex = len(imgName) + for charIndex in range(len(imgName), 79): + fp.write(struct.pack('c', chr(0))) + fp.write(struct.pack('>l', colormap)) + for i in range(0, 404): + fp.write(struct.pack('c', chr(0))) + for zChannel in range(0, z): + dIndex = 0 + for yPos in range(0, y): + for xPos in range(0, x): + fp.write(struct.pack('c', chr(channels[zChannel][dIndex]))) + dIndex += 1 + fp.close() + + # # registry Image.register_open(SgiImageFile.format, SgiImageFile, _accept) - +Image.register_save(SgiImageFile.format, _save) +Image.register_mime(SgiImageFile.format, "image/sgi") +Image.register_mime(SgiImageFile.format, "image/rgb") Image.register_extension(SgiImageFile.format, ".bw") Image.register_extension(SgiImageFile.format, ".rgb") Image.register_extension(SgiImageFile.format, ".rgba") Image.register_extension(SgiImageFile.format, ".sgi") + +# End of file From 3d185ee8579d6cab7660d19cbcad66609c8c19c9 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 30 Dec 2016 22:31:35 +0000 Subject: [PATCH 096/632] added tests for sgi writing --- Tests/test_file_sgi.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Tests/test_file_sgi.py b/Tests/test_file_sgi.py index af40ac848..65910b5eb 100644 --- a/Tests/test_file_sgi.py +++ b/Tests/test_file_sgi.py @@ -45,6 +45,17 @@ class TestFileSgi(PillowTestCase): lambda: SgiImagePlugin.SgiImageFile(invalid_file)) + def test_write(self): + def roundtrip(img): + out = self.tempfile('temp.sgi') + img.save(out, format='sgi') + reloaded = Image.open(out) + self.assert_image_equal(img, reloaded) + + for mode in ('L', 'RGB', 'RGBA'): + roundtrip(hopper(mode)) + + if __name__ == '__main__': unittest.main() From 31c204eae4e158bbaa6cda4afe7a2f8e2fcabe6e Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 30 Dec 2016 23:10:47 +0000 Subject: [PATCH 097/632] Loop cleanup, python 3 compatibility --- PIL/SgiImagePlugin.py | 47 ++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/PIL/SgiImagePlugin.py b/PIL/SgiImagePlugin.py index 17b8efd17..d0e293368 100644 --- a/PIL/SgiImagePlugin.py +++ b/PIL/SgiImagePlugin.py @@ -28,6 +28,7 @@ import os __version__ = "0.3" i8 = _binary.i8 +o8 = _binary.o8 i16 = _binary.i16be @@ -110,41 +111,37 @@ def _save(im, fp, filename): pinmin = 0 # Maximum Byte value (255 = 8bits per pixel) pinmax = 255 - # Image name (79 characters max) - imgName = os.path.splitext(os.path.basename(filename))[0][0:78] + # Image name (79 characters max, truncated below in write) + imgName = os.path.splitext(os.path.basename(filename))[0] + if str is not bytes: + imgName = imgName.encode('ascii', 'ignore') # Standard representation of pixel in the file colormap = 0 - channels = [] - for channelIndex in range(0, z): - channelData = list(im.getdata(channelIndex)) - channels.append(channelData) fp.write(struct.pack('>h', magicNumber)) - fp.write(struct.pack('c', chr(rle))) - fp.write(struct.pack('c', chr(bpc))) + fp.write(o8(rle)) + fp.write(o8(bpc)) fp.write(struct.pack('>H', dim)) fp.write(struct.pack('>H', x)) fp.write(struct.pack('>H', y)) fp.write(struct.pack('>H', z)) fp.write(struct.pack('>l', pinmin)) fp.write(struct.pack('>l', pinmax)) - for i in range(0, 4): - fp.write(struct.pack('c', chr(0))) - for c in imgName: - fp.write(struct.pack('c', c)) - fp.write(struct.pack('c', chr(0))) - if len(imgName) < 78: - charIndex = len(imgName) - for charIndex in range(len(imgName), 79): - fp.write(struct.pack('c', chr(0))) + + fp.write(struct.pack('4s', b'')) # dummy + fp.write(struct.pack('79s', imgName)) # truncates to 79 chars + fp.write(struct.pack('s', b'')) # force null byte after imgname fp.write(struct.pack('>l', colormap)) - for i in range(0, 404): - fp.write(struct.pack('c', chr(0))) - for zChannel in range(0, z): - dIndex = 0 - for yPos in range(0, y): - for xPos in range(0, x): - fp.write(struct.pack('c', chr(channels[zChannel][dIndex]))) - dIndex += 1 + + fp.write(struct.pack('404s', b'')) # dummy + + #assert we've got the right number of bands. + if len(im.getbands()) != z: + raise ValueError("incorrect number of bands in SGI write: %s vs %s" % + (z, len(im.getbands()))) + + for channel in im.split(): + fp.write(channel.tobytes()) + fp.close() From 6fd020a465cb7ff5acafb486d36f7b9c1c328758 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 31 Dec 2016 12:33:33 +0000 Subject: [PATCH 098/632] Added save docs for SGI --- docs/handbook/image-file-formats.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index cfb19a97a..21339e75f 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -471,6 +471,12 @@ PPM PIL reads and writes PBM, PGM and PPM files containing ``1``, ``L`` or ``RGB`` data. +SGI +^^^ + +Pillow reads and writes uncompressed ``L``, ``RGB``, and ``RGBA`` files. + + SPIDER ^^^^^^ @@ -807,10 +813,6 @@ PSD PIL identifies and reads PSD files written by Adobe Photoshop 2.5 and 3.0. -SGI -^^^ - -PIL reads uncompressed ``L``, ``RGB``, and ``RGBA`` files. TGA ^^^ From 789ac7aa720cdc81769eddf51cb9729cbb8ad0c1 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 31 Dec 2016 12:35:37 +0000 Subject: [PATCH 099/632] Update Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index b8c0fa313..d1d74f729 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- SGI: Save uncompressed SGI/BW/RGB/RGBA files #2325 + [jbltx] + - Depends: Updated pngquant to 2.8.2 #2319 [radarhere] From 69bea50810ebc0b4234de4bf461ce5c76f2af72b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 29 Nov 2016 19:25:49 +0000 Subject: [PATCH 100/632] Allow 0 size images, Fixes #2259 --- PIL/Image.py | 4 ++-- Tests/test_image.py | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index c086dfcd7..03f3973ee 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1994,8 +1994,8 @@ def _check_size(size): raise ValueError("Size must be a tuple") if len(size) != 2: raise ValueError("Size must be a tuple of length 2") - if size[0] <= 0 or size[1] <= 0: - raise ValueError("Width and Height must be > 0") + if size[0] < 0 or size[1] < 0: + raise ValueError("Width and Height must be => 0") return True diff --git a/Tests/test_image.py b/Tests/test_image.py index ef9aa16af..f1457a85b 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -256,7 +256,11 @@ class TestImage(PillowTestCase): with self.assertRaises(ValueError): Image.new('RGB', (0,)) # Tuple too short with self.assertRaises(ValueError): - Image.new('RGB', (0,0)) # w,h <= 0 + Image.new('RGB', (-1,-1)) # w,h < 0 + + # this should pass with 0 sized images, #2259 + im = Image.new('L', (0, 0)) + self.assertEqual(im.size, (0, 0)) self.assertTrue(Image.new('RGB', (1,1))) # Should pass lists too From 0a922b962fdc92115a0a9f7deb909acf48afa063 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 27 Dec 2016 04:53:23 -0800 Subject: [PATCH 101/632] tests for basic operations on 0x0 images --- Tests/test_image_access.py | 13 +++++++++++++ Tests/test_image_convert.py | 5 +++++ Tests/test_image_copy.py | 9 +++++++++ Tests/test_image_crop.py | 17 +++++++++++++++++ Tests/test_image_resize.py | 8 ++++++++ 5 files changed, 52 insertions(+) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 0f8d2a654..900f39eb4 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -78,12 +78,25 @@ class TestImageGetPixel(AccessTest): im.getpixel((0, 0)), c, "put/getpixel roundtrip failed for mode %s, color %s" % (mode, c)) + # Check 0 + im = Image.new(mode, (0, 0), None) + with self.assertRaises(IndexError): + im.putpixel((0, 0), c) + with self.assertRaises(IndexError): + im.getpixel((0, 0)) + # check initial color im = Image.new(mode, (1, 1), c) self.assertEqual( im.getpixel((0, 0)), c, "initial color failed for mode %s, color %s " % (mode, c)) + # Check 0 + im = Image.new(mode, (0, 0), c) + with self.assertRaises(IndexError): + im.getpixel((0, 0)) + + def test_basic(self): for mode in ("1", "L", "LA", "I", "I;16", "I;16B", "F", "P", "PA", "RGB", "RGBA", "RGBX", "CMYK", "YCbCr"): diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 0c98211e7..54ffde10b 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -19,6 +19,11 @@ class TestImageConvert(PillowTestCase): for mode in modes: convert(im, mode) + # Check 0 + im = Image.new(mode, (0,0)) + for mode in modes: + convert(im, mode) + def test_default(self): im = hopper("P") diff --git a/Tests/test_image_copy.py b/Tests/test_image_copy.py index ba53758d5..c50205c9c 100644 --- a/Tests/test_image_copy.py +++ b/Tests/test_image_copy.py @@ -1,5 +1,7 @@ from helper import unittest, PillowTestCase, hopper +from PIL import Image + import copy @@ -33,5 +35,12 @@ class TestImageCopy(PillowTestCase): self.assertEqual(out.mode, im.mode) self.assertEqual(out.size, croppedSize) + def test_copy_zero(self): + im = Image.new('RGB', (0,0)) + out = im.copy() + self.assertEqual(out.mode, im.mode) + self.assertEqual(out.size, im.size) + + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_crop.py b/Tests/test_image_crop.py index c12e29be4..c887ab0c1 100644 --- a/Tests/test_image_crop.py +++ b/Tests/test_image_crop.py @@ -83,6 +83,23 @@ class TestImageCrop(PillowTestCase): img = img.crop(extents) img.load() + def test_crop_zero(self): + + im = Image.new('RGB', (0, 0), 'white') + + cropped = im.crop((0, 0, 0, 0)) + self.assertEqual(cropped.size, (0, 0)) + + cropped = im.crop((10, 10, 20, 20)) + self.assertEqual(cropped.size, (10, 10)) + self.assertEqual(cropped.getdata()[0], (0, 0, 0)) + + im = Image.new('RGB', (0, 0)) + + cropped = im.crop((10, 10, 20, 20)) + self.assertEqual(cropped.size, (10, 10)) + self.assertEqual(cropped.getdata()[2], (0, 0, 0)) + if __name__ == '__main__': diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py index 7db409659..38a60564c 100644 --- a/Tests/test_image_resize.py +++ b/Tests/test_image_resize.py @@ -89,6 +89,14 @@ class TestImagingCoreResize(PillowTestCase): # as separately resized channel self.assert_image_equal(ch, references[channels[i]]) + def test_enlarge_zero(self): + for f in [Image.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING, + Image.BICUBIC, Image.LANCZOS]: + r = self.resize(Image.new('RGB', (0,0), "white"), (212, 195), f) + self.assertEqual(r.mode, "RGB") + self.assertEqual(r.size, (212, 195)) + self.assertEqual(r.getdata()[0], (0,0,0)) + class TestImageResize(PillowTestCase): From 7d59183c1d61bbbad8fa5739711eac43c6725a63 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 31 Dec 2016 13:08:00 +0000 Subject: [PATCH 102/632] Zero image size test --- Tests/test_image_rotate.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index e90b9a592..70523a698 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -15,13 +15,19 @@ class TestImageRotate(PillowTestCase): self.assertEqual(out.size, im.size) else: self.assertNotEqual(out.size, im.size) - for mode in "1", "P", "L", "RGB", "I", "F": + + for mode in ("1", "P", "L", "RGB", "I", "F"): im = hopper(mode) rotate(im, mode, 45) - for angle in 0, 90, 180, 270: + + for angle in (0, 90, 180, 270): im = Image.open('Tests/images/test-card.png') rotate(im, im.mode, angle) + for angle in (0, 45, 90, 180, 270): + im = Image.new('RGB',(0,0)) + rotate(im, im.mode, angle) + if __name__ == '__main__': unittest.main() From 20abc9cdfee882a0e90eea05929a3af78d767e8d Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 31 Dec 2016 13:31:51 +0000 Subject: [PATCH 103/632] Fix size check on expan for image_rotate --- Tests/test_image_rotate.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index 70523a698..dfe5a0731 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -13,8 +13,11 @@ class TestImageRotate(PillowTestCase): self.assertEqual(out.mode, mode) if angle % 180 == 0: self.assertEqual(out.size, im.size) + elif im.size == (0, 0): + self.assertEqual(out.size, im.size) else: self.assertNotEqual(out.size, im.size) + for mode in ("1", "P", "L", "RGB", "I", "F"): im = hopper(mode) From dda63c1ada46a0f7e93b45e99f78a6557cde4aad Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 31 Dec 2016 16:35:42 +0000 Subject: [PATCH 104/632] Update Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index d1d74f729..90c37d78d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Allow 0 size images, Fixes #2259, Reverts to pre-3.4 behavior. + [wiredfool] + - SGI: Save uncompressed SGI/BW/RGB/RGBA files #2325 [jbltx] From 5230fee237269a457ce0afc63fe455b929515283 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 31 Dec 2016 17:29:28 +0000 Subject: [PATCH 105/632] Release notes for 4.0.0 --- docs/releasenotes/4.0.0.rst | 46 +++++++++++++++++++++++++++++++++++++ docs/releasenotes/index.rst | 1 + 2 files changed, 47 insertions(+) create mode 100644 docs/releasenotes/4.0.0.rst diff --git a/docs/releasenotes/4.0.0.rst b/docs/releasenotes/4.0.0.rst new file mode 100644 index 000000000..609f8127e --- /dev/null +++ b/docs/releasenotes/4.0.0.rst @@ -0,0 +1,46 @@ +4.0.0 +----- + +Python 2.6 and 3.2 Dropped +========================== + +Pillow 4.0 no longer supports Python 2.6 and 3.2. We will not be +creating binaries, testing, or retaining compatibility with these +releases. This release removes some workarounds for those Python +releases, so the final working version of Pillow on 2.6 or 3.2 is 3.4.2. + +OleFileIO.py +============ + +OleFileIO.py has been removed as a vendored file and is now installed +from the upstream olefile pypi package. All internal dependencies are +redirected to the olefile package. Direct accesses to +``PIL.OlefileIO`` raises a deprecation warning, then patches the +upstream olefile into ``sys.modules`` in its place. + +SGI image save +============== + +It is now possible to save images in modes ``L``, ``RGB``, and +``RGBA`` to the uncompressed SGI image format. + +Zero sized images +================= + +Pillow 3.4.0 removed support for creating images with (0,0) size. This +has been reenabled, restoring pre 3.4 behavior. + +Internal handles_eof flag +========================= + +The ``handles_eof flag`` for decoding images has been removed, as there +were no internal users of the flag. Anyone maintaining image decoders +outside of the Pillow source tree should consider using the cleanup +function pointers instead. + +Image.core.stretch removed +========================== + +The stretch function on the core image object has been removed. This +used to be for enlarging the image, but has been aliased to resize +recently. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 8c484af44..e32bf7e40 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -6,6 +6,7 @@ Release Notes .. toctree:: :maxdepth: 2 + 4.0.0 3.4.0 3.3.2 3.3.0 From eea7c63eb3fe8a1dbc4e8b9760e138ac620e45be Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 31 Dec 2016 17:31:39 +0000 Subject: [PATCH 106/632] Py 3.6 --- docs/releasenotes/4.0.0.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/releasenotes/4.0.0.rst b/docs/releasenotes/4.0.0.rst index 609f8127e..4d21a2e54 100644 --- a/docs/releasenotes/4.0.0.rst +++ b/docs/releasenotes/4.0.0.rst @@ -9,6 +9,11 @@ creating binaries, testing, or retaining compatibility with these releases. This release removes some workarounds for those Python releases, so the final working version of Pillow on 2.6 or 3.2 is 3.4.2. +Support added for Python 3.6 +============================ + +Pillow 4.0 supports Python 3.6. + OleFileIO.py ============ From 5269828d3ab49aaf55c4a5205d127e61eb536cbe Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 31 Dec 2016 17:38:35 +0000 Subject: [PATCH 107/632] Test: Relax WMF test condition, fixes #2323 --- Tests/test_file_wmf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_wmf.py b/Tests/test_file_wmf.py index f08ee249f..9f2f893cb 100644 --- a/Tests/test_file_wmf.py +++ b/Tests/test_file_wmf.py @@ -24,7 +24,7 @@ class TestFileWmf(PillowTestCase): # Compare to reference rendering imref = Image.open('Tests/images/drawing_wmf_ref.png') imref.load() - self.assert_image_similar(im, imref, 0.5) + self.assert_image_similar(im, imref, 2.0) if __name__ == '__main__': From f3751a1f3afb956066bfa69accd28e4f58bfbaac Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 31 Dec 2016 18:42:53 +0000 Subject: [PATCH 108/632] Update Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 90c37d78d..5b082c27b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Test: Relax WMF test condition, fixes #2323 + [wiredfool] + - Allow 0 size images, Fixes #2259, Reverts to pre-3.4 behavior. [wiredfool] From 90077b397504c19d1aaf97a9081400130ad8ce46 Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Wed, 5 Oct 2016 22:26:26 +0200 Subject: [PATCH 109/632] Add center and translate option to Image.rotate. --- PIL/Image.py | 57 +++++++++++++++++++++++++++++--------- Tests/test_image_rotate.py | 10 +++++-- 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 03f3973ee..7e02c49bb 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1555,7 +1555,7 @@ class Image(object): return self._new(self.im.resize(size, resample)) - def rotate(self, angle, resample=NEAREST, expand=0): + def rotate(self, angle, resample=NEAREST, expand=0, center=None, translate=None): """ Returns a rotated copy of this image. This method returns a copy of this image, rotated the given number of degrees counter @@ -1569,10 +1569,14 @@ class Image(object): (cubic spline interpolation in a 4x4 environment). If omitted, or if the image has mode "1" or "P", it is set :py:attr:`PIL.Image.NEAREST`. See :ref:`concept-filters`. + :param center: Optional center of rotation (a 2-tuple). Origin is + the upper left corner. Default is the center of the image. + :param translate: An optional final translation. :param expand: Optional expansion flag. If true, expands the output image to make it large enough to hold the entire rotated image. If false or omitted, make the output image the same size as the - input image. + input image. Note that the expand flag assumes rotation around + the center and no translation. :returns: An :py:class:`~PIL.Image.Image` object. """ @@ -1588,32 +1592,59 @@ class Image(object): if angle == 270 and expand: return self.transpose(ROTATE_270) + # Calculate the affine matrix. Note that this is the reverse + # transformation (from destination image to source) because we + # want to interpolate the (discrete) destination pixel from + # the local area around the (floating) source pixel. + + # The matrix we actually want (note that it operates from the right): + # (1, 0, tx) (1, 0, cx) ( cos a, sin a, 0) (1, 0, -cx) + # (0, 1, ty) * (0, 1, cy) * (-sin a, cos a, 0) * (0, 1, -cy) + # (0, 0, 1) (0, 0, 1) ( 0, 0, 1) (0, 0, 1) + + # The reverse matrix is thus: + # (1, 0, cx) ( cos -a, sin -a, 0) (1, 0, -cx) (1, 0, -tx) + # (0, 1, cy) * (-sin -a, cos -a, 0) * (0, 1, -cy) * (0, 1, -ty) + # (0, 0, 1) ( 0, 0, 1) (0, 0, 1) (0, 0, 1) + + # In any case, the final translation may be updated at the end to + # compensate for the expand flag. + + w, h = self.size + + if translate is None: + translate = [0, 0] + if center is None: + center = [w / 2.0, h / 2.0] + angle = - math.radians(angle) matrix = [ round(math.cos(angle), 15), round(math.sin(angle), 15), 0.0, round(-math.sin(angle), 15), round(math.cos(angle), 15), 0.0 - ] - - def transform(x, y, matrix=matrix): + ] + def transform(x, y, matrix): (a, b, c, d, e, f) = matrix return a*x + b*y + c, d*x + e*y + f + matrix[2], matrix[5] = transform(-center[0] - translate[0], -center[1] - translate[1], matrix) + matrix[2] += center[0] + matrix[5] += center[1] - w, h = self.size if expand: # calculate output size xx = [] yy = [] for x, y in ((0, 0), (w, 0), (w, h), (0, h)): - x, y = transform(x, y) + x, y = transform(x, y, matrix) xx.append(x) yy.append(y) - w = int(math.ceil(max(xx)) - math.floor(min(xx))) - h = int(math.ceil(max(yy)) - math.floor(min(yy))) + nw = int(math.ceil(max(xx)) - math.floor(min(xx))) + nh = int(math.ceil(max(yy)) - math.floor(min(yy))) - # adjust center - x, y = transform(w / 2.0, h / 2.0) - matrix[2] = self.size[0] / 2.0 - x - matrix[5] = self.size[1] / 2.0 - y + # We multiply a translation matrix from the right. Because of its + # special form, this is the same as taking the image of the translation vector + # as new translation vector. + matrix[2], matrix[5] = transform(-(nw - w) / 2.0, -(nh - h) / 2.0, matrix) + w, h = nw, nh return self.transform((w, h), AFFINE, matrix, resample) diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index dfe5a0731..f2a3c4fa8 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -5,11 +5,11 @@ from PIL import Image class TestImageRotate(PillowTestCase): def test_rotate(self): - def rotate(im, mode, angle): - out = im.rotate(angle) + def rotate(im, mode, angle, center=None, translate=None): + out = im.rotate(angle, center=center, translate=translate) self.assertEqual(out.mode, mode) self.assertEqual(out.size, im.size) # default rotate clips output - out = im.rotate(angle, expand=1) + out = im.rotate(angle, center=center, translate=translate, expand=1) self.assertEqual(out.mode, mode) if angle % 180 == 0: self.assertEqual(out.size, im.size) @@ -31,6 +31,10 @@ class TestImageRotate(PillowTestCase): im = Image.new('RGB',(0,0)) rotate(im, im.mode, angle) + rotate(im, im.mode, 45, center=(0, 0)) + rotate(im, im.mode, 45, translate=(im.size[0]/2, 0)) + rotate(im, im.mode, 45, center=(0, 0), translate=(im.size[0]/2, 0)) + if __name__ == '__main__': unittest.main() From cc1ba56c2819fd542d6d750554505cfacde00025 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 31 Dec 2016 19:12:39 +0000 Subject: [PATCH 110/632] Refactor tests --- Tests/test_image_rotate.py | 45 +++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index f2a3c4fa8..865544350 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -4,36 +4,41 @@ from PIL import Image class TestImageRotate(PillowTestCase): - def test_rotate(self): - def rotate(im, mode, angle, center=None, translate=None): - out = im.rotate(angle, center=center, translate=translate) - self.assertEqual(out.mode, mode) - self.assertEqual(out.size, im.size) # default rotate clips output - out = im.rotate(angle, center=center, translate=translate, expand=1) - self.assertEqual(out.mode, mode) - if angle % 180 == 0: - self.assertEqual(out.size, im.size) - elif im.size == (0, 0): - self.assertEqual(out.size, im.size) - else: - self.assertNotEqual(out.size, im.size) + def rotate(self, im, mode, angle, center=None, translate=None): + out = im.rotate(angle, center=center, translate=translate) + self.assertEqual(out.mode, mode) + self.assertEqual(out.size, im.size) # default rotate clips output + out = im.rotate(angle, center=center, translate=translate, expand=1) + self.assertEqual(out.mode, mode) + if angle % 180 == 0: + self.assertEqual(out.size, im.size) + elif im.size == (0, 0): + self.assertEqual(out.size, im.size) + else: + self.assertNotEqual(out.size, im.size) - + def test_mode(self): for mode in ("1", "P", "L", "RGB", "I", "F"): im = hopper(mode) - rotate(im, mode, 45) + self.rotate(im, mode, 45) + def test_angle(self): for angle in (0, 90, 180, 270): im = Image.open('Tests/images/test-card.png') - rotate(im, im.mode, angle) + self.rotate(im, im.mode, angle) + def test_zero(self): for angle in (0, 45, 90, 180, 270): im = Image.new('RGB',(0,0)) - rotate(im, im.mode, angle) + self.rotate(im, im.mode, angle) - rotate(im, im.mode, 45, center=(0, 0)) - rotate(im, im.mode, 45, translate=(im.size[0]/2, 0)) - rotate(im, im.mode, 45, center=(0, 0), translate=(im.size[0]/2, 0)) + def test_center(self): + im = hopper() + self.rotate(im, im.mode, 45, center=(0, 0)) + self.rotate(im, im.mode, 45, translate=(im.size[0]/2, 0)) + self.rotate(im, im.mode, 45, center=(0, 0), translate=(im.size[0]/2, 0)) + + if __name__ == '__main__': From 5fda1a803aa0337dd42760c7dd45a37de7c768c9 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 31 Dec 2016 19:30:26 +0000 Subject: [PATCH 111/632] Added resample target test --- Tests/test_image_rotate.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index 865544350..5bf2e15ee 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -32,6 +32,19 @@ class TestImageRotate(PillowTestCase): im = Image.new('RGB',(0,0)) self.rotate(im, im.mode, angle) + def test_resample(self): + # >>> im = Image.open('Tests/images/hopper.ppm') + # >>> im = im.rotate(45, resample=Image.BICUBIC, expand=True) + # >>> im.save('Tests/images/hopper_45.png') + + target = Image.open('Tests/images/hopper_45.png') + for (resample, epsilon) in ((Image.NEAREST, 10), + (Image.BILINEAR, 5), + (Image.BICUBIC, 0)): + im = hopper() + im = im.rotate(45, resample=resample, expand=True) + self.assert_image_similar(im, target, epsilon) + def test_center(self): im = hopper() self.rotate(im, im.mode, 45, center=(0, 0)) From 7228de14911c6a3dc13c568f81b9a642cb1e5c05 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 31 Dec 2016 19:31:02 +0000 Subject: [PATCH 112/632] test image --- Tests/images/hopper_45.png | Bin 0 -> 36094 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/hopper_45.png diff --git a/Tests/images/hopper_45.png b/Tests/images/hopper_45.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e61428321e0dd4c89b2035e94783c7e1414c52 GIT binary patch literal 36094 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 <7jGYaGJR0BH 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 a;r{`iKf@(5hpVXo0000 Date: Sun, 1 Jan 2017 11:09:06 +0000 Subject: [PATCH 113/632] Added output checked tests for rotate with center and translate --- Tests/test_image_rotate.py | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index 5bf2e15ee..9ee01db44 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -33,6 +33,7 @@ class TestImageRotate(PillowTestCase): self.rotate(im, im.mode, angle) def test_resample(self): + # Target image creation, inspected by eye. # >>> im = Image.open('Tests/images/hopper.ppm') # >>> im = im.rotate(45, resample=Image.BICUBIC, expand=True) # >>> im.save('Tests/images/hopper_45.png') @@ -45,6 +46,51 @@ class TestImageRotate(PillowTestCase): im = im.rotate(45, resample=resample, expand=True) self.assert_image_similar(im, target, epsilon) + def test_center_0(self): + im = hopper() + target = Image.open('Tests/images/hopper_45.png') + target_origin = target.size[1]/2 + target = target.crop((0, target_origin, 128, target_origin + 128)) + + im = im.rotate(45, center=(0,0), resample=Image.BICUBIC) + + self.assert_image_similar(im, target, 15) + + def test_center_14(self): + im = hopper() + target = Image.open('Tests/images/hopper_45.png') + target_origin = target.size[1] / 2 - 14 + target = target.crop((6, target_origin, 128 + 6, target_origin + 128)) + + im = im.rotate(45, center=(14,14), resample=Image.BICUBIC) + + self.assert_image_similar(im, target, 10) + + def test_translate(self): + im = hopper() + target = Image.open('Tests/images/hopper_45.png') + target_origin = (target.size[1] / 2 - 64) - 5 + target = target.crop((target_origin, target_origin, + target_origin + 128, target_origin + 128)) + + im = im.rotate(45, translate=(5,5), resample=Image.BICUBIC) + + self.assert_image_similar(im, target, 1) + + def test_fastpath_center(self): + # if the center is -1,-1 and we rotate by 90<=x<=270 the + # resulting image should be black + for angle in (90, 180, 270): + im = hopper().rotate(angle, center=(-1,-1)) + self.assert_image_equal(im, Image.new('RGB', im.size, 'black')) + + def test_fastpath_translate(self): + # if we post-translate by -128 + # resulting image should be black + for angle in (0, 90, 180, 270): + im = hopper().rotate(angle, translate=(-128,-128)) + self.assert_image_equal(im, Image.new('RGB', im.size, 'black')) + def test_center(self): im = hopper() self.rotate(im, im.mode, 45, center=(0, 0)) From f286d8bb3404109cd711b71a0a3fdcfdb0fcdb59 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 1 Jan 2017 11:10:39 +0000 Subject: [PATCH 114/632] Documentation param order to match actual order --- PIL/Image.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 7e02c49bb..b86fae814 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1569,14 +1569,14 @@ class Image(object): (cubic spline interpolation in a 4x4 environment). If omitted, or if the image has mode "1" or "P", it is set :py:attr:`PIL.Image.NEAREST`. See :ref:`concept-filters`. - :param center: Optional center of rotation (a 2-tuple). Origin is - the upper left corner. Default is the center of the image. - :param translate: An optional final translation. :param expand: Optional expansion flag. If true, expands the output image to make it large enough to hold the entire rotated image. If false or omitted, make the output image the same size as the input image. Note that the expand flag assumes rotation around the center and no translation. + :param center: Optional center of rotation (a 2-tuple). Origin is + the upper left corner. Default is the center of the image. + :param translate: An optional post-rotate translation (a 2-tuple). :returns: An :py:class:`~PIL.Image.Image` object. """ From fed4b52171c865ec45916699f5f13ac3a2c3c2cb Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 1 Jan 2017 11:11:10 +0000 Subject: [PATCH 115/632] Disable fastpath when using center or translate --- PIL/Image.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index b86fae814..f49834e5b 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1582,15 +1582,17 @@ class Image(object): angle = angle % 360.0 - # Fast paths regardless of filter - if angle == 0: - return self.copy() - if angle == 180: - return self.transpose(ROTATE_180) - if angle == 90 and expand: - return self.transpose(ROTATE_90) - if angle == 270 and expand: - return self.transpose(ROTATE_270) + # Fast paths regardless of filter, as long as we're not + # translating or changing the center. + if not (center or translate): + if angle == 0: + return self.copy() + if angle == 180: + return self.transpose(ROTATE_180) + if angle == 90 and expand: + return self.transpose(ROTATE_90) + if angle == 270 and expand: + return self.transpose(ROTATE_270) # Calculate the affine matrix. Note that this is the reverse # transformation (from destination image to source) because we From f78f1adf4f0888950f8cd2a8aefe8a3e05f72b15 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 1 Jan 2017 11:28:00 +0000 Subject: [PATCH 116/632] Date Range --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 22a4445f9..5bb70fea4 100644 --- a/LICENSE +++ b/LICENSE @@ -5,7 +5,7 @@ The Python Imaging Library (PIL) is Pillow is the friendly PIL fork. It is - Copyright © 2017 by Alex Clark and contributors + Copyright © 2010-2017 by Alex Clark and contributors Like PIL, Pillow is licensed under the MIT-like open source PIL Software License: From 962752f3fdc5ea1b2ef8f5d6f54a9db8ff6d4874 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 1 Jan 2017 11:28:19 +0000 Subject: [PATCH 117/632] Date Range --- docs/COPYING | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/COPYING b/docs/COPYING index ee8a7f807..d958dff46 100644 --- a/docs/COPYING +++ b/docs/COPYING @@ -5,7 +5,7 @@ The Python Imaging Library (PIL) is Pillow is the friendly PIL fork. It is - Copyright © 2017 by Alex Clark and contributors + Copyright © 2010-2017 by Alex Clark and contributors Like PIL, Pillow is licensed under the MIT-like open source PIL Software License: From 8dd19e6c3391557fddf00efed83dba87c144b229 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 1 Jan 2017 12:04:59 +0000 Subject: [PATCH 118/632] refactor out postprocessing hack to load_end in PcdImageFile --- PIL/ImageFile.py | 6 ------ PIL/PcdImagePlugin.py | 8 ++++++++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 52c2ed34c..a56795751 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -243,12 +243,6 @@ class ImageFile(Image.Image): # still raised if decoder fails to return anything raise_ioerror(err_code) - # post processing - if hasattr(self, "tile_post_rotate"): - # FIXME: This is a hack to handle rotated PCD's - self.im = self.im.rotate(self.tile_post_rotate) - self.size = self.im.size - self.load_end() return Image.Image.load(self) diff --git a/PIL/PcdImagePlugin.py b/PIL/PcdImagePlugin.py index b53635a99..0cf348e74 100644 --- a/PIL/PcdImagePlugin.py +++ b/PIL/PcdImagePlugin.py @@ -42,6 +42,7 @@ class PcdImageFile(ImageFile.ImageFile): raise SyntaxError("not a PCD file") orientation = i8(s[1538]) & 3 + self.tile_post_rotate = None if orientation == 1: self.tile_post_rotate = 90 # hack elif orientation == 3: @@ -51,6 +52,13 @@ 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 load_end(self): + if self.tile_post_rotate: + # Handle rotated PCDs + self.im = self.im.rotate(self.tile_post_rotate) + self.size = self.im.size + + # # registry From 599ec6bcd6d8dbfbca0606bc0c9f0b2e8ce9526e Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 1 Jan 2017 12:59:48 +0000 Subject: [PATCH 119/632] Removed #hack --- PIL/PcdImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/PcdImagePlugin.py b/PIL/PcdImagePlugin.py index 0cf348e74..24186bcfc 100644 --- a/PIL/PcdImagePlugin.py +++ b/PIL/PcdImagePlugin.py @@ -44,7 +44,7 @@ class PcdImageFile(ImageFile.ImageFile): orientation = i8(s[1538]) & 3 self.tile_post_rotate = None if orientation == 1: - self.tile_post_rotate = 90 # hack + self.tile_post_rotate = 90 elif orientation == 3: self.tile_post_rotate = -90 From 1e22c6f1312822eafaeace70e1eac49ccc1f8c44 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 1 Jan 2017 19:07:50 +0000 Subject: [PATCH 120/632] Update Changes.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 5b082c27b..bfe27fa78 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 3.5.0 (unreleased) ------------------ +- Refactor out postprocessing hack to load_end in PcdImageFile + [wiredfool] + +- Add center and translate option to Image.rotate. #2328 + [lambdafu] + - Test: Relax WMF test condition, fixes #2323 [wiredfool] From a021d4978dd96371557f21c7b68feff2056a6e9b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 1 Jan 2017 20:20:06 +0000 Subject: [PATCH 121/632] 4.0.0 version bump --- CHANGES.rst | 2 +- PIL/__init__.py | 2 +- _imaging.c | 2 +- appveyor.yml | 2 +- setup.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index bfe27fa78..094e39f87 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,7 +1,7 @@ Changelog (Pillow) ================== -3.5.0 (unreleased) +4.0.0 (2017-01-01) ------------------ - Refactor out postprocessing hack to load_end in PcdImageFile diff --git a/PIL/__init__.py b/PIL/__init__.py index be672e825..36c193cfc 100644 --- a/PIL/__init__.py +++ b/PIL/__init__.py @@ -12,7 +12,7 @@ # ;-) VERSION = '1.1.7' # PIL version -PILLOW_VERSION = '3.5.0.dev0' # Pillow +PILLOW_VERSION = '4.0.0' # Pillow __version__ = PILLOW_VERSION diff --git a/_imaging.c b/_imaging.c index 83e159c56..c852f6d43 100644 --- a/_imaging.c +++ b/_imaging.c @@ -71,7 +71,7 @@ * See the README file for information on usage and redistribution. */ -#define PILLOW_VERSION "3.5.0.dev0" +#define PILLOW_VERSION "4.0.0" #include "Python.h" diff --git a/appveyor.yml b/appveyor.yml index 9ff661224..e03afa4c0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 3.5.pre.{build} +version: 4.0.0.{build} clone_folder: c:\pillow init: - ECHO %PYTHON% diff --git a/setup.py b/setup.py index c35d4357c..65760926a 100755 --- a/setup.py +++ b/setup.py @@ -106,7 +106,7 @@ except (ImportError, OSError): _tkinter = None NAME = 'Pillow' -PILLOW_VERSION = '3.5.0.dev0' +PILLOW_VERSION = '4.4.0' JPEG_ROOT = None JPEG2K_ROOT = None ZLIB_ROOT = None From 49fc3f175f44ad11440511a18075bb12b4f1f3b2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 2 Jan 2017 14:32:08 +1100 Subject: [PATCH 122/632] Updated freetype to 2.7.1 --- winbuild/config.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/winbuild/config.py b/winbuild/config.py index 3cbba9d97..e6b8ac76b 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -37,10 +37,10 @@ libs = { 'dir': 'tiff-4.0.6', }, 'freetype': { - 'url': 'http://download.savannah.gnu.org/releases/freetype/freetype-2.7.tar.gz', - 'filename': PILLOW_DEPENDS_DIR + 'freetype-2.7.tar.gz', - 'hash': 'md5:337139e5c7c5bd645fe130608e0fa8b5', - 'dir': 'freetype-2.7', + 'url': 'http://download.savannah.gnu.org/releases/freetype/freetype-2.7.1.tar.gz', + 'filename': PILLOW_DEPENDS_DIR + 'freetype-2.7.1.tar.gz', + 'hash': 'md5:78701bee8d249578d83bb9a2f3aa3616', + 'dir': 'freetype-2.7.1', }, 'lcms': { 'url': SF_MIRROR+'/project/lcms/lcms/2.7/lcms2-2.7.zip', From 3f6db91ccc917e803227d245e38871169f08350f Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 2 Jan 2017 03:45:39 -0800 Subject: [PATCH 123/632] Fixed typo in version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 65760926a..825d059b8 100755 --- a/setup.py +++ b/setup.py @@ -106,7 +106,7 @@ except (ImportError, OSError): _tkinter = None NAME = 'Pillow' -PILLOW_VERSION = '4.4.0' +PILLOW_VERSION = '4.0.0' JPEG_ROOT = None JPEG2K_ROOT = None ZLIB_ROOT = None From 296fb5fe1da4e44a473862b8ba46669a98e5ec15 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 2 Jan 2017 04:06:48 -0800 Subject: [PATCH 124/632] 4.1.0.dev0 version bump --- PIL/__init__.py | 2 +- _imaging.c | 2 +- appveyor.yml | 2 +- setup.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/PIL/__init__.py b/PIL/__init__.py index 36c193cfc..7a32533d9 100644 --- a/PIL/__init__.py +++ b/PIL/__init__.py @@ -12,7 +12,7 @@ # ;-) VERSION = '1.1.7' # PIL version -PILLOW_VERSION = '4.0.0' # Pillow +PILLOW_VERSION = '4.1.0.dev0' # Pillow __version__ = PILLOW_VERSION diff --git a/_imaging.c b/_imaging.c index c852f6d43..aa2e04778 100644 --- a/_imaging.c +++ b/_imaging.c @@ -71,7 +71,7 @@ * See the README file for information on usage and redistribution. */ -#define PILLOW_VERSION "4.0.0" +#define PILLOW_VERSION "4.1.0.dev0" #include "Python.h" diff --git a/appveyor.yml b/appveyor.yml index e03afa4c0..deb6d3b1a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 4.0.0.{build} +version: 4.1.pre.{build} clone_folder: c:\pillow init: - ECHO %PYTHON% diff --git a/setup.py b/setup.py index 825d059b8..b0209a399 100755 --- a/setup.py +++ b/setup.py @@ -106,7 +106,7 @@ except (ImportError, OSError): _tkinter = None NAME = 'Pillow' -PILLOW_VERSION = '4.0.0' +PILLOW_VERSION = '4.1.0.dev0' JPEG_ROOT = None JPEG2K_ROOT = None ZLIB_ROOT = None From c5265e2100f283b3ee884dce4157ed67aaed022c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 3 Jan 2017 13:30:09 +1100 Subject: [PATCH 125/632] Added test for crop operation with no argument --- Tests/test_image_crop.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Tests/test_image_crop.py b/Tests/test_image_crop.py index c887ab0c1..be50b46b7 100644 --- a/Tests/test_image_crop.py +++ b/Tests/test_image_crop.py @@ -7,9 +7,12 @@ class TestImageCrop(PillowTestCase): def test_crop(self): def crop(mode): - out = hopper(mode).crop((50, 50, 100, 100)) - self.assertEqual(out.mode, mode) - self.assertEqual(out.size, (50, 50)) + im = hopper(mode) + self.assert_image_equal(im.crop(), im) + + cropped = im.crop((50, 50, 100, 100)) + self.assertEqual(cropped.mode, mode) + self.assertEqual(cropped.size, (50, 50)) for mode in "1", "P", "L", "RGB", "I", "F": crop(mode) @@ -70,23 +73,23 @@ class TestImageCrop(PillowTestCase): #Image.crop crashes prepatch with an access violation #apparently a use after free on windows, see #https://github.com/python-pillow/Pillow/issues/1077 - + test_img = 'Tests/images/bmp/g/pal8-0.bmp' extents = (1,1,10,10) #works prepatch img = Image.open(test_img) img2 = img.crop(extents) img2.load() - + # fail prepatch img = Image.open(test_img) img = img.crop(extents) img.load() def test_crop_zero(self): - + im = Image.new('RGB', (0, 0), 'white') - + cropped = im.crop((0, 0, 0, 0)) self.assertEqual(cropped.size, (0, 0)) @@ -95,7 +98,7 @@ class TestImageCrop(PillowTestCase): self.assertEqual(cropped.getdata()[0], (0, 0, 0)) im = Image.new('RGB', (0, 0)) - + cropped = im.crop((10, 10, 20, 20)) self.assertEqual(cropped.size, (10, 10)) self.assertEqual(cropped.getdata()[2], (0, 0, 0)) From 1a1818f1eb19656b917d47d87c847aabdcb0a379 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 3 Jan 2017 09:41:29 +0200 Subject: [PATCH 126/632] [CI skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 094e39f87..b91e961e7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,12 @@ Changelog (Pillow) ================== +4.1.0 (unreleased) +------------------ + +- Add test for crop operation with no argument #2333 + [radarhere] + 4.0.0 (2017-01-01) ------------------ From 2eba610b298bd7673d34ae072f58e06d3453790a Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 3 Jan 2017 15:13:45 +0200 Subject: [PATCH 127/632] Pillow 3.5.0 became 4.0.0 And some caps consistency [CI skip] --- docs/installation.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 5eb12c69c..320c7e4ad 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -15,9 +15,9 @@ Notes .. note:: Pillow < 2.0.0 supports Python versions 2.4, 2.5, 2.6, 2.7. -.. note:: Pillow >= 2.0.0 < 3.5.0 supports Python versions 2.6, 2.7, 3.2, 3.3, 3.4, 3.5 +.. note:: Pillow >= 2.0.0 < 4.0.0 supports Python versions 2.6, 2.7, 3.2, 3.3, 3.4, 3.5 -.. note:: Pillow >= 3.5.0 supports Python versions 2.7, 3.3, 3.4, 3.5, 3.6 +.. note:: Pillow >= 4.0.0 supports Python versions 2.7, 3.3, 3.4, 3.5, 3.6 Basic Installation ------------------ @@ -193,7 +193,7 @@ build with newly installed external libraries. Build Options ^^^^^^^^^^^^^ -* Environment Variable: ``MAX_CONCURRENCY=n``. By default, Pillow will +* Environment variable: ``MAX_CONCURRENCY=n``. By default, Pillow will use multiprocessing to build the extension on all available CPUs, but not more than 4. Setting ``MAX_CONCURRENCY`` to 1 will disable parallel building. @@ -223,7 +223,7 @@ Build Options stdout. -Sample Usage:: +Sample usage:: $ MAX_CONCURRENCY=1 python setup.py build_ext --enable-[feature] install From 60bb13a89a8159ce52642a8f3f7448715f63e30d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 4 Jan 2017 11:44:36 +1100 Subject: [PATCH 128/632] Updated zlib to 1.2.10 --- winbuild/config.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/winbuild/config.py b/winbuild/config.py index 3cbba9d97..237b3a8b2 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -19,10 +19,10 @@ libs = { # 'version': '2.0' # }, 'zlib': { - 'url': 'http://zlib.net/zlib128.zip', - 'filename': PILLOW_DEPENDS_DIR + 'zlib128.zip', - 'hash': 'md5:126f8676442ffbd97884eb4d6f32afb4', - 'dir': 'zlib-1.2.8', + 'url': 'http://zlib.net/zlib1210.zip', + 'filename': PILLOW_DEPENDS_DIR + 'zlib1210.zip', + 'hash': 'md5:5327bdff96926cf9c479008bae983bc0', + 'dir': 'zlib-1.2.10', }, 'jpeg': { 'url': 'http://www.ijg.org/files/jpegsr9b.zip', From 3ac9ab6fa2cc3022369f4e260783f4d01eaad81d Mon Sep 17 00:00:00 2001 From: Jerome Leclanche Date: Fri, 6 Jan 2017 06:19:13 +0200 Subject: [PATCH 129/632] Remove an unnecessary import --- PIL/JpegImagePlugin.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 716cd7274..3976ff55a 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -38,7 +38,6 @@ import array import struct import io import warnings -from struct import unpack_from from PIL import Image, ImageFile, TiffImagePlugin, _binary from PIL.JpegPresets import presets from PIL._util import isStringType @@ -493,7 +492,7 @@ def _getmp(self): try: rawmpentries = mp[0xB002] for entrynum in range(0, quant): - unpackedentry = unpack_from( + unpackedentry = struct.unpack_from( '{}LLLHH'.format(endianness), rawmpentries, entrynum * 16) labels = ('Attribute', 'Size', 'DataOffset', 'EntryNo1', 'EntryNo2') From 1fb00976f5ac7f07930f8c701784f0aadf47cb8d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 7 Jan 2017 10:14:49 +1100 Subject: [PATCH 130/632] Removed TODO resolved in #1121 --- PIL/_binary.py | 1 - 1 file changed, 1 deletion(-) diff --git a/PIL/_binary.py b/PIL/_binary.py index 9760b86cd..17ee67b11 100644 --- a/PIL/_binary.py +++ b/PIL/_binary.py @@ -28,7 +28,6 @@ else: # Input, le = little endian, be = big endian -# TODO: replace with more readable struct.unpack equivalent def i16le(c, o=0): """ Converts a 2-bytes (16 bits) string to an unsigned integer. From 67c1258cfcb9dc23b000c0fe572da59f0cf76217 Mon Sep 17 00:00:00 2001 From: Luis G Date: Sun, 19 Jun 2016 21:39:31 -0300 Subject: [PATCH 131/632] Expose registered file extensions This adds a new method in Image (registered_extensions) that exposes the internal EXTENSION dictionary to consumers of the library --- PIL/Image.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/PIL/Image.py b/PIL/Image.py index f49834e5b..e368ef187 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -2512,6 +2512,16 @@ def register_extension(id, extension): EXTENSION[extension.lower()] = id.upper() +def registered_extensions(): + """ + Returns a dictionary containing all file extensions belonging + to registered plugins + """ + if not bool(EXTENSION): + init() + return EXTENSION + + # -------------------------------------------------------------------- # Simple display support. User code may override this. From dad59715618926a405eff12c828b2c704053ff18 Mon Sep 17 00:00:00 2001 From: Luis G Date: Mon, 20 Jun 2016 12:36:26 -0300 Subject: [PATCH 132/632] Add unit tests Add unit tests for registered_extensions --- Tests/test_image.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Tests/test_image.py b/Tests/test_image.py index f1457a85b..85d1f3f5c 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -196,6 +196,24 @@ class TestImage(PillowTestCase): img_colors = sorted(img.getcolors()) self.assertEqual(img_colors, expected_colors) + def test_registered_extensions_uninitialized(self): + # Act + ext = Image.registered_extensions() + + # Assert + self.assertEqual(bool(ext), True) + + def test_registered_extensions(self): + # Arrange + # Open an image to trigger plugin registration + Image.open('Tests/images/rgb.jpg') + + # Act + ext = Image.registered_extensions() + + # Assert + self.assertEqual(bool(ext), True) + def test_effect_mandelbrot(self): # Arrange size = (512, 512) From 2a93cdb698fea78a3fec9b3bace5244178db1360 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 7 Jan 2017 11:35:09 +1100 Subject: [PATCH 133/632] Simplified assertEqual checks to assertTrue --- Tests/test_image.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 85d1f3f5c..a02596b20 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -201,7 +201,7 @@ class TestImage(PillowTestCase): ext = Image.registered_extensions() # Assert - self.assertEqual(bool(ext), True) + self.assertTrue(bool(ext)) def test_registered_extensions(self): # Arrange @@ -212,7 +212,7 @@ class TestImage(PillowTestCase): ext = Image.registered_extensions() # Assert - self.assertEqual(bool(ext), True) + self.assertTrue(bool(ext)) def test_effect_mandelbrot(self): # Arrange From 89742225bfade3df3f7cc2d755916c75ff7aad3c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 7 Jan 2017 13:20:16 +1100 Subject: [PATCH 134/632] Fixed test coverage --- Tests/test_image.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index a02596b20..70bc63877 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -197,11 +197,20 @@ class TestImage(PillowTestCase): self.assertEqual(img_colors, expected_colors) def test_registered_extensions_uninitialized(self): + # Arrange + Image._initialized = 0 + extension = Image.EXTENSION + Image.EXTENSION = {} + # Act - ext = Image.registered_extensions() + Image.registered_extensions() # Assert - self.assertTrue(bool(ext)) + self.assertEqual(Image._initialized, 2) + + # Restore the original state and assert + Image.EXTENSION = extension + self.assertTrue(Image.EXTENSION) def test_registered_extensions(self): # Arrange @@ -209,10 +218,12 @@ class TestImage(PillowTestCase): Image.open('Tests/images/rgb.jpg') # Act - ext = Image.registered_extensions() + extensions = Image.registered_extensions() # Assert - self.assertTrue(bool(ext)) + self.assertTrue(bool(extensions)) + for ext in ['.cur', '.icns', '.tif', '.tiff']: + self.assertIn(ext, extensions) def test_effect_mandelbrot(self): # Arrange From c1905d3e26a88d31d03dd27d1aa33658d25e21e0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 7 Jan 2017 18:45:36 +1100 Subject: [PATCH 135/632] Added macOS Sierra tested Pillow version [ci skip] --- docs/installation.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/installation.rst b/docs/installation.rst index 320c7e4ad..eafefa976 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -338,6 +338,8 @@ current versions of Linux, macOS, and Windows. +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ |**Operating system** |**Supported**|**Tested Python versions** |**Latest tested Pillow version**|**Tested processors** | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ +| macOS 10.12 Sierra |Yes | 3.4,3.5,3.6 | 4.0.0 |x86-64 | ++----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ | Mac OS X 10.11 El Capitan |Yes | 2.7,3.3,3.4,3.5 | 3.4.1 |x86-64 | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ | Mac OS X 10.10 Yosemite |Yes | 2.7,3.3,3.4 | 3.0.0 |x86-64 | From da4ee8f90612568fcd55187fbf9b6a7cc367e200 Mon Sep 17 00:00:00 2001 From: David McInnis Date: Sat, 7 Jan 2017 04:47:13 -0800 Subject: [PATCH 136/632] added new version numbers for arch linux --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index eafefa976..42a1e28fe 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -369,7 +369,7 @@ current versions of Linux, macOS, and Windows. +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ | Gentoo Linux |Yes | 2.7,3.2 | 2.1.0 |x86-64 | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Arch Linux |Yes | 2.7,3.5 | 3.4.1 |x86,x86-64 | +| Arch Linux |Yes | 2.7,3.6 | 4.0.0 |x86,x86-64 | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ | FreeBSD 10.2 |Yes | 2.7,3.4 | 3.1.0 |x86-64 | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ From 071a5933ef5c9ed0261c7de37baa471ee7dac6da Mon Sep 17 00:00:00 2001 From: Alexander Karpinsky Date: Sun, 8 Jan 2017 22:32:57 +0300 Subject: [PATCH 137/632] Update concepts.rst --- docs/handbook/concepts.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/concepts.rst b/docs/handbook/concepts.rst index 8c5de15d6..3023e1e67 100644 --- a/docs/handbook/concepts.rst +++ b/docs/handbook/concepts.rst @@ -93,7 +93,7 @@ Filters ------- For geometry operations that may map multiple input pixels to a single output -pixel, the Python Imaging Library provides four different resampling *filters*. +pixel, the Python Imaging Library provides different resampling *filters*. ``NEAREST`` Pick one nearest pixel from the input image. Ignore all other input pixels. From 3bdd15e55e58871181b16e5ede268a1f14e93178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarkko=20P=C3=B6yry?= Date: Tue, 10 Jan 2017 23:20:05 +0200 Subject: [PATCH 138/632] Make mode descriptor cache initialization thread-safe. Initializing mode descriptor cache in-place is racy and may cause a thread to observe a partially constructed cache if another thread is pre-empted while it's still constructing the cache. In this change, the mode descriptor cache is constructed into a local variable instead and then set globally in a single atomic operation, preventing any possibility of observing an incomplete cache. --- PIL/ImageMode.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/PIL/ImageMode.py b/PIL/ImageMode.py index f78a8df90..93dbeab41 100644 --- a/PIL/ImageMode.py +++ b/PIL/ImageMode.py @@ -14,7 +14,7 @@ # # mode descriptor cache -_modes = {} +_modes = None class ModeDescriptor(object): @@ -32,19 +32,23 @@ class ModeDescriptor(object): def getmode(mode): """Gets a mode descriptor for the given mode.""" + global _modes if not _modes: # initialize mode cache from PIL import Image + modes = {} # core modes for m, (basemode, basetype, bands) in Image._MODEINFO.items(): - _modes[m] = ModeDescriptor(m, bands, basemode, basetype) + modes[m] = ModeDescriptor(m, bands, basemode, basetype) # extra experimental modes - _modes["RGBa"] = ModeDescriptor("RGBa", ("R", "G", "B", "a"), "RGB", "L") - _modes["LA"] = ModeDescriptor("LA", ("L", "A"), "L", "L") - _modes["La"] = ModeDescriptor("La", ("L", "a"), "L", "L") - _modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L") + modes["RGBa"] = ModeDescriptor("RGBa", ("R", "G", "B", "a"), "RGB", "L") + modes["LA"] = ModeDescriptor("LA", ("L", "A"), "L", "L") + modes["La"] = ModeDescriptor("La", ("L", "a"), "L", "L") + modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L") # mapping modes - _modes["I;16"] = ModeDescriptor("I;16", "I", "L", "L") - _modes["I;16L"] = ModeDescriptor("I;16L", "I", "L", "L") - _modes["I;16B"] = ModeDescriptor("I;16B", "I", "L", "L") + modes["I;16"] = ModeDescriptor("I;16", "I", "L", "L") + modes["I;16L"] = ModeDescriptor("I;16L", "I", "L", "L") + modes["I;16B"] = ModeDescriptor("I;16B", "I", "L", "L") + # set global mode cache atomically + _modes = modes return _modes[mode] From bbb0ab9101165997df41f64c79b3a75d6f852136 Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 12 Jan 2017 21:28:24 +0200 Subject: [PATCH 139/632] Fix invalid string escapes --- winbuild/build.py | 2 +- winbuild/build_dep.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/winbuild/build.py b/winbuild/build.py index 487977adb..1fbfa14a6 100644 --- a/winbuild/build.py +++ b/winbuild/build.py @@ -16,7 +16,7 @@ def setup_vms(): for arch in ('', X64_EXT): ret.append("virtualenv -p c:/Python%s%s/python.exe --clear %s%s%s" % (py, arch, VIRT_BASE, py, arch)) - ret.append("%s%s%s\Scripts\pip.exe install nose" % + ret.append(r"%s%s%s\Scripts\pip.exe install nose" % (VIRT_BASE, py, arch)) return "\n".join(ret) diff --git a/winbuild/build_dep.py b/winbuild/build_dep.py index 4c397236b..fb4d55d8c 100644 --- a/winbuild/build_dep.py +++ b/winbuild/build_dep.py @@ -13,6 +13,7 @@ def _relpath(*args): def _relbuild(*args): return _relpath('build', *args) + build_dir = _relpath('build') inc_dir = _relpath('depends') @@ -108,7 +109,7 @@ set MSBUILD=C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe set CMAKE="cmake.exe" set INCLIB=%~dp0\depends set BUILD=%~dp0\build -""" + "\n".join('set %s=%%BUILD%%\%s' % (k.upper(), v['dir']) +""" + "\n".join(r'set %s=%%BUILD%%\%s' % (k.upper(), v['dir']) for (k, v) in libs.items() if v['dir']) From c5cd32dd4af58492910e1af1b2d7b7653a3907da Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 14 Jan 2017 19:54:14 +1100 Subject: [PATCH 140/632] Changed from pngquant to libimagequant --- depends/install_imagequant.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index 21386557b..4a8c0e6be 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,14 +1,14 @@ #!/bin/bash # install libimagequant -archive=pngquant-2.8.2 +archive=libimagequant-2.8.2 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz pushd $archive -make -C lib shared -sudo cp lib/libimagequant.so* /usr/lib/ -sudo cp lib/libimagequant.h /usr/include/ +make shared +sudo cp libimagequant.so* /usr/lib/ +sudo cp libimagequant.h /usr/include/ popd From 8aec14c405db16d275a61269055b49fa518e0751 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 16 Jan 2017 11:43:30 +0000 Subject: [PATCH 141/632] Update Changes.rst [ci skip] --- CHANGES.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index b91e961e7..128d7ca3e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,21 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Expose registered file extensions in Image #2343 + [iggomez, radarhere] + +- Make mode descriptor cache initialization thread-safe. #2351 + [gunjambi] + +- Updated windows test dependencies: Freetype 2.7.1, zlib 1.2.10. #2331, #2332 + [radarhere] + +- Followed upstream pngquant packaging reorg to libimagquant #2354 + [radarhere] + +- Fix invalid string escapes #2352 + [hugovk] + - Add test for crop operation with no argument #2333 [radarhere] From a3d81e0677713ae9e0bac594679e13277d74ec4d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 17 Jan 2017 19:36:04 +1100 Subject: [PATCH 142/632] Updated zlib to 1.2.11 --- winbuild/config.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/winbuild/config.py b/winbuild/config.py index efe36810b..6e927d2fb 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -19,10 +19,10 @@ libs = { # 'version': '2.0' # }, 'zlib': { - 'url': 'http://zlib.net/zlib1210.zip', - 'filename': PILLOW_DEPENDS_DIR + 'zlib1210.zip', - 'hash': 'md5:5327bdff96926cf9c479008bae983bc0', - 'dir': 'zlib-1.2.10', + 'url': 'http://zlib.net/zlib1211.zip', + 'filename': PILLOW_DEPENDS_DIR + 'zlib1211.zip', + 'hash': 'md5:16b41357b2cd81bca5e1947238e64465', + 'dir': 'zlib-1.2.11', }, 'jpeg': { 'url': 'http://www.ijg.org/files/jpegsr9b.zip', From 58b5c9187db8bb1c0cf49a35d8996a2179ac2e4c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 18 Jan 2017 00:22:18 +1100 Subject: [PATCH 143/632] Replaced absolute PIL imports with relative imports (#2349) --- PIL/BdfFontFile.py | 3 +-- PIL/BmpImagePlugin.py | 11 +++------ PIL/BufrStubImagePlugin.py | 2 +- PIL/CurImagePlugin.py | 7 ++---- PIL/DcxImagePlugin.py | 7 +++--- PIL/DdsImagePlugin.py | 2 +- PIL/EpsImagePlugin.py | 6 ++--- PIL/FitsStubImagePlugin.py | 2 +- PIL/FliImagePlugin.py | 8 ++----- PIL/FontFile.py | 2 +- PIL/FpxImagePlugin.py | 6 ++--- PIL/FtexImagePlugin.py | 2 +- PIL/GbrImagePlugin.py | 5 ++--- PIL/GdImageFile.py | 7 +++--- PIL/GifImagePlugin.py | 10 +++------ PIL/GimpGradientFile.py | 2 +- PIL/GimpPaletteFile.py | 2 +- PIL/GribStubImagePlugin.py | 2 +- PIL/Hdf5StubImagePlugin.py | 2 +- PIL/IcnsImagePlugin.py | 5 ++--- PIL/IcoImagePlugin.py | 7 ++---- PIL/ImImagePlugin.py | 4 ++-- PIL/Image.py | 46 ++++++++++++++++++-------------------- PIL/ImageChops.py | 2 +- PIL/ImageColor.py | 2 +- PIL/ImageDraw.py | 10 ++++----- PIL/ImageDraw2.py | 2 +- PIL/ImageEnhance.py | 2 +- PIL/ImageFile.py | 4 ++-- PIL/ImageFont.py | 6 ++--- PIL/ImageGrab.py | 4 ++-- PIL/ImageMath.py | 3 +-- PIL/ImageMode.py | 3 ++- PIL/ImageMorph.py | 3 +-- PIL/ImageOps.py | 6 ++--- PIL/ImagePalette.py | 5 +---- PIL/ImagePath.py | 2 +- PIL/ImageQt.py | 4 ++-- PIL/ImageTk.py | 4 ++-- PIL/ImageTransform.py | 2 +- PIL/ImageWin.py | 2 +- PIL/ImtImagePlugin.py | 2 +- PIL/IptcImagePlugin.py | 10 +++------ PIL/Jpeg2KImagePlugin.py | 2 +- PIL/JpegImagePlugin.py | 12 ++++------ PIL/McIdasImagePlugin.py | 2 +- PIL/MicImagePlugin.py | 2 +- PIL/MpegImagePlugin.py | 4 ++-- PIL/MpoImagePlugin.py | 2 +- PIL/MspImagePlugin.py | 7 ++---- PIL/PSDraw.py | 2 +- PIL/PaletteFile.py | 2 +- PIL/PalmImagePlugin.py | 6 ++--- PIL/PcdImagePlugin.py | 5 ++--- PIL/PcfFontFile.py | 11 ++------- PIL/PcxImagePlugin.py | 9 ++------ PIL/PdfImagePlugin.py | 4 ++-- PIL/PixarImagePlugin.py | 6 ++--- PIL/PngImagePlugin.py | 11 ++------- PIL/PpmImagePlugin.py | 2 +- PIL/PsdImagePlugin.py | 10 ++------- PIL/SgiImagePlugin.py | 9 +++----- PIL/SunImagePlugin.py | 21 +++++++++-------- PIL/TarIO.py | 2 +- PIL/TgaImagePlugin.py | 10 ++------- PIL/TiffImagePlugin.py | 13 ++++------- PIL/WalImageFile.py | 5 ++--- PIL/WebPImagePlugin.py | 6 ++--- PIL/WmfImagePlugin.py | 12 ++++------ PIL/XVThumbImagePlugin.py | 5 ++--- PIL/XbmImagePlugin.py | 2 +- PIL/XpmImagePlugin.py | 4 ++-- PIL/features.py | 2 +- 73 files changed, 160 insertions(+), 258 deletions(-) diff --git a/PIL/BdfFontFile.py b/PIL/BdfFontFile.py index b02c44fd2..c8bc60461 100644 --- a/PIL/BdfFontFile.py +++ b/PIL/BdfFontFile.py @@ -19,8 +19,7 @@ from __future__ import print_function -from PIL import Image -from PIL import FontFile +from . import Image, FontFile # -------------------------------------------------------------------- diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index b04981af9..1afe303ab 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -24,18 +24,13 @@ # -from PIL import Image, ImageFile, ImagePalette, _binary +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, i32le as i32, \ + o8, o16le as o16, o32le as o32 import math __version__ = "0.7" -i8 = _binary.i8 -i16 = _binary.i16le -i32 = _binary.i32le -o8 = _binary.o8 -o16 = _binary.o16le -o32 = _binary.o32le - # # -------------------------------------------------------------------- # Read BMP file diff --git a/PIL/BufrStubImagePlugin.py b/PIL/BufrStubImagePlugin.py index 5184546e4..4c5da942f 100644 --- a/PIL/BufrStubImagePlugin.py +++ b/PIL/BufrStubImagePlugin.py @@ -9,7 +9,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image, ImageFile +from . import Image, ImageFile _handler = None diff --git a/PIL/CurImagePlugin.py b/PIL/CurImagePlugin.py index 3a9a10e01..e4257cd5a 100644 --- a/PIL/CurImagePlugin.py +++ b/PIL/CurImagePlugin.py @@ -18,17 +18,14 @@ from __future__ import print_function -from PIL import Image, BmpImagePlugin, _binary +from . import Image, BmpImagePlugin +from ._binary import i8, i16le as i16, i32le as i32 __version__ = "0.1" # # -------------------------------------------------------------------- -i8 = _binary.i8 -i16 = _binary.i16le -i32 = _binary.i32le - def _accept(prefix): return prefix[:4] == b"\0\0\2\0" diff --git a/PIL/DcxImagePlugin.py b/PIL/DcxImagePlugin.py index f9034d15c..5663dff5f 100644 --- a/PIL/DcxImagePlugin.py +++ b/PIL/DcxImagePlugin.py @@ -21,15 +21,14 @@ # See the README file for information on usage and redistribution. # -from PIL import Image, _binary -from PIL.PcxImagePlugin import PcxImageFile +from . import Image +from ._binary import i32le as i32 +from .PcxImagePlugin import PcxImageFile __version__ = "0.2" MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? -i32 = _binary.i32le - def _accept(prefix): return len(prefix) >= 4 and i32(prefix) == MAGIC diff --git a/PIL/DdsImagePlugin.py b/PIL/DdsImagePlugin.py index b6228c2ad..9508e61c8 100644 --- a/PIL/DdsImagePlugin.py +++ b/PIL/DdsImagePlugin.py @@ -12,7 +12,7 @@ Full text of the CC0 license: import struct from io import BytesIO -from PIL import Image, ImageFile +from . import Image, ImageFile # Magic ("DDS ") diff --git a/PIL/EpsImagePlugin.py b/PIL/EpsImagePlugin.py index 77a7e7e1c..8dd3e6857 100644 --- a/PIL/EpsImagePlugin.py +++ b/PIL/EpsImagePlugin.py @@ -23,16 +23,14 @@ import re import io import sys -from PIL import Image, ImageFile, _binary +from . import Image, ImageFile +from ._binary import i32le as i32, o32le as o32 __version__ = "0.5" # # -------------------------------------------------------------------- -i32 = _binary.i32le -o32 = _binary.o32le - split = re.compile(r"^%%([^:]*):[ \t]*(.*)[ \t]*$") field = re.compile(r"^%[%!\w]([^:]*)[ \t]*$") diff --git a/PIL/FitsStubImagePlugin.py b/PIL/FitsStubImagePlugin.py index b6ea0e37d..e3a7eb4a6 100644 --- a/PIL/FitsStubImagePlugin.py +++ b/PIL/FitsStubImagePlugin.py @@ -9,7 +9,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image, ImageFile +from . import Image, ImageFile _handler = None diff --git a/PIL/FliImagePlugin.py b/PIL/FliImagePlugin.py index a07dc29b0..429b5e26f 100644 --- a/PIL/FliImagePlugin.py +++ b/PIL/FliImagePlugin.py @@ -16,15 +16,11 @@ # -from PIL import Image, ImageFile, ImagePalette, _binary +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, i32le as i32, o8 __version__ = "0.2" -i8 = _binary.i8 -i16 = _binary.i16le -i32 = _binary.i32le -o8 = _binary.o8 - # # decoder diff --git a/PIL/FontFile.py b/PIL/FontFile.py index 807984a8c..46e49bc4e 100644 --- a/PIL/FontFile.py +++ b/PIL/FontFile.py @@ -17,7 +17,7 @@ from __future__ import print_function import os -from PIL import Image, _binary +from . import Image, _binary WIDTH = 800 diff --git a/PIL/FpxImagePlugin.py b/PIL/FpxImagePlugin.py index 08e7f0da1..23f15f459 100644 --- a/PIL/FpxImagePlugin.py +++ b/PIL/FpxImagePlugin.py @@ -17,15 +17,13 @@ from __future__ import print_function -from PIL import Image, ImageFile, _binary +from . import Image, ImageFile +from ._binary import i32le as i32, i8 import olefile __version__ = "0.1" -i32 = _binary.i32le -i8 = _binary.i8 - # we map from colour field tuples to (mode, rawmode) descriptors MODES = { # opacity diff --git a/PIL/FtexImagePlugin.py b/PIL/FtexImagePlugin.py index 4fa462f04..0d08f4cc4 100644 --- a/PIL/FtexImagePlugin.py +++ b/PIL/FtexImagePlugin.py @@ -42,7 +42,7 @@ Note: All data is stored in little-Endian (Intel) byte order. import struct from io import BytesIO -from PIL import Image, ImageFile +from . import Image, ImageFile MAGIC = b"FTEX" diff --git a/PIL/GbrImagePlugin.py b/PIL/GbrImagePlugin.py index d62981c28..b8b9f1a3c 100644 --- a/PIL/GbrImagePlugin.py +++ b/PIL/GbrImagePlugin.py @@ -24,9 +24,8 @@ # Version 3 files have a format specifier of 18 for 16bit floats in # the color depth field. This is currently unsupported by Pillow. -from PIL import Image, ImageFile, _binary - -i32 = _binary.i32be +from . import Image, ImageFile +from ._binary import i32be as i32 def _accept(prefix): diff --git a/PIL/GdImageFile.py b/PIL/GdImageFile.py index 5a07ee230..09ab5ec69 100644 --- a/PIL/GdImageFile.py +++ b/PIL/GdImageFile.py @@ -23,8 +23,9 @@ # purposes only. -from PIL import ImageFile, ImagePalette, _binary -from PIL._util import isPath +from . import ImageFile, ImagePalette +from ._binary import i16be as i16 +from ._util import isPath __version__ = "0.1" @@ -34,8 +35,6 @@ except ImportError: import __builtin__ builtins = __builtin__ -i16 = _binary.i16be - ## # Image plugin for the GD uncompressed format. Note that this format diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index a50af6c02..2e519c7ac 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -24,8 +24,9 @@ # See the README file for information on usage and redistribution. # -from PIL import Image, ImageFile, ImagePalette, \ - ImageChops, ImageSequence, _binary +from . import Image, ImageFile, ImagePalette, \ + ImageChops, ImageSequence +from ._binary import i8, i16le as i16, o8, o16le as o16 __version__ = "0.9" @@ -33,11 +34,6 @@ __version__ = "0.9" # -------------------------------------------------------------------- # Helpers -i8 = _binary.i8 -i16 = _binary.i16le -o8 = _binary.o8 -o16 = _binary.o16le - # -------------------------------------------------------------------- # Identify/read GIF files diff --git a/PIL/GimpGradientFile.py b/PIL/GimpGradientFile.py index 45af573bb..43cd72649 100644 --- a/PIL/GimpGradientFile.py +++ b/PIL/GimpGradientFile.py @@ -14,7 +14,7 @@ # from math import pi, log, sin, sqrt -from PIL._binary import o8 +from ._binary import o8 # -------------------------------------------------------------------- # Stuff to translate curve segments to palette values (derived from diff --git a/PIL/GimpPaletteFile.py b/PIL/GimpPaletteFile.py index e4b4641e5..6eef6a2dd 100644 --- a/PIL/GimpPaletteFile.py +++ b/PIL/GimpPaletteFile.py @@ -15,7 +15,7 @@ # import re -from PIL._binary import o8 +from ._binary import o8 ## diff --git a/PIL/GribStubImagePlugin.py b/PIL/GribStubImagePlugin.py index e880e5281..1fbfe61dc 100644 --- a/PIL/GribStubImagePlugin.py +++ b/PIL/GribStubImagePlugin.py @@ -9,7 +9,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image, ImageFile +from . import Image, ImageFile _handler = None diff --git a/PIL/Hdf5StubImagePlugin.py b/PIL/Hdf5StubImagePlugin.py index dc85084d8..a5d6b1bc1 100644 --- a/PIL/Hdf5StubImagePlugin.py +++ b/PIL/Hdf5StubImagePlugin.py @@ -9,7 +9,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image, ImageFile +from . import Image, ImageFile _handler = None diff --git a/PIL/IcnsImagePlugin.py b/PIL/IcnsImagePlugin.py index 089fc2a44..cb215fe3e 100644 --- a/PIL/IcnsImagePlugin.py +++ b/PIL/IcnsImagePlugin.py @@ -15,7 +15,8 @@ # See the README file for information on usage and redistribution. # -from PIL import Image, ImageFile, PngImagePlugin, _binary +from PIL import Image, ImageFile, PngImagePlugin +from PIL._binary import i8 import io import os import shutil @@ -27,8 +28,6 @@ enable_jpeg2k = hasattr(Image.core, 'jp2klib_version') if enable_jpeg2k: from PIL import Jpeg2KImagePlugin -i8 = _binary.i8 - HEADERSIZE = 8 diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index 3436ae84f..e4db4e766 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -25,7 +25,8 @@ import struct from io import BytesIO -from PIL import Image, ImageFile, BmpImagePlugin, PngImagePlugin, _binary +from . import Image, ImageFile, BmpImagePlugin, PngImagePlugin +from ._binary import i8, i16le as i16, i32le as i32 from math import log, ceil __version__ = "0.1" @@ -33,10 +34,6 @@ __version__ = "0.1" # # -------------------------------------------------------------------- -i8 = _binary.i8 -i16 = _binary.i16le -i32 = _binary.i32le - _MAGIC = b"\0\0\1\0" diff --git a/PIL/ImImagePlugin.py b/PIL/ImImagePlugin.py index dd4f82900..4638419fa 100644 --- a/PIL/ImImagePlugin.py +++ b/PIL/ImImagePlugin.py @@ -27,8 +27,8 @@ import re -from PIL import Image, ImageFile, ImagePalette -from PIL._binary import i8 +from . import Image, ImageFile, ImagePalette +from ._binary import i8 __version__ = "0.7" diff --git a/PIL/Image.py b/PIL/Image.py index e368ef187..dbe916df1 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -26,7 +26,7 @@ from __future__ import print_function -from PIL import VERSION, PILLOW_VERSION, _plugins +from . import VERSION, PILLOW_VERSION, _plugins import logging import warnings @@ -64,7 +64,7 @@ try: # 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 + from . import _imaging as core if PILLOW_VERSION != getattr(core, 'PILLOW_VERSION', None): raise ImportError("The _imaging extension was built for another " "version of Pillow or PIL") @@ -109,11 +109,9 @@ except ImportError: import __builtin__ builtins = __builtin__ -from PIL import ImageMode -from PIL._binary import i8 -from PIL._util import isPath -from PIL._util import isStringType -from PIL._util import deferred_error +from . import ImageMode +from ._binary import i8 +from ._util import isPath, isStringType, deferred_error import os import sys @@ -355,23 +353,23 @@ def preinit(): return try: - from PIL import BmpImagePlugin + from . import BmpImagePlugin except ImportError: pass try: - from PIL import GifImagePlugin + from . import GifImagePlugin except ImportError: pass try: - from PIL import JpegImagePlugin + from . import JpegImagePlugin except ImportError: pass try: - from PIL import PpmImagePlugin + from . import PpmImagePlugin except ImportError: pass try: - from PIL import PngImagePlugin + from . import PngImagePlugin except ImportError: pass # try: @@ -525,7 +523,7 @@ class Image(object): if self.palette: new.palette = self.palette.copy() if im.mode == "P" and not new.palette: - from PIL import ImagePalette + from . import ImagePalette new.palette = ImagePalette.ImagePalette() new.info = self.info.copy() return new @@ -775,7 +773,7 @@ class Image(object): if HAS_CFFI and USE_CFFI_ACCESS: if self.pyaccess: return self.pyaccess - from PIL import PyAccess + from . import PyAccess self.pyaccess = PyAccess.new(self, self.readonly) if self.pyaccess: return self.pyaccess @@ -908,7 +906,7 @@ class Image(object): if mode == "P" and palette == ADAPTIVE: im = self.im.quantize(colors) new = self._new(im) - from PIL import ImagePalette + from . import ImagePalette new.palette = ImagePalette.raw("RGB", new.im.getpalette("RGB")) if delete_trns: # This could possibly happen if we requantize to fewer colors. @@ -1321,7 +1319,7 @@ class Image(object): box += (box[0]+size[0], box[1]+size[1]) if isStringType(im): - from PIL import ImageColor + from . import ImageColor im = ImageColor.getcolor(im, self.mode) elif isImageType(im): @@ -1468,7 +1466,7 @@ class Image(object): :param data: A palette sequence (either a list or a string). """ - from PIL import ImagePalette + from . import ImagePalette if self.mode not in ("L", "P"): raise ValueError("illegal image mode") @@ -1583,7 +1581,7 @@ class Image(object): angle = angle % 360.0 # Fast paths regardless of filter, as long as we're not - # translating or changing the center. + # translating or changing the center. if not (center or translate): if angle == 0: return self.copy() @@ -1977,14 +1975,14 @@ class Image(object): def toqimage(self): """Returns a QImage copy of this image""" - from PIL import ImageQt + from . import ImageQt if not ImageQt.qt_is_installed: raise ImportError("Qt bindings are not installed") return ImageQt.toqimage(self) def toqpixmap(self): """Returns a QPixmap copy of this image""" - from PIL import ImageQt + from . import ImageQt if not ImageQt.qt_is_installed: raise ImportError("Qt bindings are not installed") return ImageQt.toqpixmap(self) @@ -2057,7 +2055,7 @@ def new(mode, size, color=0): if isStringType(color): # css3-style specifier - from PIL import ImageColor + from . import ImageColor color = ImageColor.getcolor(color, mode) return Image()._new(core.fill(mode, size, color)) @@ -2219,7 +2217,7 @@ def fromarray(obj, mode=None): def fromqimage(im): """Creates an image instance from a QImage image""" - from PIL import ImageQt + from . import ImageQt if not ImageQt.qt_is_installed: raise ImportError("Qt bindings are not installed") return ImageQt.fromqimage(im) @@ -2227,7 +2225,7 @@ def fromqimage(im): def fromqpixmap(im): """Creates an image instance from a QPixmap image""" - from PIL import ImageQt + from . import ImageQt if not ImageQt.qt_is_installed: raise ImportError("Qt bindings are not installed") return ImageQt.fromqpixmap(im) @@ -2531,7 +2529,7 @@ def _show(image, **options): def _showxv(image, title=None, **options): - from PIL import ImageShow + from . import ImageShow ImageShow.show(image, title, **options) diff --git a/PIL/ImageChops.py b/PIL/ImageChops.py index ba5350e02..89016730e 100644 --- a/PIL/ImageChops.py +++ b/PIL/ImageChops.py @@ -15,7 +15,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image +from . import Image def constant(image, value): diff --git a/PIL/ImageColor.py b/PIL/ImageColor.py index 64eebfe9d..1c7bc31d5 100644 --- a/PIL/ImageColor.py +++ b/PIL/ImageColor.py @@ -17,7 +17,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image +from . import Image import re diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 720403920..6b72fcab7 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -33,8 +33,8 @@ import numbers import warnings -from PIL import Image, ImageColor -from PIL._util import isStringType +from . import Image, ImageColor +from ._util import isStringType """ A simple 2D drawing interface for PIL images. @@ -105,7 +105,7 @@ class ImageDraw(object): """Get the current default font.""" if not self.font: # FIXME: should add a font repository - from PIL import ImageFont + from . import ImageFont self.font = ImageFont.load_default() return self.font @@ -319,11 +319,11 @@ def getdraw(im=None, hints=None): handler = None if not hints or "nicest" in hints: try: - from PIL import _imagingagg as handler + from . import _imagingagg as handler except ImportError: pass if handler is None: - from PIL import ImageDraw2 as handler + from . import ImageDraw2 as handler if im: im = handler.Draw(im) return im, handler diff --git a/PIL/ImageDraw2.py b/PIL/ImageDraw2.py index 62ee11630..a1763350d 100644 --- a/PIL/ImageDraw2.py +++ b/PIL/ImageDraw2.py @@ -16,7 +16,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image, ImageColor, ImageDraw, ImageFont, ImagePath +from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath class Pen(object): diff --git a/PIL/ImageEnhance.py b/PIL/ImageEnhance.py index 56b5c0199..b38f406a3 100644 --- a/PIL/ImageEnhance.py +++ b/PIL/ImageEnhance.py @@ -18,7 +18,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image, ImageFilter, ImageStat +from . import Image, ImageFilter, ImageStat class _Enhance(object): diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index a56795751..8f3ee524c 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -27,8 +27,8 @@ # See the README file for information on usage and redistribution. # -from PIL import Image -from PIL._util import isPath +from . import Image +from ._util import isPath import io import os import sys diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 49494b33f..c74d00138 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -25,8 +25,8 @@ # See the README file for information on usage and redistribution. # -from PIL import Image -from PIL._util import isDirectory, isPath +from . import Image +from ._util import isDirectory, isPath import os import sys @@ -37,7 +37,7 @@ class _imagingft_not_installed(object): raise ImportError("The _imagingft C module is not installed") try: - from PIL import _imagingft as core + from . import _imagingft as core except ImportError: core = _imagingft_not_installed() diff --git a/PIL/ImageGrab.py b/PIL/ImageGrab.py index 03283f3d6..938d0e994 100644 --- a/PIL/ImageGrab.py +++ b/PIL/ImageGrab.py @@ -15,7 +15,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image +from . import Image import sys if sys.platform not in ["win32", "darwin"]: @@ -75,7 +75,7 @@ def grabclipboard(): debug = 0 # temporary interface data = Image.core.grabclipboard(debug) if isinstance(data, bytes): - from PIL import BmpImagePlugin + from . import BmpImagePlugin import io return BmpImagePlugin.DibImageFile(io.BytesIO(data)) return data diff --git a/PIL/ImageMath.py b/PIL/ImageMath.py index 897f0aeb1..2ccd1891b 100644 --- a/PIL/ImageMath.py +++ b/PIL/ImageMath.py @@ -15,8 +15,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image -from PIL import _imagingmath +from . import Image, _imagingmath try: import builtins diff --git a/PIL/ImageMode.py b/PIL/ImageMode.py index 93dbeab41..b227f2127 100644 --- a/PIL/ImageMode.py +++ b/PIL/ImageMode.py @@ -35,7 +35,8 @@ def getmode(mode): global _modes if not _modes: # initialize mode cache - from PIL import Image + + from . import Image modes = {} # core modes for m, (basemode, basetype, bands) in Image._MODEINFO.items(): diff --git a/PIL/ImageMorph.py b/PIL/ImageMorph.py index 3ad708291..8382f7ce0 100644 --- a/PIL/ImageMorph.py +++ b/PIL/ImageMorph.py @@ -7,8 +7,7 @@ from __future__ import print_function -from PIL import Image -from PIL import _imagingmorph +from . import Image, _imagingmorph import re LUT_SIZE = 1 << 9 diff --git a/PIL/ImageOps.py b/PIL/ImageOps.py index 182f3c3d2..3681109c1 100644 --- a/PIL/ImageOps.py +++ b/PIL/ImageOps.py @@ -17,8 +17,8 @@ # See the README file for information on usage and redistribution. # -from PIL import Image -from PIL._util import isStringType +from . import Image +from ._util import isStringType import operator import functools @@ -39,7 +39,7 @@ def _border(border): def _color(color, mode): if isStringType(color): - from PIL import ImageColor + from . import ImageColor color = ImageColor.getcolor(color, mode) return color diff --git a/PIL/ImagePalette.py b/PIL/ImagePalette.py index 8bf09385c..cecc64583 100644 --- a/PIL/ImagePalette.py +++ b/PIL/ImagePalette.py @@ -17,10 +17,7 @@ # import array -from PIL import ImageColor -from PIL import GimpPaletteFile -from PIL import GimpGradientFile -from PIL import PaletteFile +from . import ImageColor, GimpPaletteFile, GimpGradientFile, PaletteFile class ImagePalette(object): diff --git a/PIL/ImagePath.py b/PIL/ImagePath.py index 3abfba031..1543508e4 100644 --- a/PIL/ImagePath.py +++ b/PIL/ImagePath.py @@ -14,7 +14,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image +from . import Image # the Python class below is overridden by the C implementation. diff --git a/PIL/ImageQt.py b/PIL/ImageQt.py index 2ce89e7ad..36b4e1ebc 100644 --- a/PIL/ImageQt.py +++ b/PIL/ImageQt.py @@ -16,8 +16,8 @@ # See the README file for information on usage and redistribution. # -from PIL import Image -from PIL._util import isPath +from . import Image +from ._util import isPath from io import BytesIO qt_is_installed = True diff --git a/PIL/ImageTk.py b/PIL/ImageTk.py index d3957b6d1..25c4534ce 100644 --- a/PIL/ImageTk.py +++ b/PIL/ImageTk.py @@ -32,7 +32,7 @@ except ImportError: tkinter = Tkinter del Tkinter -from PIL import Image +from . import Image from io import BytesIO @@ -182,7 +182,7 @@ class PhotoImage(object): except tkinter.TclError: # activate Tkinter hook try: - from PIL import _imagingtk + from . import _imagingtk try: _imagingtk.tkinit(tk.interpaddr(), 1) except AttributeError: diff --git a/PIL/ImageTransform.py b/PIL/ImageTransform.py index 92cc2c7e0..dcfcdfae8 100644 --- a/PIL/ImageTransform.py +++ b/PIL/ImageTransform.py @@ -13,7 +13,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image +from . import Image class Transform(Image.ImageTransformHandler): diff --git a/PIL/ImageWin.py b/PIL/ImageWin.py index 514fc4ff8..cc4dced97 100644 --- a/PIL/ImageWin.py +++ b/PIL/ImageWin.py @@ -17,7 +17,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image +from . import Image class HDC(object): diff --git a/PIL/ImtImagePlugin.py b/PIL/ImtImagePlugin.py index e95f7aeba..05e8cd31a 100644 --- a/PIL/ImtImagePlugin.py +++ b/PIL/ImtImagePlugin.py @@ -17,7 +17,7 @@ import re -from PIL import Image, ImageFile +from . import Image, ImageFile __version__ = "0.2" diff --git a/PIL/IptcImagePlugin.py b/PIL/IptcImagePlugin.py index 319e6abfe..8941643bb 100644 --- a/PIL/IptcImagePlugin.py +++ b/PIL/IptcImagePlugin.py @@ -17,17 +17,13 @@ from __future__ import print_function -from PIL import Image, ImageFile, _binary +from . import Image, ImageFile +from ._binary import i8, i16be as i16, i32be as i32, o8 import os import tempfile __version__ = "0.3" -i8 = _binary.i8 -i16 = _binary.i16be -i32 = _binary.i32be -o8 = _binary.o8 - COMPRESSION = { 1: "raw", 5: "jpeg" @@ -191,7 +187,7 @@ def getiptcinfo(im): :returns: A dictionary containing IPTC information, or None if no IPTC information block was found. """ - from PIL import TiffImagePlugin, JpegImagePlugin + from . import TiffImagePlugin, JpegImagePlugin import io data = None diff --git a/PIL/Jpeg2KImagePlugin.py b/PIL/Jpeg2KImagePlugin.py index 66de34bfa..101f55f76 100644 --- a/PIL/Jpeg2KImagePlugin.py +++ b/PIL/Jpeg2KImagePlugin.py @@ -12,7 +12,7 @@ # # See the README file for information on usage and redistribution. # -from PIL import Image, ImageFile +from . import Image, ImageFile import struct import os import io diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 3976ff55a..f01885b60 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -38,14 +38,10 @@ import array import struct import io import warnings -from PIL import Image, ImageFile, TiffImagePlugin, _binary -from PIL.JpegPresets import presets -from PIL._util import isStringType - -i8 = _binary.i8 -o8 = _binary.o8 -i16 = _binary.i16be -i32 = _binary.i32be +from . import Image, ImageFile, TiffImagePlugin +from ._binary import i8, o8, i16be as i16, i32be as i32 +from .JpegPresets import presets +from ._util import isStringType __version__ = "0.6" diff --git a/PIL/McIdasImagePlugin.py b/PIL/McIdasImagePlugin.py index b75360353..08eeec39f 100644 --- a/PIL/McIdasImagePlugin.py +++ b/PIL/McIdasImagePlugin.py @@ -17,7 +17,7 @@ # import struct -from PIL import Image, ImageFile +from . import Image, ImageFile __version__ = "0.2" diff --git a/PIL/MicImagePlugin.py b/PIL/MicImagePlugin.py index 125e297ac..a70838b07 100644 --- a/PIL/MicImagePlugin.py +++ b/PIL/MicImagePlugin.py @@ -17,7 +17,7 @@ # -from PIL import Image, TiffImagePlugin +from . import Image, TiffImagePlugin import olefile diff --git a/PIL/MpegImagePlugin.py b/PIL/MpegImagePlugin.py index 6671b8691..bdc5e3689 100644 --- a/PIL/MpegImagePlugin.py +++ b/PIL/MpegImagePlugin.py @@ -14,8 +14,8 @@ # -from PIL import Image, ImageFile -from PIL._binary import i8 +from . import Image, ImageFile +from ._binary import i8 __version__ = "0.1" diff --git a/PIL/MpoImagePlugin.py b/PIL/MpoImagePlugin.py index 1d26021d8..9341c530c 100644 --- a/PIL/MpoImagePlugin.py +++ b/PIL/MpoImagePlugin.py @@ -18,7 +18,7 @@ # See the README file for information on usage and redistribution. # -from PIL import Image, JpegImagePlugin +from . import Image, JpegImagePlugin __version__ = "0.1" diff --git a/PIL/MspImagePlugin.py b/PIL/MspImagePlugin.py index 85f8e764b..b60a21d69 100644 --- a/PIL/MspImagePlugin.py +++ b/PIL/MspImagePlugin.py @@ -17,7 +17,8 @@ # -from PIL import Image, ImageFile, _binary +from . import Image, ImageFile +from ._binary import i16le as i16, o16le as o16 __version__ = "0.1" @@ -25,8 +26,6 @@ __version__ = "0.1" # # read MSP files -i16 = _binary.i16le - def _accept(prefix): return prefix[:4] in [b"DanM", b"LinS"] @@ -66,8 +65,6 @@ class MspImageFile(ImageFile.ImageFile): # # write MSP files (uncompressed only) -o16 = _binary.o16le - def _save(im, fp, filename): diff --git a/PIL/PSDraw.py b/PIL/PSDraw.py index d4e7b18cc..fe0823860 100644 --- a/PIL/PSDraw.py +++ b/PIL/PSDraw.py @@ -15,7 +15,7 @@ # See the README file for information on usage and redistribution. # -from PIL import EpsImagePlugin +from . import EpsImagePlugin import sys ## diff --git a/PIL/PaletteFile.py b/PIL/PaletteFile.py index ef50feefd..9ed69d687 100644 --- a/PIL/PaletteFile.py +++ b/PIL/PaletteFile.py @@ -13,7 +13,7 @@ # See the README file for information on usage and redistribution. # -from PIL._binary import o8 +from ._binary import o8 ## diff --git a/PIL/PalmImagePlugin.py b/PIL/PalmImagePlugin.py index d02839bdf..cb4e491c0 100644 --- a/PIL/PalmImagePlugin.py +++ b/PIL/PalmImagePlugin.py @@ -7,7 +7,8 @@ # Image plugin for Palm pixmap images (output only). ## -from PIL import Image, ImageFile, _binary +from . import Image, ImageFile +from ._binary import o8, o16be as o16b __version__ = "1.0" @@ -108,9 +109,6 @@ _COMPRESSION_TYPES = { "scanline": 0x00, } -o8 = _binary.o8 -o16b = _binary.o16be - # # -------------------------------------------------------------------- diff --git a/PIL/PcdImagePlugin.py b/PIL/PcdImagePlugin.py index 24186bcfc..fa95b5008 100644 --- a/PIL/PcdImagePlugin.py +++ b/PIL/PcdImagePlugin.py @@ -15,12 +15,11 @@ # -from PIL import Image, ImageFile, _binary +from . import Image, ImageFile +from ._binary import i8 __version__ = "0.1" -i8 = _binary.i8 - ## # Image plugin for PhotoCD images. This plugin only reads the 768x512 diff --git a/PIL/PcfFontFile.py b/PIL/PcfFontFile.py index c2006905e..eba85feb0 100644 --- a/PIL/PcfFontFile.py +++ b/PIL/PcfFontFile.py @@ -16,9 +16,8 @@ # See the README file for information on usage and redistribution. # -from PIL import Image -from PIL import FontFile -from PIL import _binary +from . import Image, FontFile +from ._binary import i8, i16le as l16, i32le as l32, i16be as b16, i32be as b32 # -------------------------------------------------------------------- # declarations @@ -42,12 +41,6 @@ BYTES_PER_ROW = [ lambda bits: ((bits+63) >> 3) & ~7, ] -i8 = _binary.i8 -l16 = _binary.i16le -l32 = _binary.i32le -b16 = _binary.i16be -b32 = _binary.i32be - def sz(s, o): return s[o:s.index(b"\0", o)] diff --git a/PIL/PcxImagePlugin.py b/PIL/PcxImagePlugin.py index 9440d5362..e3c008f4f 100644 --- a/PIL/PcxImagePlugin.py +++ b/PIL/PcxImagePlugin.py @@ -28,14 +28,11 @@ from __future__ import print_function import logging -from PIL import Image, ImageFile, ImagePalette, _binary +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, o8, o16le as o16 logger = logging.getLogger(__name__) -i8 = _binary.i8 -i16 = _binary.i16le -o8 = _binary.o8 - __version__ = "0.6" @@ -123,8 +120,6 @@ SAVE = { "RGB": (5, 8, 3, "RGB;L"), } -o16 = _binary.o16le - def _save(im, fp, filename, check=0): diff --git a/PIL/PdfImagePlugin.py b/PIL/PdfImagePlugin.py index 7decf0ee5..b615fe1e0 100644 --- a/PIL/PdfImagePlugin.py +++ b/PIL/PdfImagePlugin.py @@ -20,8 +20,8 @@ # Image plugin for PDF images (output only). ## -from PIL import Image, ImageFile -from PIL._binary import i8 +from . import Image, ImageFile +from ._binary import i8 import io __version__ = "0.4" diff --git a/PIL/PixarImagePlugin.py b/PIL/PixarImagePlugin.py index fd002d9cf..732d8c692 100644 --- a/PIL/PixarImagePlugin.py +++ b/PIL/PixarImagePlugin.py @@ -19,16 +19,14 @@ # See the README file for information on usage and redistribution. # -from PIL import Image, ImageFile, _binary +from . import Image, ImageFile +from ._binary import i16le as i16 __version__ = "0.1" # # helpers -i16 = _binary.i16le - - def _accept(prefix): return prefix[:4] == b"\200\350\000\000" diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index 4d6f9d7ff..dca8a456e 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -38,16 +38,13 @@ import re import zlib import struct -from PIL import Image, ImageFile, ImagePalette, _binary +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16be as i16, i32be as i32, o8, o16be as o16, o32be as o32 __version__ = "0.9" logger = logging.getLogger(__name__) -i8 = _binary.i8 -i16 = _binary.i16be -i32 = _binary.i32be - is_cid = re.compile(br"\w\w\w\w").match @@ -621,10 +618,6 @@ class PngImageFile(ImageFile.ImageFile): # -------------------------------------------------------------------- # PNG writer -o8 = _binary.o8 -o16 = _binary.o16be -o32 = _binary.o32be - _OUTMODES = { # supported PIL modes, and corresponding rawmodes/bits/color combinations "1": ("1", b'\x01\x00'), diff --git a/PIL/PpmImagePlugin.py b/PIL/PpmImagePlugin.py index adaf8384c..b91f9912b 100644 --- a/PIL/PpmImagePlugin.py +++ b/PIL/PpmImagePlugin.py @@ -17,7 +17,7 @@ import string -from PIL import Image, ImageFile +from . import Image, ImageFile __version__ = "0.2" diff --git a/PIL/PsdImagePlugin.py b/PIL/PsdImagePlugin.py index d06e320b0..1e4051c29 100644 --- a/PIL/PsdImagePlugin.py +++ b/PIL/PsdImagePlugin.py @@ -18,7 +18,8 @@ __version__ = "0.4" -from PIL import Image, ImageFile, ImagePalette, _binary +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16be as i16, i32be as i32 MODES = { # (photoshop mode, bits) -> (pil mode, required channels) @@ -33,13 +34,6 @@ MODES = { (9, 8): ("LAB", 3) } -# -# helpers - -i8 = _binary.i8 -i16 = _binary.i16be -i32 = _binary.i32be - # --------------------------------------------------------------------. # read PSD images diff --git a/PIL/SgiImagePlugin.py b/PIL/SgiImagePlugin.py index d0e293368..973c68567 100644 --- a/PIL/SgiImagePlugin.py +++ b/PIL/SgiImagePlugin.py @@ -21,16 +21,13 @@ # -from PIL import Image, ImageFile, _binary +from . import Image, ImageFile +from ._binary import i8, o8, i16be as i16 import struct import os __version__ = "0.3" -i8 = _binary.i8 -o8 = _binary.o8 -i16 = _binary.i16be - def _accept(prefix): return len(prefix) >= 2 and i16(prefix) == 474 @@ -134,7 +131,7 @@ def _save(im, fp, filename): fp.write(struct.pack('404s', b'')) # dummy - #assert we've got the right number of bands. + #assert we've got the right number of bands. if len(im.getbands()) != z: raise ValueError("incorrect number of bands in SGI write: %s vs %s" % (z, len(im.getbands()))) diff --git a/PIL/SunImagePlugin.py b/PIL/SunImagePlugin.py index c3e2bc402..876fb73fa 100644 --- a/PIL/SunImagePlugin.py +++ b/PIL/SunImagePlugin.py @@ -17,12 +17,11 @@ # -from PIL import Image, ImageFile, ImagePalette, _binary +from . import Image, ImageFile, ImagePalette +from ._binary import i32be as i32 __version__ = "0.3" -i32 = _binary.i32be - def _accept(prefix): return len(prefix) >= 4 and i32(prefix) == 0x59a66a95 @@ -63,11 +62,11 @@ class SunImageFile(ImageFile.ImageFile): self.size = i32(s[4:8]), i32(s[8:12]) depth = i32(s[12:16]) - data_length = i32(s[16:20]) # unreliable, ignore. + data_length = i32(s[16:20]) # unreliable, ignore. file_type = i32(s[20:24]) palette_type = i32(s[24:28]) # 0: None, 1: RGB, 2: Raw/arbitrary palette_length = i32(s[28:32]) - + if depth == 1: self.mode, rawmode = "1", "1;I" elif depth == 4: @@ -85,23 +84,23 @@ class SunImageFile(ImageFile.ImageFile): else: self.mode, rawmode = 'RGB', 'BGRX' else: - raise SyntaxError("Unsupported Mode/Bit Depth") - + raise SyntaxError("Unsupported Mode/Bit Depth") + if palette_length: if palette_length > 1024: raise SyntaxError("Unsupported Color Palette Length") if palette_type != 1: raise SyntaxError("Unsupported Palette Type") - + offset = offset + palette_length self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length)) if self.mode == "L": self.mode = "P" rawmode = rawmode.replace('L', 'P') - + # 16 bit boundaries on stride - stride = ((self.size[0] * depth + 15) // 16) * 2 + stride = ((self.size[0] * depth + 15) // 16) * 2 # file type: Type is the version (or flavor) of the bitmap # file. The following values are typically found in the Type @@ -127,7 +126,7 @@ class SunImageFile(ImageFile.ImageFile): self.tile = [("sun_rle", (0, 0)+self.size, offset, rawmode)] else: raise SyntaxError('Unsupported Sun Raster file type') - + # # registry diff --git a/PIL/TarIO.py b/PIL/TarIO.py index 4f3182848..0e949ff88 100644 --- a/PIL/TarIO.py +++ b/PIL/TarIO.py @@ -14,7 +14,7 @@ # See the README file for information on usage and redistribution. # -from PIL import ContainerIO +from . import ContainerIO ## diff --git a/PIL/TgaImagePlugin.py b/PIL/TgaImagePlugin.py index a75ce2986..de2844339 100644 --- a/PIL/TgaImagePlugin.py +++ b/PIL/TgaImagePlugin.py @@ -17,7 +17,8 @@ # -from PIL import Image, ImageFile, ImagePalette, _binary +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, o8, o16le as o16, o32le as o32 __version__ = "0.3" @@ -26,9 +27,6 @@ __version__ = "0.3" # -------------------------------------------------------------------- # Read RGA file -i8 = _binary.i8 -i16 = _binary.i16le - MODES = { # map imagetype/depth to rawmode @@ -132,10 +130,6 @@ class TgaImageFile(ImageFile.ImageFile): # -------------------------------------------------------------------- # Write TGA file -o8 = _binary.o8 -o16 = _binary.o16le -o32 = _binary.o32le - SAVE = { "1": ("1", 1, 0, 3), "L": ("L", 8, 0, 3), diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index ae98831d2..e5009d0f1 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -41,10 +41,8 @@ from __future__ import division, print_function -from PIL import Image, ImageFile -from PIL import ImagePalette -from PIL import _binary -from PIL import TiffTags +from . import Image, ImageFile, ImagePalette, TiffTags +from ._binary import i8, o8 import collections from fractions import Fraction @@ -71,9 +69,6 @@ IFD_LEGACY_API = True II = b"II" # little-endian (Intel style) MM = b"MM" # big-endian (Motorola style) -i8 = _binary.i8 -o8 = _binary.o8 - # # -------------------------------------------------------------------- # Read TIFF files @@ -569,7 +564,7 @@ class ImageFileDirectory_v2(collections.MutableMapping): def _register_loader(idx, size): def decorator(func): - from PIL.TiffTags import TYPES + from .TiffTags import TYPES if func.__name__.startswith("load_"): TYPES[idx] = func.__name__[5:].replace("_", " ") _load_dispatch[idx] = size, func @@ -583,7 +578,7 @@ class ImageFileDirectory_v2(collections.MutableMapping): return decorator def _register_basic(idx_fmt_name): - from PIL.TiffTags import TYPES + from .TiffTags import TYPES idx, fmt, name = idx_fmt_name TYPES[idx] = name size = struct.calcsize("=" + fmt) diff --git a/PIL/WalImageFile.py b/PIL/WalImageFile.py index 1167fa739..a17238a5a 100644 --- a/PIL/WalImageFile.py +++ b/PIL/WalImageFile.py @@ -23,7 +23,8 @@ from __future__ import print_function -from PIL import Image, _binary +from . import Image +from ._binary import i32le as i32 try: import builtins @@ -31,8 +32,6 @@ except ImportError: import __builtin__ builtins = __builtin__ -i32 = _binary.i32le - def open(filename): """ diff --git a/PIL/WebPImagePlugin.py b/PIL/WebPImagePlugin.py index 6837b53be..b93e0d3e7 100644 --- a/PIL/WebPImagePlugin.py +++ b/PIL/WebPImagePlugin.py @@ -1,7 +1,5 @@ -from PIL import Image -from PIL import ImageFile +from . import Image, ImageFile, _webp from io import BytesIO -from PIL import _webp _VALID_WEBP_MODES = { @@ -43,7 +41,7 @@ class WebPImageFile(ImageFile.ImageFile): self.tile = [("raw", (0, 0) + self.size, 0, self.mode)] def _getexif(self): - from PIL.JpegImagePlugin import _getexif + from .JpegImagePlugin import _getexif return _getexif(self) diff --git a/PIL/WmfImagePlugin.py b/PIL/WmfImagePlugin.py index 99e498226..f7076c0d9 100644 --- a/PIL/WmfImagePlugin.py +++ b/PIL/WmfImagePlugin.py @@ -21,7 +21,10 @@ from __future__ import print_function -from PIL import Image, ImageFile, _binary +from . import Image, ImageFile +from ._binary import i16le as word, si16le as short, i32le as dword, si32le as _long + + __version__ = "0.2" @@ -59,13 +62,6 @@ if hasattr(Image.core, "drawwmf"): register_handler(WmfHandler()) -# -------------------------------------------------------------------- - -word = _binary.i16le -short = _binary.si16le -dword = _binary.i32le -_long = _binary.si32le - # # -------------------------------------------------------------------- # Read WMF file diff --git a/PIL/XVThumbImagePlugin.py b/PIL/XVThumbImagePlugin.py index 0034ff7d0..6929e8b82 100644 --- a/PIL/XVThumbImagePlugin.py +++ b/PIL/XVThumbImagePlugin.py @@ -17,12 +17,11 @@ # FIXME: make save work (this requires quantization support) # -from PIL import Image, ImageFile, ImagePalette, _binary +from . import Image, ImageFile, ImagePalette +from ._binary import o8 __version__ = "0.1" -o8 = _binary.o8 - _MAGIC = b"P7 332" # standard color palette for thumbnails (RGB332) diff --git a/PIL/XbmImagePlugin.py b/PIL/XbmImagePlugin.py index d0b0e47ab..b43fbef50 100644 --- a/PIL/XbmImagePlugin.py +++ b/PIL/XbmImagePlugin.py @@ -20,7 +20,7 @@ # import re -from PIL import Image, ImageFile +from . import Image, ImageFile __version__ = "0.6" diff --git a/PIL/XpmImagePlugin.py b/PIL/XpmImagePlugin.py index 556adb8f7..87736aff9 100644 --- a/PIL/XpmImagePlugin.py +++ b/PIL/XpmImagePlugin.py @@ -16,8 +16,8 @@ import re -from PIL import Image, ImageFile, ImagePalette -from PIL._binary import i8, o8 +from . import Image, ImageFile, ImagePalette +from ._binary import i8, o8 __version__ = "0.2" diff --git a/PIL/features.py b/PIL/features.py index 134d85abf..fb8e4371b 100644 --- a/PIL/features.py +++ b/PIL/features.py @@ -1,4 +1,4 @@ -from PIL import Image +from . import Image modules = { "pil": "PIL._imaging", From fbb92e99bb6426f1ee9a248db30d19328aeb8531 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 17 Jan 2017 13:23:30 +0000 Subject: [PATCH 144/632] Update Changes.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 128d7ca3e..102686d2c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Replaced absolute PIL imports with relative imports #2349 + [radarhere] + +- Added context managers for file handling #2307 + [radarhere] + - Expose registered file extensions in Image #2343 [iggomez, radarhere] From c13676e97556991f6aa5744eec1dd0d3d740e032 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 17 Jan 2017 06:21:47 -0800 Subject: [PATCH 145/632] Removed PIL 1.0 era readme that concerns Windows 95/NT --- Tk/README.rst | 285 -------------------------------------------------- 1 file changed, 285 deletions(-) delete mode 100644 Tk/README.rst diff --git a/Tk/README.rst b/Tk/README.rst deleted file mode 100644 index 61385effb..000000000 --- a/Tk/README.rst +++ /dev/null @@ -1,285 +0,0 @@ -Using PIL With Tkinter -==================================================================== - -Starting with 1.0 final (release candidate 2 and later, to be -precise), PIL can attach itself to Tkinter in flight. As a result, -you no longer need to rebuild the Tkinter extension to be able to -use PIL. - -However, if you cannot get the this to work on your platform, you -can do it in the old way: - -Adding Tkinter support ----------------------- - -1. Compile Python's _tkinter.c with the WITH_APPINIT and WITH_PIL - flags set, and link it with tkImaging.c and tkappinit.c. To - do this, copy the former to the Modules directory, and edit - the _tkinter line in Setup (or Setup.in) according to the - instructions in that file. - - NOTE: if you have an old Python version, the tkappinit.c - file is not included by default. If this is the case, you - will have to add the following lines to tkappinit.c, after - the MOREBUTTONS stuff:: - - { - extern void TkImaging_Init(Tcl_Interp* interp); - TkImaging_Init(interp); - } - - This registers a Tcl command called "PyImagingPhoto", which is - use to communicate between PIL and Tk's PhotoImage handler. - - You must also change the _tkinter line in Setup (or Setup.in) - to something like:: - - _tkinter _tkinter.c tkImaging.c tkappinit.c -DWITH_APPINIT - -I/usr/local/include -L/usr/local/lib -ltk8.0 -ltcl8.0 -lX11 - -The Photoimage Booster Patch (for Windows 95/NT) -==================================================================== - -This patch kit boosts performance for 16/24-bit displays. The -first patch is required on Tk 4.2 (where it fixes the problems for -16-bit displays) and later versions. By installing both patches, -Tk's PhotoImage handling becomes much faster on both 16-bit and -24-bit displays. The patch has been tested with Tk 4.2 and 8.0. - -Here's a benchmark, made with a sample program which loads two -512x512 greyscale PGM's, and two 512x512 colour PPM's, and displays -each of them in a separate toplevel windows. Tcl/Tk was compiled -with Visual C 4.0, and run on a P100 under Win95. Image load times -are not included in the timings: - -+----------------------+------------+-------------+----------------+ -| | **8-bit** | **16-bit** | **24-bit** | -+----------------------+------------+-------------+----------------+ -| 1. original 4.2 code | 5.52 s | 8.57 s | 3.79 s | -+----------------------+------------+-------------+----------------+ -| 2. booster patch | 5.49 s | 1.87 s | 1.82 s | -+----------------------+------------+-------------+----------------+ -| speedup | None | 4.6x | 2.1x | -+----------------------+------------+-------------+----------------+ - -Here's the patches: - -1. For portability and speed, the best thing under Windows is to -treat 16-bit displays as if they were 24-bit. The Windows device -drivers take care of the rest. - -.. Note:: - - If you have Tk 4.1 or Tk 8.0b1, you don't have to apply this - patch! It only applies to Tk 4.2, Tk 8.0a[12] and Tk 8.0b2. - -In ``win/tkWinImage.c``, change the following line in ``XCreateImage``:: - - imagePtr->bits_per_pixel = depth; - -to:: - - /* ==================================================================== */ - /* The tk photo image booster patch -- patch section 1 */ - /* ==================================================================== */ - - if (visual->class == TrueColor) - /* true colour is stored as 3 bytes: (blue, green, red) */ - imagePtr->bits_per_pixel = 24; - else - imagePtr->bits_per_pixel = depth; - - /* ==================================================================== */ - - -2. The DitherInstance implementation is not good. It's especially -bad on highend truecolour displays. IMO, it should be rewritten from -scratch (some other day...). - -Anyway, the following band-aid makes the situation a little bit -better under Windows. This hack trades some marginal quality (no -dithering on 16-bit displays) for a dramatic performance boost. -Requires patch 1, unless you're using Tk 4.1 or Tk 8.0b1. - -In generic/tkImgPhoto.c, add the #ifdef section to the DitherInstance -function:: - - /* ==================================================================== */ - - for (; height > 0; height -= nLines) { - if (nLines > height) { - nLines = height; - } - dstLinePtr = (unsigned char *) imagePtr->data; - yEnd = yStart + nLines; - - /* ==================================================================== */ - /* The tk photo image booster patch -- patch section 2 */ - /* ==================================================================== */ - - #ifdef __WIN32__ - if (colorPtr->visualInfo.class == TrueColor - && instancePtr->gamma == 1.0) { - /* Windows hicolor/truecolor booster */ - for (y = yStart; y < yEnd; ++y) { - destBytePtr = dstLinePtr; - srcPtr = srcLinePtr; - for (x = xStart; x < xEnd; ++x) { - destBytePtr[0] = srcPtr[2]; - destBytePtr[1] = srcPtr[1]; - destBytePtr[2] = srcPtr[0]; - destBytePtr += 3; srcPtr += 3; - } - srcLinePtr += lineLength; - dstLinePtr += bytesPerLine; - } - } else - #endif - - /* ==================================================================== */ - - for (y = yStart; y < yEnd; ++y) { - srcPtr = srcLinePtr; - errPtr = errLinePtr; - destBytePtr = dstLinePtr; - -The PIL Bitmap Booster Patch -==================================================================== - -The pilbitmap booster patch greatly improves performance of the -ImageTk.BitmapImage constructor. Unfortunately, the design of Tk -doesn't allow us to do this from the tkImaging interface module, so -you have to patch the Tk sources. - -Once installed, the ImageTk module will automatically detect this -patch. - -(Note: this patch has been tested with Tk 8.0 on Win32 only, but it -should work just fine on other platforms as well). - -1. To the beginning of TkGetBitmapData (in generic/tkImgBmap.c), add - the following stuff:: - - /* ==================================================================== */ - - int width, height, numBytes, hotX, hotY; - char *p, *end, *expandedFileName; - ParseInfo pi; - char *data = NULL; - Tcl_DString buffer; - - /* ==================================================================== */ - /* The pilbitmap booster patch -- patch section */ - /* ==================================================================== */ - - char *PILGetBitmapData(); - - if (string) { - /* Is this a PIL bitmap reference? */ - data = PILGetBitmapData(string, widthPtr, heightPtr, hotXPtr, hotYPtr); - if (data) - return data; - } - - /* ==================================================================== */ - - pi.string = string; - if (string == NULL) { - if (Tcl_IsSafe(interp)) { - -2. Append the following to the same file (you may wish to include -Imaging.h instead of copying the struct declaration...):: - - /* ==================================================================== */ - /* The pilbitmap booster patch -- code section */ - /* ==================================================================== */ - - /* Imaging declaration boldly copied from Imaging.h (!) */ - - typedef struct ImagingInstance *Imaging; /* a.k.a. ImagingImage :-) */ - - typedef unsigned char UINT8; - typedef int INT32; - - struct ImagingInstance { - - /* Format */ - char mode[4+1]; /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK") */ - int type; /* Always 0 in this version */ - int depth; /* Always 8 in this version */ - int bands; /* Number of bands (1, 3, or 4) */ - int xsize; /* Image dimension. */ - int ysize; - - /* Colour palette (for "P" images only) */ - void* palette; - - /* Data pointers */ - UINT8 **image8; /* Set for 8-bit image (pixelsize=1). */ - INT32 **image32; /* Set for 32-bit image (pixelsize=4). */ - - /* Internals */ - char **image; /* Actual raster data. */ - char *block; /* Set if data is allocated in a single block. */ - - int pixelsize; /* Size of a pixel, in bytes (1 or 4) */ - int linesize; /* Size of a line, in bytes (xsize * pixelsize) */ - - /* Virtual methods */ - void (*im_delete)(Imaging *); - - }; - - /* The pilbitmap booster patch allows you to pass PIL images to the - Tk bitmap decoder. Passing images this way is much more efficient - than using the "tobitmap" method. */ - - char * - PILGetBitmapData(string, widthPtr, heightPtr, hotXPtr, hotYPtr) - char *string; - int *widthPtr, *heightPtr; - int *hotXPtr, *hotYPtr; - { - char* data; - char* p; - int y; - Imaging im; - - if (strncmp(string, "PIL:", 4) != 0) - return NULL; - - im = (Imaging) atol(string + 4); - - if (strcmp(im->mode, "1") != 0 && strcmp(im->mode, "L") != 0) - return NULL; - - data = p = (char *) ckalloc((unsigned) ((im->xsize+7)/8) * im->ysize); - - for (y = 0; y < im->ysize; y++) { - char* in = im->image8[y]; - int i, m, b; - b = 0; m = 1; - for (i = 0; i < im->xsize; i++) { - if (in[i] != 0) - b |= m; - m <<= 1; - if (m == 256){ - *p++ = b; - b = 0; m = 1; - } - } - if (m != 1) - *p++ = b; - } - - *widthPtr = im->xsize; - *heightPtr = im->ysize; - *hotXPtr = -1; - *hotYPtr = -1; - - return data; - } - - /* ==================================================================== */ - -3. Recompile Tk and relink the _tkinter module (where necessary). \ No newline at end of file From 97a2d42dacdde77e50eba95ccfeb19d114ead9bc Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 7 Oct 2016 21:39:14 +1100 Subject: [PATCH 146/632] Removed unused print_function imports --- PIL/PcxImagePlugin.py | 2 -- PIL/PngImagePlugin.py | 2 -- PIL/PyAccess.py | 2 -- PIL/WalImageFile.py | 2 -- Tests/test_file_tiff.py | 1 - Tests/test_tiff_ifdrational.py | 2 -- 6 files changed, 11 deletions(-) diff --git a/PIL/PcxImagePlugin.py b/PIL/PcxImagePlugin.py index e3c008f4f..ef89a1907 100644 --- a/PIL/PcxImagePlugin.py +++ b/PIL/PcxImagePlugin.py @@ -25,8 +25,6 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - import logging from . import Image, ImageFile, ImagePalette from ._binary import i8, i16le as i16, o8, o16le as o16 diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index dca8a456e..caa786b85 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -31,8 +31,6 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - import logging import re import zlib diff --git a/PIL/PyAccess.py b/PIL/PyAccess.py index 8b67a8ea2..58d20ca38 100644 --- a/PIL/PyAccess.py +++ b/PIL/PyAccess.py @@ -20,8 +20,6 @@ # Access.c implementation. # -from __future__ import print_function - import logging import sys diff --git a/PIL/WalImageFile.py b/PIL/WalImageFile.py index a17238a5a..95bedbfaf 100644 --- a/PIL/WalImageFile.py +++ b/PIL/WalImageFile.py @@ -21,8 +21,6 @@ # http://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml # and has been tested with a few sample files found using google. -from __future__ import print_function - from . import Image from ._binary import i32le as i32 diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index bf19947a1..5f81f36b3 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -1,4 +1,3 @@ -from __future__ import print_function import logging from io import BytesIO import struct diff --git a/Tests/test_tiff_ifdrational.py b/Tests/test_tiff_ifdrational.py index ffd4f9eac..54f330ec3 100644 --- a/Tests/test_tiff_ifdrational.py +++ b/Tests/test_tiff_ifdrational.py @@ -1,5 +1,3 @@ -from __future__ import print_function - from helper import unittest, PillowTestCase, hopper from PIL import TiffImagePlugin, Image From 25fb149d5e995b56dd6ea5e5960fb51ed749fae6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 7 Oct 2016 21:39:21 +1100 Subject: [PATCH 147/632] Removed unused docs import --- docs/conf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 33dd6a4f7..11956b03e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,7 +14,6 @@ import sys import os -import shlex # 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 From c168f011113dde1358c10a89c0ac6baf07de6e40 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 7 Oct 2016 21:46:48 +1100 Subject: [PATCH 148/632] Removed imports used only by comments --- PIL/Image.py | 2 -- Tests/test_format_hsv.py | 1 - docs/conf.py | 3 --- 3 files changed, 6 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index dbe916df1..b2e2344ac 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -24,8 +24,6 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - from . import VERSION, PILLOW_VERSION, _plugins import logging diff --git a/Tests/test_format_hsv.py b/Tests/test_format_hsv.py index eea29b3f1..b965a854f 100644 --- a/Tests/test_format_hsv.py +++ b/Tests/test_format_hsv.py @@ -1,4 +1,3 @@ -from __future__ import print_function from helper import unittest, PillowTestCase, hopper from PIL import Image diff --git a/docs/conf.py b/docs/conf.py index 11956b03e..f21e2e51a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,9 +12,6 @@ # All configuration values have a default; values that are commented out # serve to show the default. -import sys -import os - # 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. From b82151f281892930924c15649609a92c3a6db89e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 7 Oct 2016 21:52:25 +1100 Subject: [PATCH 149/632] Removed unused division import --- Tests/test_file_tiff_metadata.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index c75487f9b..844703370 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -1,5 +1,3 @@ -from __future__ import division - import io import struct From b001e5d4abddb3368c7e9c42f7bc04aa22a38a53 Mon Sep 17 00:00:00 2001 From: Alexandru Chirila Date: Wed, 18 Jan 2017 14:22:14 +0200 Subject: [PATCH 150/632] Ensure that the `err_code` variable is initialized before using. --- PIL/ImageFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 8f3ee524c..0c7a19194 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -178,7 +178,7 @@ class ImageFile(Image.Image): self.map = None self.load_prepare() - + err_code = 0 if not self.map: # sort tiles in file order self.tile.sort(key=_tilesort) From a46ce022e72e4b93e7ed4a7ce3d169bbe9e3cfda Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 19 Jan 2017 19:45:49 +1100 Subject: [PATCH 151/632] Removed warning about zlib 1.2.2 security vulnerability --- setup.py | 36 +++--------------------------------- 1 file changed, 3 insertions(+), 33 deletions(-) diff --git a/setup.py b/setup.py index b0209a399..b967926eb 100755 --- a/setup.py +++ b/setup.py @@ -631,16 +631,11 @@ class pil_build_ext(build_ext): build_ext.build_extensions(self) # - # sanity and security checks + # sanity checks - unsafe_zlib = None + self.summary_report(feature) - if feature.zlib: - unsafe_zlib = self.check_zlib_version(self.compiler.include_dirs) - - self.summary_report(feature, unsafe_zlib) - - def summary_report(self, feature, unsafe_zlib): + def summary_report(self, feature): print("-" * 68) print("PIL SETUP SUMMARY") @@ -676,16 +671,6 @@ class pil_build_ext(build_ext): print("*** %s support not available" % option[1]) all = 0 - if feature.zlib and unsafe_zlib: - print("") - print("*** Warning: zlib", unsafe_zlib) - print("may contain a security vulnerability.") - print("*** Consider upgrading to zlib 1.2.3 or newer.") - print("*** See: http://www.kb.cert.org/vuls/id/238678") - print(" http://www.kb.cert.org/vuls/id/680620") - print(" http://www.gzip.org/zlib/advisory-2002-03-11.txt") - print("") - print("-" * 68) if not all: @@ -697,21 +682,6 @@ class pil_build_ext(build_ext): print("To check the build, run the selftest.py script.") print("") - def check_zlib_version(self, include_dirs): - # look for unsafe versions of zlib - for subdir in include_dirs: - zlibfile = os.path.join(subdir, "zlib.h") - if os.path.isfile(zlibfile): - break - else: - return - for line in open(zlibfile).readlines(): - m = re.match(r'#define\s+ZLIB_VERSION\s+"([^"]*)"', line) - if not m: - continue - if m.group(1) < "1.2.3": - return m.group(1) - # https://hg.python.org/users/barry/rev/7e8deab93d5a def add_multiarch_paths(self): # Debian/Ubuntu multiarch support. From 8a9bd2cdcdd7fc9ecd89fa79323463f4d24f53b8 Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Thu, 19 Jan 2017 17:24:28 +0100 Subject: [PATCH 152/632] Default to inch-interpretation for missing ResolutionUnit in TiffImagePlugin. --- PIL/TiffImagePlugin.py | 6 +++++- Tests/test_file_tiff.py | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index e5009d0f1..505025bb8 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1163,11 +1163,15 @@ class TiffImageFile(ImageFile.ImageFile): yres = self.tag_v2.get(Y_RESOLUTION, 1) if xres and yres: - resunit = self.tag_v2.get(RESOLUTION_UNIT, 1) + resunit = self.tag_v2.get(RESOLUTION_UNIT) if resunit == 2: # dots per inch self.info["dpi"] = xres, yres elif resunit == 3: # dots per centimeter. convert to dpi self.info["dpi"] = xres * 2.54, yres * 2.54 + elif resunit == None: # used to default to 1, but now 2) + self.info["dpi"] = xres, yres + # For backward compatibility, we also preserve the old behavior. + self.info["resolution"] = xres, yres else: # No absolute unit of measurement self.info["resolution"] = xres, yres diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index bf19947a1..1fe3ad45e 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -93,6 +93,24 @@ class TestFileTiff(PillowTestCase): self.assertEqual(im.info['dpi'], (72., 72.)) + def test_xyres_fallback_tiff(self): + from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION, RESOLUTION_UNIT + filename = "Tests/images/compression.tif" + im = Image.open(filename) + + # v2 api + self.assertIsInstance(im.tag_v2[X_RESOLUTION], + TiffImagePlugin.IFDRational) + self.assertIsInstance(im.tag_v2[Y_RESOLUTION], + TiffImagePlugin.IFDRational) + self.assertRaises(KeyError, + lambda: im.tag_v2[RESOLUTION_UNIT]) + + # Legacy. + self.assertEqual(im.info['resolution'], (100., 100.)) + # Fallback "inch". + self.assertEqual(im.info['dpi'], (100., 100.)) + def test_int_resolution(self): from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION filename = "Tests/images/pil168.tif" From 9099798ff279d00c80d3e336de2f8f82fa95b50e Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 19 Jan 2017 20:53:31 +0200 Subject: [PATCH 153/632] [CI ski[ --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 102686d2c..873326be7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -16,7 +16,7 @@ Changelog (Pillow) - Make mode descriptor cache initialization thread-safe. #2351 [gunjambi] -- Updated windows test dependencies: Freetype 2.7.1, zlib 1.2.10. #2331, #2332 +- Updated Windows test dependencies: Freetype 2.7.1, zlib 1.2.11 #2331, #2332, #2357 [radarhere] - Followed upstream pngquant packaging reorg to libimagquant #2354 From bceee54895f851028b76e75eca3149f41fa4c44d Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 20 Jan 2017 21:10:02 +0200 Subject: [PATCH 154/632] Prevent nose -v printing docstrings (#2369) --- Tests/helper.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/helper.py b/Tests/helper.py index f4b6b52cf..f8eed3e2d 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -149,6 +149,10 @@ class PillowTestCase(unittest.TestCase): if skip: self.skipTest(msg or "Known Bad Test") + def shortDescription(self): + # Prevents `nose -v` printing docstrings + return None + def tempfile(self, template): assert template[:5] in ("temp.", "temp_") fd, path = tempfile.mkstemp(template[4:], template[:4]) From da8f2737a8a325ed5bb1d24a777a0b4d3ddaa7d8 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 20 Jan 2017 19:12:44 +0000 Subject: [PATCH 155/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 873326be7..0816eabcc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Removed PIL 1.0 era TK readme that concerns Windows 95/NT #2360 + [wiredfool] + +- Prevent `nose -v` printing docstrings #2369 + [hugovk] + - Replaced absolute PIL imports with relative imports #2349 [radarhere] From 3c7798bc7bedc7c868e88ddcf605c8f128f61a90 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 19 Jan 2017 07:54:54 -0800 Subject: [PATCH 156/632] Add prebuilt docker files to travis --- .travis.yml | 129 +++++++++++---------------------------- .travis/after_success.sh | 44 +++++++++++++ .travis/install.sh | 34 +++++++++++ .travis/script.sh | 14 +++++ 4 files changed, 126 insertions(+), 95 deletions(-) create mode 100755 .travis/after_success.sh create mode 100755 .travis/install.sh create mode 100755 .travis/script.sh diff --git a/.travis.yml b/.travis.yml index 3478d0aa0..2259fd5ea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,49 +6,37 @@ notifications: # 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. -python: - - "pypy" - - "pypy3" - - 3.6 - - 2.7 - - "2.7_with_system_site_packages" # For PyQt4 - - 3.5 - - 3.4 - - 3.3 - - nightly +matrix: + fast_finish: false + allow_failures: + - python: nightly + include: + - python: "pypy" + - python: "pypy3" + - python: '3.6' + - python: '2.7' + - env: DOCKER="alpine" + - env: DOCKER="ubuntu-trusty-x86" + - env: DOCKER="ubuntu-xenial-amd64" + - env: DOCKER="ubuntu-precise-amd64" + - python: "2.7_with_system_site_packages" # For PyQt4 + - python: '3.5' + - python: '3.4' + - python: '3.3' + dist: trusty +sudo: required + +services: + - docker + install: - - "travis_retry sudo apt-get update" - - "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 nose" - - "travis_retry pip install check-manifest" - - "travis_retry pip install olefile" - # Pyroma tests sometimes hang on PyPy; skip - - if [ $TRAVIS_PYTHON_VERSION != "pypy" ]; then travis_retry pip install pyroma; fi - - - "travis_retry pip install coverage" - - # docs only on python 2.7 - - if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then travis_retry pip install -r requirements.txt ; fi - - # clean checkout for manifest - - mkdir /tmp/check-manifest && cp -a . /tmp/check-manifest - - # webp - - pushd depends && ./install_webp.sh && popd - - # openjpeg - - pushd depends && ./install_openjpeg.sh && popd - - # libimagequant - - pushd depends && ./install_imagequant.sh && popd - - # extra test images - - pushd depends && ./install_extra_test_images.sh && popd + - if [ "$DOCKER" == "" ]; then .travis/install.sh; fi +before_install: + - if [ "$DOCKER" ]; then docker pull pythonpillow/$DOCKER; fi before_script: # Qt needs a display for some of the tests, and it's only run on the system site packages install @@ -56,60 +44,16 @@ before_script: - "sh -e /etc/init.d/xvfb start" script: - - coverage erase - - python setup.py clean - - CFLAGS="-coverage" python setup.py build_ext --inplace - - - coverage run --append --include=PIL/* selftest.py - - coverage run --append --include=PIL/* -m nose -vx Tests/test_*.py - - pushd /tmp/check-manifest && check-manifest --ignore ".coveragerc,.editorconfig,*.yml,*.yaml,tox.ini" && popd - - # Docs - - if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then make install && make doccheck; fi + - | + if [ "$DOCKER" == "" ]; then + .travis/script.sh + else + docker run -v $TRAVIS_BUILD_DIR:/Pillow pythonpillow/$DOCKER + fi after_success: - # gather the coverage data - - travis_retry sudo apt-get -qq install lcov - - lcov --capture --directory . -b . --output-file coverage.info - # filter to remove system headers - - lcov --remove coverage.info '/usr/*' -o coverage.filtered.info - # convert to json - - travis_retry gem install coveralls-lcov - - coveralls-lcov -v -n coverage.filtered.info > coverage.c.json - - - coverage report - - 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 - - pyflakes *.py | tee >(wc -l) - - 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 depends/diffcover-install.sh; fi - - if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then depends/diffcover-run.sh; fi - - # after_all - - | - if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then - curl -Lo travis_after_all.py https://raw.github.com/dmakhno/travis_after_all/master/travis_after_all.py - python travis_after_all.py - export $(cat .to_export_back) - if [ "$BUILD_LEADER" = "YES" ]; then - if [ "$BUILD_AGGREGATE_STATUS" = "others_succeeded" ]; then - echo "All jobs succeded! Triggering macOS build..." - # Trigger a macOS build at the pillow-wheels repo - ./build_children.sh - else - echo "Some jobs failed" - fi - fi - fi - + - .travis/after_success.sh + after_failure: - | if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then @@ -131,11 +75,6 @@ after_script: echo leader=$BUILD_LEADER status=$BUILD_AGGREGATE_STATUS fi -matrix: - fast_finish: true - allow_failures: - - python: nightly - env: global: # travis encrypt AUTH_TOKEN= diff --git a/.travis/after_success.sh b/.travis/after_success.sh new file mode 100755 index 000000000..64f35c9c9 --- /dev/null +++ b/.travis/after_success.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# gather the coverage data +sudo apt-get -qq install lcov +lcov --capture --directory . -b . --output-file coverage.info +# filter to remove system headers +lcov --remove coverage.info '/usr/*' -o coverage.filtered.info +# convert to json +gem install coveralls-lcov +coveralls-lcov -v -n coverage.filtered.info > coverage.c.json + +coverage report +pip install coveralls-merge +coveralls-merge coverage.c.json + +if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then + pip install pep8 pyflakes + pep8 --statistics --count PIL/*.py + pep8 --statistics --count Tests/*.py + pyflakes *.py | tee >(wc -l) + pyflakes PIL/*.py | tee >(wc -l) + pyflakes Tests/*.py | tee >(wc -l) +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 depends/diffcover-install.sh; fi +if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then depends/diffcover-run.sh; fi + +# after_all + +if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then + curl -Lo travis_after_all.py https://raw.github.com/dmakhno/travis_after_all/master/travis_after_all.py + python travis_after_all.py + export $(cat .to_export_back) + if [ "$BUILD_LEADER" = "YES" ]; then + if [ "$BUILD_AGGREGATE_STATUS" = "others_succeeded" ]; then + echo "All jobs succeded! Triggering macOS build..." + # Trigger a macOS build at the pillow-wheels repo + ./build_children.sh + else + echo "Some jobs failed" + fi + fi diff --git a/.travis/install.sh b/.travis/install.sh new file mode 100755 index 000000000..4b7503bed --- /dev/null +++ b/.travis/install.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +set -e + +sudo apt-get update +sudo apt-get -qq install libfreetype6-dev liblcms2-dev\ + python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake imagemagick +pip install cffi +pip install nose +pip install check-manifest +pip install olefile +# Pyroma tests sometimes hang on PyPy; skip +if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then pip install pyroma; fi + +pip install coverage + +# docs only on python 2.7 +if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then pip install -r requirements.txt ; fi + +# clean checkout for manifest +mkdir /tmp/check-manifest && cp -a . /tmp/check-manifest + +# webp +pushd depends && ./install_webp.sh && popd + +# openjpeg +pushd depends && ./install_openjpeg.sh && popd + +# libimagequant +pushd depends && ./install_imagequant.sh && popd + +# extra test images +pushd depends && ./install_extra_test_images.sh && popd + diff --git a/.travis/script.sh b/.travis/script.sh new file mode 100755 index 000000000..e1d522122 --- /dev/null +++ b/.travis/script.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +set -e + +coverage erase +python setup.py clean +CFLAGS="-coverage" python setup.py build_ext --inplace + +coverage run --append --include=PIL/* selftest.py +coverage run --append --include=PIL/* -m nose -vx Tests/test_*.py +pushd /tmp/check-manifest && check-manifest --ignore ".coveragerc,.editorconfig,*.yml,*.yaml,tox.ini" && popd + +# Docs +if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then make install && make doccheck; fi From 94cc72a2ba879592e437ec8506a2fe50f9f8777e Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 20 Jan 2017 07:50:51 -0800 Subject: [PATCH 157/632] disable tests broken on old system versions of numpy/scipy --- Tests/test_numpy.py | 7 ++++++- Tests/test_scipy.py | 8 +++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 02ae5e50b..8a530ce1b 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -135,7 +135,12 @@ class TestNumpy(PillowTestCase): img = Image.fromarray(arr * 255).convert('1') self.assertEqual(img.mode, '1') arr_back = numpy.array(img) - numpy.testing.assert_array_equal(arr, arr_back) + # numpy 1.8 and earlier return this as a boolean. (trusty/precise) + if arr_back.dtype == numpy.bool: + arr_bool = numpy.array([[1, 0, 0, 1, 0], [0, 1, 0, 0, 0]], 'bool') + numpy.testing.assert_array_equal(arr_bool, arr_back) + else: + numpy.testing.assert_array_equal(arr, arr_back) def test_save_tiff_uint16(self): # Tests that we're getting the pixel value in the right byte order. diff --git a/Tests/test_scipy.py b/Tests/test_scipy.py index 8be16c518..1f4f016d1 100644 --- a/Tests/test_scipy.py +++ b/Tests/test_scipy.py @@ -1,10 +1,11 @@ from helper import unittest, PillowTestCase - +from distutils.version import StrictVersion try: import numpy as np from numpy.testing import assert_equal from scipy import misc + import scipy HAS_SCIPY = True except ImportError: HAS_SCIPY = False @@ -27,6 +28,11 @@ class Test_scipy_resize(PillowTestCase): im1 = misc.imresize(im, T(1.101)) self.assertEqual(im1.shape, (11, 22)) + # this test fails prior to scipy 0.14.0b1 + # https://github.com/scipy/scipy/commit/855ff1fff805fb91840cf36b7082d18565fc8352 + @unittest.skipIf(HAS_SCIPY and + (StrictVersion(scipy.__version__) < StrictVersion('0.14.0')), + "Test fails on scipy < 0.14.0") def test_imresize4(self): im = np.array([[1, 2], [3, 4]]) From 426f8d68b15dacf134881b8276b564b803c35bd8 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 20 Jan 2017 11:34:13 -0800 Subject: [PATCH 158/632] reenable nightly, move diffcover to non-docker 2.7 build --- .travis.yml | 3 ++- .travis/after_success.sh | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2259fd5ea..34f37b611 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ notifications: # Then run the remainder. matrix: - fast_finish: false + fast_finish: true allow_failures: - python: nightly include: @@ -24,6 +24,7 @@ matrix: - python: '3.5' - python: '3.4' - python: '3.3' + - python: 'nightly' dist: trusty diff --git a/.travis/after_success.sh b/.travis/after_success.sh index 64f35c9c9..415224f48 100755 --- a/.travis/after_success.sh +++ b/.travis/after_success.sh @@ -13,19 +13,19 @@ coverage report pip install coveralls-merge coveralls-merge coverage.c.json -if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then +if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ] && [ "$DOCKER" == "" ]; then pip install pep8 pyflakes pep8 --statistics --count PIL/*.py pep8 --statistics --count Tests/*.py pyflakes *.py | tee >(wc -l) pyflakes PIL/*.py | tee >(wc -l) pyflakes Tests/*.py | tee >(wc -l) -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 depends/diffcover-install.sh; fi -if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then depends/diffcover-run.sh; fi + # Coverage and quality reports on just the latest diff. + # (Installation is very slow on Py3, so just do it for Py2.) + depends/diffcover-install.sh + depends/diffcover-run.sh +fi # after_all From 361f579579ca9cfed40a9bb4fc322e0ea99d60e4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 15 Jan 2017 17:36:59 +1100 Subject: [PATCH 159/632] Moved iCCP chunk before PLTE chunk when saving as PNG --- PIL/PngImagePlugin.py | 24 ++++++++++++------------ Tests/test_file_png.py | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index dca8a456e..486162a38 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -715,6 +715,18 @@ def _save(im, fp, filename, chunk=putchunk, check=0): b'\0', # 11: filter category b'\0') # 12: interlace flag + icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) + if icc: + # ICC profile + # according to PNG spec, the iCCP chunk contains: + # Profile name 1-79 bytes (character string) + # Null separator 1 byte (null character) + # Compression method 1 byte (0) + # Compressed profile n bytes (zlib with deflate compression) + name = b"ICC Profile" + data = name + b"\0\0" + zlib.compress(icc) + chunk(fp, b"iCCP", data) + if im.mode == "P": palette_byte_number = (2 ** bits) * 3 palette_bytes = im.im.getpalette("RGB")[:palette_byte_number] @@ -764,18 +776,6 @@ def _save(im, fp, filename, chunk=putchunk, check=0): for cid, data in info.chunks: chunk(fp, cid, data) - icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) - if icc: - # ICC profile - # according to PNG spec, the iCCP chunk contains: - # Profile name 1-79 bytes (character string) - # Null separator 1 byte (null character) - # Compression method 1 byte (0) - # Compressed profile n bytes (zlib with deflate compression) - name = b"ICC Profile" - data = name + b"\0\0" + zlib.compress(icc) - chunk(fp, b"iCCP", data) - ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0)+im.size, 0, rawmode)]) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index cab0e01fa..fc6b07699 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -497,6 +497,25 @@ class TestFilePng(PillowTestCase): self.assertEqual(repr_png.format, 'PNG') self.assert_image_equal(im, repr_png) + def test_chunk_order(self): + im = Image.open("Tests/images/icc_profile.png") + test_file = self.tempfile("temp.png") + im.convert("P").save(test_file) + + chunks = [] + fp = open(test_file, "rb") + fp.read(8) + png = PngImagePlugin.PngStream(fp) + while True: + cid, pos, length = png.read() + chunks.append(cid) + try: + s = png.call(cid, pos, length) + except EOFError: + break + png.crc(cid, s) + self.assertLess(chunks.index(b"iCCP"), chunks.index(b"PLTE")) + if __name__ == '__main__': unittest.main() From ded14572a180142dd3c75fd55daf6d873255daf0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 21 Jan 2017 14:47:59 +1100 Subject: [PATCH 160/632] Added more tests for PNG chunk ordering --- Tests/test_file_png.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index fc6b07699..8af5afe2f 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -500,7 +500,7 @@ class TestFilePng(PillowTestCase): def test_chunk_order(self): im = Image.open("Tests/images/icc_profile.png") test_file = self.tempfile("temp.png") - im.convert("P").save(test_file) + im.convert("P").save(test_file, dpi=(100, 100)) chunks = [] fp = open(test_file, "rb") @@ -514,7 +514,20 @@ class TestFilePng(PillowTestCase): except EOFError: break png.crc(cid, s) + + # https://www.w3.org/TR/PNG/#5ChunkOrdering + # IHDR - shall be first + self.assertEqual(chunks.index(b"IHDR"), 0) + # PLTE - before first IDAT + self.assertLess(chunks.index(b"PLTE"), chunks.index(b"IDAT")) + # iCCP - before PLTE and IDAT self.assertLess(chunks.index(b"iCCP"), chunks.index(b"PLTE")) + self.assertLess(chunks.index(b"iCCP"), chunks.index(b"IDAT")) + # tRNS - after PLTE, before IDAT + self.assertGreater(chunks.index(b"tRNS"), chunks.index(b"PLTE")) + self.assertLess(chunks.index(b"tRNS"), chunks.index(b"IDAT")) + # pHYs - before IDAT + self.assertLess(chunks.index(b"pHYs"), chunks.index(b"IDAT")) if __name__ == '__main__': From f0480de118c36024094801fd98de9513c6ec4785 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 21 Jan 2017 16:57:03 +1100 Subject: [PATCH 161/632] Restricted PNG encoderinfo chunks to valid values when saving --- PIL/PngImagePlugin.py | 19 ++++++++++++++++++- Tests/test_file_png.py | 4 ++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index 486162a38..a633d4e54 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -715,6 +715,8 @@ def _save(im, fp, filename, chunk=putchunk, check=0): b'\0', # 11: filter category b'\0') # 12: interlace flag + chunks = [b"cHRM", b"gAMA", b"sBIT", b"sRGB", b"tIME"] + icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) if icc: # ICC profile @@ -726,6 +728,18 @@ def _save(im, fp, filename, chunk=putchunk, check=0): name = b"ICC Profile" data = name + b"\0\0" + zlib.compress(icc) chunk(fp, b"iCCP", data) + else: + chunks.remove(b"sRGB") + + info = im.encoderinfo.get("pnginfo") + if info: + chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"] + for cid, data in info.chunks: + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) + elif cid in chunks_multiple_allowed: + chunk(fp, cid, data) if im.mode == "P": palette_byte_number = (2 ** bits) * 3 @@ -773,8 +787,11 @@ def _save(im, fp, filename, chunk=putchunk, check=0): info = im.encoderinfo.get("pnginfo") if info: + chunks = [b"bKGD", b"hIST"] for cid, data in info.chunks: - chunk(fp, cid, data) + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0)+im.size, 0, rawmode)]) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 8af5afe2f..32d6a3acd 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -394,8 +394,8 @@ class TestFilePng(PillowTestCase): self.assertIsInstance(im.info["Text"], str) def test_unicode_text(self): - # Check preservation of non-ASCII characters on Python3 - # This cannot really be meaningfully tested on Python2, + # Check preservation of non-ASCII characters on Python 3 + # This cannot really be meaningfully tested on Python 2, # since it didn't preserve charsets to begin with. def rt_text(value): From 02e077aa480504977a5554e7181a13547c14938f Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 21 Jan 2017 02:21:58 -0800 Subject: [PATCH 162/632] run pep8/pyflakes on all non-docker builds --- .travis/after_success.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis/after_success.sh b/.travis/after_success.sh index 415224f48..136dbdc8e 100755 --- a/.travis/after_success.sh +++ b/.travis/after_success.sh @@ -13,14 +13,16 @@ coverage report pip install coveralls-merge coveralls-merge coverage.c.json -if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ] && [ "$DOCKER" == "" ]; then +if [ "$DOCKER" == "" ]; then pip install pep8 pyflakes pep8 --statistics --count PIL/*.py pep8 --statistics --count Tests/*.py pyflakes *.py | tee >(wc -l) pyflakes PIL/*.py | tee >(wc -l) pyflakes Tests/*.py | tee >(wc -l) +fi +if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ] && [ "$DOCKER" == "" ]; then # Coverage and quality reports on just the latest diff. # (Installation is very slow on Py3, so just do it for Py2.) depends/diffcover-install.sh From ca3f6a25f40f6c51d69c71f1206e337684a36ef8 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 17 Jan 2017 06:20:39 -0800 Subject: [PATCH 163/632] Applied patch: https://github.com/matplotlib/matplotlib/commit/a91559b82cf23ee407cd57580653015fc7dc35f0 to fix issue #1902 --- _imagingtk.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_imagingtk.c b/_imagingtk.c index 87de36a04..d0295f317 100644 --- a/_imagingtk.c +++ b/_imagingtk.c @@ -36,18 +36,18 @@ _tkinit(PyObject* self, PyObject* args) { Tcl_Interp* interp; - Py_ssize_t arg; + PyObject* arg; int is_interp; - if (!PyArg_ParseTuple(args, "ni", &arg, &is_interp)) + if (!PyArg_ParseTuple(args, "Oi", &arg, &is_interp)) return NULL; if (is_interp) - interp = (Tcl_Interp*) arg; + interp = (Tcl_Interp*)PyLong_AsVoidPtr(arg); else { TkappObject* app; /* Do it the hard way. This will break if the TkappObject layout changes */ - app = (TkappObject*) arg; + app = (TkappObject*)PyLong_AsVoidPtr(arg); interp = app->interp; } From e66271d46477cedca2ffb18a1206e3436f7710d8 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Tue, 24 Jan 2017 05:43:58 -0800 Subject: [PATCH 164/632] added tests for functionality in ImageTk --- Tests/test_imagetk.py | 63 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 7 deletions(-) diff --git a/Tests/test_imagetk.py b/Tests/test_imagetk.py index f56333a59..1d5a281a6 100644 --- a/Tests/test_imagetk.py +++ b/Tests/test_imagetk.py @@ -1,22 +1,29 @@ -from helper import unittest, PillowTestCase +from helper import unittest, PillowTestCase, hopper from PIL import Image + try: from PIL import ImageTk + import Tkinter as tk dir(ImageTk) + HAS_TK = True except (OSError, ImportError) as v: # Skipped via setUp() - pass - + HAS_TK = False + +TK_MODES = ('1', 'L', 'P', 'RGB', 'RGBA') class TestImageTk(PillowTestCase): def setUp(self): + if not HAS_TK: + self.skipTest("Tk not installed") try: - from PIL import ImageTk - dir(ImageTk) - except (OSError, ImportError) as v: - self.skipTest(v) + # setup tk + app = tk.Frame() + #root = tk.Tk() + except (tk.TclError) as v: + self.skipTest("TCL Error: %s" % v) def test_kw(self): TEST_JPG = "Tests/images/hopper.jpg" @@ -40,5 +47,47 @@ class TestImageTk(PillowTestCase): self.assertEqual(im, None) + def test_photoimage(self): + for mode in TK_MODES: + # test as image: + im = hopper(mode) + + # this should not crash + im_tk = ImageTk.PhotoImage(im) + + self.assertEqual(im_tk.width(), im.width) + self.assertEqual(im_tk.height(), im.height) + + # _tkinter.TclError: this function is not yet supported + #reloaded = ImageTk.getimage(im_tk) + #self.assert_image_equal(reloaded, im) + + + + def test_photoimage_blank(self): + # test a image using mode/size: + for mode in TK_MODES: + im_tk = ImageTk.PhotoImage(mode, (100,100)) + + self.assertEqual(im_tk.width(), 100) + self.assertEqual(im_tk.height(), 100) + + #reloaded = ImageTk.getimage(im_tk) + #self.assert_image_equal(reloaded, im) + + def test_bitmapimage(self): + im = hopper('1') + + # this should not crash + im_tk = ImageTk.BitmapImage(im) + + self.assertEqual(im_tk.width(), im.width) + self.assertEqual(im_tk.height(), im.height) + + #reloaded = ImageTk.getimage(im_tk) + #self.assert_image_equal(reloaded, im) + + + if __name__ == '__main__': unittest.main() From a69c37738ab5bf370e007f762272710a86a9bd5a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 26 Jan 2017 05:30:49 -0800 Subject: [PATCH 165/632] Look in a different location for the tk intepreter on pypy fixes #2376 --- PIL/ImageTk.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/PIL/ImageTk.py b/PIL/ImageTk.py index 25c4534ce..d0d6fa8fd 100644 --- a/PIL/ImageTk.py +++ b/PIL/ImageTk.py @@ -32,6 +32,13 @@ except ImportError: tkinter = Tkinter del Tkinter +# required for pypy, which always has cffi installed +try: + from cffi import FFI + ffi = FFI() +except ImportError: + pass + from . import Image from io import BytesIO @@ -184,7 +191,13 @@ class PhotoImage(object): try: from . import _imagingtk try: - _imagingtk.tkinit(tk.interpaddr(), 1) + if hasattr(tk, 'interp'): + # Pypy is using a ffi cdata element + # (Pdb) self.tk.interp + # + _imagingtk.tkinit(int(ffi.cast("uintptr_t", tk.interp)), 1) + else: + _imagingtk.tkinit(tk.interpaddr(), 1) except AttributeError: _imagingtk.tkinit(id(tk), 0) tk.call("PyImagingPhoto", self.__photo, block.id) From b4fbd36adb718488f4bfd7618d012c5db8f83565 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 26 Jan 2017 13:42:07 +0000 Subject: [PATCH 166/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 0816eabcc..7bd2adc97 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Tests: Added docker images for testing alternate platforms. See also https://github.com/python-pillow/docker-images. #2368 + [wiredfool] + - Removed PIL 1.0 era TK readme that concerns Windows 95/NT #2360 [wiredfool] From a71ba1a1c63678c701524203788bf2d3c733d1e5 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 26 Jan 2017 05:55:18 -0800 Subject: [PATCH 167/632] comments --- PIL/ImageTk.py | 2 ++ Tk/tkImaging.c | 7 ++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/PIL/ImageTk.py b/PIL/ImageTk.py index d0d6fa8fd..8c6d1a9c2 100644 --- a/PIL/ImageTk.py +++ b/PIL/ImageTk.py @@ -277,6 +277,8 @@ class BitmapImage(object): def getimage(photo): + """ This function is unimplemented """ + """Copies the contents of a PhotoImage to a PIL image memory.""" photo.tk.call("PyImagingPhotoGet", photo) diff --git a/Tk/tkImaging.c b/Tk/tkImaging.c index 6c612cfe9..f448be166 100644 --- a/Tk/tkImaging.c +++ b/Tk/tkImaging.c @@ -24,10 +24,7 @@ * This registers a Tcl command called "PyImagingPhoto", which is used * to communicate between PIL and Tk's PhotoImage handler. * - * Compile and link tkImaging.c with tkappinit.c and _tkinter (see the - * Setup file for details on how to use tkappinit.c). Note that - * _tkinter.c must be compiled with WITH_APPINIT. - * + * History: * 1995-09-12 fl Created * 1996-04-08 fl Ready for release @@ -169,7 +166,7 @@ PyImagingPhotoPut(ClientData clientdata, Tcl_Interp* interp, return TCL_OK; } - +/* Warning -- this does not work at all */ static int PyImagingPhotoGet(ClientData clientdata, Tcl_Interp* interp, int argc, const char **argv) From 74a29602e8ce00af086732f9ffd8dd5cb1181d29 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 26 Jan 2017 14:12:58 +0000 Subject: [PATCH 168/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 7bd2adc97..014aabd44 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Fixed segfault when using ImagingTk on pypy Issue #2376, #2359. + [wiredfool] + +- Fixed Integer overflow using ImagingTk on 32 bit platforms #2359 + [wiredfool, QuLogic] + - Tests: Added docker images for testing alternate platforms. See also https://github.com/python-pillow/docker-images. #2368 [wiredfool] From 54eedd81199f637fb29930b3f3947a13656644a3 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 26 Jan 2017 14:23:19 +0000 Subject: [PATCH 169/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 014aabd44..d5d05a954 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,10 +4,13 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ -- Fixed segfault when using ImagingTk on pypy Issue #2376, #2359. +- Default to inch-interpretation for missing ResolutionUnit in TiffImagePlugin #2365 + [lambdafu] + +- Bug: Fixed segfault when using ImagingTk on pypy Issue #2376, #2359. [wiredfool] -- Fixed Integer overflow using ImagingTk on 32 bit platforms #2359 +- Bug: Fixed Integer overflow using ImagingTk on 32 bit platforms #2359 [wiredfool, QuLogic] - Tests: Added docker images for testing alternate platforms. See also https://github.com/python-pillow/docker-images. #2368 From 851aa210df1956f7e55dec5d161be042bb9c26c6 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 26 Jan 2017 14:31:40 +0000 Subject: [PATCH 170/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index d5d05a954..8c5025758 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- PNG: Moved iCCP chunk before PLTE chunk when saving as PNG, restricted chunks known value/ordering #2347 + [radarhere] + - Default to inch-interpretation for missing ResolutionUnit in TiffImagePlugin #2365 [lambdafu] From cecdb2af61dc14b737299a15b7c86922b8a321d6 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Wed, 23 Nov 2016 17:48:56 -0800 Subject: [PATCH 171/632] Send unwanted subprocess output to /dev/null Avoids unnecessary creation of temporary files as well as unnecessarily storing process output in memory. The temporary files would sometimes remain and not be cleaned up. --- PIL/EpsImagePlugin.py | 13 +++++-------- PIL/GifImagePlugin.py | 11 +++++------ PIL/IcnsImagePlugin.py | 4 ++-- Tests/helper.py | 12 ++++++------ 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/PIL/EpsImagePlugin.py b/PIL/EpsImagePlugin.py index 8dd3e6857..a481a06b4 100644 --- a/PIL/EpsImagePlugin.py +++ b/PIL/EpsImagePlugin.py @@ -22,6 +22,7 @@ import re import io +import os import sys from . import Image, ImageFile from ._binary import i32le as i32, o32le as o32 @@ -57,8 +58,8 @@ def has_ghostscript(): if not sys.platform.startswith('win'): import subprocess try: - gs = subprocess.Popen(['gs', '--version'], stdout=subprocess.PIPE) - gs.stdout.read() + with open(os.devnull, 'wb') as devnull: + subprocess.check_call(['gs', '--version'], stdout=devnull) return True except OSError: # no ghostscript @@ -137,12 +138,8 @@ def Ghostscript(tile, size, fp, scale=1): # push data through ghostscript try: - gs = subprocess.Popen(command, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - gs.stdin.close() - status = gs.wait() - if status: - raise IOError("gs failed (status %d)" % status) + with open(os.devnull, 'w+b') as devnull: + subprocess.check_call(command, stdin=devnull, stdout=devnull) im = Image.open(outfile) im.load() finally: diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 2e519c7ac..bdda5c185 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -519,18 +519,17 @@ def _save_netpbm(im, fp, filename): with open(filename, 'wb') as f: if im.mode != "RGB": - with tempfile.TemporaryFile() as stderr: - check_call(["ppmtogif", file], stdout=f, stderr=stderr) + with open(os.devnull, 'wb') as devnull: + check_call(["ppmtogif", file], stdout=f, stderr=devnull) else: # Pipe ppmquant output into ppmtogif # "ppmquant 256 %s | ppmtogif > %s" % (file, filename) quant_cmd = ["ppmquant", "256", file] togif_cmd = ["ppmtogif"] - with tempfile.TemporaryFile() as stderr: - quant_proc = Popen(quant_cmd, stdout=PIPE, stderr=stderr) - with tempfile.TemporaryFile() as stderr: + with open(os.devnull, 'wb') as devnull: + quant_proc = Popen(quant_cmd, stdout=PIPE, stderr=devnull) togif_proc = Popen(togif_cmd, stdin=quant_proc.stdout, - stdout=f, stderr=stderr) + stdout=f, stderr=devnull) # Allow ppmquant to receive SIGPIPE if ppmtogif exits quant_proc.stdout.close() diff --git a/PIL/IcnsImagePlugin.py b/PIL/IcnsImagePlugin.py index cb215fe3e..5c5bd7cf9 100644 --- a/PIL/IcnsImagePlugin.py +++ b/PIL/IcnsImagePlugin.py @@ -329,8 +329,8 @@ def _save(im, fp, filename): from subprocess import Popen, PIPE, CalledProcessError convert_cmd = ["iconutil", "-c", "icns", "-o", filename, iconset] - with tempfile.TemporaryFile() as stderr: - convert_proc = Popen(convert_cmd, stdout=PIPE, stderr=stderr) + with open(os.devnull, 'wb') as devnull: + convert_proc = Popen(convert_cmd, stdout=PIPE, stderr=devnull) convert_proc.stdout.close() diff --git a/Tests/helper.py b/Tests/helper.py index f8eed3e2d..d596f51ec 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -218,25 +218,25 @@ def command_succeeds(cmd): command succeeds, or False if an OSError was raised by subprocess.Popen. """ import subprocess - with open(os.devnull, 'w') as f: + with open(os.devnull, 'wb') as f: try: - subprocess.Popen(cmd, stdout=f, stderr=subprocess.STDOUT).wait() + subprocess.call(cmd, stdout=f, stderr=subprocess.STDOUT) except OSError: return False return True def djpeg_available(): - return command_succeeds(['djpeg', '--help']) + return command_succeeds(['djpeg', '-version']) def cjpeg_available(): - return command_succeeds(['cjpeg', '--help']) + return command_succeeds(['cjpeg', '-version']) def netpbm_available(): - return (command_succeeds(["ppmquant", "--help"]) and - command_succeeds(["ppmtogif", "--help"])) + return (command_succeeds(["ppmquant", "--version"]) and + command_succeeds(["ppmtogif", "--version"])) def imagemagick_available(): From 581fef2ebd1bdc0ff09951a3d9e6250ac08420a7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 28 Jan 2017 13:06:28 +1100 Subject: [PATCH 172/632] Added test for Image offset NotImplementedError --- Tests/test_image.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Tests/test_image.py b/Tests/test_image.py index c79930e76..ae8dd7bf4 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -305,6 +305,13 @@ class TestImage(PillowTestCase): with self.assertRaises(ValueError): Image.core.fill('RGB', (2,-2), (0,0,0)) + def test_offset_not_implemented(self): + # Arrange + im = hopper() + + # Act / Assert + self.assertRaises(NotImplementedError, lambda: im.offset(None)) + if __name__ == '__main__': unittest.main() From e8495e59179f487a46c9aebfd0c40c05e907e471 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 28 Jan 2017 13:50:44 +1100 Subject: [PATCH 173/632] Added test for abbreviated Image paste mask syntax --- Tests/test_image_paste.py | 41 ++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/Tests/test_image_paste.py b/Tests/test_image_paste.py index 4450fd028..1b76c6609 100644 --- a/Tests/test_image_paste.py +++ b/Tests/test_image_paste.py @@ -28,6 +28,15 @@ class TestImagingPaste(PillowTestCase): ] self.assertEqual(actual, expected) + def assert_9points_paste(self, im, im2, mask, expected): + im3 = im.copy() + im3.paste(im2, (0, 0), mask) + self.assert_9points_image(im3, expected) + + # Abbreviated syntax + im.paste(im2, mask) + self.assert_9points_image(im, expected) + @cached_property def mask_1(self): mask = Image.new('1', (self.size, self.size)) @@ -91,9 +100,7 @@ class TestImagingPaste(PillowTestCase): im = Image.new(mode, (200, 200), 'white') im2 = getattr(self, 'gradient_' + mode) - im.paste(im2, (0, 0), self.mask_1) - - self.assert_9points_image(im, [ + self.assert_9points_paste(im, im2, self.mask_1, [ (255, 255, 255, 255), (255, 255, 255, 255), (127, 254, 127, 0), @@ -110,9 +117,7 @@ class TestImagingPaste(PillowTestCase): im = Image.new(mode, (200, 200), 'white') im2 = getattr(self, 'gradient_' + mode) - im.paste(im2, (0, 0), self.mask_L) - - self.assert_9points_image(im, [ + self.assert_9points_paste(im, im2, self.mask_L, [ (128, 191, 255, 191), (208, 239, 239, 208), (255, 255, 255, 255), @@ -129,9 +134,7 @@ class TestImagingPaste(PillowTestCase): im = Image.new(mode, (200, 200), 'white') im2 = getattr(self, 'gradient_' + mode) - im.paste(im2, (0, 0), self.gradient_RGBA) - - self.assert_9points_image(im, [ + self.assert_9points_paste(im, im2, self.gradient_RGBA, [ (128, 191, 255, 191), (208, 239, 239, 208), (255, 255, 255, 255), @@ -148,9 +151,7 @@ class TestImagingPaste(PillowTestCase): im = Image.new(mode, (200, 200), 'white') im2 = getattr(self, 'gradient_' + mode) - im.paste(im2, (0, 0), self.gradient_RGBa) - - self.assert_9points_image(im, [ + self.assert_9points_paste(im, im2, self.gradient_RGBa, [ (128, 255, 126, 255), (0, 127, 126, 255), (126, 253, 126, 255), @@ -180,9 +181,7 @@ class TestImagingPaste(PillowTestCase): im = Image.new(mode, (200, 200), (50, 60, 70, 80)[:len(mode)]) color = (10, 20, 30, 40)[:len(mode)] - im.paste(color, (0, 0), self.mask_1) - - self.assert_9points_image(im, [ + self.assert_9points_paste(im, color, self.mask_1, [ (50, 60, 70, 80), (50, 60, 70, 80), (10, 20, 30, 40), @@ -199,9 +198,7 @@ class TestImagingPaste(PillowTestCase): im = getattr(self, 'gradient_' + mode).copy() color = 'white' - im.paste(color, (0, 0), self.mask_L) - - self.assert_9points_image(im, [ + self.assert_9points_paste(im, color, self.mask_L, [ (127, 191, 254, 191), (111, 207, 206, 110), (127, 254, 127, 0), @@ -218,9 +215,7 @@ class TestImagingPaste(PillowTestCase): im = getattr(self, 'gradient_' + mode).copy() color = 'white' - im.paste(color, (0, 0), self.gradient_RGBA) - - self.assert_9points_image(im, [ + self.assert_9points_paste(im, color, self.gradient_RGBA, [ (127, 191, 254, 191), (111, 207, 206, 110), (127, 254, 127, 0), @@ -237,9 +232,7 @@ class TestImagingPaste(PillowTestCase): im = getattr(self, 'gradient_' + mode).copy() color = 'white' - im.paste(color, (0, 0), self.gradient_RGBa) - - self.assert_9points_image(im, [ + self.assert_9points_paste(im, color, self.gradient_RGBa, [ (255, 63, 126, 63), (47, 143, 142, 46), (126, 253, 126, 255), From 01cb6590a49c250f31912320921d957e7553b522 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 28 Jan 2017 14:02:22 +1100 Subject: [PATCH 174/632] Added test for point operation on F mode image --- Tests/test_image_point.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tests/test_image_point.py b/Tests/test_image_point.py index dd33b3632..a6d20daa4 100644 --- a/Tests/test_image_point.py +++ b/Tests/test_image_point.py @@ -35,6 +35,9 @@ class TestImagePoint(PillowTestCase): int_lut = [x//2 for x in range(256)] self.assert_image_equal(out.convert('L'), im.point(int_lut, 'L')) + def test_f_mode(self): + self.assertRaises(ValueError, lambda: hopper('F').point(None)) + if __name__ == '__main__': unittest.main() From 2039d43d854b0ec4e71b64cfc476004fac015479 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 28 Jan 2017 14:09:28 +1100 Subject: [PATCH 175/632] Added test for unknown filter in Image resize --- Tests/test_image_resize.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py index 38a60564c..de7b6abc3 100644 --- a/Tests/test_image_resize.py +++ b/Tests/test_image_resize.py @@ -97,6 +97,9 @@ class TestImagingCoreResize(PillowTestCase): self.assertEqual(r.size, (212, 195)) self.assertEqual(r.getdata()[0], (0,0,0)) + def test_unknown_filter(self): + self.assertRaises(ValueError, self.resize, hopper(), (10, 10), 9) + class TestImageResize(PillowTestCase): From cd114cef3f71ad3279f3ef947cda09268efe5225 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 28 Jan 2017 14:16:39 +1100 Subject: [PATCH 176/632] Added test for Image fromstring NotImplementedError --- Tests/test_image.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tests/test_image.py b/Tests/test_image.py index ae8dd7bf4..afeacb0a0 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -312,6 +312,9 @@ class TestImage(PillowTestCase): # Act / Assert self.assertRaises(NotImplementedError, lambda: im.offset(None)) + def test_fromstring(self): + self.assertRaises(NotImplementedError, Image.fromstring) + if __name__ == '__main__': unittest.main() From e67ee44ea816458ab16136809d88a5a9c7b5e179 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 28 Jan 2017 14:21:41 +1100 Subject: [PATCH 177/632] Added test for missing method data in Image transform --- Tests/test_image_transform.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index 16e2e4850..da254eaf6 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -140,6 +140,10 @@ class TestImageTransform(PillowTestCase): self.test_mesh() + def test_missing_method_data(self): + self.assertRaises(ValueError, lambda: + hopper().transform((100, 100), None)) + class TestImageTransformAffine(PillowTestCase): transform = Image.AFFINE From fa56b3d2558bc02ba9fad13892f2c87a4c4f6987 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarkko=20P=C3=B6yry?= Date: Sat, 28 Jan 2017 22:04:49 +0200 Subject: [PATCH 178/632] Add tests for CMS transform auxiliary channel preservation. See bug #1662. --- Tests/test_imagecms.py | 93 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index 136590667..a661ab24d 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -1,7 +1,7 @@ from helper import unittest, PillowTestCase, hopper import datetime -from PIL import Image +from PIL import Image, ImageMode from io import BytesIO import os @@ -332,6 +332,97 @@ class TestImageCms(PillowTestCase): with self.assertRaises(TypeError): ImageCms.ImageCmsProfile(1).tobytes() + def assert_aux_channel_preserved(self, mode, transform_in_place, preserved_channel): + def create_test_image(): + # set up test image with something interesting in the tested aux + # channel. + nine_grid_deltas = [ + (-1, -1), (-1, 0), (-1, 1), + ( 0, -1), ( 0, 0), ( 0, 1), + ( 1, -1), ( 1, 0), ( 1, 1), + ] + chans = [] + bands = ImageMode.getmode(mode).bands + for band_ndx, band in enumerate(bands): + channel_type = 'L' # 8-bit unorm + channel_pattern = hopper(channel_type) + + # paste pattern with varying offsets to avoid correlation + # potentially hiding some bugs (like channels getting mixed). + paste_offset = ( + int(band_ndx / float(len(bands)) * channel_pattern.size[0]), + int(band_ndx / float(len(bands) * 2) * channel_pattern.size[1]) + ) + channel_data = Image.new(channel_type, channel_pattern.size) + for delta in nine_grid_deltas: + channel_data.paste(channel_pattern, tuple(paste_offset[c] + delta[c]*channel_pattern.size[c] for c in range(2))) + chans.append(channel_data) + return Image.merge(mode, chans) + + source_image = create_test_image() + preserved_channel_ndx = source_image.getbands().index(preserved_channel) + source_image_aux = source_image.split()[preserved_channel_ndx] + + # create some transform, it doesn't matter which one + source_profile = ImageCms.createProfile("sRGB") + destination_profile = ImageCms.createProfile("sRGB") + t = ImageCms.buildTransform(source_profile, destination_profile, inMode=mode, outMode=mode) + + # apply transform + if transform_in_place: + ImageCms.applyTransform(source_image, t, inPlace=True) + result_image = source_image + else: + result_image = ImageCms.applyTransform(source_image, t, inPlace=False) + result_image_aux = result_image.split()[preserved_channel_ndx] + + self.assert_image_equal(source_image_aux, result_image_aux) + + def test_preserve_auxiliary_channels_rgba(self): + self.assert_aux_channel_preserved(mode='RGBA', transform_in_place=False, preserved_channel='A') + + def test_preserve_auxiliary_channels_rgba_in_place(self): + self.assert_aux_channel_preserved(mode='RGBA', transform_in_place=True, preserved_channel='A') + + def test_preserve_auxiliary_channels_rgbx(self): + self.assert_aux_channel_preserved(mode='RGBX', transform_in_place=False, preserved_channel='X') + + def test_preserve_auxiliary_channels_rgbx_in_place(self): + self.assert_aux_channel_preserved(mode='RGBX', transform_in_place=True, preserved_channel='X') + + def test_auxiliary_channels_isolated(self): + # test data in aux channels does not affect non-aux channels + aux_channel_formats = [ + # format, profile, color-only format, source test image + ('RGBA', 'sRGB', 'RGB', hopper('RGBA')), + ('RGBX', 'sRGB', 'RGB', hopper('RGBX')), + ('LAB', 'LAB', 'LAB', Image.open('Tests/images/hopper.Lab.tif')), + ] + for src_format in aux_channel_formats: + for dst_format in aux_channel_formats: + for transform_in_place in [True, False]: + # inplace only if format doesn't change + if transform_in_place and src_format[0] != dst_format[0]: + continue + + # convert with and without AUX data, test colors are equal + source_profile = ImageCms.createProfile(src_format[1]) + destination_profile = ImageCms.createProfile(dst_format[1]) + source_image = src_format[3] + test_transform = ImageCms.buildTransform(source_profile, destination_profile, inMode=src_format[0], outMode=dst_format[0]) + + # test conversion from aux-ful source + if transform_in_place: + test_image = source_image.copy() + ImageCms.applyTransform(test_image, test_transform, inPlace=True) + else: + test_image = ImageCms.applyTransform(source_image, test_transform, inPlace=False) + + # reference conversion from aux-less source + reference_transform = ImageCms.buildTransform(source_profile, destination_profile, inMode=src_format[2], outMode=dst_format[2]) + reference_image = ImageCms.applyTransform(source_image.convert(src_format[2]), reference_transform) + + self.assert_image_equal(test_image.convert(dst_format[2]), reference_image) if __name__ == '__main__': unittest.main() From 4a1ad8986f7f1e616ca34a2201316baa5a049116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarkko=20P=C3=B6yry?= Date: Sat, 28 Jan 2017 22:05:49 +0200 Subject: [PATCH 179/632] Preserve auxiliary channels during CMS transform. --- _imagingcms.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/_imagingcms.c b/_imagingcms.c index fe905f969..bc83183f7 100644 --- a/_imagingcms.c +++ b/_imagingcms.c @@ -291,6 +291,97 @@ findLCMStype(char* PILmode) } } +#define Cms_Min(a, b) ((a) < (b) ? (a) : (b)) + +static int +pyCMSgetAuxChannelChannel (cmsUInt32Number format, int auxChannelNdx) +{ + int numColors = T_CHANNELS(format); + int numExtras = T_EXTRA(format); + + if (T_SWAPFIRST(format) && T_DOSWAP(format)) { + // reverse order, before anything but last extra is shifted last + if (auxChannelNdx == numExtras - 1) + return numColors + numExtras - 1; + else + return numExtras - 2 - auxChannelNdx; + } + else if (T_SWAPFIRST(format)) { + // in order, after color channels, but last extra is shifted to first + if (auxChannelNdx == numExtras - 1) + return 0; + else + return numColors + 1 + auxChannelNdx; + } + else if (T_DOSWAP(format)) { + // reverse order, before anything + return numExtras - 1 - auxChannelNdx; + } + else { + // in order, after color channels + return numColors + auxChannelNdx; + } +} + +static void +pyCMScopyAux (cmsHTRANSFORM hTransform, Imaging imDst, const Imaging imSrc) +{ + cmsUInt32Number dstLCMSFormat; + cmsUInt32Number srcLCMSFormat; + int numSrcExtras; + int numDstExtras; + int numExtras; + int ySize; + int xSize; + int channelSize; + int srcChunkSize; + int dstChunkSize; + int e; + + // trivially copied + if (imDst == imSrc) + return; + + dstLCMSFormat = cmsGetTransformOutputFormat(hTransform); + srcLCMSFormat = cmsGetTransformInputFormat(hTransform); + + // currently, all Pillow formats are chunky formats, but check it anyway + if (T_PLANAR(dstLCMSFormat) || T_PLANAR(srcLCMSFormat)) + return; + + // copy only if channel format is identical, except OPTIMIZED is ignored as it + // does not affect the aux channel + if (T_FLOAT(dstLCMSFormat) != T_FLOAT(srcLCMSFormat) + || T_FLAVOR(dstLCMSFormat) != T_FLAVOR(srcLCMSFormat) + || T_ENDIAN16(dstLCMSFormat) != T_ENDIAN16(srcLCMSFormat) + || T_BYTES(dstLCMSFormat) != T_BYTES(srcLCMSFormat)) + return; + + numSrcExtras = T_EXTRA(srcLCMSFormat); + numDstExtras = T_EXTRA(dstLCMSFormat); + numExtras = Cms_Min(numSrcExtras, numDstExtras); + ySize = Cms_Min(imSrc->ysize, imDst->ysize); + xSize = Cms_Min(imSrc->xsize, imDst->xsize); + channelSize = T_BYTES(dstLCMSFormat); + srcChunkSize = (T_CHANNELS(srcLCMSFormat) + T_EXTRA(srcLCMSFormat)) * channelSize; + dstChunkSize = (T_CHANNELS(dstLCMSFormat) + T_EXTRA(dstLCMSFormat)) * channelSize; + + for (e = 0; e < numExtras; ++e) { + int y; + int dstChannel = pyCMSgetAuxChannelChannel(dstLCMSFormat, e); + int srcChannel = pyCMSgetAuxChannelChannel(srcLCMSFormat, e); + + for (y = 0; y < ySize; y++) { + int x; + char* pDstExtras = imDst->image[y] + dstChannel * channelSize; + const char* pSrcExtras = imSrc->image[y] + srcChannel * channelSize; + + for (x = 0; x < xSize; x++) + memcpy(pDstExtras + x * dstChunkSize, pSrcExtras + x * srcChunkSize, channelSize); + } + } +} + static int pyCMSdoTransform(Imaging im, Imaging imOut, cmsHTRANSFORM hTransform) { @@ -301,9 +392,19 @@ pyCMSdoTransform(Imaging im, Imaging imOut, cmsHTRANSFORM hTransform) Py_BEGIN_ALLOW_THREADS + // transform color channels only for (i = 0; i < im->ysize; i++) cmsDoTransform(hTransform, im->image[i], imOut->image[i], im->xsize); + // lcms by default does nothing to the auxiliary channels leaving those + // unchanged. To do "the right thing" here, i.e. maintain identical results + // with and without inPlace, we replicate those channels to the output. + // + // As of lcms 2.8, a new cmsFLAGS_COPY_ALPHA flag is introduced which would + // do the same thing automagically. Unfortunately, lcms2.8 is not yet widely + // enough available on all platforms, so we polyfill it here for now. + pyCMScopyAux(hTransform, imOut, im); + Py_END_ALLOW_THREADS return 0; From 3ffcd9770cef435e10b0a5890d36501d1153e729 Mon Sep 17 00:00:00 2001 From: Lukasz Kozuchowski Date: Sun, 29 Jan 2017 07:20:44 +0100 Subject: [PATCH 180/632] BUG fix: '' in image mode no longer causes a crash --- libImaging/Storage.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libImaging/Storage.c b/libImaging/Storage.c index 27661bfdb..fb27572d3 100644 --- a/libImaging/Storage.c +++ b/libImaging/Storage.c @@ -398,6 +398,9 @@ ImagingNew(const char* mode, int xsize, int ysize) int bytes; Imaging im; + if (strcmp(mode, "") == 0) + return (Imaging) ImagingError_ValueError("empty mode"); + if (strlen(mode) == 1) { if (mode[0] == 'F' || mode[0] == 'I') bytes = 4; From 3e317f3ca0aab1688f813a771885ce1f4fdb047a Mon Sep 17 00:00:00 2001 From: Lukasz Kozuchowski Date: Sun, 29 Jan 2017 07:50:28 +0100 Subject: [PATCH 181/632] Empty image mode test --- Tests/test_image.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/test_image.py b/Tests/test_image.py index c79930e76..bb2110632 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -29,6 +29,7 @@ class TestImage(PillowTestCase): self.assertEqual(im3.getcolors(), [(10000, 0)]) self.assertRaises(ValueError, lambda: Image.new("X", (100, 100))) + self.assertRaises(ValueError, lambda: Image.new("", (100, 100))) # self.assertRaises( # MemoryError, lambda: Image.new("L", (1000000, 1000000))) From 92c9e7255ec60706d2af4491f89ae63c1050d226 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 29 Jan 2017 13:38:54 +0200 Subject: [PATCH 182/632] [CI skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 8c5025758..66902e62c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Remove 'MIT-like' from license #2145 + [wiredfool] + +- Tests: Add tests for several Image operations #2379 + [radarhere] + - PNG: Moved iCCP chunk before PLTE chunk when saving as PNG, restricted chunks known value/ordering #2347 [radarhere] From cea36587ab209f00173cdd8716232fcc3673a868 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 29 Jan 2017 14:03:38 +0200 Subject: [PATCH 183/632] Test matrix convert --- Tests/test_image_convert.py | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 54ffde10b..6128dc9d9 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -20,10 +20,10 @@ class TestImageConvert(PillowTestCase): convert(im, mode) # Check 0 - im = Image.new(mode, (0,0)) + im = Image.new(mode, (0, 0)) for mode in modes: convert(im, mode) - + def test_default(self): im = hopper("P") @@ -137,6 +137,37 @@ class TestImageConvert(PillowTestCase): self.assert_image_similar(alpha, comparable, 5) + def test_matrix_illegal_conversion(self): + # Arrange + im = hopper('CMYK') + matrix = ( + 0.412453, 0.357580, 0.180423, 0, + 0.212671, 0.715160, 0.072169, 0, + 0.019334, 0.119193, 0.950227, 0) + self.assertNotEqual(im.mode, 'RGB') + + # Act / Assert + self.assertRaises(ValueError, + lambda: im.convert(mode='CMYK', matrix=matrix)) + + def test_matrix(self): + # Arrange + im = hopper('RGB') + matrix = ( + 0.412453, 0.357580, 0.180423, 0, + 0.212671, 0.715160, 0.072169, 0, + 0.019334, 0.119193, 0.950227, 0) + self.assertEqual(im.mode, 'RGB') + + # Act + # Convert an RGB image to the CIE XYZ colour space + converted_im = im.convert(mode='RGB', matrix=matrix) + + # Assert + self.assertEqual(converted_im.mode, 'RGB') + self.assertEqual(converted_im.size, im.size) + + if __name__ == '__main__': unittest.main() From 90dac5f4dc529bc60e94b387960dd0b5546eaa19 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 29 Jan 2017 14:24:49 +0200 Subject: [PATCH 184/632] Refactor and test matrix convert with RGB and L modes --- Tests/test_image_convert.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 6128dc9d9..170b174ad 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -150,23 +150,27 @@ class TestImageConvert(PillowTestCase): self.assertRaises(ValueError, lambda: im.convert(mode='CMYK', matrix=matrix)) - def test_matrix(self): - # Arrange - im = hopper('RGB') - matrix = ( - 0.412453, 0.357580, 0.180423, 0, - 0.212671, 0.715160, 0.072169, 0, - 0.019334, 0.119193, 0.950227, 0) - self.assertEqual(im.mode, 'RGB') + def test_matrix_rgb(self): - # Act - # Convert an RGB image to the CIE XYZ colour space - converted_im = im.convert(mode='RGB', matrix=matrix) + def matrix_convert(mode): + # Arrange + im = hopper('RGB') + matrix = ( + 0.412453, 0.357580, 0.180423, 0, + 0.212671, 0.715160, 0.072169, 0, + 0.019334, 0.119193, 0.950227, 0) + self.assertEqual(im.mode, 'RGB') - # Assert - self.assertEqual(converted_im.mode, 'RGB') - self.assertEqual(converted_im.size, im.size) + # Act + # Convert an RGB image to the CIE XYZ colour space + converted_im = im.convert(mode=mode, matrix=matrix) + # Assert + self.assertEqual(converted_im.mode, mode) + self.assertEqual(converted_im.size, im.size) + + matrix_convert('RGB') + matrix_convert('L') if __name__ == '__main__': From fdf0737fcd601942c6f7b8d5ced559796cce7636 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 29 Jan 2017 15:55:17 +0200 Subject: [PATCH 185/632] Test matrix convert for ValueError: image has wrong mode --- Tests/test_image_convert.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 170b174ad..512a86491 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -150,6 +150,19 @@ class TestImageConvert(PillowTestCase): self.assertRaises(ValueError, lambda: im.convert(mode='CMYK', matrix=matrix)) + def test_matrix_wrong_mode(self): + # Arrange + im = hopper('L') + matrix = ( + 0.412453, 0.357580, 0.180423, 0, + 0.212671, 0.715160, 0.072169, 0, + 0.019334, 0.119193, 0.950227, 0) + self.assertEqual(im.mode, 'L') + + # Act / Assert + self.assertRaises(ValueError, + lambda: im.convert(mode='L', matrix=matrix)) + def test_matrix_rgb(self): def matrix_convert(mode): From 47b1c66961c979bb9b52255a6233f837bca2635d Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 29 Jan 2017 18:17:31 +0200 Subject: [PATCH 186/632] Expose and test linear_gradient --- PIL/Image.py | 9 +++++++++ Tests/images/linear_gradient_L.png | Bin 0 -> 516 bytes Tests/images/linear_gradient_P.png | Bin 0 -> 1480 bytes Tests/test_image.py | 26 ++++++++++++++++++++++++++ 4 files changed, 35 insertions(+) create mode 100644 Tests/images/linear_gradient_L.png create mode 100644 Tests/images/linear_gradient_P.png diff --git a/PIL/Image.py b/PIL/Image.py index dbe916df1..119cc2b08 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -2558,3 +2558,12 @@ def effect_noise(size, sigma): :param sigma: Standard deviation of noise. """ return Image()._new(core.effect_noise(size, sigma)) + + +def linear_gradient(mode): + """ + Generate 256x256 linear gradient from black to white, top to bottom. + + :param mode: Input mode. + """ + return Image()._new(core.linear_gradient(mode)) diff --git a/Tests/images/linear_gradient_L.png b/Tests/images/linear_gradient_L.png new file mode 100644 index 0000000000000000000000000000000000000000..7b02227ce8a52adad4664333b66c78b633a5f6e4 GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5890C>L#5>RT|mxhPZ!6KiaBpDIPx+m@Ekax zdvJg1ghKu(*0X18?ya*sFqh#Aqh7-(F{s1fKI6An%y*b&Ke2w# literal 0 HcmV?d00001 diff --git a/Tests/images/linear_gradient_P.png b/Tests/images/linear_gradient_P.png new file mode 100644 index 0000000000000000000000000000000000000000..ee9b35e37a14330cce473dc0f167068779137043 GIT binary patch literal 1480 zcmYk6_g~H51IKSeC6W-~7`g8^A(7c3yS$5}xFfr|?cI?SMcvzy9LhK$^BN(kB-vTL zj}@8ObUVqGk*xao{`P%5UXRD~`FQ>Tuhkyzf|+R#Q;9@k=IY`!TO!f>r+N|-gMSDu z@RCU+1`-c9ne+duo}RwGzJY;(p`l@$Hf@ZIjEs$qO-xMMwry)_YTB+{yY}tdo0*w) z=+MF3+`MDQjusXcojP^u+_`g?E?q1wExUH@+O1nRD=Vw+-Mjbb(W7V2o&bPey?XWT z-MdepK7IT4wYIkI*RP*cD&;ti=lTBq`wti}z{bXA;J|@{1`QfKc(ARl?T{fu?Ck7@ z4jnpd*f4v0`{Bcfj~FpxOqein z;>1alCQY6^dCHV2Q>RXKa&mHZcAhqEnji=+E-tRFuG6PapD|;Go15FrnKRwp-Dl03 z<>BGs>FGIp_Ut)x=E!6+xm>PLD3nU2mzUSvxpU{un>T;{`~?dZEL^y7(V|6*7cchq z_V)4d@%8mpsZ@S`e*XUc0RaJlfq_9mLBYYnAt525p`l@6Vd3H75fKrQk&#hRQPI)S z2%#lQmc+!wEM2-ZHa2$IvSo2`aq;o-%a<=-v0_C+LPBC<;>wjPSFKu=l$4a5oUB%> zH5yGyN=j;KYFb)adU|?BM#k#Zt1~k**Q{BSm6f%2?OKfSx^?T;uV0^?ot=}Dvth%A zjT<*^+O%o&=FNnV+}zwPTefW7x^>&OZFzZl+qZAuv17;1ojZ5!+O>Q4?mc_N>LOkrB|{)|_3PJf+_-V`=FO_As#~{i-M)Rhy1M$#ojZ5$-o1D4 z-u?UcA3S*Q@ZrOnnwm$C9zA~i_{ozePoF-0_Uzg7=g(ifc=7V(%U7>n)z;SPbh^5_ zI>uOief{g#uNxW~-n@D9_U+qu@7}$C|Ng^=4>UGvNepsHPS&?2QbGGzC~Q6J7{{7pa8;N1+rVRRar_ z!3lnF54DivAml`(X~3Rk@In}@r4~vYhb|LoGHA(&KCId4T z#0e_6l~&7e02)cOsbB~T;)PK7m{u!rEGi{h4d}%hI3W<8qSbO7fnta@9gJrUybuY0 z(P|}LiM|n45-?y^oahbHsJ#sPp!P(S0;J4}7lU9WwO8P1ltol((3$0Oq95E(?d3Qa zxe-+w7{PLRF$~sIdnJxXH;5`3v}0bJ=nFT~Vj1>FwnUW*1~V^S41o`5u>vne1w^F* zJy{JW2EZ~}EXUy}jHuGVI99`p5wM9CD{&%vPjpGZm^pBw55zQDhE)gdvmki8V94D&a4%#Tg zfyj~QQo&Fb$BUuxIc-$nW#|miX+R&=%!z^U9Bq{2NR&Wy>0lyj=EX?ZLK~HM6>8Pf XHl?H3czvUPmn?C0c6TbA;;sG<^8vdU literal 0 HcmV?d00001 diff --git a/Tests/test_image.py b/Tests/test_image.py index afeacb0a0..a261584c0 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -315,6 +315,32 @@ class TestImage(PillowTestCase): def test_fromstring(self): self.assertRaises(NotImplementedError, Image.fromstring) + def test_linear_gradient_wrong_mode(self): + # Arrange + wrong_mode = "RGB" + + # Act / Assert + self.assertRaises(ValueError, + lambda: Image.linear_gradient(wrong_mode)) + return + + def test_linear_gradient(self): + + # Arrange + for mode in ["L", "P"]: + + # Act + im = Image.linear_gradient(mode) + + # Assert + self.assertEqual(im.size, (256, 256)) + self.assertEqual(im.mode, mode) + self.assertEqual(im.getpixel((0, 0)), 0) + self.assertEqual(im.getpixel((255, 255)), 255) + im2 = Image.open('Tests/images/linear_gradient_{}.png'.format( + mode)) + self.assert_image_equal(im, im2) + if __name__ == '__main__': unittest.main() From 3ead178d18dab9a6dd74adde6ba1b5ab39b9b9a9 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 29 Jan 2017 18:38:06 +0200 Subject: [PATCH 187/632] flake8 --- PIL/Image.py | 45 +++++++++++++++++++++++++++------------------ Tests/test_image.py | 11 ++++++----- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 119cc2b08..682fa6056 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -144,6 +144,7 @@ def isImageType(t): """ return hasattr(t, "im") + # # Constants (also defined in _imagingmodule.c!) @@ -339,6 +340,7 @@ def getmodebands(mode): """ return len(ImageMode.getmode(mode).bands) + # -------------------------------------------------------------------- # Helpers @@ -691,8 +693,8 @@ class Image(object): return b"".join(data) def tostring(self, *args, **kw): - raise NotImplementedError("tostring() has been removed. " + - "Please call tobytes() instead.") + raise NotImplementedError("tostring() has been removed. " + "Please call tobytes() instead.") def tobitmap(self, name="image"): """ @@ -742,8 +744,8 @@ class Image(object): raise ValueError("cannot decode image data") def fromstring(self, *args, **kw): - raise NotImplementedError("fromstring() has been removed. " + - "Please call frombytes() instead.") + raise NotImplementedError("fromstring() has been removed. " + "Please call frombytes() instead.") def load(self): """ @@ -879,7 +881,7 @@ class Image(object): try: t = trns_im.palette.getcolor(t) except: - raise ValueError("Couldn't allocate a palette " + + raise ValueError("Couldn't allocate a palette " "color for transparency") trns_im.putpixel((0, 0), t) @@ -1034,8 +1036,7 @@ class Image(object): if y1 < y0: y1 = y0 - return self._new(self.im.crop(( x0, y0, x1, y1))) - + return self._new(self.im.crop((x0, y0, x1, y1))) def draft(self, mode, size): """ @@ -1254,8 +1255,8 @@ class Image(object): return self.im.histogram() def offset(self, xoffset, yoffset=None): - raise NotImplementedError("offset() has been removed. " + - "Please call ImageChops.offset() instead.") + raise NotImplementedError("offset() has been removed. " + "Please call ImageChops.offset() instead.") def paste(self, im, box=None, mask=None): """ @@ -1553,7 +1554,8 @@ class Image(object): return self._new(self.im.resize(size, resample)) - def rotate(self, angle, resample=NEAREST, expand=0, center=None, translate=None): + def rotate(self, angle, resample=NEAREST, expand=0, center=None, + translate=None): """ Returns a rotated copy of this image. This method returns a copy of this image, rotated the given number of degrees counter @@ -1622,10 +1624,13 @@ class Image(object): round(math.cos(angle), 15), round(math.sin(angle), 15), 0.0, round(-math.sin(angle), 15), round(math.cos(angle), 15), 0.0 ] + def transform(x, y, matrix): (a, b, c, d, e, f) = matrix return a*x + b*y + c, d*x + e*y + f - matrix[2], matrix[5] = transform(-center[0] - translate[0], -center[1] - translate[1], matrix) + + matrix[2], matrix[5] = transform(-center[0] - translate[0], + -center[1] - translate[1], matrix) matrix[2] += center[0] matrix[5] += center[1] @@ -1641,9 +1646,11 @@ class Image(object): nh = int(math.ceil(max(yy)) - math.floor(min(yy))) # We multiply a translation matrix from the right. Because of its - # special form, this is the same as taking the image of the translation vector - # as new translation vector. - matrix[2], matrix[5] = transform(-(nw - w) / 2.0, -(nh - h) / 2.0, matrix) + # special form, this is the same as taking the image of the + # translation vector as new translation vector. + matrix[2], matrix[5] = transform(-(nw - w) / 2.0, + -(nh - h) / 2.0, + matrix) w, h = nw, nh return self.transform((w, h), AFFINE, matrix, resample) @@ -1759,8 +1766,8 @@ class Image(object): PPM file, and calls either the **xv** utility or the **display** utility, depending on which one can be found. - On macOS, this method saves the image to a temporary BMP file, and opens - it with the native Preview application. + On macOS, this method saves the image to a temporary BMP file, and + opens it with the native Preview application. On Windows, it saves the image to a temporary BMP file, and uses the standard BMP display utility to show it (usually Paint). @@ -1988,7 +1995,6 @@ class Image(object): return ImageQt.toqpixmap(self) - # -------------------------------------------------------------------- # Abstract handlers. @@ -2013,6 +2019,7 @@ def _wedge(): return Image()._new(core.wedge("L")) + def _check_size(size): """ Common check to enforce type and sanity check on size tuples @@ -2030,6 +2037,7 @@ def _check_size(size): return True + def new(mode, size, color=0): """ Creates a new image with the given mode and size. @@ -2101,7 +2109,7 @@ def frombytes(mode, size, data, decoder_name="raw", *args): def fromstring(*args, **kw): raise NotImplementedError("fromstring() has been removed. " + - "Please call frombytes() instead.") + "Please call frombytes() instead.") def frombuffer(mode, size, data, decoder_name="raw", *args): @@ -2230,6 +2238,7 @@ def fromqpixmap(im): raise ImportError("Qt bindings are not installed") return ImageQt.fromqpixmap(im) + _fromarray_typemap = { # (shape, typestr) => mode, rawmode # first two members of shape are set to one diff --git a/Tests/test_image.py b/Tests/test_image.py index a261584c0..d345ee5da 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -279,21 +279,22 @@ class TestImage(PillowTestCase): self.assert_image_similar(im2, im3, 110) def test_check_size(self): - # Checking that the _check_size function throws value errors when we want it to. + # Checking that the _check_size function throws value errors + # when we want it to. with self.assertRaises(ValueError): Image.new('RGB', 0) # not a tuple with self.assertRaises(ValueError): Image.new('RGB', (0,)) # Tuple too short with self.assertRaises(ValueError): - Image.new('RGB', (-1,-1)) # w,h < 0 + Image.new('RGB', (-1, -1)) # w,h < 0 # this should pass with 0 sized images, #2259 im = Image.new('L', (0, 0)) self.assertEqual(im.size, (0, 0)) - self.assertTrue(Image.new('RGB', (1,1))) + self.assertTrue(Image.new('RGB', (1, 1))) # Should pass lists too - i = Image.new('RGB', [1,1]) + i = Image.new('RGB', [1, 1]) self.assertIsInstance(i.size, tuple) def test_storage_neg(self): @@ -303,7 +304,7 @@ class TestImage(PillowTestCase): # Storage.c, rather than the size check above with self.assertRaises(ValueError): - Image.core.fill('RGB', (2,-2), (0,0,0)) + Image.core.fill('RGB', (2, -2), (0, 0, 0)) def test_offset_not_implemented(self): # Arrange From 07af06bf8c1a72799e691f5f30fe7b9c92e8f858 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 29 Jan 2017 18:44:24 +0200 Subject: [PATCH 188/632] Expose and test radial_gradient --- PIL/Image.py | 9 +++++++++ Tests/images/radial_gradient_L.png | Bin 0 -> 6540 bytes Tests/images/radial_gradient_P.png | Bin 0 -> 11927 bytes Tests/test_image.py | 26 ++++++++++++++++++++++++++ 4 files changed, 35 insertions(+) create mode 100644 Tests/images/radial_gradient_L.png create mode 100644 Tests/images/radial_gradient_P.png diff --git a/PIL/Image.py b/PIL/Image.py index 682fa6056..ed1d10907 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -2576,3 +2576,12 @@ def linear_gradient(mode): :param mode: Input mode. """ return Image()._new(core.linear_gradient(mode)) + + +def radial_gradient(mode): + """ + Generate 256x256 radial gradient from black to white, centre to edge. + + :param mode: Input mode. + """ + return Image()._new(core.radial_gradient(mode)) diff --git a/Tests/images/radial_gradient_L.png b/Tests/images/radial_gradient_L.png new file mode 100644 index 0000000000000000000000000000000000000000..95309d7c097c2babd136bf7cf2e7452acc4f2024 GIT binary patch literal 6540 zcmWkzcT`i^*L^K7FAV|&2t`QfC<>v81xP4@pn`~s1qtP+sHoUcN?sBWP{Ck9Y!DSk zX2!u-Q4sS$1T3R*Y^W$fMa4!yga9G=`2M-;taa{L_pW`O0ARIfZkQlG>*Tc+8?w)O(YKC%G#Ea92;#q={%SMyZNuRw zwc(eYW^H>pt)3_uH2RZKa&h0Mp#DjT+sa<6ZkXBRtl#pq^;G9lG>eqBsr2c%t z(|fXITE84O@i&*`IInIWc(g0vQPS6J!0rZ5Ujf_!Hd!?mZc@$CQE#8=p0UgwDE=Yv zz4T!6)_(K6MZ3OIV^g{8s*51P$Is+gOn+JPkh0iq+Me$pJB5)0~M(l+2B{C&q5-WZZa6BKKoC zXBD9P#@akO!EH@Qaf>W%rVPPR3#9R07>3@ik2KsETMYtv?hy}*+-|Q0w(I;LU%1VsC^Yk#eZJgH=?@rcLmR}(NJ1!Q z!Uy3~Qn_*IN3(_+nyD4+0TCJv3G_pw&f(P#OcWa+dU zYzU2G;@4Ij!DnMz&EiLeog{O(1(k#P*+3nJv1^VAr;2aU2A*nI4;?!0#ykmsVh%rN zw>!zd$B2PQ7tRfqo1#j6J};NROTg8FjH}3Dl!(JU(VCzDc{r#jQT|?E1+w!uhO5JY zF?pKcfFR|)Rm@s1z{rMUvan(F_g?XQv-tl)}OL3hX%jFxG3zI|9?>~b|&2&tU_D`h2oJB4FQ3Zc|Y z3y9+<0LGxbdiqv^0;i^a?vAoQ*)QrlpQ<9xpBEm?CToA#X5QzgK{9C&(jNy*LwZ;b zhdnh7Gt`dg`-O70M97US1K+8u9(4Cv36084 zVy0Z(FUksSo9(lip;h!}ZkUAG1{?;i28t-*O!!N2@;l#$&9o2(XhJ5$%%A<4;AN zPgc*;`M_SVIrShLcfm$Ex7o~#kUz?quE%saf&9tIo>T@r6OA>J1Yr%FLyj{!Yjq@R zp)QasuO-*G%}xW_h~-c%?LKl9&FGQ@I&w*arjfC{eFSz`DM@s zwSB+m$C#u4;vd`|vH=T)DL+x=fg}Up)#M@9Q=q5`_YwC==Rs^K!PM~d*;DzxkL|*{ zgW%zB?nV}8V*}8#W*wMkB%bqfC9Q(vweUt8KSL4*b@%Xdr=FbK(dPNS@4De6d_(_7 zxxJS<0xSm(5s9$}1oyVfb9Jlq&%S)UybDD4*t}rn^VIXy&P1YWzaRwq1H91v)VYtV zUn`E0aEit0EYl+`smxU-@kp#fWVV5cHmyhJ(S?-#Gs9Dvj(H_r9fpGsl3B=`h3vaT zu4N>Li7Q#{6I}KD5VKDH#Lq>r%wV|?W8-J}))M-=n5H$_YvarGt&q2J8`IWXoys|g zV*(%4-T4;b`Q3Bp>*vMmW1_Gqii@!Yy@P#Y8DN?P9lrpu&lv%m(@T}>wi>D(_4eAT^jjWo8X1_d3QT?E?aVx~Zwy~y>CBEnlV<+wx3(0EAEj-3l zSsc7UbR8eD@U=z6C7>@gz$o4lS?5XSr-@t*uSmCm3#H2c0nx+`!3?CvT>}J{E5Ac$ zwFg1|9U6*~=Ri{ADe3%pZ?tZS{s2;s|J*>(+XHHN!W7P-i6j?t11b}mA6t%Z=sl;i zx1JfQBz7{9S#-8pMNqqK4KFgs%>$Ab1z!!80fp*H#&s*E3*Q}RqPuDZ@Zhm}v{qw-0hI*njOrD`` zl{mmOik8<-2e<3w{f@l{2A=w{n8lpypu4*hJ-`g0;Jlh!^!x|63kD-bmVv7f4`8~r zn@#l()d`_YLx>hs{t?y_qWBN&S#0bn>e6l>IRZ_K%r{i}#%FNY3Kt<|Wi$NAvHJ*k za{SlLm*q+BIMW2D{E=J;CPU8P2Qd%5cQ?tzkZ)%kSgTtCUcw-o@7~Nveurx{b$`LOY_Ip(J?bON(Zkf0C=Gd9lKL| z{(&(|Rz$qwqXMxw0a`~tzWCyYrCUYbgEt1A{=R@#U7W&kxGY(>mq!Xh|3F+40?E<- zkoL^DxwR5q@P6Hgm5fzKLw>wfC#ZbW9E51=8;rd2DZGwbL6(;&)9)2-kFo5VLb~vl z^A9Iqaap`y%!Qbe6t3GdlLw;Ks)L4V?u$ToQY87X!;{b5-q=dInt52nz1@28M_-S9 z%e!$u_7^B;KH_xD%iqmQbIXD*cz3v;Hgd7hZp1J03pU|uMYp3DkY{Y)Lfl)=HN=ff zqD&Hd4uu~o^foGYk(sJeV}a~u*Cn^hMCWv+$QyKhSxti5Ug9{hM;@sU1CHs=)*d}5 z5Apg1S~Qh1u2QOz<9K6XRgdw5s+z7n^46rHu(SdOdKekBy;ZDSnKxfj$H#(-!=9UG zEXt?X*v50+cx$xh$2WYq*jl+-K1=te3=4}*A@-=ZP#=AISJLrxIIvY|UR(~&6Z?sW zaD#6`lWV?#Gvo{BR_?tWToiV!xD5N*_79TZdj}AX*^F#zv-@*w0ou3A>FXuVY9gAC zai~DRaOK^~OF&grk4cBq8p8$M4UNT&l4(LcIPl4u~DvlqQZCFU2?(?Nt%=5wxjgkxk6aQ#WuT#NFcPBy)Pt zru!2}d7J3GyoF8hyog?DdO(zwjLT+#@_x%yV=D0%v6}B8mPWEdGU@dCJ!I{L*?G=} zE#JEzZarc2q)pZ6yq{Hp1zNP2Mh1cE)|hV{51fo;!6zzDUrcC@0_hQaB!wmCp}VND z9}c8mblKI=J7e^m^GO!Vg!LLvqoNFAdLAo#*NLQ!IoOLV>|Cb61fi?UB$*iDb8(T# z0l)7;Z)!|$cQ7G0{h|$j!%d2QDEBs=c_saKGGgo@h(b;?K27QDV30!eg71@}-feur zy|ID9ELNe8Nac)<59A(W*UsFJk3S8gxvh87QcaVsv^&QeYCn%v{VE(y96!EF?CGCq zVyG{=GHsTl8{vSRCJhT`(Pr?J?ZaSR_Y~l^?}9 zNvwq4GrM@|o5yO&uAP>Cb>uv&3`xYWN4LY1BDHsq>mvQlu``|Q7rE-C1-b3gBNB@y zWxw;s7?+_^^-ICHe{$6?xx;2}P2cDmP0~Pb71#Jr?MP?@+22FZiq14Kax#3?iMkyd z4*!f4hieXyyzEA#TU=Eapfg>O_MMgmmV#@VY}d;A~J5GDw#_nXp zQlc>J2KmRH2g+%~_NP*X;`=|$yl3nBx~4TYa)6b0-t5x6yZYjI(BSx+bJJr8`%~ee zCpPb^)I^-;Zc<)MQoI@$KDE;-3nk^jjYE6LpY0OVw!Zf5-CIWrv2qrxt1jntST*Km zu{Bq?SUdL3gy@^@o^|^#&uiHm*~b?X;DhH+Hw@6;4lcUBD`1u($!Kk^@VqANe%I^1 zmkAR};p&tEc;WuD${wFpj-UU!E@)~AzU>6lSLyT-v$bcH<6WHQvK zZ#=UI#ZP$PAltw#ouz14``(bISv)mlsq)Kgy~X31M{foEUZ!7t->_)- zA#MTge)~Af>*(Fb>-DU>cXj=OJswK4PmYxN^tC3k@@AW8VC&#ZdCAAOYbt)7on+{J zIX?0-@rA`+VsEdb`|K0?83Pj`x_MKYMIy-BN43&v_rAuDroU z;WjT-v`I&#(^k>_P|^Aw30bjuYYc51x_m9_V1mTSL#d+|S}%Q+DqkH-G;TNWh_rJc zdYF-qW$v7PJ!}S&dhbp1-@$7n1NLZE2H{7dW7_=N@0O=blAya{vxY6_ozXE3j=*y= z6XqlBp!=I6 zLVL6*iAQ`Z4lr$6?)3Te3Pst+xn~$Do2r9m1^;L0C}o~B#jIrhu?|=cKdnZyR>enK z4(==#=I7Yn2 z6KFk=^hK8}U+1_F<$Q?IJf7aeOarUw9hdm~INwSIlZTEB(k`tzG*N|+fdc{$u@gFv znRe&Na_Z=9n|q{-#8DAm~h1v;09?Ja*Q>Y8&hp>9yC>CC;Iia8aRwN zm=(Eonl!~x1IzT2hfWS|9gE&v!b{&HSMXbKW2h;_&oq=4KRW5>?&bPRv(<|uFEfHN3Q8is zpSa|z*wo%-CB*po>a!1=;bMjiTT&MA8Q=c>-ay~IE-SnmIEn1AlBsA8s<THYmw})5H+@|;KDR>Hgx3jtJcK4ib(tF!vj;nF?ldv1rhb~%kq>XPZ=a`$ zPg1aUAROp9y7r&!6M2jD=40OgS%#c>QnQrDM8pr8&)MvDAIkh-*-q1*2lIgpY#rs9 zRi=Mrn6OzjSr|B&KH~ZQaeU(P2@&-b{+q2?n7$#_RJ@q)J?J*_@_h_R{*^Qb=p>u# zOkscQDr1R5EVaGRj*|FVDM^YFc7*6l8V=z_;>qyW5!2n1C9B*-8x5v;CO{NWYr;1B z?gdDN?$8pvIM6e9_VBdVT`gT5nqS)sD66qEbJ%9`*U3USnG};B3w+-lFtVj!6I|N*mPUK@6aIH5p1S&&w2x1f*0bO*#+`T#2#eMtS|wv!7E(#rlz4>KV_s4&DsM@0n8+G06+A;Khq(-4tf!N zdsurOY0sB`0*1xL?4m1*)bGSdp>|F82VVPJqC!oA%NP{}Ptc_U7u%{R{Pln{uuBkj zAfy8cM(u5P1}BoimMoM1PJl^3MYBt8JrN+ zycVJ?stXfBBY z9Iswg(C9Zf3jg$XP|BJvJqP&XXE(e0C6vyZSu75~w9fgY$a_g|43qM#013U5lxTla zz1=2YHHRwM*kj+?Wu*VSY8B-em;?Jj0@&bwA$-=o~z1NB8F;~#b znIC5%beBb{ebFd^Ds)6i7&By4Ad2JPGzGoNsPxxP*S-RT^mX*IWo#7UZESAdXRu$>dU%BmAcJ6pQYJS$uUY@}bd3~OH4o`%Z^6b_D@Sf}XJt=gY6)`N~P~Rws!-b?=qP zRUZpH`Y;exWG`(ky61E@NPF1+F8`F+gW6Cv_U`@XuZOZczDRU--EK&P_%WOPAh}do zqFu`1+d?RwDqBY5Q!dO`wBdV0%0Sot&u}bCge{nOyDq3S*z#e->EKkkfsuFon(JvvHLX6#%>$UHnFObp<`f%7 z1hHOkV_HOom(3(|sovV7^!+pkXlUrUeS_;Bpn=&*6{yHK;(z?KeQ^LX{Y{neEfugE z>%as@;I0bd+8ry&iGd^puV=ZLWx66ygEW=mOHU1ml5bxsNS_KgG2136T{A6nf0C^u zSGIp`9Az|K%(;IG!Q0vTk#o`J$Sl1J|;XVal>NR6))ih{cF&QVO^n#V&b~# zn#Xkd{LDwhN?MLYRKs79<}E~oU5_F;K21C6+ky^A^{)N2mTJ0JqXhCsuUmaF z`|Xlvj{C;0gE1Pbo`W^56+c5Rve`&RiKu%0KQN!oUruZjOo(KSpWcbYh5evUPHCTU z)66%(Hb7rvCaiBuHcg%;8?yknQ(ckD_0 zXYhW&g3ErN)JCkD;%2J0;b4FS<$ztDq}rQny8p)7=WF(et-)kCUfT%9W5l%dCrh0a zX~H&SqB9LE9%6&HjUB-Dt|P-w+<-Pd8^eoIPmAR6dmg}{ksZNl< z0n|IeA|J&&(t}(@x@0E29x~O<1YAb@bvg8qO(#o2Cc{$mCJ>H>w&(`devK-cPyEl4 z9?Faaj;m#2a}d<`hpq;K5hNNsy+>}moJK4pc8INE8pMAcZMp?cNBNe%eT`qG=4M4p zVpBP;@?A2UgrA>8;wu#G`JcX5~PCZkY#>28Upd*t03D3NFa6r=j2=X wi=kcg3+y7yOZx%XPnVSlo-^n5i&_W~ucq6{(sCeH+(@@ZHQ3ve>{>DZ~y=R literal 0 HcmV?d00001 diff --git a/Tests/images/radial_gradient_P.png b/Tests/images/radial_gradient_P.png new file mode 100644 index 0000000000000000000000000000000000000000..1990749cc87543bf80f689543b3992112997f468 GIT binary patch literal 11927 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 K7ZrH3c>fQtTtG1Z literal 0 HcmV?d00001 diff --git a/Tests/test_image.py b/Tests/test_image.py index d345ee5da..9034de720 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -342,6 +342,32 @@ class TestImage(PillowTestCase): mode)) self.assert_image_equal(im, im2) + def test_radial_gradient_wrong_mode(self): + # Arrange + wrong_mode = "RGB" + + # Act / Assert + self.assertRaises(ValueError, + lambda: Image.radial_gradient(wrong_mode)) + return + + def test_radial_gradient(self): + + # Arrange + for mode in ["L", "P"]: + + # Act + im = Image.radial_gradient(mode) + + # Assert + self.assertEqual(im.size, (256, 256)) + self.assertEqual(im.mode, mode) + self.assertEqual(im.getpixel((0, 0)), 255) + self.assertEqual(im.getpixel((128, 128)), 0) + im2 = Image.open('Tests/images/radial_gradient_{}.png'.format( + mode)) + self.assert_image_equal(im, im2) + if __name__ == '__main__': unittest.main() From 05aa252f9ff14e9f455e828a991937fb6c1920fc Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 29 Jan 2017 18:50:30 +0200 Subject: [PATCH 189/632] Tabs to spaces and add defensive brackets --- libImaging/Fill.c | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/libImaging/Fill.c b/libImaging/Fill.c index 1e8dbf9d8..15107b6d6 100644 --- a/libImaging/Fill.c +++ b/libImaging/Fill.c @@ -64,15 +64,18 @@ ImagingFillLinearGradient(const char *mode) Imaging im; int y; - if (strlen(mode) != 1) - return (Imaging) ImagingError_ModeError(); + if (strlen(mode) != 1) { + return (Imaging) ImagingError_ModeError(); + } im = ImagingNew(mode, 256, 256); - if (!im) - return NULL; + if (!im) { + return NULL; + } - for (y = 0; y < 256; y++) - memset(im->image8[y], (unsigned char) y, 256); + for (y = 0; y < 256; y++) { + memset(im->image8[y], (unsigned char) y, 256); + } return im; } @@ -84,21 +87,25 @@ ImagingFillRadialGradient(const char *mode) int x, y; int d; - if (strlen(mode) != 1) - return (Imaging) ImagingError_ModeError(); + if (strlen(mode) != 1) { + return (Imaging) ImagingError_ModeError(); + } im = ImagingNew(mode, 256, 256); - if (!im) - return NULL; + if (!im) { + return NULL; + } - for (y = 0; y < 256; y++) - for (x = 0; x < 256; x++) { - d = (int) sqrt((double) ((x-128)*(x-128) + (y-128)*(y-128)) * 2.0); - if (d >= 255) - im->image8[y][x] = 255; - else - im->image8[y][x] = d; - } + for (y = 0; y < 256; y++) { + for (x = 0; x < 256; x++) { + d = (int) sqrt((double) ((x-128)*(x-128) + (y-128)*(y-128)) * 2.0); + if (d >= 255) { + im->image8[y][x] = 255; + } else { + im->image8[y][x] = d; + } + } + } return im; } From 5e5eb9b2f4a2c0d912ad67c52af3a42c3fcfd810 Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 30 Jan 2017 08:53:09 +0200 Subject: [PATCH 190/632] Fix syntax error --- .travis/after_success.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis/after_success.sh b/.travis/after_success.sh index 136dbdc8e..906ade61b 100755 --- a/.travis/after_success.sh +++ b/.travis/after_success.sh @@ -44,3 +44,4 @@ if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "mas echo "Some jobs failed" fi fi +fi From bb129c4cae209f2ace4ff4baf12233b1fea5ca76 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 30 Jan 2017 19:51:28 +1100 Subject: [PATCH 191/632] Exclude .travis and contents from manifest --- MANIFEST.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index f6a1488f0..09f0a133e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -23,6 +23,8 @@ prune docs/_static exclude .coveragerc exclude .editorconfig exclude .landscape.yaml +exclude .travis +exclude .travis/* exclude appveyor.yml exclude build_children.sh exclude tox.ini From 7068e645ae1f2107b471f8c1456b94e5f8e92300 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 30 Jan 2017 11:30:10 +0000 Subject: [PATCH 192/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 66902e62c..3a451bbf6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Exclude .travis and contents from manifest #2386 + [radarhere] + - Remove 'MIT-like' from license #2145 [wiredfool] From 7fba16b07450a110eaf363cdb805c3d34b8549dd Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 30 Jan 2017 14:27:29 +0200 Subject: [PATCH 193/632] Test for similarity --- Tests/test_image_convert.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 512a86491..5da593e59 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -163,7 +163,7 @@ class TestImageConvert(PillowTestCase): self.assertRaises(ValueError, lambda: im.convert(mode='L', matrix=matrix)) - def test_matrix_rgb(self): + def test_matrix_xyz(self): def matrix_convert(mode): # Arrange @@ -181,6 +181,8 @@ class TestImageConvert(PillowTestCase): # Assert self.assertEqual(converted_im.mode, mode) self.assertEqual(converted_im.size, im.size) + if converted_im.mode == 'RGB': + self.assert_image_similar(converted_im, im, 33) matrix_convert('RGB') matrix_convert('L') From 04e3f585b036cbecaaca0be00213dd173f248f96 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 30 Jan 2017 14:28:00 +0200 Subject: [PATCH 194/632] Test no change with identity matrix --- Tests/test_image_convert.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 5da593e59..011f23bf8 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -187,6 +187,23 @@ class TestImageConvert(PillowTestCase): matrix_convert('RGB') matrix_convert('L') + def test_matrix_identity(self): + # Arrange + im = hopper('RGB') + identity_matrix = ( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0) + self.assertEqual(im.mode, 'RGB') + + # Act + # Convert with an identity matrix + converted_im = im.convert(mode='RGB', matrix=identity_matrix) + + # Assert + # No change + self.assert_image_equal(converted_im, im) + if __name__ == '__main__': unittest.main() From 008431fe0e6b9489fa8f2553802834b831519bb0 Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 30 Jan 2017 21:50:48 +0200 Subject: [PATCH 195/632] Test ImageDraw.Outline curve --- Tests/images/imagedraw_outline_curve.png | Bin 0 -> 454 bytes Tests/test_imagedraw.py | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 Tests/images/imagedraw_outline_curve.png diff --git a/Tests/images/imagedraw_outline_curve.png b/Tests/images/imagedraw_outline_curve.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9f3b412c23ef5c92aed7a7d00b3aef154f3dd4 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^DImCx#Z@9pUYxJ`R!FQcNfaocU`_;%jln^b0DH&W5fGb&-cB~+u4`J+imVJ zomGO{Kr8_$bHM7_gYENMLwO-W8w5`uzxHH*^J%7S$(HNRGU;*O=)L-B$G3CuHZ=sS zF*`15vGp_)U(!~ybssAGr(gA3e|YjQBbG%;TMgFDFfMy>|NHts_x=Bf+&KNAR@hlR z>GZ6<2}zvhb{`r4f9YHrTmNWNTL0`DGjG>?TYPx4TG^+p^Lp7~KaXs>b0ue^nyA|8 z9e>YkoR-HE{^DVP!L=ukQe5XRJi1>x?k8WsuX54&YhK?L##S1y>k}1t5pj}zN>|d= q^ZU~ok1_SYz0e;E2EwA-7tm=^=%hr!d;&t;ucLK6TIhq{aa literal 0 HcmV?d00001 diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 6f92ac3a0..fd4c3a104 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -172,6 +172,28 @@ class TestImageDraw(PillowTestCase): def test_line2(self): self.helper_line(POINTS2) + def test_outline_curve(self): + # Arrange + im = Image.new("RGB", (100, 100), "white") + draw = ImageDraw.Draw(im) + x0, y0 = 5, 5 + x1, y1 = 5, 50 + x2, y2 = 95, 50 + x3, y3 = 95, 5 + + # Act + s = ImageDraw.Outline() + s.move(x0, y0) + s.curve(x1, y1, x2, y2, x3, y3) + s.line(x0, y0) + + draw.shape(s, fill=1) + del draw + + # Assert + self.assert_image_equal( + im, Image.open("Tests/images/imagedraw_outline_curve.png")) + def helper_pieslice(self, bbox, start, end): # Arrange im = Image.new("RGB", (W, H)) From 96dfd722c32bfc5c49f02639d89caca1e256cb87 Mon Sep 17 00:00:00 2001 From: hugovk Date: Tue, 31 Jan 2017 08:22:33 +0200 Subject: [PATCH 196/632] Test ImageDraw.Outline curve --- ...outline_curve.png => imagedraw_shape1.png} | Bin Tests/images/imagedraw_shape2.png | Bin 0 -> 459 bytes Tests/test_imagedraw.py | 26 ++++++++++++++++-- 3 files changed, 24 insertions(+), 2 deletions(-) rename Tests/images/{imagedraw_outline_curve.png => imagedraw_shape1.png} (100%) create mode 100644 Tests/images/imagedraw_shape2.png diff --git a/Tests/images/imagedraw_outline_curve.png b/Tests/images/imagedraw_shape1.png similarity index 100% rename from Tests/images/imagedraw_outline_curve.png rename to Tests/images/imagedraw_shape1.png diff --git a/Tests/images/imagedraw_shape2.png b/Tests/images/imagedraw_shape2.png new file mode 100644 index 0000000000000000000000000000000000000000..daf0303133080ab9770ea71230241b8ec89c852e GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^DImqb78PxC@AZ)6LT3pmz2y-mCByp~qz&%IoFtJN+)^5yn@ zleWga;hN~LoO^9oIWF&#-d@HWw%OOOgb0Vi_NJL-DUXt{}W##EA`Cy&eB+t`T8$)!S_SDU1wK^`97`E{8*bv<2wuzB%q2VLR%&C}#$$6rGv2?^i_@% literal 0 HcmV?d00001 diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index fd4c3a104..cd6519709 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -172,7 +172,7 @@ class TestImageDraw(PillowTestCase): def test_line2(self): self.helper_line(POINTS2) - def test_outline_curve(self): + def test_shape1(self): # Arrange im = Image.new("RGB", (100, 100), "white") draw = ImageDraw.Draw(im) @@ -192,7 +192,29 @@ class TestImageDraw(PillowTestCase): # Assert self.assert_image_equal( - im, Image.open("Tests/images/imagedraw_outline_curve.png")) + im, Image.open("Tests/images/imagedraw_shape1.png")) + + def test_shape2(self): + # Arrange + im = Image.new("RGB", (100, 100), "white") + draw = ImageDraw.Draw(im) + x0, y0 = 95, 95 + x1, y1 = 95, 50 + x2, y2 = 5, 50 + x3, y3 = 5, 95 + + # Act + s = ImageDraw.Outline() + s.move(x0, y0) + s.curve(x1, y1, x2, y2, x3, y3) + s.line(x0, y0) + + draw.shape(s, outline="blue") + del draw + + # Assert + self.assert_image_equal( + im, Image.open("Tests/images/imagedraw_shape2.png")) def helper_pieslice(self, bbox, start, end): # Arrange From 997bcb269bf740abbdc7e3a84c7aea08b96f3f34 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 31 Jan 2017 19:04:30 +0000 Subject: [PATCH 197/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3a451bbf6..33d92ac84 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- BUG: '' in image mode no longer causes a crash #2380 + [evalapply] + - Exclude .travis and contents from manifest #2386 [radarhere] From 973d1cfb3d79b1190afa995eabaf118f6e3ffde5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 5 Feb 2017 14:45:55 +1100 Subject: [PATCH 198/632] Added PySide to ImageQt documentation [ci skip] --- docs/reference/ImageQt.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/reference/ImageQt.rst b/docs/reference/ImageQt.rst index e63fd99fe..7bc426eec 100644 --- a/docs/reference/ImageQt.rst +++ b/docs/reference/ImageQt.rst @@ -4,8 +4,8 @@ :py:mod:`ImageQt` Module ======================== -The :py:mod:`ImageQt` module contains support for creating PyQt4 or PyQt5 QImage objects -from PIL images. +The :py:mod:`ImageQt` module contains support for creating PyQt4, PyQt5 or +PySide QImage objects from PIL images. .. versionadded:: 1.1.6 @@ -14,7 +14,7 @@ from PIL images. Creates an :py:class:`~PIL.ImageQt.ImageQt` object from a PIL :py:class:`~PIL.Image.Image` object. This class is a subclass of QtGui.QImage, which means that you can pass the resulting objects directly - to PyQt4/5 API functions and methods. + to PyQt4/PyQt5/PySide API functions and methods. This operation is currently supported for mode 1, L, P, RGB, and RGBA images. To handle other modes, you need to convert the image first. From 88d7c6f09d79cf8849131351b97c5c86f66094d4 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 6 Feb 2017 17:00:31 +0000 Subject: [PATCH 199/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 33d92ac84..49c09c4d5 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,14 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ -- BUG: '' in image mode no longer causes a crash #2380 + +- Test ImageDraw.Outline and and ImageDraw.Shape #2389 + [hugovk] + +- Added PySide to ImageQt documentation #2392 + [radarhere] + +- BUG: Empty image mode no longer causes a crash #2380 [evalapply] - Exclude .travis and contents from manifest #2386 From d7fe8d1eb70e912c1028ddcedee6f778f0175313 Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 6 Feb 2017 22:03:17 +0200 Subject: [PATCH 200/632] Linear and radial gradient: only need one target image --- ...inear_gradient_L.png => linear_gradient.png} | Bin Tests/images/linear_gradient_P.png | Bin 1480 -> 0 bytes ...adial_gradient_L.png => radial_gradient.png} | Bin Tests/images/radial_gradient_P.png | Bin 11927 -> 0 bytes Tests/test_image.py | 12 ++++++------ 5 files changed, 6 insertions(+), 6 deletions(-) rename Tests/images/{linear_gradient_L.png => linear_gradient.png} (100%) delete mode 100644 Tests/images/linear_gradient_P.png rename Tests/images/{radial_gradient_L.png => radial_gradient.png} (100%) delete mode 100644 Tests/images/radial_gradient_P.png diff --git a/Tests/images/linear_gradient_L.png b/Tests/images/linear_gradient.png similarity index 100% rename from Tests/images/linear_gradient_L.png rename to Tests/images/linear_gradient.png diff --git a/Tests/images/linear_gradient_P.png b/Tests/images/linear_gradient_P.png deleted file mode 100644 index ee9b35e37a14330cce473dc0f167068779137043..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1480 zcmYk6_g~H51IKSeC6W-~7`g8^A(7c3yS$5}xFfr|?cI?SMcvzy9LhK$^BN(kB-vTL zj}@8ObUVqGk*xao{`P%5UXRD~`FQ>Tuhkyzf|+R#Q;9@k=IY`!TO!f>r+N|-gMSDu z@RCU+1`-c9ne+duo}RwGzJY;(p`l@$Hf@ZIjEs$qO-xMMwry)_YTB+{yY}tdo0*w) z=+MF3+`MDQjusXcojP^u+_`g?E?q1wExUH@+O1nRD=Vw+-Mjbb(W7V2o&bPey?XWT z-MdepK7IT4wYIkI*RP*cD&;ti=lTBq`wti}z{bXA;J|@{1`QfKc(ARl?T{fu?Ck7@ z4jnpd*f4v0`{Bcfj~FpxOqein z;>1alCQY6^dCHV2Q>RXKa&mHZcAhqEnji=+E-tRFuG6PapD|;Go15FrnKRwp-Dl03 z<>BGs>FGIp_Ut)x=E!6+xm>PLD3nU2mzUSvxpU{un>T;{`~?dZEL^y7(V|6*7cchq z_V)4d@%8mpsZ@S`e*XUc0RaJlfq_9mLBYYnAt525p`l@6Vd3H75fKrQk&#hRQPI)S z2%#lQmc+!wEM2-ZHa2$IvSo2`aq;o-%a<=-v0_C+LPBC<;>wjPSFKu=l$4a5oUB%> zH5yGyN=j;KYFb)adU|?BM#k#Zt1~k**Q{BSm6f%2?OKfSx^?T;uV0^?ot=}Dvth%A zjT<*^+O%o&=FNnV+}zwPTefW7x^>&OZFzZl+qZAuv17;1ojZ5!+O>Q4?mc_N>LOkrB|{)|_3PJf+_-V`=FO_As#~{i-M)Rhy1M$#ojZ5$-o1D4 z-u?UcA3S*Q@ZrOnnwm$C9zA~i_{ozePoF-0_Uzg7=g(ifc=7V(%U7>n)z;SPbh^5_ zI>uOief{g#uNxW~-n@D9_U+qu@7}$C|Ng^=4>UGvNepsHPS&?2QbGGzC~Q6J7{{7pa8;N1+rVRRar_ z!3lnF54DivAml`(X~3Rk@In}@r4~vYhb|LoGHA(&KCId4T z#0e_6l~&7e02)cOsbB~T;)PK7m{u!rEGi{h4d}%hI3W<8qSbO7fnta@9gJrUybuY0 z(P|}LiM|n45-?y^oahbHsJ#sPp!P(S0;J4}7lU9WwO8P1ltol((3$0Oq95E(?d3Qa zxe-+w7{PLRF$~sIdnJxXH;5`3v}0bJ=nFT~Vj1>FwnUW*1~V^S41o`5u>vne1w^F* zJy{JW2EZ~}EXUy}jHuGVI99`p5wM9CD{&%vPjpGZm^pBw55zQDhE)gdvmki8V94D&a4%#Tg zfyj~QQo&Fb$BUuxIc-$nW#|miX+R&=%!z^U9Bq{2NR&Wy>0lyj=EX?ZLK~HM6>8Pf XHl?H3czvUPmn?C0c6TbA;;sG<^8vdU diff --git a/Tests/images/radial_gradient_L.png b/Tests/images/radial_gradient.png similarity index 100% rename from Tests/images/radial_gradient_L.png rename to Tests/images/radial_gradient.png diff --git a/Tests/images/radial_gradient_P.png b/Tests/images/radial_gradient_P.png deleted file mode 100644 index 1990749cc87543bf80f689543b3992112997f468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11927 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 K7ZrH3c>fQtTtG1Z diff --git a/Tests/test_image.py b/Tests/test_image.py index 9034de720..64efe28ca 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -328,6 +328,7 @@ class TestImage(PillowTestCase): def test_linear_gradient(self): # Arrange + target_file = "Tests/images/linear_gradient.png" for mode in ["L", "P"]: # Act @@ -338,9 +339,8 @@ class TestImage(PillowTestCase): self.assertEqual(im.mode, mode) self.assertEqual(im.getpixel((0, 0)), 0) self.assertEqual(im.getpixel((255, 255)), 255) - im2 = Image.open('Tests/images/linear_gradient_{}.png'.format( - mode)) - self.assert_image_equal(im, im2) + target = Image.open(target_file).convert(mode) + self.assert_image_equal(im, target) def test_radial_gradient_wrong_mode(self): # Arrange @@ -354,6 +354,7 @@ class TestImage(PillowTestCase): def test_radial_gradient(self): # Arrange + target_file = "Tests/images/radial_gradient.png" for mode in ["L", "P"]: # Act @@ -364,9 +365,8 @@ class TestImage(PillowTestCase): self.assertEqual(im.mode, mode) self.assertEqual(im.getpixel((0, 0)), 255) self.assertEqual(im.getpixel((128, 128)), 0) - im2 = Image.open('Tests/images/radial_gradient_{}.png'.format( - mode)) - self.assert_image_equal(im, im2) + target = Image.open(target_file).convert(mode) + self.assert_image_equal(im, target) if __name__ == '__main__': From 2d271e23746bf79aeeb6ab6a7ba6d900b87f155d Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 6 Feb 2017 21:59:34 +0000 Subject: [PATCH 201/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 49c09c4d5..a5f97174a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,8 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Test linear and radial gradient effects #2382 + [hugovk] - Test ImageDraw.Outline and and ImageDraw.Shape #2389 [hugovk] From 70ef34eda8fbcb5e431b80d608d18838e07be70d Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Tue, 7 Feb 2017 03:18:46 -0800 Subject: [PATCH 202/632] added additional docker builds, removed nightly --- .travis.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 34f37b611..20d1ef5bd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,22 +9,21 @@ notifications: matrix: fast_finish: true - allow_failures: - - python: nightly include: - python: "pypy" - python: "pypy3" - python: '3.6' - python: '2.7' - env: DOCKER="alpine" + - env: DOCKER="arch" # contains PyQt5 - env: DOCKER="ubuntu-trusty-x86" - env: DOCKER="ubuntu-xenial-amd64" - - env: DOCKER="ubuntu-precise-amd64" + - env: DOCKER="ubuntu-precise-amd64" + - env: DOCKER="debian-stretch-x86" - python: "2.7_with_system_site_packages" # For PyQt4 - python: '3.5' - python: '3.4' - python: '3.3' - - python: 'nightly' dist: trusty From 0f9233623e20599166581e7d63762e8052e29187 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 7 Feb 2017 19:39:40 +0000 Subject: [PATCH 203/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index a5f97174a..b6f8fa4e6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Preserve aux/alpha channels when performing Imagecms transforms #2355 + [gunjambi] + - Test linear and radial gradient effects #2382 [hugovk] From 75ca512c02bbeff08f5c14f04bdacabebee88332 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 9 Feb 2017 19:14:25 +1100 Subject: [PATCH 204/632] Updated libwebp to 0.6.0 --- depends/install_webp.sh | 2 +- winbuild/config.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/depends/install_webp.sh b/depends/install_webp.sh index 8f700901c..9993254a6 100755 --- a/depends/install_webp.sh +++ b/depends/install_webp.sh @@ -1,7 +1,7 @@ #!/bin/bash # install webp -archive=libwebp-0.5.2 +archive=libwebp-0.6.0 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz diff --git a/winbuild/config.py b/winbuild/config.py index 6e927d2fb..735d8e6d3 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -75,10 +75,10 @@ libs = { 'version': '8.6.6', }, 'webp': { - 'url': 'http://downloads.webmproject.org/releases/webp/libwebp-0.5.2.tar.gz', - 'filename': PILLOW_DEPENDS_DIR + 'libwebp-0.5.2.tar.gz', - 'hash': 'sha1:c3adfa47f96a3909fb05e41636fdcbe3826edfbd', - 'dir': 'libwebp-0.5.2', + 'url': 'http://downloads.webmproject.org/releases/webp/libwebp-0.6.0.tar.gz', + 'filename': PILLOW_DEPENDS_DIR + 'libwebp-0.6.0.tar.gz', + 'hash': 'sha1:156d24fff454bfccd1f44434e226a10d9eb38186', + 'dir': 'libwebp-0.6.0', }, 'openjpeg': { 'url': SF_MIRROR+'/project/openjpeg/openjpeg/2.1.2/openjpeg-2.1.2.tar.gz', From 63d0a5a3267d6fdea8dca0d8ab2320cc58132690 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 11 Feb 2017 12:47:10 +1100 Subject: [PATCH 205/632] Added anchor to readthedocs URL --- Tests/test_psdraw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_psdraw.py b/Tests/test_psdraw.py index 50e8763e2..17fa3662b 100644 --- a/Tests/test_psdraw.py +++ b/Tests/test_psdraw.py @@ -31,7 +31,7 @@ class TestPsDraw(PillowTestCase): def test_draw_postscript(self): # Based on Pillow tutorial, but there is no textsize: - # https://pillow.readthedocs.io/en/latest/handbook/tutorial.html + # https://pillow.readthedocs.io/en/latest/handbook/tutorial.html#drawing-postscript # Arrange tempfile = self.tempfile('temp.ps') From 53e570255761645b4c0b65e5287df7374e0ec361 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 14 Feb 2017 11:27:02 +0200 Subject: [PATCH 206/632] Update http to https --- CHANGES.rst | 24 ++++++++++++------------ PIL/SpiderImagePlugin.py | 4 ++-- PIL/SunImagePlugin.py | 2 +- PIL/WalImageFile.py | 2 +- Tests/test_image.py | 2 +- Tests/test_numpy.py | 2 +- _imagingcms.c | 4 ++-- docs/_templates/sidebarhelp.html | 2 +- docs/handbook/image-file-formats.rst | 6 +++--- docs/installation.rst | 2 +- libImaging/SunRleDecode.c | 16 ++++++++-------- mp_compile.py | 2 +- setup.py | 4 ++-- winbuild/config.py | 2 +- 14 files changed, 37 insertions(+), 37 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index b6f8fa4e6..4acbabdfa 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -6,7 +6,7 @@ Changelog (Pillow) - Preserve aux/alpha channels when performing Imagecms transforms #2355 [gunjambi] - + - Test linear and radial gradient effects #2382 [hugovk] @@ -18,10 +18,10 @@ Changelog (Pillow) - BUG: Empty image mode no longer causes a crash #2380 [evalapply] - + - Exclude .travis and contents from manifest #2386 [radarhere] - + - Remove 'MIT-like' from license #2145 [wiredfool] @@ -42,19 +42,19 @@ Changelog (Pillow) - Tests: Added docker images for testing alternate platforms. See also https://github.com/python-pillow/docker-images. #2368 [wiredfool] - + - Removed PIL 1.0 era TK readme that concerns Windows 95/NT #2360 [wiredfool] - Prevent `nose -v` printing docstrings #2369 [hugovk] - + - Replaced absolute PIL imports with relative imports #2349 [radarhere] - Added context managers for file handling #2307 [radarhere] - + - Expose registered file extensions in Image #2343 [iggomez, radarhere] @@ -81,16 +81,16 @@ Changelog (Pillow) - Add center and translate option to Image.rotate. #2328 [lambdafu] - + - Test: Relax WMF test condition, fixes #2323 - [wiredfool] + [wiredfool] - Allow 0 size images, Fixes #2259, Reverts to pre-3.4 behavior. [wiredfool] - + - SGI: Save uncompressed SGI/BW/RGB/RGBA files #2325 [jbltx] - + - Depends: Updated pngquant to 2.8.2 #2319 [radarhere] @@ -1983,7 +1983,7 @@ Changelog (Pillow) - Use PyCapsule for py3.1 #238 (fixes #237) [wiredfool] -- Workaround for: http://bugs.python.org/issue16754 in 3.2.x < 3.2.4 and 3.3.0. +- Workaround for: https://bugs.python.org/issue16754 in 3.2.x < 3.2.4 and 3.3.0. 2.0.0 (2013-03-15) ------------------ @@ -2132,7 +2132,7 @@ Changelog (Pillow) ---------------- - 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 `_ +- Forked PIL based on `Hanno Schlichting's re-packaging `_ [aclark4life] Pre-fork diff --git a/PIL/SpiderImagePlugin.py b/PIL/SpiderImagePlugin.py index aa332bf02..f26775ed8 100644 --- a/PIL/SpiderImagePlugin.py +++ b/PIL/SpiderImagePlugin.py @@ -27,10 +27,10 @@ # image data from electron microscopy and tomography. # # Spider home page: -# http://spider.wadsworth.org/spider_doc/spider/docs/spider.html +# https://spider.wadsworth.org/spider_doc/spider/docs/spider.html # # Details about the Spider image format: -# http://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html +# https://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html # from __future__ import print_function diff --git a/PIL/SunImagePlugin.py b/PIL/SunImagePlugin.py index 876fb73fa..eb25caffc 100644 --- a/PIL/SunImagePlugin.py +++ b/PIL/SunImagePlugin.py @@ -118,7 +118,7 @@ class SunImageFile(ImageFile.ImageFile): # RGB looks similar to standard, but RGB byte order # TIFF and IFF mean that they were converted from T/IFF # Experimental means that it's something else. - # (http://www.fileformat.info/format/sunraster/egff.htm) + # (https://www.fileformat.info/format/sunraster/egff.htm) if file_type in (0, 1, 3, 4, 5): self.tile = [("raw", (0, 0)+self.size, offset, (rawmode, stride))] diff --git a/PIL/WalImageFile.py b/PIL/WalImageFile.py index a17238a5a..ff1598926 100644 --- a/PIL/WalImageFile.py +++ b/PIL/WalImageFile.py @@ -18,7 +18,7 @@ # the WalImageFile.open() function instead. # This reader is based on the specification available from: -# http://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml +# https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml # and has been tested with a few sample files found using google. from __future__ import print_function diff --git a/Tests/test_image.py b/Tests/test_image.py index 659bcc757..1bdbd3960 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -168,7 +168,7 @@ class TestImage(PillowTestCase): self.assertTrue(im1 != im2) def test_alpha_composite(self): - # http://stackoverflow.com/questions/3374878 + # https://stackoverflow.com/questions/3374878 # Arrange from PIL import ImageDraw diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 8a530ce1b..01b02c9e5 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -100,7 +100,7 @@ class TestNumpy(PillowTestCase): self.assert_image(to_image(numpy.uint8, 4), "RGBA", (10, 10)) # based on an erring example at - # http://stackoverflow.com/questions/10854903/what-is-causing-dimension-dependent-attributeerror-in-pil-fromarray-function + # https://stackoverflow.com/questions/10854903/what-is-causing-dimension-dependent-attributeerror-in-pil-fromarray-function def test_3d_array(self): size = (5, TEST_IMAGE_SIZE[0], TEST_IMAGE_SIZE[1]) a = numpy.ones(size, dtype=numpy.uint8) diff --git a/_imagingcms.c b/_imagingcms.c index bc83183f7..fed455941 100644 --- a/_imagingcms.c +++ b/_imagingcms.c @@ -828,7 +828,7 @@ static cmsBool _calculate_rgb_primaries(CmsProfileObject* self, cmsCIEXYZTRIPLE* cmsHPROFILE hXYZ; cmsHTRANSFORM hTransform; - /* http://littlecms2.blogspot.com/2009/07/less-is-more.html */ + /* https://littlecms2.blogspot.com/2009/07/less-is-more.html */ // double array of RGB values with max on each identity hXYZ = cmsCreateXYZProfile(); @@ -1606,7 +1606,7 @@ PyInit__imagingcms(void) { if (setup_module(m) < 0) return NULL; - + PyDateTime_IMPORT; return m; diff --git a/docs/_templates/sidebarhelp.html b/docs/_templates/sidebarhelp.html index e07180a99..111fa5dae 100644 --- a/docs/_templates/sidebarhelp.html +++ b/docs/_templates/sidebarhelp.html @@ -1,4 +1,4 @@

Need help?

diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 21339e75f..694027a47 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -79,7 +79,7 @@ The :py:meth:`~PIL.Image.Image.open` method sets the following **version** Version (either ``GIF87a`` or ``GIF89a``). -**duration** +**duration** May not be present. The time to display the current frame of the GIF, in milliseconds. @@ -514,8 +514,8 @@ the output format must be specified explicitly:: For more information about the SPIDER image processing package, see the `SPIDER homepage`_ at `Wadsworth Center`_. -.. _SPIDER homepage: http://spider.wadsworth.org/spider_doc/spider/docs/spider.html -.. _Wadsworth Center: http://www.wadsworth.org/ +.. _SPIDER homepage: https://spider.wadsworth.org/spider_doc/spider/docs/spider.html +.. _Wadsworth Center: https://www.wadsworth.org/ TIFF ^^^^ diff --git a/docs/installation.rst b/docs/installation.rst index 42a1e28fe..005cbfd22 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -243,7 +243,7 @@ have the full Xcode package installed. It may be necessary to run tools. The easiest way to install external libraries is via `Homebrew -`_. After you install Homebrew, run:: +`_. After you install Homebrew, run:: $ brew install libtiff libjpeg webp little-cms2 diff --git a/libImaging/SunRleDecode.c b/libImaging/SunRleDecode.c index 09375cfa5..50d816e38 100644 --- a/libImaging/SunRleDecode.c +++ b/libImaging/SunRleDecode.c @@ -58,7 +58,7 @@ ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) if (bytes < 3) break; - /* from (http://www.fileformat.info/format/sunraster/egff.htm) + /* from (https://www.fileformat.info/format/sunraster/egff.htm) For example, a run of 100 pixels with the value of 0Ah would encode as the values 80h 64h 0Ah. A @@ -67,8 +67,8 @@ ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) would be stored in the RLE stream as 12h 34h 56h 78h. 100 pixels, n=100, not 100 pixels, n=99. - But Wait! There's More! - (http://www.fileformat.info/format/sunraster/spec/598a59c4fac64c52897585d390d86360/view.htm) + But Wait! There's More! + (https://www.fileformat.info/format/sunraster/spec/598a59c4fac64c52897585d390d86360/view.htm) If the first byte is 0x80, and the second byte is not zero, the record is three bytes long. The @@ -78,7 +78,7 @@ ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) 2 specs, same site, but Imagemagick and GIMP seem to agree on the second one. */ - n += 1; + n += 1; if (state->x + n > state->bytes) { extra_bytes = n; /* full value */ @@ -96,8 +96,8 @@ ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) } else { - /* Literal byte */ - n = 1; + /* Literal byte */ + n = 1; state->buffer[state->x] = ptr[0]; @@ -108,7 +108,7 @@ ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) for (;;) { state->x += n; - + if (state->x >= state->bytes) { /* Got a full line, unpack it */ @@ -123,7 +123,7 @@ ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) return -1; } } - + if (extra_bytes == 0) { break; } diff --git a/mp_compile.py b/mp_compile.py index 3139e0bb9..7448c8a09 100644 --- a/mp_compile.py +++ b/mp_compile.py @@ -72,7 +72,7 @@ def install(): # explicitly don't enable if environment says 1 processor try: # bug, only enable if we can make a Pool. see issue #790 and - # http://stackoverflow.com/questions/6033599/oserror-38-errno-38-with-multiprocessing + # https://stackoverflow.com/questions/6033599/oserror-38-errno-38-with-multiprocessing pool = Pool(2) CCompiler.compile = _mp_compile except Exception as msg: diff --git a/setup.py b/setup.py index 8992a1179..b9ba1301c 100755 --- a/setup.py +++ b/setup.py @@ -718,7 +718,7 @@ try: long_description=_read('README.rst').decode('utf-8'), author='Alex Clark (Fork Author)', author_email='aclark@aclark.net', - url='http://python-pillow.org', + url='https://python-pillow.org', classifiers=[ "Development Status :: 6 - Mature", "Topic :: Multimedia :: Graphics", @@ -753,7 +753,7 @@ The headers or library files could not be found for %s, a required dependency when compiling Pillow from source. Please see the install instructions at: - http://pillow.readthedocs.io/en/latest/installation.html + https://pillow.readthedocs.io/en/latest/installation.html """ % (str(err)) sys.stderr.write(msg) diff --git a/winbuild/config.py b/winbuild/config.py index 6e927d2fb..5dd149b04 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -37,7 +37,7 @@ libs = { 'dir': 'tiff-4.0.6', }, 'freetype': { - 'url': 'http://download.savannah.gnu.org/releases/freetype/freetype-2.7.1.tar.gz', + 'url': 'https://download.savannah.gnu.org/releases/freetype/freetype-2.7.1.tar.gz', 'filename': PILLOW_DEPENDS_DIR + 'freetype-2.7.1.tar.gz', 'hash': 'md5:78701bee8d249578d83bb9a2f3aa3616', 'dir': 'freetype-2.7.1', From 28b818974e0602d9f38858c9e979d4755550c8e5 Mon Sep 17 00:00:00 2001 From: Leonid Bloch Date: Thu, 16 Feb 2017 02:54:43 +0200 Subject: [PATCH 207/632] Allow to save tiff stacks from separate images This is a quick solution that will allow to save tiff stacks from separate images, e.g. from Numpy arrays. Previously, tiff stacks could be saved only from multiframe images. This behavior is similar to what is possible now with GIFs. Note however, that for correct results, all the appended images should have the same encoder{info,config} properties. Example: import numpy as np from PIL import Image a = np.ones((100,100,100), dtype=np.uint8) imlist = [] for m in a: imlist.append(Image.fromarray(m)) imlist[0].save("test.tif", compression="tiff_deflate", save_all=True, append_images=imlist[1:]) (Should result in a 100-frame, 100x100 tiff stack.) Signed-off-by: Leonid Bloch --- PIL/TiffImagePlugin.py | 23 +++++++++++++++++------ Tests/test_file_tiff.py | 12 ++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 505025bb8..ede267c43 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1737,17 +1737,28 @@ class AppendingTiffWriter: self.rewriteLastLong(offset) def _save_all(im, fp, filename): - if not hasattr(im, "n_frames"): + encoderinfo = im.encoderinfo.copy() + encoderconfig = im.encoderconfig + append_images = encoderinfo.get("append_images", []) + if not hasattr(im, "n_frames") and not len(append_images): return _save(im, fp, filename) cur_idx = im.tell() try: with AppendingTiffWriter(fp) as tf: - for idx in range(im.n_frames): - im.seek(idx) - im.load() - _save(im, tf, filename) - tf.newFrame() + for ims in [im]+append_images: + ims.encoderinfo = encoderinfo + ims.encoderconfig = encoderconfig + if not hasattr(ims, "n_frames"): + nfr = 1 + else: + nfr = ims.n_frames + + for idx in range(nfr): + ims.seek(idx) + ims.load() + _save(ims, tf, filename) + tf.newFrame() finally: im.seek(cur_idx) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 1fe3ad45e..1dfd0620c 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -473,6 +473,18 @@ class TestFileTiff(PillowTestCase): with Image.open(mp) as im: self.assertEqual(im.n_frames, 3) + # Test appending images + mp = io.BytesIO() + im = Image.new('RGB', (100, 100), '#f00') + ims = [Image.new('RGB', (100, 100), color) for color + in ['#0f0', '#00f']] + im.save(mp, format="TIFF", save_all=True, append_images=ims) + + mp.seek(0, os.SEEK_SET) + reread = Image.open(mp) + self.assertEqual(reread.n_frames, 3) + + def test_saving_icc_profile(self): # Tests saving TIFF with icc_profile set. # At the time of writing this will only work for non-compressed tiffs From 8fb44a2beeec200fc7408cc3996c1ff704fec1ff Mon Sep 17 00:00:00 2001 From: ces42 Date: Fri, 17 Feb 2017 14:39:16 +0100 Subject: [PATCH 208/632] More explicit error message when saving to a file with invalid extension (#2399) * more explicit error message when saving to a file with invalid extension + test --- PIL/Image.py | 5 ++++- Tests/test_image.py | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/PIL/Image.py b/PIL/Image.py index ed1d10907..c643e24d9 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1715,7 +1715,10 @@ class Image(object): if not format: if ext not in EXTENSION: init() - format = EXTENSION[ext] + try: + format = EXTENSION[ext] + except KeyError: + raise ValueError('unknown file extension: {}'.format(ext)) if format.upper() not in SAVE: init() diff --git a/Tests/test_image.py b/Tests/test_image.py index 1bdbd3960..6aefc4f73 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -87,6 +87,11 @@ class TestImage(PillowTestCase): reloaded = Image.open(fp) self.assert_image_similar(im, reloaded, 20) + def test_unknown_extension(self): + im = hopper() + temp_file = self.tempfile("temp.unknown") + self.assertRaises(ValueError, lambda: im.save(temp_file)) + def test_internals(self): im = Image.new("L", (100, 100)) From 007a2da56ea3fd641406998cb9217ab08b7a6881 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 17 Feb 2017 13:46:01 +0000 Subject: [PATCH 209/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 4acbabdfa..2a045a81f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- More explicit error message when saving to a file with invalid extension #2399 + [ces42] + +- Docs: Update some http urls to https #2403 + [hugovk] + - Preserve aux/alpha channels when performing Imagecms transforms #2355 [gunjambi] From d4d5df14ae923cf4c2e4eebe89ce94123a9b2de4 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 17 Feb 2017 13:56:01 +0000 Subject: [PATCH 210/632] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 2a045a81f..d72c5d79d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Updated libwebp to 0.6.0 on appveyor #2395 + [radarhere] + - More explicit error message when saving to a file with invalid extension #2399 [ces42] From f0cebebf32faa8cb84de4320d9aa7c0f2fd26e3a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 17 Feb 2017 06:22:40 -0800 Subject: [PATCH 211/632] Clarify that draft is only implemented for JPEG and PCD --- PIL/Image.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PIL/Image.py b/PIL/Image.py index f49834e5b..1a94fec3a 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1051,6 +1051,9 @@ class Image(object): in place. If the image has already been loaded, this method has no effect. + Warning: This method is not implemented for most images. It is + currently implemented only for JPEG and PCD images. + :param mode: The requested mode. :param size: The requested size. """ From c2cfd8e7e41bff44805f87cf67a973a2c2ce07db Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 18 Feb 2017 15:44:22 +1100 Subject: [PATCH 212/632] Changed http URL to https --- PIL/JpegPresets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/JpegPresets.py b/PIL/JpegPresets.py index ece33bbbe..6fda20aec 100644 --- a/PIL/JpegPresets.py +++ b/PIL/JpegPresets.py @@ -62,7 +62,7 @@ The tables format between im.quantization and quantization in presets differ in You can convert the dict format to the preset format with the `JpegImagePlugin.convert_dict_qtables(dict_qtables)` function. -Libjpeg ref.: http://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html +Libjpeg ref.: https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html """ From 16c8b010261b3c4164bddaf53637fd6483ef2078 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 18 Feb 2017 15:53:01 +1100 Subject: [PATCH 213/632] Replaced broken URL with web.archive.org URL --- PIL/EpsImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/EpsImagePlugin.py b/PIL/EpsImagePlugin.py index 8dd3e6857..867113a6f 100644 --- a/PIL/EpsImagePlugin.py +++ b/PIL/EpsImagePlugin.py @@ -321,7 +321,7 @@ class EpsImageFile(ImageFile.ImageFile): # EPS can contain binary data # or start directly with latin coding # more info see: - # http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf + # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf offset = i32(s[4:8]) length = i32(s[8:12]) else: From 0f383d7c7ef93ba7b8d2ddd595f8ec3464aaebbf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 18 Feb 2017 16:29:26 +1100 Subject: [PATCH 214/632] Removed unused private functions --- setup.py | 4 ---- winbuild/build_dep.py | 4 ---- 2 files changed, 8 deletions(-) diff --git a/setup.py b/setup.py index b9ba1301c..1dc146d26 100755 --- a/setup.py +++ b/setup.py @@ -84,10 +84,6 @@ def _find_library_file(self, library): return ret -def _lib_include(root): - # map root to (root/lib, root/include) - return os.path.join(root, "lib"), os.path.join(root, "include") - def _cmd_exists(cmd): return any( os.access(os.path.join(path, cmd), os.X_OK) diff --git a/winbuild/build_dep.py b/winbuild/build_dep.py index fb4d55d8c..c932a2fcb 100644 --- a/winbuild/build_dep.py +++ b/winbuild/build_dep.py @@ -10,10 +10,6 @@ def _relpath(*args): return os.path.join(os.getcwd(), *args) -def _relbuild(*args): - return _relpath('build', *args) - - build_dir = _relpath('build') inc_dir = _relpath('depends') From 9b82bdbb1026346b6788ebaa54b678b112f81ecb Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 17 Feb 2017 09:03:49 -0800 Subject: [PATCH 215/632] fix ToQimage tests for QT5 --- Tests/test_image_toqimage.py | 43 +++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/Tests/test_image_toqimage.py b/Tests/test_image_toqimage.py index 4a318c5c4..3e2aa9dd6 100644 --- a/Tests/test_image_toqimage.py +++ b/Tests/test_image_toqimage.py @@ -1,7 +1,7 @@ from helper import unittest, PillowTestCase, hopper from test_imageqt import PillowQtTestCase -from PIL import ImageQt +from PIL import ImageQt, Image if ImageQt.qt_is_installed: @@ -9,39 +9,62 @@ if ImageQt.qt_is_installed: try: from PyQt5 import QtGui + from PyQt5.QtWidgets import QWidget, QHBoxLayout, QLabel, QApplication + QT_VERSION = 5 except (ImportError, RuntimeError): try: from PyQt4 import QtGui + from PyQt4.QtGui import QWidget, QHBoxLayout, QLabel, QApplication + QT_VERSION = 4 except (ImportError, RuntimeError): from PySide import QtGui + from PySide.QtGui import QWidget, QHBoxLayout, QLabel, QApplication + QT_VERSION = 4 - - class TestToQImage(PillowQtTestCase, PillowTestCase): def test_sanity(self): PillowQtTestCase.setUp(self) - for mode in ('1', 'RGB', 'RGBA', 'L', 'P'): - data = ImageQt.toqimage(hopper(mode)) + for mode in ('RGB', 'RGBA', 'L', 'P', '1'): + src = hopper(mode) + data = ImageQt.toqimage(src) self.assertIsInstance(data, QImage) self.assertFalse(data.isNull()) + # reload directly from the qimage + rt = ImageQt.fromqimage(data) + if mode in ('L', 'P', '1'): + self.assert_image_equal(rt, src.convert('RGB')) + else: + self.assert_image_equal(rt, src) + + if QT_VERSION == 5 and mode == '1': + # this combination appears to not save correctly + # kicks out errors on console: + # libpng warning: Invalid color type/bit depth combination in IHDR + # libpng error: Invalid IHDR data + continue + # Test saving the file tempfile = self.tempfile('temp_{}.png'.format(mode)) data.save(tempfile) + # Check that it actually worked. + reloaded = Image.open(tempfile) + self.assert_image_equal(reloaded, src) + def test_segfault(self): PillowQtTestCase.setUp(self) - app = QtGui.QApplication([]) + app = QApplication([]) ex = Example() if ImageQt.qt_is_installed: - class Example(QtGui.QWidget): + class Example(QWidget): def __init__(self): super(Example, self).__init__() @@ -52,9 +75,9 @@ if ImageQt.qt_is_installed: pixmap1 = QtGui.QPixmap.fromImage(qimage) - hbox = QtGui.QHBoxLayout(self) + hbox = QHBoxLayout(self) - lbl = QtGui.QLabel(self) + lbl = QLabel(self) # Segfault in the problem lbl.setPixmap(pixmap1.copy()) @@ -62,7 +85,7 @@ if ImageQt.qt_is_installed: def main(): - app = QtGui.QApplication(sys.argv) + app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) From 1b94ff81feab659605c09507bf5aafcaa7b0743f Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 20 Feb 2017 08:49:44 -0800 Subject: [PATCH 216/632] Skip failing QPixmap/QT5 tests on Arch --- Tests/helper.py | 6 ++++++ Tests/test_image_fromqpixmap.py | 5 +++-- Tests/test_image_toqpixmap.py | 4 +++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index f8eed3e2d..d5b2d97ba 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -253,6 +253,12 @@ if sys.platform == 'win32': else: IMCONVERT = 'convert' +def distro(): + if os.path.exists('/etc/os-release'): + with open('/etc/os-release', 'r') as f: + for line in f: + if 'ID=' in line: + return line.strip().split('=')[1] class cached_property(object): def __init__(self, func): diff --git a/Tests/test_image_fromqpixmap.py b/Tests/test_image_fromqpixmap.py index 543b74bbf..cf76cffca 100644 --- a/Tests/test_image_fromqpixmap.py +++ b/Tests/test_image_fromqpixmap.py @@ -1,9 +1,10 @@ -from helper import unittest, PillowTestCase, hopper +from helper import unittest, PillowTestCase, hopper, distro from test_imageqt import PillowQtTestCase, PillowQPixmapTestCase from PIL import ImageQt - +@unittest.skipIf(ImageQt.qt_version == '5' and distro() == 'arch', + "Topixmap fails on Arch + QT5") class TestFromQPixmap(PillowQPixmapTestCase, PillowTestCase): def roundtrip(self, expected): diff --git a/Tests/test_image_toqpixmap.py b/Tests/test_image_toqpixmap.py index c6555d7ff..a48e278ad 100644 --- a/Tests/test_image_toqpixmap.py +++ b/Tests/test_image_toqpixmap.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, hopper +from helper import unittest, PillowTestCase, hopper, distro from test_imageqt import PillowQtTestCase, PillowQPixmapTestCase from PIL import ImageQt @@ -9,6 +9,8 @@ if ImageQt.qt_is_installed: class TestToQPixmap(PillowQPixmapTestCase, PillowTestCase): + @unittest.skipIf(ImageQt.qt_version == '5' and distro() == 'arch', + "Topixmap fails on Arch + QT5") def test_sanity(self): PillowQtTestCase.setUp(self) From 89443ae9506f4f494876a7980f2295e278c031b5 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 20 Feb 2017 12:28:13 -0800 Subject: [PATCH 217/632] B/W images don't save properly in QT4 either --- Tests/test_image_toqimage.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Tests/test_image_toqimage.py b/Tests/test_image_toqimage.py index 3e2aa9dd6..5afb9a9f4 100644 --- a/Tests/test_image_toqimage.py +++ b/Tests/test_image_toqimage.py @@ -40,8 +40,8 @@ class TestToQImage(PillowQtTestCase, PillowTestCase): else: self.assert_image_equal(rt, src) - if QT_VERSION == 5 and mode == '1': - # this combination appears to not save correctly + if mode == '1': + # BW appears to not save correctly on QT4 and QT5 # kicks out errors on console: # libpng warning: Invalid color type/bit depth combination in IHDR # libpng error: Invalid IHDR data @@ -53,6 +53,10 @@ class TestToQImage(PillowQtTestCase, PillowTestCase): # Check that it actually worked. reloaded = Image.open(tempfile) + # Gray images appear to come back in palette mode. + # They're roughly equivalent + if QT_VERSION == 4 and mode == 'L': + src = src.convert('P') self.assert_image_equal(reloaded, src) From d707cb3692dab6931ea4f3b5f6d7b874a48ac8cc Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 20 Feb 2017 13:41:28 -0800 Subject: [PATCH 218/632] Tight similarity tests for XYZ conversion --- Tests/images/hopper-XYZ.png | Bin 0 -> 30271 bytes Tests/test_image_convert.py | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Tests/images/hopper-XYZ.png diff --git a/Tests/images/hopper-XYZ.png b/Tests/images/hopper-XYZ.png new file mode 100644 index 0000000000000000000000000000000000000000..194d24540e1a67bbe9f0b402df6e4ebe684eafad GIT binary patch literal 30271 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 literal 0 HcmV?d00001 diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 011f23bf8..e641a99f2 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -181,8 +181,12 @@ class TestImageConvert(PillowTestCase): # Assert self.assertEqual(converted_im.mode, mode) self.assertEqual(converted_im.size, im.size) + target = Image.open('Tests/images/hopper-XYZ.png') if converted_im.mode == 'RGB': - self.assert_image_similar(converted_im, im, 33) + self.assert_image_similar(converted_im, target, 3) + else: + self.assert_image_similar(converted_im, target.split()[0], 1) + matrix_convert('RGB') matrix_convert('L') From facb5f7a8107842d2e1fcf63196eb5ac1933580d Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 20 Feb 2017 22:02:27 +0000 Subject: [PATCH 219/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index d72c5d79d..e26c16939 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Test: Fixed Qt tests for QT5, Arch, and saving 1 bit PNG #2394 + [wiredfool] + +- Test: docker builds for Arch and Debian Stretch #2394 + [wiredfool] + - Updated libwebp to 0.6.0 on appveyor #2395 [radarhere] From badc3ec1f37096ebf959524b4bcf2c14db2d7936 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 20 Feb 2017 22:38:00 +0000 Subject: [PATCH 220/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e26c16939..e6a656934 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,15 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Test: Added matrix convert tests #2381 + [hugovk] + +- Replaced broken URL to partners.adobe.com #2413 + [radarhere] + +- Removed unused private functions in setup.py and build_dep.py #2414 + [radarhere] + - Test: Fixed Qt tests for QT5, Arch, and saving 1 bit PNG #2394 [wiredfool] From 310105625cb0c7c2fa7fdaf0defdb6d234f6cb67 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 22 Feb 2017 08:16:17 +0200 Subject: [PATCH 221/632] Failing test case for #2259 --- Tests/test_numpy.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 01b02c9e5..8b9208cd6 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -204,6 +204,14 @@ class TestNumpy(PillowTestCase): self.assertEqual(len(im.getdata()), len(arr)) + def test_zero_size(self): + # Shouldn't cause floating point exception + # See https://github.com/python-pillow/Pillow/issues/2259 + + im = Image.fromarray(numpy.empty((0, 0), dtype=numpy.uint8)) + + self.assertEqual(im.size, (0, 0)) + if __name__ == '__main__': unittest.main() From 0764b2b5e92e7b3c3aec0e52d9e4437b208ede87 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 22 Feb 2017 08:20:45 +0200 Subject: [PATCH 222/632] Update error message --- PIL/Image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/Image.py b/PIL/Image.py index c643e24d9..77f2836c0 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -2036,7 +2036,7 @@ def _check_size(size): if len(size) != 2: raise ValueError("Size must be a tuple of length 2") if size[0] < 0 or size[1] < 0: - raise ValueError("Width and Height must be => 0") + raise ValueError("Width and height must be >= 0") return True From a662443b7f3fe394115d2eb9d71fb956b3848063 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 22 Feb 2017 08:28:20 +0200 Subject: [PATCH 223/632] Avoid division by zero --- map.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/map.c b/map.c index 75f463440..9d4751e31 100644 --- a/map.c +++ b/map.c @@ -342,7 +342,7 @@ PyImaging_MapBuffer(PyObject* self, PyObject* args) stride = xsize * 4; } - if (ysize > INT_MAX / stride) { + if (stride > 0 && ysize > INT_MAX / stride) { PyErr_SetString(PyExc_MemoryError, "Integer overflow in ysize"); return NULL; } @@ -352,7 +352,7 @@ PyImaging_MapBuffer(PyObject* self, PyObject* args) if (offset > PY_SSIZE_T_MAX - size) { PyErr_SetString(PyExc_MemoryError, "Integer overflow in offset"); return NULL; - } + } /* check buffer size */ if (PyImaging_GetBuffer(target, &view) < 0) From f4556acef1351c8fa7ce703dddf6792fdeba0592 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 22 Feb 2017 10:15:01 +0000 Subject: [PATCH 224/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e6a656934..ab0ce5dc0 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,18 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Removed use of spaces in TIFF kwargs names, deprecated in 2.7 #1390 + [radarhere] + +- Removed deprecated ImageDraw setink, setfill, setfont methods #2220 + [jdufresne] + +- Send unwanted subprocess output to /dev/null #2253 + [jdufresne] + +- Fix division by zero when creating 0x0 image from numpy array #2419 + [hugovk] + - Test: Added matrix convert tests #2381 [hugovk] From 64cd722038f82fd730e40686533d542faed93ea7 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 22 Feb 2017 08:10:08 -0800 Subject: [PATCH 225/632] Arch qpixmap is fixed on on the docker side with the environment variable QT_QPA_PLATFORM=offscreen --- Tests/test_image_fromqpixmap.py | 2 -- Tests/test_image_toqpixmap.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/Tests/test_image_fromqpixmap.py b/Tests/test_image_fromqpixmap.py index cf76cffca..cbac7d189 100644 --- a/Tests/test_image_fromqpixmap.py +++ b/Tests/test_image_fromqpixmap.py @@ -3,8 +3,6 @@ from test_imageqt import PillowQtTestCase, PillowQPixmapTestCase from PIL import ImageQt -@unittest.skipIf(ImageQt.qt_version == '5' and distro() == 'arch', - "Topixmap fails on Arch + QT5") class TestFromQPixmap(PillowQPixmapTestCase, PillowTestCase): def roundtrip(self, expected): diff --git a/Tests/test_image_toqpixmap.py b/Tests/test_image_toqpixmap.py index a48e278ad..137a875fe 100644 --- a/Tests/test_image_toqpixmap.py +++ b/Tests/test_image_toqpixmap.py @@ -9,8 +9,6 @@ if ImageQt.qt_is_installed: class TestToQPixmap(PillowQPixmapTestCase, PillowTestCase): - @unittest.skipIf(ImageQt.qt_version == '5' and distro() == 'arch', - "Topixmap fails on Arch + QT5") def test_sanity(self): PillowQtTestCase.setUp(self) From c05099f45c0d94a2a98c3609a96bdb6cf7446627 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 22 Feb 2017 22:48:48 +0000 Subject: [PATCH 226/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index ab0ce5dc0..314d353f3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -25,7 +25,7 @@ Changelog (Pillow) - Removed unused private functions in setup.py and build_dep.py #2414 [radarhere] -- Test: Fixed Qt tests for QT5, Arch, and saving 1 bit PNG #2394 +- Test: Fixed Qt tests for QT5 and saving 1 bit PNG #2394 [wiredfool] - Test: docker builds for Arch and Debian Stretch #2394 From e6864d16a806cc5972048f1fa0d3c5218759526c Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 19 Feb 2017 11:30:16 +0200 Subject: [PATCH 227/632] Remove unrunnable code --- Tests/test_image_toqimage.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/Tests/test_image_toqimage.py b/Tests/test_image_toqimage.py index 5afb9a9f4..f7580aed1 100644 --- a/Tests/test_image_toqimage.py +++ b/Tests/test_image_toqimage.py @@ -21,7 +21,6 @@ if ImageQt.qt_is_installed: from PySide.QtGui import QWidget, QHBoxLayout, QLabel, QApplication QT_VERSION = 4 - class TestToQImage(PillowQtTestCase, PillowTestCase): def test_sanity(self): @@ -86,15 +85,5 @@ if ImageQt.qt_is_installed: lbl.setPixmap(pixmap1.copy()) - - -def main(): - app = QApplication(sys.argv) - ex = Example() - sys.exit(app.exec_()) - - - - if __name__ == '__main__': unittest.main() From c4b686f82db06bdcb335a1649b7aaac5bfef7724 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 19 Feb 2017 12:04:18 +0200 Subject: [PATCH 228/632] flake8 --- Tests/test_image_toqimage.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Tests/test_image_toqimage.py b/Tests/test_image_toqimage.py index f7580aed1..435a07765 100644 --- a/Tests/test_image_toqimage.py +++ b/Tests/test_image_toqimage.py @@ -5,7 +5,7 @@ from PIL import ImageQt, Image if ImageQt.qt_is_installed: - from PIL.ImageQt import QImage, QPixmap + from PIL.ImageQt import QImage try: from PyQt5 import QtGui @@ -64,6 +64,8 @@ class TestToQImage(PillowQtTestCase, PillowTestCase): app = QApplication([]) ex = Example() + assert(app) # Silence warning + assert(ex) # Silence warning if ImageQt.qt_is_installed: @@ -72,7 +74,7 @@ if ImageQt.qt_is_installed: def __init__(self): super(Example, self).__init__() - img = hopper().resize((1000,1000)) + img = hopper().resize((1000, 1000)) qimage = ImageQt.ImageQt(img) From 0ae3e3b482b592af0f7bec4e97787a8b99003bb3 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 23 Feb 2017 11:08:13 +0000 Subject: [PATCH 229/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 314d353f3..d754119f2 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Test: Removed unrunnable code in test_image_toqimage #2415 + [hugovk] + - Removed use of spaces in TIFF kwargs names, deprecated in 2.7 #1390 [radarhere] From f9a99652e4e7a6891c75b2a1c50184f63eb2bdd8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 25 Feb 2017 13:49:05 +1100 Subject: [PATCH 230/632] Replaced KeyError catch with dictionary get method --- PIL/GifImagePlugin.py | 10 ++-------- PIL/ImImagePlugin.py | 5 +---- PIL/Image.py | 5 +---- Scripts/player.py | 10 ++-------- 4 files changed, 6 insertions(+), 24 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index bdda5c185..7fe662fc6 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -415,10 +415,7 @@ def _save(im, fp, filename, save_all=False): def get_interlace(im): - try: - interlace = im.encoderinfo["interlace"] - except KeyError: - interlace = 1 + interlace = im.encoderinfo.get("interlace", 1) # workaround for @PIL153 if min(im.size) < 16: @@ -484,10 +481,7 @@ def _get_local_header(fp, im, offset, flags): o8(0)) include_color_table = im.encoderinfo.get('include_color_table') if include_color_table: - try: - palette = im.encoderinfo["palette"] - except KeyError: - palette = None + palette = im.encoderinfo.get("palette", None) palette_bytes = _get_palette_bytes(im, palette, im.encoderinfo)[0] color_table_size = _get_color_table_size(palette_bytes) if color_table_size: diff --git a/PIL/ImImagePlugin.py b/PIL/ImImagePlugin.py index 4638419fa..b0edac409 100644 --- a/PIL/ImImagePlugin.py +++ b/PIL/ImImagePlugin.py @@ -325,10 +325,7 @@ def _save(im, fp, filename, check=0): except KeyError: raise ValueError("Cannot save %s images as IM" % im.mode) - try: - frames = im.encoderinfo["frames"] - except KeyError: - frames = 1 + frames = im.encoderinfo.get("frames", 1) if check: return check diff --git a/PIL/Image.py b/PIL/Image.py index 77f2836c0..a656209e5 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -2194,10 +2194,7 @@ def fromarray(obj, mode=None): arr = obj.__array_interface__ shape = arr['shape'] ndim = len(shape) - try: - strides = arr['strides'] - except KeyError: - strides = None + strides = arr.get('strides', None) if mode is None: try: typekey = (1, 1) + shape[2:], arr['typestr'] diff --git a/Scripts/player.py b/Scripts/player.py index ac9eb817f..40873ff5f 100644 --- a/Scripts/player.py +++ b/Scripts/player.py @@ -38,10 +38,7 @@ class UI(Label): self.update() - try: - duration = im.info["duration"] - except KeyError: - duration = 100 + duration = im.info.get("duration", 100) self.after(duration, self.next) def next(self): @@ -64,10 +61,7 @@ class UI(Label): except EOFError: return # end of file - try: - duration = im.info["duration"] - except KeyError: - duration = 100 + duration = im.info.get("duration", 100) self.after(duration, self.next) self.update_idletasks() From 89b603dae6a05d0c898d91a80c2f581b05184953 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 25 Feb 2017 10:56:58 +0200 Subject: [PATCH 231/632] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index d754119f2..89f619eca 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Replaced KeyError catch with dictionary get method #2424 + [radarhere] + - Test: Removed unrunnable code in test_image_toqimage #2415 [hugovk] From 4c932e066144d86421c10607dad8f63fcc81d575 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 26 Feb 2017 10:09:01 +0200 Subject: [PATCH 232/632] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 89f619eca..1e7e538ef 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Remove unused imports #1822 + [radarhere] + - Replaced KeyError catch with dictionary get method #2424 [radarhere] From f66e93bb4b4d19988bb7c04b29108cfb35ddfb3c Mon Sep 17 00:00:00 2001 From: Alexander Karpinsky Date: Mon, 27 Feb 2017 02:04:12 +0300 Subject: [PATCH 233/632] Fix version in notes --- docs/releasenotes/3.4.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/3.4.0.rst b/docs/releasenotes/3.4.0.rst index a6512fc12..65b52e958 100644 --- a/docs/releasenotes/3.4.0.rst +++ b/docs/releasenotes/3.4.0.rst @@ -20,7 +20,7 @@ Deprecation Warning when Saving JPEGs JPEG images cannot contain an alpha channel. Pillow prior to 3.4.0 silently drops the alpha channel. With this release Pillow will now issue a ``DeprecationWarning`` when attempting to save a ``RGBA`` mode -image as a JPEG. This will become an error in Pillow 3.7. +image as a JPEG. This will become an error in Pillow 4.2. New DDS Decoders ================ From 5c3b10ee87d9a3c06bd438ce20d821cdc206e2c1 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 27 Feb 2017 15:41:28 +0200 Subject: [PATCH 234/632] Test PSD for similarity --- Tests/test_file_psd.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index 2b4825734..bd1aca66c 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase +from helper import hopper, unittest, PillowTestCase from PIL import Image, PsdImagePlugin @@ -15,6 +15,9 @@ class TestImagePsd(PillowTestCase): self.assertEqual(im.size, (128, 128)) self.assertEqual(im.format, "PSD") + im2 = hopper() + self.assert_image_similar(im, im2, 4.8) + def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" From 921a25d144c56bb4cb4213d3739f671d69e4aa53 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 27 Feb 2017 16:09:05 +0200 Subject: [PATCH 235/632] Test PSD seek --- Tests/test_file_psd.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index bd1aca66c..dd75a31c9 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -46,6 +46,29 @@ class TestImagePsd(PillowTestCase): except EOFError: self.assertTrue(im.tell() < n_frames) + def test_seek_tell(self): + im = Image.open(test_file) + + layer_number = im.tell() + self.assertEqual(layer_number, 0) + + im.seek(0) + layer_number = im.tell() + self.assertEqual(layer_number, 0) + + im.seek(1) + layer_number = im.tell() + self.assertEqual(layer_number, 1) + + im.seek(2) + layer_number = im.tell() + self.assertEqual(layer_number, 2) + + def test_seek_eoferror(self): + im = Image.open(test_file) + + self.assertRaises(EOFError, lambda: im.seek(-1)) + if __name__ == '__main__': unittest.main() From 1a607bfd56b348b85c6c4d7506c9919c8457211f Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 27 Feb 2017 16:45:31 +0200 Subject: [PATCH 236/632] Resave hopper.psd with ICC profile, using Photoshop --- Tests/images/hopper.psd | Bin 171559 -> 175119 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Tests/images/hopper.psd b/Tests/images/hopper.psd index e8b184cf5a3f111cf2b9b6af8426b5264f96a7eb..5ec686ca0220f8d392ead8231355a67b0af80e2b 100644 GIT binary patch delta 3452 zcma)<2UHVT7subsq!(I3=n#4{Ktf3X=`|E7B25%92@p!a5Q;SxLugMPO&r1pZLVZ%yww+#Tv{@*^Ru0a!pwKw0m%SDuxa;`q%q>s0v;tsniKV&uw-s40Pp zD?}{GhE)K_lE|cy0p85mxOgVM55Ry3aDWX!vLH7nbh>|(!h`SU!^}mE6#UnK0C;sB zpmzYSumZ!G%)j*SKID^TRRuXx830f?s@V%gxdN1nP|hrnf@W|Kw1XqyBsc>u zfJ@*SxD5uu2zU(SO@gR4|4+?=Ip*ScBN`)j)9<&fz z4wXU`Pz|&lYJ?6zhoO_uIjA4H2@OGG&>zq{7=bA;9oB=*U|X06d%?kQ6g&$~h3CTa z;Uah~Tn*R5``|YCBzytB1`ooILwt}hBpyjYq{w2V1gS#mk!GY5 z=|Qd_gUA!)Ee407VVD>e#uXEYnSl{t=3*9O)?jKddoXR7Zp;uO$OfVpD2>yh4f`qV)P(|2FI7YZk7$v+X zst`?yF2pdRkT{Q6Mrxm_>O(cWn%qpyPfe&+q_#utl-e*2p&8SBXad@DS_ADgZG?`a zo74I9bb2ZMM|vN9TwP7wK|NZ%P`y_DsQMrSVVE)aj7&xu;~?WY}HM|>KX@$3CWNtLWXqi!q(OqMbG0!-~c)f9#@wkbB zNvO#}lO~f}rbJVoX_~2gqiK)nYcq4R7_*gT?Pd?nHO=|v^Ua&g?^sYRJS^r~)LUG& z#98tzGc31QUb2F%9Ieu!`4pLV(Tr|{Zp`0oTo^p)K3{;QCMEAd{z@{$cAAP zVzbPq-R7CCiEX^?I@=!Gk9LlBnRX3!x7lj!AoenLC;JbM6-OZF)N-!cQ|*C}hb2;epyDQ5z!*#Fg!>Q&|MN=E54!aq-CA)2R8+2#7C%JEPAM`NvNcO1rxbJD~ zDfHasIqGHUmF^|q=k?6n&Rgnz$osXAi_apT6TXOVfNzO!pP!oF48Iz`d;UiLss2s= z;{lEV3j$6AVgrK%*98vn_4opQBY!-I8?-2>JD3tYJ-8t`2c_vcvW6z2@ib(y}xM1%d@#3k?@8T{yJJYteT3VrcQ4#a(h^d69f%Nx+gl zOG!&Jmj1HLZdt{$m&;?8cNXatEh!pa5wN1ESgBZAJh0MrW!);wD)Fkm)%L45t^Qad zEID6lS6Ws2VU1wT`5)LnRR8d4ZOYodGN-bw<+yT5`So=k>-JQrR?M#$t_-bgThCly zvi{|U#0}@F9IEOz%1ImZHV#&YRCjDL*;KyiLrq%EwOa4mmd(1GS8sm3MY!eiR?n@? zb$WHBb?>%`x82wtu)VF`tiEaoZb$x(2My5;Jv(_j8+U2%D&6(xZprS!J&}958@Y{* zdv*7gHNj1JO=J5K_FekX_s5QAR`d22MoZ~_us?7AqXS6?t{)6O*d=e}wKo4``qSn^ zv_mCrP}{t=@%FU#!H&3&{=-3syEiWr>=HKboZSOK7IC#|Cv)gUOmUpx}808&gIg=D|FF$tKocz37)Tfxydk{t z@Mh-C=eP22y}!NW4)#vTU6s34_jK>o|7!Vb%b?TX(IMZV-uu(<-yRkWKmINEw+|yl z52z2SMh!+AA95ZZ8S@{z^l0Xzk;gfY-#;mSs`_;EGmB?G{qFgD?|AI^$aCrQPk*d= zp=I-8_e+PDT@&FG_g-badjGoQjn6Tm}?Q0P=)}sydiOALn74PkO(h#{|~zb BO>Y1I delta 182 zcmeCb!L@u3*8~N=L4W=WBDV*%z*Ahir!3=IFlVDl{Z&n%pR zU_nMkhRt^(+C?-?tPCuzjEofw&8-Y9tV}H!7+5ASFt7s^u^1Q`87^RCU Date: Mon, 27 Feb 2017 17:21:27 +0200 Subject: [PATCH 237/632] Test PSD with and without ICC profile --- Tests/test_file_psd.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index dd75a31c9..04a171cbb 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -69,6 +69,18 @@ class TestImagePsd(PillowTestCase): self.assertRaises(EOFError, lambda: im.seek(-1)) + def test_icc_profile(self): + im = Image.open(test_file) + self.assertIn("icc_profile", im.info) + + icc_profile = im.info["icc_profile"] + self.assertEqual(len(icc_profile), 3144) + + def test_no_icc_profile(self): + im = Image.open("Tests/images/hopper_merged.psd") + + self.assertNotIn("icc_profile", im.info) + if __name__ == '__main__': unittest.main() From 358ccfb80b06e30c7c8d0bf771c1c7cd0f6d4d83 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 27 Feb 2017 21:13:07 +0000 Subject: [PATCH 238/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 1e7e538ef..1d0f24fa4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Test PsdImageFile for correctness #2427 + [hugovk] + - Remove unused imports #1822 [radarhere] From c9e139e260b4a512d0517ce402ea35c1ac1610c0 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 28 Feb 2017 08:22:03 +0200 Subject: [PATCH 239/632] Image created with Photoshop --- Tests/images/hopper.pxr | Bin 0 -> 50176 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/hopper.pxr diff --git a/Tests/images/hopper.pxr b/Tests/images/hopper.pxr new file mode 100644 index 0000000000000000000000000000000000000000..a7dee295a2c3efeca6b38204adb7eebdd75eaaef GIT binary patch literal 50176 zcmeFZcT^Q;+xE?!sKBnXXJ+?C@1XSFd+)tU?;QkbqEZA!utvq+E7Cy}6%c#xvDes3 z>`}A7b2G`lz4P49_usqL_pS9NN3L9Z_JGOnIIr`nGqaw^$^A?2|Niy=RRXi*h`(ua zKgr2W`akerDgB*?{tx`#|NATde?b6eIx|oQMY0K#?ZDwVa`<*sR10D13VG8-{6r@1 z$6&Z~xxO5(C)~;9c?boGVo@@e7tFw1XsA6MbD%R_S^Qv*Aco0}q|toD>;MkKs3d*n z%ll6{*DSoVea_hxMFRu73QOi9n4OZUpGe6ap-)ZFlKXW-fv2}IhI3TaoJvZUoIm#H z{X>c58l))R=Z}daY|d|o4w03 zt-~p0&^&67YsO}~#5K0@TU^ujIHvEmP2XjizSlf;k9q1Y^R(?&=_~EhRyil_b4xwo zoW92?ZMReME|5#=Ue~lv=Zqeg%wGEpscbWPK=!HKjw#(PN!`wgUG^z^9a1|%j%i*0 zQ?jp|(!1gJfE-hM98$WSQoCF;dVO;H0*i)1O7?}84u#Fw2MU=n7+kX7zj&Wt;eOwu z{eHy<2>v9BDez}=9oRfu3PY2Q>+m`80&W71`67rLhvNhMnJgC`-;>Wv5DAkw+#m#X z2L4jvE;u(3!9&>mXbcPFV?Ih;tLEy~f!*ENkzUs}RHjT-G&0f%jYzYwPUQ;RX^1(O zW09gScV$hEx38&Cq(Y^WsUCyr)- zdsMqi!djQK^(NtM+J3VQ!Zo!e+aS-BuZ$ zW+}UYzim#3W8QlE^md1Yey7Aig1>XhZkN@s^D(t4ay zdw@R(m=lm?sNo9GCPX+Qy8%ABWb`|y_c^C^yQKGcW%u~y4+Iwv0{`$bslv*KLP`$= zmhKNI9`-L84k$f{v+PmamP|EcaU6j^lWj+$tI{w{E;pRVi(p{RG{k|$@nmzoaF#od zAIRZ_3Ph0{o)-i&4YQ=ndz5?CDe!HrrPy4CXLgb%g=8(=0EI9{=>)v#-xz zeSZ4l`OOE5>y~J+4Rl2|(^MVxlq^))x;6&ZMoI?eDu#}F)@E9!j`lu2A!%Xht)3}+ z{EClQrVcvikJ_aTI;8YU876l)r?!J!(z`r!`kgcOI;D3wr+2ty>~+oP2DxNH=yo~h z^g3ntIOTLXW_LPeb~&eYI;HNFY6A6-go#jxl7RmY3tTe?zyg2|a?j|LHi6=S(6arY zu<`>Ss07V85Lj|BaK@pavcmwMf!R=K=4`GL@W)xUiZm7A5AgZ?$p6Y;D30Rty&1SY zz(<(Ybe0p!@ewLdM_FMs#Fx+V6S8f69V4fy8^`;&{<^Ip$q?bPRlsOAFA!(@iN&G7 zKUHV)osHFwHqJO|Ig#T0#T*|Ej<*(H?fAg3CAK`~!Sw0&eMhp$P;O^@q$D3Mv^4F5O26;$Oxe!OR%AIhAI`=D2`xrX$2Z z9oOOuLIlE4lx0K5ELmJPHpdUggP>8cdHzD>K%UTp0pyvM2+IoiGuYl#ERe~M#MmJ? z;>}`MX^ZT5h*nZS(8+Z&+T-}+3TFW0pyiF?3;BMA{^wB z-Q$|m>z*^@BY4*<8YmVn$d6zDh^$+C&CKhh++^tkU{m};mlFn@#x2{?7^^-*MP4dUPdtEzM0Dm)07xSrc z5s~dt>D_MAx7j9d^~~?~DcLEtV0yo2+5wlm9_QR{fbW*u2mC<hASrbxv->ZbCXyAvCq7CWPC7J%z5iBf&yW0}p?PF=cxLbQ%IWmZ?efa&_0I3} z%J26s81N|^f-acBFvf8+lwmF4d2-oqOw37Iov=D4dbw* z+1wzZQYe@2Lu1%c=vH*pmWn&kFfXn+7UG|bcrj2fHf}FKO@#Q=Xut3in^Gf<@|mi$ zD$D=;^zzZYW1H4BynK55!@Kw2B$D@ECC|S+`y}}&`TfP+(?@Td9D4WQ;;H?|ZS}2; zHS}BRn#K=}tZZMEThtbjvLY~ZgICUO=Ujk4?2*?cZ4|jZZV>!A`$4YRgU*@IX+n>% z+a+@+h~V##-3lUxWg%u6hI#~^+L9h;AqO{e1)f3`AC&FL;W-Og_U);HQ_FnB z97}MYEwtr8zT#VErO&x~{n{VjzWynZG&C&avejJeeXGh#V?w=aDiTu@J^j4w(^675 zZrOd~{*$YZuC(u1RXja9EyS;NR(@kyda!dqenO6}NZoRp>6>RSzWw?A?MKPbv2SH< z$9?nnI%Mqw{?Hu20^skO-9G_;2>82XL8l3n{tJKioIV-q38a5HB7<+AvIhkGC*VV- zlJ*yb7r@^wyBo-Z+_Sr6{DC|HANaFzV;!w_pKT@A!#`6~&-7?>4> zW~!zhDinkwNC1l!hT|d1%F|(9fMK3gsw0EpN}@W@7#`zi zKfb;FQ}Q7*D@8@9tjZH>2+(EqITwbTCGQV^|7~PrbJ6FAw=Rti-Ml<-?)a|V^X5rj zzkYdb`~54MVuKt+9KkdlCv{cJzQIG#Ox}I_@tt|4Sl1x!tn}(<> zi^AEsue{SOmHJE{Tvf1GrPJ~bxD}bpM4&AXAg1C^$_P`%w`4apg5uv!dfal0( znF-m3fv$n4H$eXX31@^6{5irYO zSn%cRo3QXe5m%@sR?`+U>q}$L4mG~|b?duZ1CkH7Al*xTecGOf4_eH^MjrT zS2s@&bFnlw7jdR3i%r{>tokZ}?n3hN<2&I0ULv{oT(Yg_acuE6&-C?vIlKJ}20Zf* zxMd%(PwDf_JM_Qt2aEugpi0C%ffp_k*9jMh8;G0X`rl^ll@50^rTX9aqZAD_k;Rn@ z&+puLudnUIWg5`wd{xz{EX0S;3}oUCET$ue?X0C4jAQoFu?p_TW(5d&ff&P?tZ0R! zFe&x|7r25z4nF|FT@Z#nk7LWljl_Jj0N1c{8w%p4$?;G>9zTR94r2>~nH*OzeQlb- zxnJVd`KqxIao@hbhESD!el7X%TJrI!JM z5lmv6ftZoo7zkm)M1cNT<_aXQ_^Y$_6 z+As(?I(qZ%OG$0jvLL^-ojdzuV$wONAMi&Rwis$B6nM-m->jnS3w8+jkc+}Z{2&(Y zrYLVgqu5fYwvdHzwhxoz%i=-*>wqGr9L!KjVD9G}a(-iBlIbLZKVK=F1wY7j<1kG& z=a`H(2RWMCe}4Dn-TTK<{vThyxpj4T+p6L1zuY?0?_sIJQ6Q_JOmzloq0FD1W&i5x z&b!ApNZ#LpURUzryX22Q{`l}#^7W16%kA42HuP>PwNn-7(Q!SdSdA%|S(NeO)xAHy zOQ0`#_d5)dfd2!q0RDCQrX-j(Z~wuTB%d;IWG z7}33X{`%>|Cu5_BeY`!z%s@WFmq~Nt;SMUw&OJS6V&ZZ{N>g#%LM(P>vn-gq<(3MST*;aBq)>K$r;wk&$e0P?>j>FY& zPc%8%mUR2-*!Pcs<<|Fi=XzGoSwB0!DKkFAMB7*-r^%KRVRV>|so=^6O8Vo2%bwmG z+`Ovn-j#vxAEY4-OhJP+S7TM3PWO~gxQ#9rRl{^oMO zn}`;1P4zcWn0 zbD-ZJaGwZ%ulyk`rK!zx7CpZA+xyoa-oAJP7HrzMUQb4lj?v!jik?JThpkf9KM^e*>oym$zs~GnC8GAQV{UJyfHP;R*r+~ z!^#F%$p_`S68slM==?s=^zrpg$>&Eee;ci@jGUR^>8{1nQjpW9{v;;JX|UutR7Ea@ zsm0S&#*|v;By??_efi|J*AK@Z-+un>tK`*Z$?xAJ56>OHcdqBeSpB6lt*OzTx&l>O zEo&pDuC+jZ8Y*WlkSmXK7}(bK;Me0HKS7rJD*5vd$+vIM-bxB;H-?vNb;{TU3vOYT{#~b z9^~ggeQ5ugvuExG_)lkH8eFCxgQ1Ji4Rj6s>l$_|t9sHI=1dr}q9!7)rK?5Q)zw)g z){1;gSGs&B4rj3ZSUgWA$Gj!LQF46WpYNZ&e|EPtGsxXYsPnU&!DL0TygXZBa%zHI zX;FZ(GMCR4v1nW)m8lDAf+TPIBu}?IyV%;lrsl()6Ou2FC7&K%8{GQh^nm2WcFC)q z*&!Czs$x?W4IREnS52WH(@#$cHB}SnG3jX@uDy$DZVYUee7gJP)wQQjpN?OA>@j^_ zU|F|Ie!o+0uVaohGkaw1mWjyTKQaf@1Z3hOlyF7HpJ*fQIXxgqJMiNKbNJ=Xd3_Gq z@JIAHW%q#v(%{b@@+myvTQt0{v+uXt4?ezq{`J#~Z(p8)_U>8lXlKetynsIkan=xf z>g%{3J9_!?lLvS2-+J|0^5Egeb!$6?0s|4>fXUEOR8++=qiMz==PrD9a>>M))*O~K z7c*5A*;yO-TxrjoVM`X^dTfrHKsgd+`?L98EUrbPm$l^5k>8)(ZmqA>;Qb_2kejAB zsXlgkNo=g8j;4;G`b>&#t_Ca_Q6a z8}~1rw>6Fs3tcd_4V&-q^Av69a6MhTUfsXnK7YOj8+9}{s4C4i)b+J83A?sFqtcZM zt9%I4mZ##*7Q1jUOA*H^G$>_oV0ckutC-E?aLIfDO@qxF-n#qliS?HbE;`lUv~}_H zE2GWt?rxL3=y`T^?bB;Ep zeEw}n@?m7OW9I37v)9fKd2wyyt6#Sr*)!YAm{b~X7GQxp=m@*lu9v)g|Lof1t*f?X zq?aY-)rDm(^Uv;*cES0FZ8L}5ih7*0_YiXdX)sS@dm`G2^fFPOST!QnPKni?i7pt( z!{p9Auh%2L56TJkd*ly*-1GVgLEW=p(7R~Jr+7c`7qU#lLLxuD|8nraNk`idD-$0* zbvGgIY@rkVOWTV3*RFhj|MK&T+kd{h^T+EO@1I;NNlRAa+4EtslwkM{^8-kuP2sEUJZVIvUlBr&@=n$ZXI8KaewQF z+r4*=t##Iw*Fq;-X=t77J22XLuq30z)Wk)s>*y8V1pHwL>X>`bI(^W!up9UjeF4#* z%EBJVgWw}E{`tq?2WC|SdC!7=Lf`_R_A1;5rA+XVfbUy!08unj7rFcS#y)%crMhC7 zfNR0$n6gk~5z|Xg96CKVt9SRny2IrV9_AJhVegdU>9MJ?uKSm^XJ20E##R~6?I^VUPl^W(ce-@X0z z^8MSp@A6XTh+w~r<)Eh<8Xcdou&L$hnTwx)dwqUn_gL?`^yp9_L(FAZs0&@rEsbmr zz){SI#WoWt*)q9iEUFGlQXx;FG7+2$ErUu{Aj#1gKMPTg5{!13GyzGDry!@rmUlN% zH4scO5KNjTnqnZ5H&mkO@+r!QqBf7Mj`Kt`j)6#PDvPU!(490?%>_(nO}?8hFW6i; z)=~G!)`h3`EW6UTHp)`N7?m?b{#6#?xncGUCo>&A5nmaChRPDLMI;i6@HFHQLzlQ! zz~3pi-yW8u3-q3$$MzBN11u~fTHE#t_|71hy&^PY2E~PmcyQTMVS=WmVt3@=4HzPo52w*;rft;O3?4 z7fyuvyK5|uA%G&Lex5FW4 zn_JEv&-`AHS3#dl(kpqeUh!`czQ{^h%oFiX1iw$QH2=up6Xc1KByYp#_-bi;fCX%p zomk|?hBZ&B5o}|@PNGO)0;>}OmeKLiJHrF#3^g4zIF|Zi=eW>W;eO>zx+#n^IV_Tf znAu!a_2T-C*SAj{AJ|fsovX^$7vRo9rpt*1UdyA{z@Nv`=diV@6do?m1^zSz1vZ0$ zk`!oDCgD69@Mn-1LZ%W$5yucdN@0;E(O3*NN~5C`in>^=CKB;P-HR%m1i61I23qhY=M!#TVAJ2!7i}CJ-5TVuph`n=~FZSB0f$mAWIkU zK}4OfgRlTnjZ6R^1n_-JhKQU)guP$su>XvMgjh^}SWkeR7areTS2tEH4rJh_2xh{< zJir$P1sy)$R$V3V=-9iYgk~k7hceuz9;hmcP*;kA)P@D}EJ27K28SpM=pVRK+Q9%8O1T$uktE&?yuu100+@NlsB=62f9l zL6!9EGeWYrd1rU{6n1+S?)50>fF*iZA13(w77v2{;{SsqK83K1FEv8ug-`L|grJ9o zfS2-z3Rv*B_RA~?C_4nA(>zpFVqn{m!*x|r2~kxIab8%lng-FjWf%i-uN}rJ7TJ`!P1sxv#RF8svRuZ zjn1{-k)^?7YoT-{fKQ>K0tOfOqck!_VKVTilPP2lU4coV(0FtzkD-VY7BHzCE}a7w zaG@Pcp)nQc*c2)zPevvwpbCmi_+9c-aFQZIV^GO7ih`o__e_=tv7yN*k}wkdR)jS9 zCmQgE9%jnVTn^kmSrH@4DNLp#U^xv#X()p#Po+*mL55YFXd{FQD#O7|a8k01Fft3+UI6AGfwK<$_;CyZsu z6FTsD!OBXJERHu%;LjHMaKyd@f0SiNqv_Boy1>7&W~GaD7@Kaw$1G@wkb;URs1aDu zQ8;x^fdK?zx?V;4&vY_aK&J^1x=<0PDPUBvU=m&NX9{_O zHiFpg>ZT3htuPexgA9 zlO`+B$s`n-1DP}h{&Pr}ijHMMRPN58f}Wrfz}p>IHt3x{99TL=zz>+Q4+Iv#M}jud zBK%8-Ktx@39V&zughBt4KQtMzfZ&f}&U}INc$G*LBoc-zD@9@WGzwK4K`mj$3}@M} zx%Maur{H`UxF_uVV!|L?6wDR{aRfdn?n0wlQfQhqMBB`;0H^yaEBPoY>i?{u!C)IA zECU)-YiG9h;7oG>OF;w>dkQFnMnyq5lMUm3iad=@VjvKSD4G6~BJE!aRO-(pk{pc; zTQ&+zh5|yCM---DWJOF-VL~KqBDX+#A(9M>LY0a{0t&8qSOMEHW{TV!WflBqj2do76s6ftS5LV>?PHzclbcUVbZ$c%oU z;;w+QKEL9Fp%vo<`QVucKwyDPe_t66Dwj%Tgseh1A}b00gas4959d#$c?ovj`8*d6 z%R|HqRpQ2~3KB5XkV4ksuwfY)&c&HvOdB|eB|ZEj2o#7zxWX8z1i@e#f?6w5^c88! z6owiT594v8X>?cEUV&XplA<<+s>@;N?MhP{tFghTTsq2!frlarV-Xm1(FUBnF*}M)4`(5vIL(JV z*-PAUyFK4PssikI>gMO`x;ao4X3WsUgCYljyTxXPQG+9nx zPEO}va$qQAFjTd+~SuKa3z60#Sk~L>Bp4}{&a?wj6aTrVrU2)P$bi=Cr!~u8HNmW8j5J_PFEi) zH3t3^ItTbGK>C5Ory}rw4H=t0iNunJz?Orlmnvn7BbQrhZQL5@wJjsDt0=p-B)hLP zXRtJPpd_caFmp#*{MOWjjfpW!f_+I%cV6N^MaFP# z?%}xweU<40RXKyT#l5wqTS{_kL;Qo(m2`iSqbf{-E}TWiU|0)7Q4kH<8;v&^w~i>- z4*bI_`hzQbLaKU$%Z9@$4in@2MX`OaJ%29{w;tavqE5-k286n*I#29_hru!J!rj~7L!`$O=<4zGY8FXF@r zIZ<3@5Xw{|(}Zwd5&CO{WkIGxmmP-C{9&nq$uJ^M)>cL>2XeIgv$bF(Nrh<+O`cvH&xh1nMuWL<8}_;qR4!_@^(HWWPFko$OT z*4>q<*O#YUT%2}cN!I06r6-mY?kEXu2({5y44D983^Q`XcP^CV?S{Ckjse?vSWcij}?ru)G2fk z!5`&V;T(4c3j4yLWQs0>YJgDOxEaLrn#`0`P}i43Q6WPgq!h?R7(r zDAL{dm#XZ;E1S=?w_RT~7xM?B!D8<}K6CK<6Yi#-KKJu@tb;R>B1htlP^REAK2ZmXi1 z>+Dr(WZd9t+FKKN@|TROTWfCantOYrG}@nRnfq*O(~IpbzwcT8v8VlyfpvcjZ}_-x z&8xnpZwG&Q-M{Qz-%82BE#D7pdegb+&x7kgp9fYy>00*r==R@F?sz(~{>9<7_jb&G zwY}+Xd->DN)pyzpu58RbyeQ_-{F==L$xT6q8HR|)&x$O05_ID72wjoq7gN>kH>=aL zVsBJce?&!ZSZ!ZOO;32ufw1cRp;bd5s1Ws#%6;$=%HWDYC}omv@Pk<`oe45W?k7*{b1Xy-?rAi*wOfAck9RQU%vLQ z`#!Ys&;6U;543~c4Xylgc-{N`tKM`k|Jb+sUH8gw2iAPuzxwmw%0Kq4eKpYjq<_WD z-X*vCmfr7Q`u@P$$LnX`T2Xp$bt&*azb0dJN!;kd+1)jTy;U(_LGUy)9+?Ky9Ex0LVjy5K$+*_@^%uZA6x`h?WAtWdib`h?*=+Mp^>HPUyktKYPH&nc0Tsl1|y&z-6!G7~YKM3^s^9tJrdMxi)2fX;Sh zaNXJ55Saf$*Fd4_k*R8Qh8Ap|z&wu04#1dxu+>6GjZvlvf@tk7&>E;Trji&qg9GzT z81EUt`7K+gY%hm=C*wt-PW=_}2V2@+bpP_YZ`JREYd#;`^sayHtKG}rcdq%pqy7HwmM7gy-fe4p)!y)CMcv(b zB`2y=_m{^Vnv;BRcG8)J`R7{-j@M_Lou7BMwczZM;=`@^gN^A2>%u!q+zWy|4EQ*A z3LHB~%Ybm+gVF8p-Cq&eV>);4c0Xw9=R3D6} zIRuKF1rbhYG;-Fc3_H{bO;|AU?zihN?q0}9%s4rI^T9(&Y+NOWHRemlrMBXyTjoJ|qB;9`OYTTp!GZbN{Z;p$gCID@r<`7Yjsu=}E&l-!JJsvmbX#Ct`-=01G{qD_YcdtIYbul3>ODxb=Q#K(h z@RQ@>p5D2;artK8ugZ2!iECQ1tXEIp8{u1`d?$DcfXVa*{#1$q@TXEWsWdwb^`_E2 zKxDd!JXM{FX`?LVU3sGJQgz^up-Kpysm2$?IoQ?5g)~lgSeojwsUWC-Zpx9RIiriS zjyD!wYACrnFXhOL;Lb$H?NK&cqwKcFIP6Gp-j(QjvLW$q`;5n1tM6}|38T=bJ7<61 zw;1@}?`*rawc%>pj0+WMN3+7V`Is+u)L!N}b&i92z8&ll$x1Zm>^6KG( z*sxSBWkW=f%OVRR{G49hJOBCluO;c>{X2I*z5SxGwvEp>W$-NF3>BO0$-&)WrhwDc zVY`Y>VWV_C6`>o43Lc-6aqE|g zCu`6^O=ZXH684pZY)|)E9A=ei1i|sIR9$YZqv`Tsj}|Zc zdLO$&S0j5(s)H77PI^vWNTiptIN91VCM+s3Cc#Nr$3d(W9G#!vv^%+G1af%5oc+P| z2Loz{!sZOe%!Sy7fIkSOOz<(bZUhA15+dqwL)_fa9~C=iglG+YZDhZM9HCwvJ=A|T|4&m)vb?Duid$Ld8Ge{fu=c%>d`so z40uwB?a5_&aBx!=LlgMZ$SftHm8D6nwkFKK;6$h%4bcStu%y{vtPX;c{1g&f#Nl|D zPhFZ8u`JDZUbN+`plSK;rlo;)Nsb!c+O%Xb;!lz@!{n^klN?24H!;nLPjcoc1Sun_ z`n*OTlg`|bo6Bc@?OgV)bIF%IZIXTKB*U9N4la1Kt@1?u^c^WKQ2i_(T?<{h0=wkb2FziGzzM<-{c`x#&yCrv$fkswe@!`IzADkLJ@%s#}}CcAiE z#nOSS`r`?W4*$0uq9AK1^6d49*J)li>n_cjF8<1@Z;;o{!`;X z8^{w)1L{BOQ1{|5FHT)KapLafM=u|J+qG#(iKFRcZhda_06bCh`ri1#GhtUw+*n=F@w)t_en!pq;!6D~UDJ&&&JOx#XAxr(i}`JuN)tJ ze&ghmUk`$g4)30(VW`Y>h2wDW*fl(kO7Q0)+5xWKrP&G1wI##dgCX8AC|Qp(Sp$yE zGN>AKvKmzSbG19uRW*6aw$sd`Jk47RLN@36HwGGISqY-1adZ^q4KaqAqMWTNx;;0p zBY*l}Y0lyR_e>q7I1wHrq=j>)%=a)p(~vbfBm7{#=kYSn)0MstmZv;knSOs&+UfeB zlhq!58ODP-HUqhyJ2O02#(D&)(hHr;oEZx7YNB`^GloOYHxSi%7#F#!ra21IU7Ztb zt>X-Iym%}dRZ+6H+q%s3{q=K)wr*S1-kDW(AalXdgqD$*rs3G;gGsH&e*h~5E)#)0 zv2mQx4=((LeR>0An15UFcf0s2?M!bt23-tj@w{21gL}33Zdzg=Ce2EP?=Ir%EAd2g z%F7;JJ^TK*E5ARwbobiH()>a-kpq|M&SLrr_#qt3Q;4|oX)17*rYt+8GC!g$D@8}F z&Y`HGifVL4Wt5`DL<~@>?!J8E!!xXmm~2lygT>k2JIf>1#Mo3=awAj}Le!bzQ>O)J zXF-0Zc1EN z9%fG`i7+a|P*dZ=kppiZUc7#4=;fnpXO5jP(DI@vSiyrZupP!{`3UGPsw^E(Ym3>X zamDEY(^Q3wDHH*s#YgqYlZ6bjCOiTF{C6d)AFFmWoaDSZ+Pc76 zxzybp_{W)<`)Kh>f^24(sVxb1^ix;%5c5L~G|lJ=`jh2+m08tZHp{|Y%MAIg_G+u$ zv`&{s9M1Cktu6o0J2deWZLFy~SX6%~ zt*S45_JO z!hoCA5w~WA->-|=Y;f)X?rjHoYb+xojj_{gQoVsSwvIyT;R8fOL)dK!-Gy*1NG@4dNmcc-=xfz8v zGazVHoKvH%#^!Lxow4p~lRTG4xem|GA8RUIlj_)>U^CZ3sd1X1Rt;^^=Wp@1K2w?c zaCz0Q3yL5=T&qpGHZ$V=vV6(zxvv*xZ17ckydvl8Kr`@{3^hMmlJ;g%uB5%{L3QGl z{K(hKYaT2vg8?dxk=|{nd%Pg;VnN8u`B|^q^6t%v{dIoKrIzRm3zPecJ^K>PuFMX* z(;R=gEO3#%GVm{&)1O@fDd) zS`x=Ay&tz{ec4*}aaG>$^OJv@6?>u3=Wb*2?Nzy#+R|<>F8;M;#+fCR2kUYUrg-0< zm-TT+{l$i)rH-1TS!r1dN0S>4rZybNY&sI&dNg{;Ndm8oHc?4mc;X*d;5Nd7)TVKe z3_DbaR`8cE^NvIC6Y$fUPl9+%JFoyATA`!X9HBdl?@Fd?0e=;do}HPinBk(yiWMU9 zd@Mn_p2IdFu^e!*FPrC!(_MLtX)H1yw#C_03LjBc;hOO=D?Zx>ro*r)Kt|OmnCjYO zmA(o~J1QeoO>1qCQ?(ZVctOg=ioCA8kQN{9p+e8IbArYzoW@FQFXV(DigxYr(TAS& zXtwXo`jqq4affsL`Vt*Z6$MN7E|hGk`>>?waDx4D}+aw3qf(4&@+9dl|ov4U< z{7d2M^)n?0+CJ{8xHvE3YF*gzT&L?r-ltNWPUpCvDGj=}rr_p^yfbr>&&|ylY0N(` zC+kdc)L??sjfGja+HzKVPCZeWn=%i^KSxsP_vf}8k6L^pa?xKwF2fGw|Eu5z!h-bq z$0l@wumIo_x=gCt z_9WrKa$`-Jq9F&{ni11%EPga6=0^hA(x9oZdAt{F9|p?H=#4jeVeZ` za2qY~87>MLu9!YLEA{^RI?2I}lHnDfIvVaR%k9Z)yqZ(cO{*TfUF1lZpK+ewnR^SEGOtnYwnJmsJ0oi^5^#yHXqJz7|yOclHPJUv-ND&!sD4O$1)Zi z1wn=Q2o>TYl-aE(;39mR)_f#={&;4~DNx3Olj-xN7RdM$tw5G`WEFsqv5lChC-4_? zec%ynfKO3WV=_!|x;YbdjX&Lx z)REzOD8=$hh5zFvdGEJ3{n5W#a(Juc*e>AzwSSRhbk*6pF*jP%Kkr^3 z$i`3mS4u`VUT(>MyrSw`2V8Fl3xNN(p`~v+>mP2O`E*P9i_PWtmSb@CWRK z3vdI$pSa;4{AKxvh<_P&BKbhcV40w7Qw(!wGGSop1gG>N`H;v$*o6n4EYyV$OAQ=& z?AH!nQ-k470(iX=JAlD;ps~$JOzkNQb(myfByBc%Dw}Lfp%{VS1l?ps6$Yxw!4gA0FZ{})2U;c7)&7I{14_6gFT$XoZ-t;STV=mVv9xU=7s`0(B zEcxTox&2|T2UFdSR)oWI^a~r-WVZ}wHIHS^8-c-pX4{4Ih35$V1ZpS=+EB@9J4t*c zy8;&{OaWg`K>QO;09pYdg8yG1Co(@_f%L2nSb(|#e;(Hn_)}?0U;&&$0sd^v75GE` zfusKL0v~vWj*ohaS^jjk9ffJ4fN4&mtHM$PLqU^AGeV~rpr{3%Zc39TA8k6Kj*wW* z9{;+#I&8;+x|4ghyy)Nj>+-6PYf4WPdJW|H-&|aDzcp(p#c3eH=2UUO=&aD=_0eal z{0?N>-dU0(*#}X*75IPMx908MC671Nc4Rv5$#8hMw)D-ec?AED18X7qNREI_TcJgC zCwXk}Gr2S?`M1S0e*2~T?$VOGzZ5>(Q2AlkoDW-PJzAV~z9xLUH26?)z({?_m6hp| zH47fiEdu`IGsAY&*SFNK2L3q<#^>Ly|2{u=$xPzO-ZM-T+ZeP{MMNL zef@mNriJ%r=bp@t=m;>`?q%>>Q`VREs_$ExB#@d8?UeMdmkh7}zHjx{o?j#bYd@@Q z97zl64tE%caoy@`yxre)EHB`3Tj8tr8E@87O>H^#5B|i*A7dUG!hf`d1t;Lge^hqM zX;9|;lQLy3I5i>ogH8i{c*zfny8?fBER>GJ&;=*ang8Gq765z@to#uCDNHjmrbD7> z!t*Tn6m5XdCz)V$BOEaX{&1L<$5yGIG4sx*u-h9$yIN*n@7?~}$hLEvYHzotfCa$+ z@#dO)>q|zfL&nlv$1~jf3LQsl{9Z3eg%0{yhUZofz4flsb_d#Y1la8Hw_Z36zg8YA z**N#(ikY9GN8SY)X0xQL{o7zW@c*=T$=98W-mIMSWIRQvJ#U-we(kJ} z>t{nNyV;a-V_wp!nIR`?6AqMz9b1reZFSMJMKcei_}*wpyfQm>L0x;nyus9#<6uEX z^D*F`z2rjH;`6{(#vCeyWc;D>BY$av`X~I81pmL86Xd03cFP$MJedfI1$NjcHrb77 zxQaX-RY2f`^28Bb+!uDWq>|=hHoL_qT@k)fV09+jMJqL)X%r(@pV@HWT!&{kAD``as@m_-qV)SM8JA|oU8_xfxS;U%+|0viz8gIaUM!k%dtT;+ z+0*YWD}A(P*4sUcU+rvtw4v_qimE5=v(MM2U#>~NJTqmpi{aq}-;c|xC2Jcb>l@xK zue{roab*r9|M<%d(~r$gI8YIBtSRN!_8I49#olO6f3&>l{G9l*#fN}x>Y}qLZD%s( zjbt{BLVudtH1=Ql!<|IT6BVK^g%2sH<>ZeRNPV1;j6Y$Atb{X!U;zwlWc&d>31!0Q z5s|+9!5hbXaHcCfAOO!WO3k85Er2&)!P)X3`O_41zyby`6$byn-^J2#$Er0)x2(Oh zDdfSni2m8d!2j;y&FkmJ9IK1EzAWqcj@dU?6)rKR&Ga^iADx?VtSg-d zr?viOrAms6EmX@nliRJeuFi;m(^~erZN~k^oX4$sx0^Gr)+O9&%R1eVGF%xsRzH1n zn$w+y*>BcWovw+#-I`r6e-LOVEj$Gl0UFnDJ5E@nN!i(*1{G~Jb#`eOLET6PdwY4dbl#WJJ+{A-{nB5 z*Og^OBTZGAZ70%OPNgk8o!)vTZ{bL8%V8)BT90N!hG{*K3rQYg9?1XwF@N#tyhW#o zD_JldfY|}e5$2CW@Mq3HPUwf=hYm&B3lIYAxvgjO+RlLl9BUZrBUCFDu@8n##c(Zv zFE^RYKn>u{Gc>9jLiYgvF!-khbYzn>JHvMRI@ZH53kg>1KPB@wq)MCONPWF7hr0ii^(T%2@>+^FjHfHTk z^_XQXiebwY=^@)=osU%}LjE~hm2$H_Z!9yYMu}9;|EVj)`gm^e`O@eM)iGylVs0!* z`?WRWWMka5C3(N^o_}X$`IGe}S6h?sZ>SlrFVAQ_p0?m5bhtnA&tEt$1O5;G0G}{L z2A{A1$V2x*2n3=`wH60G6C8%}s! zS9pdC4oDO8FFIn!rr9zn@V-QSDqVxYR7P+mSS*$9?UFbmp>9*l^8cr>uYil=+}@^5 zU|nW+))kMC5Qq?I+}+(3cZWc5cZZ;H65{TG2!s$U?w+Pi>XNp%Dc>_YWXnJ8y30_}jhdfR3Z3|s}-g)LFp9S|5JX#{x-brw8i&|eFwDduu=gHNR z1LP(Ny@*{i`X5;`ves)Fl+4}q4fk{0n$y>|XFI>GO#Wd8NRmb)mJi4dm=he9S2gEp-RZO>Sk6QXP-Sb6W&^J|yuS=u9*_s4z=a=ni9mk3~ zc4u}}XZ=+g`&()3vlQ>=*#WQfLvVeV;NBj-vS_$Pngdxq!=cV&YIFGFTk)$N<$E@y zuDlq(;+H+;-)t?Y&vHFf4qe-Sm+u5{I~ zrZkuPCBb{#rcEPEl4pEzDPrc6BDV*dJ==5EwWTcEwxmzW5dLNV=?y`%-{c1Z|F;$K z&k8sGRGk6*f83JXalE)=Zw~P9*p~W7c|4q@AFJZt6o$RX34E03aX;3%-eY$5AjMU$ z+1RgqlIHd-+oL&QMSaSO-1&X?te$s0Ht0yif|C_qdByvK5)TC=pYTembxFPMmfiyJ z-O?`tL$JUII9Nd6)A-Z(H0JcR^QUR`?x|O3G9vGmf`^^>;|9+u)}%E7|7$0+&+dsG z-K(Fqz{-Z`D>2oJ7?M##Cq!;cUc7LfN@dICsAP&BB2h0s*MZIKXGS`iqGhhkLB=Rk;9e^W45mw=h<64m}e3=Wys;s$v4wi-%VfpuGsfk+S&`wBahCv zza2R5cJRU%aW1za*EaYpIqy98ir13M8|JimE&VY$;6v8Nw~?-oeV1Kzp3xq#q$O;5 zW8k8ejVm6fdP4pm#W)|BGw5FU%CED$zRLCaGS{m;apjTlS)n7;F+&_H7tXq0opfM( zuvc!whSUq8$)|!7Pi#nSb4kD9lG)&#QSY4I>-%-MY9L_|F+O+D2%tG_}xR_lhZL{9`KEGfj&!(KH&(tow@dY=K44Jo`3F)Yzvvy=Wvy-L|G|w1hkvl-2@2J~7+V1G20Tqs#vVN+fL7JQa%9uXF)Io}* zfwC<#9geLW3(x0yoXfimzmA>pud_T6%vpdfCT{GHRC3HA+Ue~KfCq6;ScAB_J3%xr`bVWyXc>fis*0UV^l%3Y6AZ6Z{B@+ zwzfDTwYS(($JffaN*vFbGHL3-0YlAoePpCPyi>XS3kIjJnXo5UYA@y5D~0`$o#Sw< zI_o{TIcmxMm|1^r^ZT*F^Z^kTh>ZO_cMAs?1$G zszWn(_~zDb$hZOWN^AE`yWyMB0CLG~aL%d!8(4$?Z+z*S*KG9v>4#th%`BQD)XR^t z0Nf#$lzLoYhz&-W@boJ3Fur(v> zFBA^oiv}`9y@9`s*H6xO5E1>bx2xi5$B?=ZzC4I4Egv`Ga&q*EecQo;hUy)4TPv^a zE4{iu?c03!ud+7O=PY}9IJ|vp=w`RcRV&6-E}Q6TFB>K?!P!Pzoo1k|%@`}I&CB{V zAT5@(rafWJSLMM!Zi#r1ysp7-W=qh#W}kU?LYCbNUHvG+`E5$*`+|fYGUL8Yi~X%2 z{Xh8$-zJ5AmlO3%QNqu;K3^rRf3RuMz39acGh8kQ&;G7({rd{f?@Bj3OrL+PGVn}B zz!v9)5n~*4R!lk&=YFBOaNCyc5xKiPGtatY-2!>1-{^`zSYVWMBl7eOE&RBrVgF>A z&@3?G57>?18-lV<=Li1(!pRFH406qU*Kn^Gt)z#Lp;SxM#W}_6mai8w+1^ zrT4a`zAc*bCV%FM&1-KQPCHu>k>E1n(CPv8p7!Tf$y4l1rjsV)q^vewY zZ!&{kC3-ze^|=@8(h@WcbT4M%n|xPfurG$pewV%G!xsOiNsAsOFTIo&csR~2c44pJ zxt95U3$~;r?5a4Bm~uEIqX9U$=iETTA5k#n`D9-5&bo|b0*H>YjA$FV&=v5`$QPRe zU2HTh|3(%V#GXp4euBT1)KW)i6xtARcjY#q#>y+pg^00sPPHt^)qIE0ew|m<2jk zyt;W`;)GNg@nn59^!rL$6bw{*c?6iVfLbL zE1aL_F0Jz(@+f8A%d};;BWE=SPQ}K-Rp03s+$Nt~GvUy((R=0(-8IEw@616*R*XHl zc2bl71w0 z@i#_cP(i2?Czbth+6#U@AwbclhQ}0WNsYg2fTOLGM$}Ki?}xaU}`&Yk25mwZ>_wvyX<0hY5T5{wz9-qm2=w5W?sme zbAMNGTe)ww|HMOH!%uAJbwAMlwuk)d2#dFomRJiR<|flknYmMEobwxvEtsb8X)klv zwMWfv3Y&UAVbQ~+C9iWfJWXA9Cw^r^;M@bNMsArspnUeg%DGOv=k>3g(sRqae*0Gs zzwAHucHF%7nAr{C({E?Ew5P0l5VPoB)Pma)^RM~NIKR<9WBH7zHKXE!W(N7X$0oq& zoe0Wo2+X~KfYdwhsz?4+_reB{XZ}?H9+=S@klq6PKVbo_k?;^VUAch!Pg&3fe>w!C zS3%c}0HM^5Ekq{4QNZuRX6nTPy_BFDkJwxH>!Ilb{3UEVrFZ}eJ4wPuB(~*Om z$V$nR4PlE`NtEFd0{BPq`N=ZbSx>LFlEMo+ifeb4wCyZzE{VIdWnSy%>1WetKBx`> z{#!jq?{gb+#;xzeV23-Niih6hBOghVm(7luR&Ey7DPzVTadAS0ZA0)Ru;84>@JFf3 zo~5sB-8iE$Xv&Sqg{_f`5X|0)UGpk0_{);Wr@6t;)7M%;32 zjyz3Y|7D)XmpPtKkhD)&{dGYADi1sMWxd~({KuZOj_QQpw?@6MiT}Ae=ErURKWz{A zZmZwBtwF6B?sZYiZ^x}@2%3f9_q_Y;3o*d~)24@Q@QsZx-I!bxoKx$ZdC?=U!9Dwe zZ_!1sq6;AB;zsA9cDI6CKDoETGulBk_(m2OU($S`k^kqF<^rvMfH}Z7+Fyf3p!UM( zECfT;SD+lk!&!B)BhyUFV<}02RKz1CA{D{Y0)HOQ9{6+k_H;cJ@W=6S;J-v{86_~^ zB$Nh-*?t5wg3C-I#7RQMOOKGo?4-u>>}xx6Ys=yvZXWq!%Y@dPwNENS+jG1Rc}}bK z9$vS>_WC-DyPmqcUh>->(wm+Z^(*ZPY%FqY%^M?^9dVg}E%M8Oa~`CvZ{4`?cI?te zDQnsz7CldQd6w?-GRy1N9kCq;aykxVcO1#@*qicmc{uj#f8Uq*=e~$vcLl$#@cOFK z|7zko;E(Y6z>2~30dubSEjkw!SnTT;;}sg8SRR{oI3V*JrDqDSdF5U7E577iT-z0Y z-@MxqSvNsOz`Nc6d|(dw$3uD*0B}5^U()Qr6X5?(@C{7q%!N|=pXiHjKgc|jf<9u7 z9*19e9O`&FA<=ThHcY~iCF;)-IhYChG6@SFsZ}tJ0F+kBA zPAXSi!dIMg9DX-xQ)5o_rOok2QUmYj+Wv8PVoS`FJ4wrL#I88DVRTFAsLL+a*Il(Y zy%g=9#JvFdRS$Ke&#(wf)f%Dc>EJn6Vi)go9f{JcOX0JwN6o4A9|NuaFlEuxjAf5f z7vD>q|7GEZH$~3xcLx1Yz42{9=r={-KWvZx^FY>zeX-wG1U$@He>-#ivEW73Zd11{ z9em7l%3+Ubdt7EzZ}LTjPeMfLri3$L>GeUmw>n$FJ^trg4+2$d9 zwo!lGM}Nh`DauBh>}2<_$p2#0f~_kC>|QE^SmJFNv{919OtLm8`=_=oC}`5(`9npc${QnF1;Kkqgiv_(Tgq=dzTZX!2u9n~^s3ti=F^AMhHTHyb5Qo!8 z#_yvO^wbHIy}874zIhNw7cEkyi)49ReioA*$7IKta+1tMS$t(KsfuN?t0oP-krI5j zF!prVhHII!j&qZ5#P&V!-uw9Kz6Y1~xDqh*l$&Kspr+kdc*BSNHp$|+yDol~m90#E zYWJQ;WzpA?JokFcNT1X@ZlpGUnqB_1o;#Ngxg0wGI%(zj?7R^3ASi}w4>Y%1QE6Xb@*af1hs z@(Ih0Og|Blb~Pa5xnK5+;G!=*Gah+nw;&PZSy1Oyc+s=ql6P*se@;VC{=W-9@Q3}S zxnN`g4Ze{DH2$=}L+5{#{J;HwnhPYV1phDoe1RBUs@Uk*AhBf&>}mX!Y%48a;Uw2= zkoDR~SjUnY8vkq-C!WOt{>cn+wm_93kS6nm(LI#)k?z;iLaxO70{;&u#$~3z5VA0k{9>$gTZVsa)SA4RjzDjv)Wp;3 zvq(o_=`6bg>qY_Fed|V7Epp19WScv^chT(rTNY2MS~Rg_!RW%dBg$smm&~xsnqV0_ zT(O~tV7|-*->}zZ;-&a?4f!F!pK2T@(I~BkFLN&l%edy1^w1~snRnKcz=BskdF?*= zjR4=f=#qEQ72o`;0lA>2|0e(b1+8EK(56)l%>^S1=!Ztl1N`Z=@bOCR{L&;A+Dk+Z zGNC=mvlH_4e6ErsBzYn!+EqzN8#%wHWp^9<&orYLOi__$*DC;4q&sSuFc( zrJCc}TNO08x2J>6nx6W38u@gkY@xN)ntt{h`r9wJ(alnc=P3AVELgrhg&Q4Z(N1cw zJ_@&l231!CZjjYS%Ni*DBaP0iIZ+?&dK&*7c}ZJg{g^-|K$EPp(p4_R-XOC<>NZ zejzf^nVFCblj5G3G>&e5qLy@48de`&6ylE!~?$}L1^S0U2lG`aqNBz z85UszU5=QS!1yelMJDs)MLc#fpOZ$gq6OWH4p#X0 zGrL#df$E5pA#?V5P0Cv|AZ2Es#F+ykCOi0#ahPQz9jBEzk*Ki~*|ND7rVLxt?gRLo z;WBcDx!P}tP2t>8m5avYPj||iI&9b4xo3SBUfZ<(V$|B}CE;ZWK?2k660td(i47*M zSit{`!LS`N+$CjeU?J*!TKo%dZ7R4Ik#{F7uPrdQ#igKqLms7M{*?j>+h{U!;S>BR z7GyUY=_B$KJB;At2H?~9^Z0fwj-J6rmqHTwV;3G7p=tJ0y#_4t(hk{3nCD3ZSp>8_ zg@1{FyP48ItSElBP=>&lA=$u{`pGSV_<{_nq|mHe1)tL#<+@|h=;!7AJC4uzwrc$L z`TUBh>iiLwCtYVnd|@+~VbY6f0{qEtQtZ3&P1NmI8lN^jnZzP-&bxd{085sGlE&rv8CA(u?H)UR-`i=H&FbkX?o z1*5Vj_b**I@qC!ug@7f%zdp|Sx63;+f}PRv77JX2!}tPpf8}sRA`?PlVlk}Ow9r*? zb?%wh0e)ouUEm*-*XmJn+jH}se+3^81B=>?1V-QqE%UhkO*t(-AL+m0Pl~N&(jFSJ zKd-wbDmeuV9S{9x`7Cn{8Sb{`az**6kc}Y<^BkEPkOJ6bK9NR{RU8>8pH0MYxob$q zDv_zPgyk#ar*&s$n6dMP;vA8;Y{fyKjj&KbCU-jLGeBMKLO zkv6(-SYN%5jcS8lKEjeeSi_tuXDm~&Ty3}!4l-nf(61nOT0fi@-n(vWedO|Eelr`= z+}djjzkhPaJv5=aNQbIaGy@UxDMIg1^hJcffqK_&T#2^V&{?ZOBeD)8me+^oT@1{= z7+%sEP}t&|+v=6m>{rn4SA5gA=!REbyGKr|Pa*X(ps3xi06B_AkbmA)kY7O~Y`1S- z6F%jed&5AK6YG_OgdQ@hbs*Gt`D9)9&A15y{)Es%A+$#gIkKGu%bd+3Y~V`v}wiToa3KCTfO>$kYVwXi#Fo;>pqbjcWfU5z+WRd)Wf~ ztK27FFZ4edyzun8Nyu{^TsE>|Mt|U+H*ZMFNV{04o*{iLJ#BT9`zmG*(78F;1UQ&S z4l~c2)EE6Cs^$&OoMczIcsNqor+jBM#I3%X?%wgJ;pZ0*7OwZ}Mre6#37>-w(iHK~ zgOO^(D1ypmiBue!ZFjN{M>}H3tWdx7GqDwI-Wiwt3!44&0dl)@Wob-JqRiG$Z{sm?=!9N69m_<^{ak8lBK+KhY8pvM z1bmXumGRI>k|*PHND)V*;EN;-#_fjspPxLOWXVdN>vS#F?M|Y{CEuAxR*$S))Nj}N zVHL}V<<9CKKioEXlzo_!t&fA=#X%E3u3y?{oG`UY8Pls|&d^;e##YW9xOsZdgKI|~ z^_YA%V#&D_zlX=ScYO8i?Tcq~=Pu=N#ArB=E7~Aagh-zwr2Ap=gfcTGiFRrdl>wHtG4!*b4TDy-kM`C3@X^?>{azuc>Sg-t$?Y6J*HZ6NQ07N5da z|B@R%xe)$FEDBf?*mSs6KDjr%b74e~(?iu_Jr)A+_swqhMRF;3kXR&*3Q2&B$Q3z~7Yb zWx|Z&sIqw$iQVMRCX9(DCTRI+#WVr_=;yEIbeAHdXKKb}aL|QDh?X4!1s5$m*<#=? z=Mkit*|oE0{`309GAE7yaP!tA?_2S17d)q;bZYPV;d@+0Y+XIFX#U`oF?Jc_2WI($)6QB=pXmhbPi zef|6?A}=0KLgSC_(G;--AeseyLQaU$Ma=@)V6N5HIM3I%BM7Knu98QYta0W&}T1zB)K3~m3H(FRW(uClc@X!xiZN}7KW$}bMmO#Z7 zgA`0I)diHx<_V}aszN1?l$r65Zrk_!i|?8b@1AEVIpMnOPP}J*$n4`T!*_cP-S0ng zpX-?ID@Nta7?L&3DPg>Q+}J*OWBcu$KYIVXA=NYbSIi!|d)fH?YsOVCAGUwZ;L~2? zYNM7^`Ye7{f9jX7-hTD^n`e(-sRV?QFQj^Sqx~mhd@g~G(Oi}g`7X4+Cov9!MIiC3 z5bHEDOF3aK;;WI37fJ0uV`84$;5o~~V{;BBm!6HuKO32U9`(|Jc^88V8$wE3gEqJL z7F?&-0yGard2P`ANTM1DH&_DKy{LRO64X%s2K|%S;+xrm2usH6!Ibo%@h7pxr4XGg zPrtA&Ez-?w7fldA<7PaWq+Gn%K`te-q(S6XrOR?r5rs<6Tn5 z=Mqy>1%n|+i*W`Erp-jeH4&pFvjs(ba|T<{jfF1eGBzPY2VgdbhrZ>=^vNK391+=# zlNuKHW!s~Uubx)kx%NO+)%K8hWjto&ho_d(w$W@Cy@`5u? zL>6D!xVdp->GhzJX5WHF@4RcY{-NweK{JiNcg{@%wR`8ZQ{YoYyr^cWr|qv#Ml(o= z(-TBrp2UtJuwn5OLN}2DV3-Nf#Fo{KWOtVcm@*N%x-)q~CKFG2P&Q}^1nSnE1*nB0f+B*8W{>Ei4MKx# zv_R)_*+QWReOOs6V&zKLmX>?Je*NyN#(K{oefMsdb2W0oA(vtM*7ZMuEi>T1Vr21x zFVd&7P^J(m#6pEs zq?bs{#UcxV(1IsIYioOv+R4gs=7<^ItNaQ=QVvBIo{KBK1WOT|b3UY?F*vU&D8C62 z1eGAlY4gfyMR0+H9(7~Lg?eW;QIviSguY227SY3uZ;i%~z~4zHI#HI?afToY`H$?JnVV6AGDZl7-O;pNm;0=oK#!e$GWdYmrbWCkO@A z;98_%GeiP3*A@_LE?U3?d9;IPvN_-liy}VyGUJM;La|u2c=6i%_h0_->dTIIUsbrT z3Ll`q5IDU)V%Aajp$DA@o$;HxbJ=hj|FR{cfd8)fPREyxK0JTe(S^hJFZ$y6x(WMN z4y~Bir(#L}>;(hv?9c!3;^wz+-az?${pP2!qo<+Oq!E9}3B`2ie2L^kVxG!5ikgFcfQjKINMoW6n88J7~ zHEMU%=7!+>t0DQ>buQZ(hb>Il>aN0=7 z>Opd}QU=$-TvSt*a`{-rmE)ClC-$A%zqh7pXKGY}jYX@gTE#;N;|sXNq*-(B zJ$v!|(X)=9{`mS~+tOh+`71`%`pw4H?a7s2oN}9Z)MIMNyrFqB2B6wMYJhUr$}cJx z4yc+tylm>AgG&eF9N)GD{R-yWdyTT$pBeSd(>uTY_~YBJzJBxi?W-p*Ak|`c{tOYs zfP-$6us&Qq?l^3?Kp2uCGc@^@5dt+@bwS#tQVXe64^m3hAeB^us|-0|kzPvbq@;yR zYK3tsaz$^c%uYbqpb5N0+0W8;%tDvksQkK3d9|V0wIMkdLkq9Li4Dx7W8pUMYy)L9 zdsE7%5rngfAmESuo0O+Vht3{y*8a-$v-=8LE>!QXEU-~2lmdxLC}o;_rY0mb{#>XM z%+C=}fQz`o|A9Y{7w|r#h)Xpyr@Fy&;dxNT7lMb?fuSTkp#&^&9Qwu6H($Sc`tm)d zGye4EUDNUS8U0SUPP*tiq26=KY4=HI{O6P}8j&%nZ|ST-h_=$k>a!mon53m36&C8#@`R4sEzXJcFoC26vz8Qg@=l{eXjgf&rTrxtS zL?J!!NBKQifRQpF8hqdnl4B?kke8q`*$M{?r4m~)X#@NvGCL93M=0rylhh3PSb^2- z`EG?#MGe5;Kl^eZ+|G=8Ln49#-z%#X;G^=>JN+u~$0<>fxCff{D7Zb;JPQev(1=<4 zw{LE$J9ez5(nhJ&5=z31Bsel5DMRyojhPfA=SUDWA&lh~SPKbV28+K_Zq~%+`QVYmGTC0*r$Zh;8)x7mpr&_w^4yy!)x6 z;*4gv>$BuK17}|5s zx(U12j!&LuAHQ_$`zN=4c>DJEKRdqp{{1gM{ru+n%W*@83C$Q7wga3o>U5LQc_Da7IJg7NTnjwI*DE< zvryx0Li{ZnNHRo8rX4zP)QaH5U2v8{vd#qMTtX?kFObi=;g#9$k|EZ@4mTqxn3zG2nG`x283`Ig#QdIfW(L)LR2s!zyu%_ zjXwpx0e`;4S}N9p1<*Vog_t6PfmZ9KI#lUsNnCX*u~tE-l_HH+YAsg`#AZ52)R!w8 zXeM>i_h0G~RTGkT1^D}9wg7z3j5Zp7REmOhBDGqeAb4sKU&Ci(N|RK6zs5vFgSld=;kqI1gQK+wzzs7v&L)} zt%YJM5owN;DHJ}X^C?E?zyfL&h_#S;6%-Vyh07{Kx>%xDE3B{_tW`E7p~j>$p4gHt z?bm1c%1s4zff<+lGFp5x+r16=yQMXuY76x$j@I@Hu2d}0N=4?>u?wz5&F5^%%XVJ8 zK+a~cyRnrrJzN_2hX7w9MrxG8UnroErwM<;|G=Ngma?#R3@o7Wr_v5s?`T=cl>>j6 zMfe-QUnP|5C7Qb9XJ0>f_U(^9{Du*~m-Q(WoARHY%8Mb)G zhAHR6*X>+8tHx(hO~{(mWm7sHw|4yYL&uNbb$saf>q7_h4<=u~d-v@C`~Gr~6#E&# zAM?U6aRzNjY5ZyMg@hPHNTec(QY_VwQVWm~f3XA#-?Ebo_*39x+L%G+__lq-`^-5`5NC6*k*oFVRm&i3m!?gIY)nXSHAH$K5Xe8n0E%)k`Ng%TB0fcQwF z;qmjMV~1MVm~(i5+?37dk{DJX(;#nX`Z)&WfFL(gjzGaCKoA|wQ=k%AcsmEvh~Q3O zCX~<&!6vLTi;L+ku)J`7FzA58@5UB>&LO(-r7R>tp?xv_3HFzRg&?y+W;i||?Au2# zet!4U%USnTM+27}Pjma@ zaeD_wTffJAWlHS-_#H#vJFpO{ckhRK5o69FAw{2UkWi%M3)Kh(Fr^1ms1TJH;Kv|0 zOr#+($4x>iq+%u14oE^!n^3T`QYa#jVHHS8bD6|KBG$uFBTJ9C09IHew&oKEGj%;> zG7U<@6$*SiEDIs;!I1PDFv&9{vofTa7{;NkH&LV+b8zwi!qcu z5hj5k8%fF-%t$v64TB~7teZ$I7m#umfq5OIipR#%_ym7^=6~alX+$V;#*{U%fSRqt z`<%%)VF^An<(aUAOib;9k4oc@sYwvCWm9MW@bvXp&)xz5UphLzr{Mgp*J#s4N|iXGtK@!Iu!Q2bP#D!<0I3_2d5={;fxLZA}dC!85bu zFf=T-g2mMcWy2huFd~W~p^=ay#^@-L5*MKe>4nbZIaH{DC|?5FpU&tSuC#-VCwN2W z`;qd+G$&j}A=8{o&n@ zZ(e-$?$x{J51yYtdUi+Ywn6 zDM4t<<4aLiMo1}ysWFBixtM^%51&(G@ao~%>m(3+v6gx$R)J`=sh~g%&mV>WETDS% z0)Jd-!aYrR30V?|WMGp_s0Rz^RlwkDeIpMACN+Aewfg4Va?QNpl}9xTLPp~H!R==% z^OlYpqA~qU%jN)o6(3!i_3-b3KQ$ZHzyeI`qrk_`#lL|Mgu5b7-_snSnL@JwPVzk^7HS{pS|v3Yp0NFC^;uc zxl{r0K~V2q2(r4&Qm@*1KlZ(RrbUUB$IkIdwZql6~AQcx+3wj2BD( zzxW%`rhx_KSQqrtFyc?&80DW@Be2T`0`hd?o#q8C{{SBZNEgmp`0DX1XnpAZ55N6| z!RW5e9;65%s#vAas+EXIRa%9PN{(^GIt7NM^7$;DfX&xoikkg^moMJ@@%vxNN$CJz zDp68bQidVt6!>B+fd7L(t$c7*$Si1*OJQEAB!h%R1&*2q|DX8(tMFrfB?d|Ze;ge` z1{L5_1NaR1v!r7}QZM@?HTdPUxMy7g{@9>FFQB%)g%?T_+7474EleM2V{Qd;VzaR! zf)9c|%D)JqE=@G@U9U6?jCO&-xr-H`?>pJ_QTc-le{Xzz)IT)-sCu-u=-F7`jHEG; zhw!gm;|w+-;(#)jk_s-B;}ZimT|h4Lhz~6_Med!XNSv6O52RqqYEm-+lXYP+&M*6#7#zqu?Di zfmw{9f?Pr%0t?`|LhZ}N@NX2_5$R&S7_nG) zVK3*=yOF31Pmf`Pa&EuHE>*;2SEG7L}3ROe2 zPTOCjKIvqQLHLbmf5HNQPupL-0rxbLwAdRL0*ybwhw}rpp)`;aHrLy@xq1UYc%;xF zcrye5?}V1aKY{cH^}BJA0f8YFgP?q{77+A-1;8J|kFSzRp}-XY9KR~YWJ7CF3&G(3 ze6#|T{-Kw^C;A^2K}0AB*mi@fNy|CyZQ>q`pauS4{7){$0wHF({$Kn}IVv-eozrB` zu$&8iS(lJ`^Ur_ilXLIxo{Wagk&Trp$8uuwf;`Z{4SR@~afy5-{=iP@g}5P<<4Z&s zO#Oe=I}JF^3*(RIhcxCiYbfx$;149}HDypfFv^tjp;ps2v!890{1@}?`{7EDe3{SugTIU!{Fl7$9kc#$p zXw5^5y>TJP4E_&opb;h@J8ei%BO-wFNf~JT2+u{BmM&D`hQ0^*)DqyyspZ_6al*PL z;gn+gTW&RUQ})rYY&7@4mhnT+oV)jGGOv|KU#&<6{skdky~P;QXhuz!HsBBRC@{Oo zKaDL7HGTgH_?;gyu&I-MAH%UvG!Ol?;01IJ2rQsN073!$0Xs4V)Yc47#6m+T5jyM= z_$wgx(VJrSRM#|IxqA2Zo#v+Nx7%(t)n7Y#{7iXi6%-d15%9+qF)s+K051VJ#RAF& zl0ovZ1n`B1Kn&c3g{9&z+6$$z?Xy@#WH^(2%jxGrEw&Y_ZTzAYbriMxbLx2wr zL&r^QP^bpM=R{c@a*Wir znt?cm|GIIcQx^vXr=AVTZu7{#e)xn&{`dF4;pW3{e^Pv} zjw-q{R2zKGmh>L7AUv}+6oFXwE#HFsz`tcnd~H$Ok=(ch_cbbPucJPURy$OA2r6_a zyGhBdfjTAm;~TodYh(fa9{dP5UElBt{YJ#MXKV$I)PY1ecEDwT zDH7e_s4Q#^w|M2<@Xo(^Yga1d|6)nP(Y$#7MKhI*Ziv57wL|096@O?m7?l5pKRgrY zBANxp_xun1yDB0Yf7%K||4^l9gaYU(ReF_NCnaPcC&$4%s&+nm_>=`ZGckF6_BJdzi`YWxTl!%V_Ln1qcv_#~)LFc6)q=~A;wa|eJM#T#z9kp(pV zMqBVV7wGT&n1wL1z$pJP!N{Kwqz3yS_}gJR5e|#_l0H4`v4`H?)cWVI*pZ!L_h^!6gz+$6wybOVzj(87ZBs1 z=8(R}duZ_C{NvvEkxrg|#2+td6-52c2LBTV7h}p9C<;Z%htfi&)B}9SJ_GWz3fr!= zeDmd7YJcTJ$A6&t|HS|OfsL-8e)tt>&jb4o!#czG!UcluP$*D9q6H)1M^P;3g1=Is z1tBSfYzB-wt#AN7eFL-sERclh1o+VZ#sz|fK+8O?T^B`H@VU_QUGPUwLLO5M5;D}J zfCT~|D7BimI)7tct7l#dD%e{}BS1K-d$cHJOdm8~;$l~k$3)~txvxlHzy=s<1_-!< z*w8`66dQZDDC;rpCYMW*5x`3-PmOp8H6SQu=slq}m)fE(1)?R3M_2M!#z6FokE25e= zZ>%eh1^!MJ8W96~RXC#7nQ8ea{!%H)Vle=3sW2!_-spCsg$fhCHT8RSsA2OoAuLP;Uz6ISP(B*9xm2YS%hhUyg-UKNl4$^`2Icn*@n;+!Qv{S{_)e`%iydmcvImDH#Y6A~ z{ZWBGu1JUAlr;9TWqfLz5aNn$M1T(h_#jH&KH|?6s;KfCo(hK?hmT$tn_nMT^31>J z$<3|tjm6<-3u6u!rrIKz&S2A$4;=7u2!B`kr)uWS%#fN$jE>GoO3F$}iwp_#_w-)1 zWZ9xQ^QKLhG|X|Jy-iOgwb@FFQRd0u$_NQkWXRG$r{U-u+!&;2@a1%DNNYCWPwfO7 zqF{KrN|_c_;*<+YYE)X=Y18JNJa+!!od>^t_jAWDztda1AAbJ*cI(ZO+|53|LH71T zuuMpq9)$Pf9$Fpx1k(qwOAbQ58vicBF37xGptq3Ns*$S}=uxo)lA-bi&6G_fgS#vH zvQYhR(HHlhTl6zE@7qn++eA9Bo0=z;Fy#`q#*(QrS1=?>rc}dKqgNQ@2dh}dR*B7I zOfHATgSb&43|%1j3I0@QfLY-@ZEuI!iG>Y8#g9TZKe@3buAwj#`0vX}&|n@tmD-|M ziPc2ok0n4A%pgiNl<}CWR6GVFB`)s#$&-{SK&8P?zvN|P6=vs_7nSTRuR3|)@Yy3L zFC0H}U}w$Nl8ThLq`1f!=QSHFtpZDMX^z_cds?8N{Yu)F~Um}-VKvT(8R=9$|1zKsNCZV%RM56`Gdd zNF(s)bC4Pw9hY}GpzuL($>ZjV*vkcB=ZX_5;zH%D&k=dil5bGgDEHxgfBzZL`;UV5@7Qy2 z*WUFj)?<5x)twDTn8qLSW7PkMo2a-Il>l7qGOK{9OlFBXOc*=oHLj-*o_ui!qe6dr z|K-4om{9hS6d>9jl+cF0zeqIzf9xJ2TY{u9kO$#Z zBeWBoI<%`r_sFp1BmVif0t#+7l|^4E48O2BDbZuK5~ozCydo89(Fw+X>K}eLhNEro z1KX?Xj-P(qcK7Y$S2wO)-(9w?C^cta)vgnJ4qZ5W>fF8)0RQaX<8_D5U@jz@f?_Qk ztvOg;SUz{!TsZTzZK7CUFaea>2N`NXk@5xpVlna$DimR&0V9ODZ_j=w_aAROSNHb8 z$|l$ITr&X-&8WadJ-C7SUnKCxL)JsNH<(P0QKWd-`?6Ua)Xbb5&+sk(R@f z=|v(`_wiULAVX=#=Q0=__ruP0h6p4X5iao;Y{r;PK0+ zFP7((E||H1Ysy8L5alF5e^M-fBSaPA!t4Tn_$dG%gz6f|Kjt{#WJG#QN?Tq1mpAWT zK6ETEIidODY*=Ad z;C==KBW_MJSv@96Q} z2f?rX+jbw?bzo0bby-1~jm`%6V-;Wte1bos9ta6)2~QCe%H+F9eLH=nv94@SJ`3 z%+B4xDd$(m*7g|M=rDFqkHK|bUi+$Jw^xR(o8qnd%trcoHw?}J_$Yw@_{ad#_;W;R z;1BsnY6AE}Be4Y5BWDB#7q&-~-EG>EhUDA%^31_dw_GMlCZO_hAOi6-WS&|KI5&Y5 zJnB0QQ82!9NPnj_OVZtww7+IuGqDAYt7;6L&x_X z+rOpy(Ds@=l{-My6+5?;Y^f-!u+~~rE-r@(2fzX-AA~JfUr2jXIWd$7Qo8_Z7%Uuo zKq-`*P@n?u-2NkHs`qa4@L4)(T4_@DKr1^L8>M?x1vOkm)bUCLu&`IsY02GUZAkx%lhz?qZuY{GV$i#!;X$!_D9LFjt3pzWt`kKA+$PhbI`(|+Wqy3 zLCM8QMX}!D7fN@e z&VOEfKSUKQQ*aI78`2Jx`9KbWN*RMF>rSa_?EO&%|8TKbLJrCa8GO_sSZS?Uw$i47$=)EQL}JR&hq zhB(4Prdcv$&RC~m6NZlHrLjRK3wD7eCP4_=_^5EhYLHMNDgs!c65UCah`)3~nKfHH zkR_j_v~{x>e9^_>my)#)s=cmcJKrWOZ}T0GT8zBx9*;(>=T6s6oiZmkr{v_JQ$Ifb za=qi|h$)MYY^$xz+PiJVvOSKYA4?}bl1ykh8+DwN=6ppFr-G>cG!_#zelD1eU$luuX*HN!WRwSfRWDBX9xn)w-xKMN)MLh76d zk_puLD2o2pKgRuB8hq+%*qx^}38hRvW{T)1IFuyl&PFVTAQ5I41jz^e6Msk!enWr{ zR^o=Lkv0%z5pZssgNk3mR;9zl+tCAu5Z!qi7-%j6QV|o?8*Jky=Y?b%aWd zl1~k0qVO=i%yLmLr-*@5Z-k8gv&!w}7U#P3wf7~qcLe=`|A7TQTdTI!oxienjazAn2%HTm}+i6bM%0fv&YRCvMw0(xz3>@Eo?AYOx3B9Gdci)~CJtvQuY-M5D!^XCMzhS*C`#BI&djV-J79*Tc z$r&=To1=i!o7ufDk2zeW#K{FFvdgH5K`MeOzEa}XLmNX>*Ta8ci*!`eNbE|W5(b3; zA`}Cg<238WqQ;2gYZr=>PUb{APaCabelA5C2g9cz^#ai+`p0O0k^Tfh?2&CYR1A~g z1+9y41L*~eX`&^W&OgA-#>sbtUC=zxP5__Q{IqSMgI{_V7-L} zWLQgy!A#PLA+r}~dyf4RHfx|vE#0k znHll#$?T>xF~P7cC=HGTnoxxNEfS;vADLSmW})%tlIAr20G~>)2`zyChL|IfB~5i@ zsfRN*E*{Yz$p@*SSPSQjfIsvP7nXp-YLtlQX3<9}O&GS4C_g}j%DuTuyuHBuWXN39fykv9euIL}P`3?yF;BCwCZSJUzj7YKg~@Ta_P z!qQaOcgni_*s|u!l^F+8LuU`_t>u^kf2a{k_&=3@CIVqvpW|NvI)ab?q3#Ws&_pxh zlPjvE*h~(tOfwb*JC}eD23A7CY4BlNVBU@Sw@>h=j>Vz!6R9()5{v^|QNw`64*UgT zHHeT>Bo(W*BCRE14i>0*YAH58_);8Y<0zCM8h<20m2wp+vmr=JoyZE*4H21@1;7X4 zx1v;wL~X0Hvl3fsd3vNZL~0x0uT$a6^~m-Be`NMVgr!hmj^?yfyKJFe!Pf~*S;#~K r3KCwYKm`_1p0EIWj!4jHfIkSWJCPTn@kjUI&w0HE%-EDr+4lbc<(E{z literal 0 HcmV?d00001 From 49815f8d4a1df163423ec5bdcb31db5b753178f0 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 28 Feb 2017 08:27:53 +0200 Subject: [PATCH 240/632] Test pixar for similarity --- PIL/PixarImagePlugin.py | 2 ++ Tests/test_file_pixar.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 Tests/test_file_pixar.py diff --git a/PIL/PixarImagePlugin.py b/PIL/PixarImagePlugin.py index 732d8c692..220577cce 100644 --- a/PIL/PixarImagePlugin.py +++ b/PIL/PixarImagePlugin.py @@ -24,6 +24,7 @@ from ._binary import i16le as i16 __version__ = "0.1" + # # helpers @@ -61,6 +62,7 @@ class PixarImageFile(ImageFile.ImageFile): # create tile descriptor (assuming "dumped") self.tile = [("raw", (0, 0)+self.size, 1024, (self.mode, 0, 1))] + # # -------------------------------------------------------------------- diff --git a/Tests/test_file_pixar.py b/Tests/test_file_pixar.py new file mode 100644 index 000000000..3078b438b --- /dev/null +++ b/Tests/test_file_pixar.py @@ -0,0 +1,30 @@ +from helper import hopper, unittest, PillowTestCase + +from PIL import Image, PixarImagePlugin + +# sample ppm stream +TEST_FILE = "Tests/images/hopper.pxr" + + +class TestImagePsd(PillowTestCase): + + def test_sanity(self): + im = Image.open(TEST_FILE) + im.load() + self.assertEqual(im.mode, "RGB") + self.assertEqual(im.size, (128, 128)) + self.assertEqual(im.format, "PIXAR") + + im2 = hopper() + self.assert_image_similar(im, im2, 4.8) + + def test_invalid_file(self): + invalid_file = "Tests/images/flower.jpg" + + self.assertRaises( + SyntaxError, + lambda: PixarImagePlugin.PixarImageFile(invalid_file)) + + +if __name__ == '__main__': + unittest.main() From 052cb99ad44f9e3aab8c375609fa02f5f976f461 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 28 Feb 2017 20:36:27 +1100 Subject: [PATCH 241/632] Changed reference to issue in changelog to a reference to the relevant PR [ci skip] --- CHANGES.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 1d0f24fa4..445e79cf9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -18,7 +18,7 @@ Changelog (Pillow) - Removed use of spaces in TIFF kwargs names, deprecated in 2.7 #1390 [radarhere] - + - Removed deprecated ImageDraw setink, setfill, setfont methods #2220 [jdufresne] @@ -33,25 +33,25 @@ Changelog (Pillow) - Replaced broken URL to partners.adobe.com #2413 [radarhere] - + - Removed unused private functions in setup.py and build_dep.py #2414 [radarhere] - Test: Fixed Qt tests for QT5 and saving 1 bit PNG #2394 - [wiredfool] + [wiredfool] - Test: docker builds for Arch and Debian Stretch #2394 [wiredfool] - + - Updated libwebp to 0.6.0 on appveyor #2395 [radarhere] - More explicit error message when saving to a file with invalid extension #2399 [ces42] - + - Docs: Update some http urls to https #2403 [hugovk] - + - Preserve aux/alpha channels when performing Imagecms transforms #2355 [gunjambi] @@ -316,7 +316,7 @@ Changelog (Pillow) 3.4.2 (2016-10-18) ------------------ -- Fix Resample coefficient calculation #2161 +- Fix Resample coefficient calculation #2162 [homm] From 91450ef83ceeabf9c39995772a03983bbb0a717d Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 28 Feb 2017 10:34:21 +0000 Subject: [PATCH 242/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 445e79cf9..3c1f49695 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Test PixarImageFile for correctness #2428 + [hugovk] + - Test PsdImageFile for correctness #2427 [hugovk] From 76cde2fafbfe110b24ef63c0c2eefaa75c8b590f Mon Sep 17 00:00:00 2001 From: hugovk Date: Tue, 28 Feb 2017 21:40:58 +0200 Subject: [PATCH 243/632] convert hopper.png hopper.fits --- Tests/images/hopper.fits | Bin 0 -> 54720 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/hopper.fits diff --git a/Tests/images/hopper.fits b/Tests/images/hopper.fits new file mode 100644 index 0000000000000000000000000000000000000000..85afa4ac1671b9ce2b33fe50d148df9dc4604a46 GIT binary patch literal 54720 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 N19b-K4E$dV`~%WG*USI_ literal 0 HcmV?d00001 From a7a3bcda846cea20a6cb0e02f7c543d61e1d5286 Mon Sep 17 00:00:00 2001 From: hugovk Date: Tue, 28 Feb 2017 21:44:26 +0200 Subject: [PATCH 244/632] Test FitsStubImagePlugin for correctness --- Tests/test_file_fitsstub.py | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_fitsstub.py b/Tests/test_file_fitsstub.py index 89e10acf1..1bf459512 100644 --- a/Tests/test_file_fitsstub.py +++ b/Tests/test_file_fitsstub.py @@ -1,17 +1,51 @@ from helper import unittest, PillowTestCase -from PIL import FitsStubImagePlugin +from PIL import FitsStubImagePlugin, Image + +TEST_FILE = "Tests/images/hopper.fits" class TestFileFitsStub(PillowTestCase): + def test_open(self): + # Act + im = Image.open(TEST_FILE) + + # Assert + self.assertEqual(im.format, "FITS") + + # Dummy data from the stub + self.assertEqual(im.mode, "F") + self.assertEqual(im.size, (1, 1)) + def test_invalid_file(self): + # Arrange invalid_file = "Tests/images/flower.jpg" + # Act / Assert self.assertRaises(SyntaxError, lambda: FitsStubImagePlugin.FITSStubImageFile(invalid_file)) + def test_load(self): + # Arrange + im = Image.open(TEST_FILE) + + # Act / Assert: stub cannot load without an implemented handler + self.assertRaises(IOError, lambda: im.load()) + + def test_save(self): + # Arrange + im = Image.open(TEST_FILE) + dummy_fp = None + dummy_filename = "dummy.filename" + + # Act / Assert: stub cannot save without an implemented handler + self.assertRaises(IOError, lambda: im.save(dummy_filename)) + self.assertRaises( + IOError, + lambda: FitsStubImagePlugin._save(im, dummy_fp, dummy_filename)) + if __name__ == '__main__': unittest.main() From 48f6be40cc905e2cbe1b9f45cc7b3a681682286d Mon Sep 17 00:00:00 2001 From: hugovk Date: Tue, 28 Feb 2017 22:21:47 +0200 Subject: [PATCH 245/632] Created via http://stackoverflow.com/a/29736206/724176 --- Tests/images/hdf5.h5 | Bin 0 -> 26451 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/hdf5.h5 diff --git a/Tests/images/hdf5.h5 b/Tests/images/hdf5.h5 new file mode 100644 index 0000000000000000000000000000000000000000..977e9659c5a83075846a720973aa6c9c74fa8256 GIT binary patch literal 26451 zcmeHQJ#14~6h6;Rf-w&HsUbg5l7XQt{8Sm}5?>QP5=)64`MHr9_!FXl1XYC?SdgkL z(4h-UhOjWax87-7c>%Scu&J-N+J>QAJM4h z4=Mj{x_T{+$x|AC3$+>@?~&Nsy|Yq;|91(@#l=Ow#)e*~&8Hu9p4s(ZyCDoJY^V%Atw!;b#g zoloj_pF7u`3)k)WZIa^7XPzmVeq(`i;W$6muje^-?a7ucV!{*Wz+Tp;Xiwv@Xfj9mE_gU>|Q7R9B})5>nq8ilXeE()o%to z%OP!V*oER(!`ki#j!W03^V)viUAn_H_Gv%%yU^V8{o0=qmpxZ`_T!OJ?boO~%gNhg z+P`t0QOzj+xdnKV!9P*_E8(9Ae^L1F!haY3)Z&j0|91GdW4{6Re_;Oy_T%t65&l>3zk>f2_77tJ zp!nNhKPUEcVt+06J7d4Ie6NiC=fDGCKm_0c0H1-^i@?hOUIy?>8o-kQo(#JmP5|FW zzGsL375uLl@CEo+Vn+fVne1bHpZhtRL@jEz>aA9@)g*uNQ6Cb`&Q#|E{GB4u85Eu& zNd^c$ZwE6-J%dU-aa6!KEzMAVdaF?)(U{bWl~S=*IvGkkr;`JnIAV|hBmfCO0+0YC00}?>kN_kA2|xmn03;w1=s?*E ygg-;sdy_!5woom_^E-pG=e2u>-|jXve*Mg%A@^_l69c@yx1Sggo56oW Date: Tue, 28 Feb 2017 22:23:05 +0200 Subject: [PATCH 246/632] Test Hdf5StubImagePlugin for correctness --- Tests/test_file_hdf5stub.py | 42 +++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_hdf5stub.py b/Tests/test_file_hdf5stub.py index 4545c8212..e030001da 100644 --- a/Tests/test_file_hdf5stub.py +++ b/Tests/test_file_hdf5stub.py @@ -1,16 +1,50 @@ from helper import unittest, PillowTestCase -from PIL import Hdf5StubImagePlugin +from PIL import Hdf5StubImagePlugin, Image + +TEST_FILE = "Tests/images/hdf5.h5" class TestFileHdf5Stub(PillowTestCase): - def test_invalid_file(self): - test_file = "Tests/images/flower.jpg" + def test_open(self): + # Act + im = Image.open(TEST_FILE) + # Assert + self.assertEqual(im.format, "HDF5") + + # Dummy data from the stub + self.assertEqual(im.mode, "F") + self.assertEqual(im.size, (1, 1)) + + def test_invalid_file(self): + # Arrange + invalid_file = "Tests/images/flower.jpg" + + # Act / Assert self.assertRaises(SyntaxError, lambda: - Hdf5StubImagePlugin.HDF5StubImageFile(test_file)) + Hdf5StubImagePlugin.HDF5StubImageFile(invalid_file)) + + def test_load(self): + # Arrange + im = Image.open(TEST_FILE) + + # Act / Assert: stub cannot load without an implemented handler + self.assertRaises(IOError, lambda: im.load()) + + def test_save(self): + # Arrange + im = Image.open(TEST_FILE) + dummy_fp = None + dummy_filename = "dummy.filename" + + # Act / Assert: stub cannot save without an implemented handler + self.assertRaises(IOError, lambda: im.save(dummy_filename)) + self.assertRaises( + IOError, + lambda: Hdf5StubImagePlugin._save(im, dummy_fp, dummy_filename)) if __name__ == '__main__': From b29ce5c8d740ee9fd04f9c620fa4c9bdf6f949d1 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 1 Mar 2017 09:20:05 +0000 Subject: [PATCH 247/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3c1f49695..bfca1b061 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Test FitsStubImagePlugin for correctness #2430 + [hugovk] + +- Test Hdf5StubImagePlugin for correctness #2431 + [hugovk] + - Test PixarImageFile for correctness #2428 [hugovk] From 5364abbae3c693bbb16d3844ac9b05be3e6c7bba Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 1 Mar 2017 11:28:53 +0200 Subject: [PATCH 248/632] Comment out broken PyPI downloads badge [CI skip] --- README.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 93e872ece..6536515f3 100644 --- a/README.rst +++ b/README.rst @@ -16,7 +16,7 @@ Pillow is the friendly PIL fork by `Alex Clark and Contributors Date: Thu, 2 Mar 2017 07:30:15 +0200 Subject: [PATCH 249/632] Remove commented download-count badge The commenting out didn't work, so just remove it. [CI skip] --- README.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.rst b/README.rst index 6536515f3..d89ee79ef 100644 --- a/README.rst +++ b/README.rst @@ -49,10 +49,6 @@ Pillow is the friendly PIL fork by `Alex Clark and Contributors Date: Sat, 25 Feb 2017 19:35:29 +1100 Subject: [PATCH 250/632] Corrected ImageDraw floodfill exception type --- PIL/ImageDraw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 838983652..ddf669f78 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -334,7 +334,7 @@ def floodfill(image, xy, value, border=None): if background == value: return # seed point already has fill color pixel[x, y] = value - except IndexError: + except (ValueError, IndexError): return # seed point outside image edge = [(x, y)] if border is None: From 257bc8bd4f719e9848f778cd2d9c891d925c09da Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 1 Mar 2017 20:20:18 +1100 Subject: [PATCH 251/632] Added tests --- PIL/PyAccess.py | 6 +++--- Tests/test_file_bufrstub.py | 8 +++++++- Tests/test_file_container.py | 21 +++++++++++++++++++++ Tests/test_file_eps.py | 7 ++++++- Tests/test_file_gribstub.py | 8 +++++++- Tests/test_file_iptc.py | 10 ++++++++++ Tests/test_file_pcx.py | 4 ++++ Tests/test_file_wmf.py | 9 ++++++++- Tests/test_file_xvthumb.py | 17 +++++++++++++++++ Tests/test_image_access.py | 5 ++++- Tests/test_imagedraw.py | 18 ++++++++++++++---- Tests/test_imagemorph.py | 8 ++++++++ Tests/test_imageshow.py | 7 +++++++ 13 files changed, 116 insertions(+), 12 deletions(-) create mode 100644 Tests/test_file_container.py create mode 100644 Tests/test_file_xvthumb.py diff --git a/PIL/PyAccess.py b/PIL/PyAccess.py index 58d20ca38..d5acfd0fe 100644 --- a/PIL/PyAccess.py +++ b/PIL/PyAccess.py @@ -165,7 +165,7 @@ class _PyAccess8(PyAccess): try: # integer self.pixels[y][x] = min(color, 255) - except: + except TypeError: # tuple self.pixels[y][x] = min(color[0], 255) @@ -182,7 +182,7 @@ class _PyAccessI16_N(PyAccess): try: # integer self.pixels[y][x] = min(color, 65535) - except: + except TypeError: # tuple self.pixels[y][x] = min(color[0], 65535) @@ -270,7 +270,7 @@ class _PyAccessF(PyAccess): try: # not a tuple self.pixels[y][x] = color - except: + except TypeError: # tuple self.pixels[y][x] = color[0] diff --git a/Tests/test_file_bufrstub.py b/Tests/test_file_bufrstub.py index 6872ca339..21d5c6ee5 100644 --- a/Tests/test_file_bufrstub.py +++ b/Tests/test_file_bufrstub.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase +from helper import unittest, PillowTestCase, hopper from PIL import BufrStubImagePlugin @@ -12,6 +12,12 @@ class TestFileBufrStub(PillowTestCase): lambda: BufrStubImagePlugin.BufrStubImageFile(invalid_file)) + def test_save(self): + im = hopper() + + tmpfile = self.tempfile("temp.bufr") + self.assertRaises(IOError, lambda: im.save(tmpfile)) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_container.py b/Tests/test_file_container.py new file mode 100644 index 000000000..56d53fc61 --- /dev/null +++ b/Tests/test_file_container.py @@ -0,0 +1,21 @@ +from helper import unittest, PillowTestCase, hopper + +from PIL import Image +from PIL import ContainerIO + + +class TestFileContainer(PillowTestCase): + + def test_sanity(self): + dir(Image) + dir(ContainerIO) + + def test_isatty(self): + im = hopper() + container = ContainerIO.ContainerIO(im, 0, 0) + + self.assertEqual(container.isatty(), 0) + + +if __name__ == '__main__': + unittest.main() diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index c16d2669c..eaf4df899 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase +from helper import unittest, PillowTestCase, hopper from PIL import Image, EpsImagePlugin import io @@ -94,6 +94,11 @@ class TestFileEps(PillowTestCase): image1_scale1_compare.load() self.assert_image_similar(img, image1_scale1_compare, 5) + def test_image_mode_not_supported(self): + im = hopper("RGBA") + tmpfile = self.tempfile('temp.eps') + self.assertRaises(ValueError, lambda: im.save(tmpfile)) + def test_render_scale1(self): # We need png support for these render test codecs = dir(Image.core) diff --git a/Tests/test_file_gribstub.py b/Tests/test_file_gribstub.py index 786ce42dd..79025d3b4 100644 --- a/Tests/test_file_gribstub.py +++ b/Tests/test_file_gribstub.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase +from helper import unittest, PillowTestCase, hopper from PIL import GribStubImagePlugin @@ -12,6 +12,12 @@ class TestFileGribStub(PillowTestCase): lambda: GribStubImagePlugin.GribStubImageFile(invalid_file)) + def test_save(self): + im = hopper() + + tmpfile = self.tempfile("temp.grib") + self.assertRaises(IOError, lambda: im.save(tmpfile)) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_iptc.py b/Tests/test_file_iptc.py index a29e1a4a6..e08d994a2 100644 --- a/Tests/test_file_iptc.py +++ b/Tests/test_file_iptc.py @@ -29,6 +29,16 @@ class TestFileIptc(PillowTestCase): self.assertEqual(iptc[(2, 90)], b"Budapest") self.assertEqual(iptc[(2, 101)], b"Hungary") + def test_getiptcinfo_tiff_none(self): + # Arrange + im = Image.open("Tests/images/hopper.tif") + + # Act + iptc = IptcImagePlugin.getiptcinfo(im) + + # Assert + self.assertIsNone(iptc) + def test_i(self): # Arrange c = b"a" diff --git a/Tests/test_file_pcx.py b/Tests/test_file_pcx.py index 7621c1cc6..9766318e6 100644 --- a/Tests/test_file_pcx.py +++ b/Tests/test_file_pcx.py @@ -19,6 +19,10 @@ class TestFilePcx(PillowTestCase): for mode in ('1', 'L', 'P', 'RGB'): self._roundtrip(hopper(mode)) + # Test an unsupported mode + f = self.tempfile("temp.pcx") + self.assertRaises(ValueError, lambda: hopper("RGBA").save(f)) + def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" diff --git a/Tests/test_file_wmf.py b/Tests/test_file_wmf.py index 9f2f893cb..73ef2a2fc 100644 --- a/Tests/test_file_wmf.py +++ b/Tests/test_file_wmf.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase +from helper import unittest, PillowTestCase, hopper from PIL import Image from io import BytesIO @@ -26,6 +26,13 @@ class TestFileWmf(PillowTestCase): imref.load() self.assert_image_similar(im, imref, 2.0) + def test_save(self): + im = hopper() + + for ext in [".wmf", ".emf"]: + tmpfile = self.tempfile("temp"+ext) + self.assertRaises(IOError, lambda: im.save(tmpfile)) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_xvthumb.py b/Tests/test_file_xvthumb.py new file mode 100644 index 000000000..a4e1e6554 --- /dev/null +++ b/Tests/test_file_xvthumb.py @@ -0,0 +1,17 @@ +from helper import unittest, PillowTestCase + +from PIL import XVThumbImagePlugin + + +class TestFileXVThumb(PillowTestCase): + + def test_invalid_file(self): + invalid_file = "Tests/images/flower.jpg" + + self.assertRaises(SyntaxError, + lambda: + XVThumbImagePlugin.XVThumbImageFile(invalid_file)) + + +if __name__ == '__main__': + unittest.main() diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 900f39eb4..005bd5d35 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -84,7 +84,7 @@ class TestImageGetPixel(AccessTest): im.putpixel((0, 0), c) with self.assertRaises(IndexError): im.getpixel((0, 0)) - + # check initial color im = Image.new(mode, (1, 1), c) self.assertEqual( @@ -234,6 +234,9 @@ class TestCffi(AccessTest): # im = Image.new('I;32B', (10, 10), 2**10) # self._test_set_access(im, 2**13-1) + def test_not_implemented(self): + self.assertIsNone(PyAccess.new(hopper("BGR;15"))) + # ref https://github.com/python-pillow/Pillow/pull/2009 def test_reference_counting(self): size = 10 diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 187a1fdcb..b0a4f2f1e 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -292,14 +292,24 @@ class TestImageDraw(PillowTestCase): draw = ImageDraw.Draw(im) draw.rectangle(BBOX2, outline="yellow", fill="green") centre_point = (int(W/2), int(H/2)) + red = ImageColor.getrgb("red") + im_floodfill = Image.open("Tests/images/imagedraw_floodfill.png") # Act - ImageDraw.floodfill(im, centre_point, ImageColor.getrgb("red")) - del draw + ImageDraw.floodfill(im, centre_point, red) # Assert - self.assert_image_equal( - im, Image.open("Tests/images/imagedraw_floodfill.png")) + self.assert_image_equal(im, im_floodfill) + + # Test that using the same colour does not change the image + ImageDraw.floodfill(im, centre_point, red) + self.assert_image_equal(im, im_floodfill) + + # Test that filling outside the image does not change the image + ImageDraw.floodfill(im, (W, H), red) + self.assert_image_equal(im, im_floodfill) + del draw + @unittest.skipIf(hasattr(sys, 'pypy_version_info'), "Causes fatal RPython error on PyPy") diff --git a/Tests/test_imagemorph.py b/Tests/test_imagemorph.py index ea54417a2..f2247bdca 100644 --- a/Tests/test_imagemorph.py +++ b/Tests/test_imagemorph.py @@ -73,10 +73,18 @@ class MorphTests(PillowTestCase): 'corner', 'dilation4', 'dilation8', 'erosion4', 'erosion8', 'edge'): lb = ImageMorph.LutBuilder(op_name=op) + self.assertIsNone(lb.get_lut()) + lut = lb.build_lut() with open('Tests/images/%s.lut' % op, 'rb') as f: self.assertEqual(lut, bytearray(f.read())) + def test_no_operator_loaded(self): + mop = ImageMorph.MorphOp() + self.assertRaises(Exception, lambda: mop.apply(None)) + self.assertRaises(Exception, lambda: mop.match(None)) + self.assertRaises(Exception, lambda: mop.save_lut(None)) + # Test the named patterns def test_erosion8(self): # erosion8 diff --git a/Tests/test_imageshow.py b/Tests/test_imageshow.py index 4424fa0eb..342c63851 100644 --- a/Tests/test_imageshow.py +++ b/Tests/test_imageshow.py @@ -10,6 +10,13 @@ class TestImageShow(PillowTestCase): dir(Image) dir(ImageShow) + def test_viewer(self): + viewer = ImageShow.Viewer() + + self.assertIsNone(viewer.get_format(None)) + + self.assertRaises(NotImplementedError, lambda: viewer.get_command(None)) + if __name__ == '__main__': unittest.main() From 3f5ac14003cd18d262c9e16255b1956d0b421834 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Mar 2017 20:11:21 +1100 Subject: [PATCH 252/632] Rearranged operating systems in Platform Support [ci skip] --- docs/installation.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 005cbfd22..334bc1638 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -354,14 +354,14 @@ current versions of Linux, macOS, and Windows. +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ | Fedora 23 |Yes | 2.7,3.4 | 3.1.0 |x86-64 | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Ubuntu Linux 10.04 LTS |Yes | 2.6 | 2.3.0 |x86,x86-64 | +| Ubuntu Linux 14.04 LTS |Yes | 2.7,3.4 | 3.1.0 |x86-64 | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ | Ubuntu Linux 12.04 LTS |Yes | 2.6,2.7,3.2,3.3,3.4,3.5 | 3.4.1 (CI target) |x86,x86-64 | | | | PyPy5.3.1,PyPy3 v2.4.0 | | | | | | | | | | | | 2.7,3.2 | 3.4.1 |ppc | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Ubuntu Linux 14.04 LTS |Yes | 2.7,3.4 | 3.1.0 |x86-64 | +| Ubuntu Linux 10.04 LTS |Yes | 2.6 | 2.3.0 |x86,x86-64 | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ | Debian 8.2 Jessie |Yes | 2.7,3.4 | 3.1.0 |x86-64 | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ @@ -373,15 +373,15 @@ current versions of Linux, macOS, and Windows. +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ | FreeBSD 10.2 |Yes | 2.7,3.4 | 3.1.0 |x86-64 | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Windows 7 Pro |Yes | 2.7,3.2,3.3 | 3.4.1 |x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Windows Server 2008 R2 Enterprise|Yes | 3.3 | |x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Windows Server 2012 R2 |Yes | 2.7,3.3,3.4 | 3.4.1 (CI target) |x86,x86-64 | +| Windows 8.1 Pro |Yes | 2.6,2.7,3.2,3.3,3.4 | 2.4.0 |x86,x86-64 | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ | Windows 8 Pro |Yes | 2.6,2.7,3.2,3.3,3.4a3 | 2.2.0 |x86,x86-64 | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Windows 8.1 Pro |Yes | 2.6,2.7,3.2,3.3,3.4 | 2.4.0 |x86,x86-64 | +| Windows 7 Pro |Yes | 2.7,3.2,3.3 | 3.4.1 |x86-64 | ++----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ +| Windows Server 2012 R2 |Yes | 2.7,3.3,3.4 | 3.4.1 (CI target) |x86,x86-64 | ++----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ +| Windows Server 2008 R2 Enterprise|Yes | 3.3 | |x86-64 | +----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ Old Versions From bef530cb091b1b3ec2eecdb11923d02b125c7401 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Mar 2017 21:06:49 +1100 Subject: [PATCH 253/632] Changed None comparison to is --- PIL/TiffImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 9dbd2d379..1cce43d74 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1168,7 +1168,7 @@ class TiffImageFile(ImageFile.ImageFile): self.info["dpi"] = xres, yres elif resunit == 3: # dots per centimeter. convert to dpi self.info["dpi"] = xres * 2.54, yres * 2.54 - elif resunit == None: # used to default to 1, but now 2) + elif resunit is None: # used to default to 1, but now 2) self.info["dpi"] = xres, yres # For backward compatibility, we also preserve the old behavior. self.info["resolution"] = xres, yres From 1fcdf6a2db21400e63cdb46aa1c44fec5d0e5aad Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Mar 2017 21:00:04 +1100 Subject: [PATCH 254/632] Removed duplicate test --- Tests/test_file_libtiff.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 48b74964f..7839c4053 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -564,20 +564,6 @@ class TestFileLibTiff(LibTiffTestCase): # Should not raise UnicodeDecodeError or anything else im.save(outfile) - 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. - 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) - # Should not divide by zero - im.save(outfile) - if __name__ == '__main__': unittest.main() From 18fea70b51b27d98a7c0bd16a6025cf872273b0d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Mar 2017 21:05:41 +1100 Subject: [PATCH 255/632] Removed unused variable --- Tests/test_imagecms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index a661ab24d..d0168b141 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -343,7 +343,7 @@ class TestImageCms(PillowTestCase): ] chans = [] bands = ImageMode.getmode(mode).bands - for band_ndx, band in enumerate(bands): + for band_ndx in range(len(bands)): channel_type = 'L' # 8-bit unorm channel_pattern = hopper(channel_type) From 4a6e8d7e92214964121c658325887b5855dfd786 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Mar 2017 21:27:16 +1100 Subject: [PATCH 256/632] Removed unnecessary pass --- Tests/test_imagesequence.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_imagesequence.py b/Tests/test_imagesequence.py index 0877bfb8a..c2d62f38c 100644 --- a/Tests/test_imagesequence.py +++ b/Tests/test_imagesequence.py @@ -58,7 +58,6 @@ class TestImageSequence(PillowTestCase): for frame in ImageSequence.Iterator(im): if firstFrame is None: firstFrame = frame.copy() - pass for frame in ImageSequence.Iterator(im): self.assert_image_equal(frame, firstFrame) break From 24eb48e9e05f8f5cd7868772513b1cf3ca463d06 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Mar 2017 21:28:58 +1100 Subject: [PATCH 257/632] Removed unnecessary lambdas --- Tests/test_file_fitsstub.py | 2 +- Tests/test_file_hdf5stub.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_fitsstub.py b/Tests/test_file_fitsstub.py index 1bf459512..f875a2ce3 100644 --- a/Tests/test_file_fitsstub.py +++ b/Tests/test_file_fitsstub.py @@ -32,7 +32,7 @@ class TestFileFitsStub(PillowTestCase): im = Image.open(TEST_FILE) # Act / Assert: stub cannot load without an implemented handler - self.assertRaises(IOError, lambda: im.load()) + self.assertRaises(IOError, im.load) def test_save(self): # Arrange diff --git a/Tests/test_file_hdf5stub.py b/Tests/test_file_hdf5stub.py index e030001da..cc2b80aa2 100644 --- a/Tests/test_file_hdf5stub.py +++ b/Tests/test_file_hdf5stub.py @@ -32,7 +32,7 @@ class TestFileHdf5Stub(PillowTestCase): im = Image.open(TEST_FILE) # Act / Assert: stub cannot load without an implemented handler - self.assertRaises(IOError, lambda: im.load()) + self.assertRaises(IOError, im.load) def test_save(self): # Arrange From 0b93853fd838603d280e8449b6350ddbfae99789 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Mar 2017 21:31:58 +1100 Subject: [PATCH 258/632] Removed duplicate imports --- PIL/EpsImagePlugin.py | 1 - Tests/helper.py | 3 --- Tests/test_file_gif.py | 4 +--- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/PIL/EpsImagePlugin.py b/PIL/EpsImagePlugin.py index 56b115f30..6c4d77b19 100644 --- a/PIL/EpsImagePlugin.py +++ b/PIL/EpsImagePlugin.py @@ -84,7 +84,6 @@ def Ghostscript(tile, size, fp, scale=1): float((72.0 * size[1]) / (bbox[3]-bbox[1]))) # print("Ghostscript", scale, size, orig_size, bbox, orig_bbox, res) - import os import subprocess import tempfile diff --git a/Tests/helper.py b/Tests/helper.py index cbfad6f03..e6e5eee79 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -167,7 +167,6 @@ class PillowTestCase(unittest.TestCase): outfile = self.tempfile("temp.png") if command_succeeds([IMCONVERT, f, outfile]): - from PIL import Image return Image.open(outfile) raise IOError() @@ -179,7 +178,6 @@ py3 = (sys.version_info >= (3, 0)) def fromstring(data): from io import BytesIO - from PIL import Image return Image.open(BytesIO(data)) @@ -191,7 +189,6 @@ def tostring(im, string_format, **options): def hopper(mode=None, cache={}): - from PIL import Image if mode is None: # Always return fresh not-yet-loaded version of image. # Operations on not-yet-loaded images is separate class of errors diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index d987f6851..7b01bcbd3 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -90,8 +90,6 @@ class TestFileGif(PillowTestCase): check(256, 511, 256) def test_optimize_full_l(self): - from io import BytesIO - im = Image.frombytes("L", (16, 16), bytes(bytearray(range(256)))) test_file = BytesIO() im.save(test_file, "GIF", optimize=True) @@ -425,7 +423,7 @@ class TestFileGif(PillowTestCase): reloaded = Image.open(out) self.assertEqual(reloaded.info['transparency'], 253) - + if __name__ == '__main__': unittest.main() From 798fde57cac7f56d3f49183e106f8a518d71a729 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Mar 2017 21:32:31 +1100 Subject: [PATCH 259/632] Removed unused imports --- PIL/EpsImagePlugin.py | 2 +- PIL/GifImagePlugin.py | 1 - PIL/JpegImagePlugin.py | 2 +- PIL/PngImagePlugin.py | 2 +- PIL/TgaImagePlugin.py | 2 +- Tests/test_file_jpeg.py | 8 ++++---- Tests/test_file_wmf.py | 1 - 7 files changed, 8 insertions(+), 10 deletions(-) diff --git a/PIL/EpsImagePlugin.py b/PIL/EpsImagePlugin.py index 6c4d77b19..cce70880a 100644 --- a/PIL/EpsImagePlugin.py +++ b/PIL/EpsImagePlugin.py @@ -25,7 +25,7 @@ import io import os import sys from . import Image, ImageFile -from ._binary import i32le as i32, o32le as o32 +from ._binary import i32le as i32 __version__ = "0.5" diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 7fe662fc6..a0d38f7d6 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -508,7 +508,6 @@ def _save_netpbm(im, fp, filename): import os from subprocess import Popen, check_call, PIPE, CalledProcessError - import tempfile file = im._dump() with open(filename, 'wb') as f: diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index f01885b60..7a29d8bff 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -39,7 +39,7 @@ import struct import io import warnings from . import Image, ImageFile, TiffImagePlugin -from ._binary import i8, o8, i16be as i16, i32be as i32 +from ._binary import i8, o8, i16be as i16 from .JpegPresets import presets from ._util import isStringType diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index defbe54af..5e5eb14c7 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -37,7 +37,7 @@ import zlib import struct from . import Image, ImageFile, ImagePalette -from ._binary import i8, i16be as i16, i32be as i32, o8, o16be as o16, o32be as o32 +from ._binary import i8, i16be as i16, i32be as i32, o16be as o16, o32be as o32 __version__ = "0.9" diff --git a/PIL/TgaImagePlugin.py b/PIL/TgaImagePlugin.py index de2844339..0bc52529a 100644 --- a/PIL/TgaImagePlugin.py +++ b/PIL/TgaImagePlugin.py @@ -18,7 +18,7 @@ from . import Image, ImageFile, ImagePalette -from ._binary import i8, i16le as i16, o8, o16le as o16, o32le as o32 +from ._binary import i8, i16le as i16, o8, o16le as o16 __version__ = "0.3" diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index b703598c5..f90a29162 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, hopper, py3 +from helper import unittest, PillowTestCase, hopper from helper import djpeg_available, cjpeg_available from io import BytesIO @@ -32,11 +32,11 @@ class TestFileJpeg(PillowTestCase): """ Generates a very hard to compress file :param size: tuple :param mode: optional image mode - + """ return Image.frombytes(mode, size, os.urandom(size[0]*size[1]*len(mode))) - + def test_sanity(self): # internal version number @@ -176,7 +176,7 @@ class TestFileJpeg(PillowTestCase): f = BytesIO() im = self.gen_random_image((256,256), 'CMYK') im.save(f, format='JPEG', progressive=True, quality=94) - + def test_large_exif(self): # https://github.com/python-pillow/Pillow/issues/148 f = self.tempfile('temp.jpg') diff --git a/Tests/test_file_wmf.py b/Tests/test_file_wmf.py index 9f2f893cb..2da74cc13 100644 --- a/Tests/test_file_wmf.py +++ b/Tests/test_file_wmf.py @@ -1,6 +1,5 @@ from helper import unittest, PillowTestCase from PIL import Image -from io import BytesIO class TestFileWmf(PillowTestCase): From 7467d1e010feb1ad19bf49d1ba1d487ed13c068e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Mar 2017 21:57:30 +1100 Subject: [PATCH 260/632] Changed comment to be 80 characters or less --- PIL/SunImagePlugin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PIL/SunImagePlugin.py b/PIL/SunImagePlugin.py index eb25caffc..b57883df6 100644 --- a/PIL/SunImagePlugin.py +++ b/PIL/SunImagePlugin.py @@ -37,7 +37,8 @@ class SunImageFile(ImageFile.ImageFile): def _open(self): - # The Sun Raster file header is 32 bytes in length and has the following format: + # The Sun Raster file header is 32 bytes in length + # and has the following format: # typedef struct _SunRaster # { From 6c34e8ace1f355188f5eb60d05e9bb2b89189b70 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 3 Mar 2017 13:35:41 +0200 Subject: [PATCH 261/632] [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index bfca1b061..96c7ab58c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Health fixes #2437 + [radarhere] + - Test FitsStubImagePlugin for correctness #2430 [hugovk] From bf9112ce0fa8f6593420018c092b10a4f6289a26 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 3 Mar 2017 15:48:53 +0000 Subject: [PATCH 262/632] Update CHANGES.rst --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 96c7ab58c..afe5931ef 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Doc: Reordered operating systems in Compatibility Matrix #2436 + [radarhere] + +- Test: Additional tests for BurfStub, Eps, Container, GribStub, IPTC, Wmf, XVThumb, ImageDraw, ImageMorph ImageShow #2425 + [radarhere] + - Health fixes #2437 [radarhere] From adda419ad6abdc90d263c70e7a5a6d9722f1a3bb Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 13:04:50 +0200 Subject: [PATCH 263/632] From http://www.globalmarinenet.com/free-grib-file-downloads/ --- Tests/images/WAlaska.wind.7days.grb | Bin 0 -> 9274 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/WAlaska.wind.7days.grb diff --git a/Tests/images/WAlaska.wind.7days.grb b/Tests/images/WAlaska.wind.7days.grb new file mode 100644 index 0000000000000000000000000000000000000000..37f9fd9b50b4856d8036e1527bb89bead80a147b GIT binary patch literal 9274 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 AMF0Q* literal 0 HcmV?d00001 From 0abfa08ff74c075f05b19a491e01106dd1815fb4 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 13:07:48 +0200 Subject: [PATCH 264/632] Test GribStubImagePlugin for correctness --- Tests/test_file_gribstub.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_gribstub.py b/Tests/test_file_gribstub.py index 79025d3b4..ea43d13c0 100644 --- a/Tests/test_file_gribstub.py +++ b/Tests/test_file_gribstub.py @@ -1,23 +1,47 @@ from helper import unittest, PillowTestCase, hopper -from PIL import GribStubImagePlugin +from PIL import GribStubImagePlugin, Image + +TEST_FILE = "Tests/images/WAlaska.wind.7days.grb" class TestFileGribStub(PillowTestCase): + def test_open(self): + # Act + im = Image.open(TEST_FILE) + + # Assert + self.assertEqual(im.format, "GRIB") + + # Dummy data from the stub + self.assertEqual(im.mode, "F") + self.assertEqual(im.size, (1, 1)) + def test_invalid_file(self): + # Arrange invalid_file = "Tests/images/flower.jpg" + # Act / Assert self.assertRaises(SyntaxError, lambda: GribStubImagePlugin.GribStubImageFile(invalid_file)) def test_save(self): + # Arrange im = hopper() - tmpfile = self.tempfile("temp.grib") + + # Act / Assert: stub cannot save without an implemented handler self.assertRaises(IOError, lambda: im.save(tmpfile)) + def test_load(self): + # Arrange + im = Image.open(TEST_FILE) + + # Act / Assert: stub cannot load without an implemented handler + self.assertRaises(IOError, lambda: im.load()) + if __name__ == '__main__': unittest.main() From 4ece1ae78af94456ad01a6e19ec752b634f0a3c4 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 13:52:14 +0200 Subject: [PATCH 265/632] Python 3 fix --- PIL/GribStubImagePlugin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PIL/GribStubImagePlugin.py b/PIL/GribStubImagePlugin.py index 1fbfe61dc..33c8291ea 100644 --- a/PIL/GribStubImagePlugin.py +++ b/PIL/GribStubImagePlugin.py @@ -10,6 +10,7 @@ # from . import Image, ImageFile +from ._binary import i8 _handler = None @@ -28,7 +29,7 @@ def register_handler(handler): # Image adapter def _accept(prefix): - return prefix[0:4] == b"GRIB" and prefix[7] == b'\x01' + return prefix[0:4] == b"GRIB" and i8(prefix[7]) == 1 class GribStubImageFile(ImageFile.StubImageFile): From 5d2e4f48dd4783f4ed02bd22addf6db5f7d33fc7 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 16:10:52 +0200 Subject: [PATCH 266/632] Reorder tests to match others --- Tests/test_file_gribstub.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Tests/test_file_gribstub.py b/Tests/test_file_gribstub.py index ea43d13c0..80e141503 100644 --- a/Tests/test_file_gribstub.py +++ b/Tests/test_file_gribstub.py @@ -27,6 +27,13 @@ class TestFileGribStub(PillowTestCase): lambda: GribStubImagePlugin.GribStubImageFile(invalid_file)) + def test_load(self): + # Arrange + im = Image.open(TEST_FILE) + + # Act / Assert: stub cannot load without an implemented handler + self.assertRaises(IOError, lambda: im.load()) + def test_save(self): # Arrange im = hopper() @@ -35,13 +42,6 @@ class TestFileGribStub(PillowTestCase): # Act / Assert: stub cannot save without an implemented handler self.assertRaises(IOError, lambda: im.save(tmpfile)) - def test_load(self): - # Arrange - im = Image.open(TEST_FILE) - - # Act / Assert: stub cannot load without an implemented handler - self.assertRaises(IOError, lambda: im.load()) - if __name__ == '__main__': unittest.main() From f09427c8bd7ec74ae16453d380174cb0a11a5a2b Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 16:25:28 +0200 Subject: [PATCH 267/632] From http://www.ftp.ncep.noaa.gov/data/nccf/com/gfs/prod/gfs.2017030406/ --- Tests/images/gfs.t06z.rassda.tm00.bufr_d | Bin 0 -> 49504 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/gfs.t06z.rassda.tm00.bufr_d diff --git a/Tests/images/gfs.t06z.rassda.tm00.bufr_d b/Tests/images/gfs.t06z.rassda.tm00.bufr_d new file mode 100644 index 0000000000000000000000000000000000000000..4f895a157136faad6f9415301018b4c138d96f1d GIT binary patch literal 49504 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 literal 0 HcmV?d00001 From 35e6cb1d09ad03a80bc2311b31b9903978f15ab6 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 16:35:54 +0200 Subject: [PATCH 268/632] Test BufrStubImagePlugin for correctness --- Tests/test_file_bufrstub.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_bufrstub.py b/Tests/test_file_bufrstub.py index 21d5c6ee5..e2b63afc4 100644 --- a/Tests/test_file_bufrstub.py +++ b/Tests/test_file_bufrstub.py @@ -1,21 +1,45 @@ from helper import unittest, PillowTestCase, hopper -from PIL import BufrStubImagePlugin +from PIL import BufrStubImagePlugin, Image + +TEST_FILE = "Tests/images/gfs.t06z.rassda.tm00.bufr_d" class TestFileBufrStub(PillowTestCase): + def test_open(self): + # Act + im = Image.open(TEST_FILE) + + # Assert + self.assertEqual(im.format, "BUFR") + + # Dummy data from the stub + self.assertEqual(im.mode, "F") + self.assertEqual(im.size, (1, 1)) + def test_invalid_file(self): + # Arrange invalid_file = "Tests/images/flower.jpg" + # Act / Assert self.assertRaises(SyntaxError, lambda: BufrStubImagePlugin.BufrStubImageFile(invalid_file)) - def test_save(self): - im = hopper() + def test_load(self): + # Arrange + im = Image.open(TEST_FILE) + # Act / Assert: stub cannot load without an implemented handler + self.assertRaises(IOError, lambda: im.load()) + + def test_save(self): + # Arrange + im = hopper() tmpfile = self.tempfile("temp.bufr") + + # Act / Assert: stub cannot save without an implemented handler self.assertRaises(IOError, lambda: im.save(tmpfile)) From 277d8123a482bf0edfb90d956e1b9e955a454caf Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 16:39:03 +0200 Subject: [PATCH 269/632] Only need to read 4 bytes --- PIL/BufrStubImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/BufrStubImagePlugin.py b/PIL/BufrStubImagePlugin.py index 4c5da942f..16d83c74d 100644 --- a/PIL/BufrStubImagePlugin.py +++ b/PIL/BufrStubImagePlugin.py @@ -40,7 +40,7 @@ class BufrStubImageFile(ImageFile.StubImageFile): offset = self.fp.tell() - if not _accept(self.fp.read(8)): + if not _accept(self.fp.read(4)): raise SyntaxError("Not a BUFR file") self.fp.seek(offset) From 7371e813f6a768a24f8e4cb7ae39cea5a4d7f29a Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 19:52:49 +0200 Subject: [PATCH 270/632] pngtopam hopper.png | pamtoxvmini > hopper.p7 --- Tests/images/hopper.p7 | Bin 0 -> 16445 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/hopper.p7 diff --git a/Tests/images/hopper.p7 b/Tests/images/hopper.p7 new file mode 100644 index 0000000000000000000000000000000000000000..474b233d52cf4e2a4cd3775cb2a084f015656742 GIT binary patch literal 16445 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 Date: Sat, 4 Mar 2017 19:54:06 +0200 Subject: [PATCH 271/632] Test XVThumbImagePlugin for correctness --- Tests/test_file_xvthumb.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_xvthumb.py b/Tests/test_file_xvthumb.py index a4e1e6554..62b8a2136 100644 --- a/Tests/test_file_xvthumb.py +++ b/Tests/test_file_xvthumb.py @@ -1,10 +1,20 @@ -from helper import unittest, PillowTestCase +from helper import hopper, unittest, PillowTestCase -from PIL import XVThumbImagePlugin +from PIL import Image, XVThumbImagePlugin + +TEST_FILE = "Tests/images/hopper.p7" class TestFileXVThumb(PillowTestCase): + def test_open(self): + # Act + im = Image.open(TEST_FILE) + + # Assert + self.assertEqual(im.format, "XVThumb") + self.assert_image_similar(im, hopper("P"), 49) + def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" From a0f50d7305c42032d2bfbfff06e0dc72526a3d10 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 19:58:49 +0200 Subject: [PATCH 272/632] Get integers, not single-item lists of integers --- PIL/XVThumbImagePlugin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PIL/XVThumbImagePlugin.py b/PIL/XVThumbImagePlugin.py index 6929e8b82..b974461f8 100644 --- a/PIL/XVThumbImagePlugin.py +++ b/PIL/XVThumbImagePlugin.py @@ -65,7 +65,7 @@ class XVThumbImageFile(ImageFile.ImageFile): s = s.strip().split() self.mode = "P" - self.size = int(s[0:1]), int(s[1:2]) + self.size = int(s[0]), int(s[1]) self.palette = ImagePalette.raw("RGB", PALETTE) @@ -74,6 +74,7 @@ class XVThumbImageFile(ImageFile.ImageFile): self.fp.tell(), (self.mode, 0, 1) )] + # -------------------------------------------------------------------- Image.register_open(XVThumbImageFile.format, XVThumbImageFile, _accept) From 5cf56e796f14b449ddfd9dc3e933bfcfcfb5c1b1 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 20:03:34 +0200 Subject: [PATCH 273/632] Refactor to reuse _accept --- PIL/XVThumbImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/XVThumbImagePlugin.py b/PIL/XVThumbImagePlugin.py index b974461f8..7686b263d 100644 --- a/PIL/XVThumbImagePlugin.py +++ b/PIL/XVThumbImagePlugin.py @@ -47,7 +47,7 @@ class XVThumbImageFile(ImageFile.ImageFile): def _open(self): # check magic - if self.fp.read(6) != _MAGIC: + if not _accept(self.fp.read(6)): raise SyntaxError("not an XV thumbnail file") # Skip to beginning of next line From 052905bf5cfefd4e53508907a3c7aa7e1099536e Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 23:19:41 +0200 Subject: [PATCH 274/632] Remove unnecessary lambda --- Tests/test_file_gribstub.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_gribstub.py b/Tests/test_file_gribstub.py index 80e141503..dc0fa22d7 100644 --- a/Tests/test_file_gribstub.py +++ b/Tests/test_file_gribstub.py @@ -32,7 +32,7 @@ class TestFileGribStub(PillowTestCase): im = Image.open(TEST_FILE) # Act / Assert: stub cannot load without an implemented handler - self.assertRaises(IOError, lambda: im.load()) + self.assertRaises(IOError, im.load) def test_save(self): # Arrange From 94c07f68fb044d57fb5e59f2aea2b9b727b9b879 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 23:28:08 +0200 Subject: [PATCH 275/632] Python 3 fix --- PIL/XVThumbImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/XVThumbImagePlugin.py b/PIL/XVThumbImagePlugin.py index 7686b263d..a7d39ed89 100644 --- a/PIL/XVThumbImagePlugin.py +++ b/PIL/XVThumbImagePlugin.py @@ -18,7 +18,7 @@ # from . import Image, ImageFile, ImagePalette -from ._binary import o8 +from ._binary import i8, o8 __version__ = "0.1" @@ -58,7 +58,7 @@ class XVThumbImageFile(ImageFile.ImageFile): s = self.fp.readline() if not s: raise SyntaxError("Unexpected EOF reading XV thumbnail file") - if s[0] != b'#': + if i8(s[0]) != 35: # ie. when not a comment: '#' break # parse header line (already read) From dc3233d52c38c262cb90237ddb50bc63d0d31f93 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 23:31:49 +0200 Subject: [PATCH 276/632] Created by editing hopper.p7 in a text editor --- Tests/images/hopper_bad.p7 | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Tests/images/hopper_bad.p7 diff --git a/Tests/images/hopper_bad.p7 b/Tests/images/hopper_bad.p7 new file mode 100644 index 000000000..382929688 --- /dev/null +++ b/Tests/images/hopper_bad.p7 @@ -0,0 +1,2 @@ +P7 332 +# Artificially edited file to cause unexpected EOF From a03a6e2049ceab4b22b1ebf547121a6da65933cd Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 4 Mar 2017 23:33:43 +0200 Subject: [PATCH 277/632] Test unexpected EOF --- Tests/test_file_xvthumb.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Tests/test_file_xvthumb.py b/Tests/test_file_xvthumb.py index 62b8a2136..cdf4bae6a 100644 --- a/Tests/test_file_xvthumb.py +++ b/Tests/test_file_xvthumb.py @@ -15,9 +15,21 @@ class TestFileXVThumb(PillowTestCase): self.assertEqual(im.format, "XVThumb") self.assert_image_similar(im, hopper("P"), 49) + def test_unexpected_eof(self): + # Test unexpected EOF reading XV thumbnail file + # Arrange + bad_file = "Tests/images/hopper_bad.p7" + + # Act / Assert + self.assertRaises(SyntaxError, + lambda: + XVThumbImagePlugin.XVThumbImageFile(bad_file)) + def test_invalid_file(self): + # Arrange invalid_file = "Tests/images/flower.jpg" + # Act / Assert self.assertRaises(SyntaxError, lambda: XVThumbImagePlugin.XVThumbImageFile(invalid_file)) From 83252ca4b1f4c35c871066da062fbef84081824f Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 5 Mar 2017 00:46:30 +0200 Subject: [PATCH 278/632] Test ContainerIO for correctness --- Tests/images/dummy.container | Bin 0 -> 120 bytes Tests/test_file_container.py | 108 +++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 Tests/images/dummy.container diff --git a/Tests/images/dummy.container b/Tests/images/dummy.container new file mode 100644 index 0000000000000000000000000000000000000000..83e7a3560ed6a044c56750761d76d7d65ba28abc GIT binary patch literal 120 qcmWH^$ShU>qMXdUR0Tt>5M-_qD%Tj5Yl6x(Mdg~Ia?Me>7F+-i3nkS6 literal 0 HcmV?d00001 diff --git a/Tests/test_file_container.py b/Tests/test_file_container.py index 56d53fc61..55228be0c 100644 --- a/Tests/test_file_container.py +++ b/Tests/test_file_container.py @@ -3,6 +3,8 @@ from helper import unittest, PillowTestCase, hopper from PIL import Image from PIL import ContainerIO +TEST_FILE = "Tests/images/dummy.container" + class TestFileContainer(PillowTestCase): @@ -16,6 +18,112 @@ class TestFileContainer(PillowTestCase): self.assertEqual(container.isatty(), 0) + def test_seek_mode_0(self): + # Arrange + mode = 0 + with open(TEST_FILE) as fh: + container = ContainerIO.ContainerIO(fh, 22, 100) + + # Act + container.seek(33, mode) + container.seek(33, mode) + + # Assert + self.assertEqual(container.tell(), 33) + + def test_seek_mode_1(self): + # Arrange + mode = 1 + with open(TEST_FILE) as fh: + container = ContainerIO.ContainerIO(fh, 22, 100) + + # Act + container.seek(33, mode) + container.seek(33, mode) + + # Assert + self.assertEqual(container.tell(), 66) + + def test_seek_mode_2(self): + # Arrange + mode = 2 + with open(TEST_FILE) as fh: + container = ContainerIO.ContainerIO(fh, 22, 100) + + # Act + container.seek(33, mode) + container.seek(33, mode) + + # Assert + self.assertEqual(container.tell(), 100) + + def test_read_n0(self): + # Arrange + with open(TEST_FILE) as fh: + container = ContainerIO.ContainerIO(fh, 22, 100) + + # Act + container.seek(81) + data = container.read() + + # Assert + self.assertEqual(data, "7\nThis is line 8\n") + + def test_read_n(self): + # Arrange + with open(TEST_FILE) as fh: + container = ContainerIO.ContainerIO(fh, 22, 100) + + # Act + container.seek(81) + data = container.read(3) + + # Assert + self.assertEqual(data, "7\nT") + + def test_read_eof(self): + # Arrange + with open(TEST_FILE) as fh: + container = ContainerIO.ContainerIO(fh, 22, 100) + + # Act + container.seek(100) + data = container.read() + + # Assert + self.assertEqual(data, "") + + def test_readline(self): + # Arrange + with open(TEST_FILE) as fh: + container = ContainerIO.ContainerIO(fh, 0, 120) + + # Act + data = container.readline() + + # Assert + self.assertEqual(data, "This is line 1\n") + + def test_readlines(self): + # Arrange + expected = ["This is line 1\n", + "This is line 2\n", + "This is line 3\n", + "This is line 4\n", + "This is line 5\n", + "This is line 6\n", + "This is line 7\n", + "This is line 8\n"] + with open(TEST_FILE) as fh: + container = ContainerIO.ContainerIO(fh, 0, 120) + + # Act + data = container.readlines() + + # Assert + + self.assertEqual(data, expected) + if __name__ == '__main__': unittest.main() From d69e252eb820852148a97c2e3fea14abfcde156f Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 5 Mar 2017 09:14:44 +0200 Subject: [PATCH 279/632] Remove unnecessary lambda --- Tests/test_file_bufrstub.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_bufrstub.py b/Tests/test_file_bufrstub.py index e2b63afc4..4932930ff 100644 --- a/Tests/test_file_bufrstub.py +++ b/Tests/test_file_bufrstub.py @@ -32,7 +32,7 @@ class TestFileBufrStub(PillowTestCase): im = Image.open(TEST_FILE) # Act / Assert: stub cannot load without an implemented handler - self.assertRaises(IOError, lambda: im.load()) + self.assertRaises(IOError, im.load) def test_save(self): # Arrange From 3e6d867ae885aa8d66bf93ab2e9a791126b789cc Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 6 Mar 2017 17:33:47 +0200 Subject: [PATCH 280/632] Compare to a Hopper image with a similar XV palette --- Tests/test_file_xvthumb.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_xvthumb.py b/Tests/test_file_xvthumb.py index cdf4bae6a..5337a8390 100644 --- a/Tests/test_file_xvthumb.py +++ b/Tests/test_file_xvthumb.py @@ -13,7 +13,10 @@ class TestFileXVThumb(PillowTestCase): # Assert self.assertEqual(im.format, "XVThumb") - self.assert_image_similar(im, hopper("P"), 49) + + # Create a Hopper image with a similar XV palette + im_hopper = hopper().quantize(palette=im) + self.assert_image_similar(im, im_hopper, 9) def test_unexpected_eof(self): # Test unexpected EOF reading XV thumbnail file From 49ae1ea608b7d9b12813abe9df130d3d83fc00db Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 6 Mar 2017 18:56:59 +0000 Subject: [PATCH 281/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index afe5931ef..05f748fa3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -12,17 +12,8 @@ Changelog (Pillow) - Health fixes #2437 [radarhere] - -- Test FitsStubImagePlugin for correctness #2430 - [hugovk] -- Test Hdf5StubImagePlugin for correctness #2431 - [hugovk] - -- Test PixarImageFile for correctness #2428 - [hugovk] - -- Test PsdImageFile for correctness #2427 +- Test: Correctness tests ContainerIO, XVThumbImagePlugin, BufrStubImagePlugin, GribStubImagePlugin, FitsStubImagePlugin, Hdf5StubImagePlugin, PixarImageFile, PsdImageFile #2443, #2442, #2441, #2440, #2431, #2430, #2428, #2427 [hugovk] - Remove unused imports #1822 From 562458cdd32fe4f081bed7ef42c859fff5ad3f39 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 26 Jan 2017 13:51:20 +1100 Subject: [PATCH 282/632] Added _save_netpbm comment --- PIL/GifImagePlugin.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index a0d38f7d6..42cfd813a 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -31,10 +31,6 @@ from ._binary import i8, i16le as i16, o8, o16le as o16 __version__ = "0.9" -# -------------------------------------------------------------------- -# Helpers - - # -------------------------------------------------------------------- # Identify/read GIF files @@ -501,6 +497,8 @@ def _get_local_header(fp, im, offset, flags): def _save_netpbm(im, fp, filename): + # Unused by default. + # To use, uncomment the register_save call at the end of the file. # # If you need real GIF compression and/or RGB quantization, you # can use the external NETPBM/PBMPLUS utilities. See comments From bf0b4cf279e30f9dab643fef14cb9cf2046d4c61 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 28 Dec 2016 09:48:16 +1100 Subject: [PATCH 283/632] Minor code cleanup in GifImagePlugin --- PIL/GifImagePlugin.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 42cfd813a..21d3a642e 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -434,13 +434,10 @@ def _get_local_header(fp, im, offset, flags): used_palette_colors = _get_optimize(im, im.encoderinfo) if used_palette_colors is not None: # adjust the transparency index after optimize - for i, palette_color in enumerate(used_palette_colors): - if palette_color == transparency: - transparency = i - transparent_color_exists = True - break - else: - transparent_color_exists = False + try: + transparency = used_palette_colors.index(transparency) + except ValueError: + transparent_color_exists = False if "duration" in im.encoderinfo: duration = int(im.encoderinfo["duration"] / 10) @@ -569,11 +566,9 @@ def _get_used_palette_colors(im): used_palette_colors = [] # check which colors are used - i = 0 - for count in im.histogram(): + for i, count in enumerate(im.histogram()): if count: used_palette_colors.append(i) - i += 1 return used_palette_colors From 4df1305073a9c6f535969242e1162b9600d2511f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 26 Jan 2017 15:27:43 +1100 Subject: [PATCH 284/632] Only call _get_used_palette_colors when necessary --- PIL/GifImagePlugin.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 21d3a642e..f27371181 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -555,12 +555,12 @@ def _get_optimize(im, info): # * If we have a 'large' image, the palette is in the noise. # create the new palette if not every color is used - used_palette_colors = _get_used_palette_colors(im) - if _FORCE_OPTIMIZE or im.mode == 'L' or \ - (len(used_palette_colors) <= 128 and - max(used_palette_colors) > len(used_palette_colors) and - im.width * im.height < 512 * 512): - return used_palette_colors + optimise = _FORCE_OPTIMIZE or im.mode == 'L' + if optimise or im.width * im.height < 512 * 512: + used_palette_colors = _get_used_palette_colors(im) + if optimise or (len(used_palette_colors) <= 128 and + max(used_palette_colors) > len(used_palette_colors)): + return used_palette_colors def _get_used_palette_colors(im): used_palette_colors = [] From ce87310026bd2ed7db570b9ba455cf1250f69e88 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 26 Jan 2017 14:17:20 +1100 Subject: [PATCH 285/632] Merged _get_used_palette_colors into _get_optimize --- PIL/GifImagePlugin.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index f27371181..9428590bc 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -557,21 +557,16 @@ def _get_optimize(im, info): # create the new palette if not every color is used optimise = _FORCE_OPTIMIZE or im.mode == 'L' if optimise or im.width * im.height < 512 * 512: - used_palette_colors = _get_used_palette_colors(im) + # check which colors are used + used_palette_colors = [] + for i, count in enumerate(im.histogram()): + if count: + used_palette_colors.append(i) + if optimise or (len(used_palette_colors) <= 128 and max(used_palette_colors) > len(used_palette_colors)): return used_palette_colors -def _get_used_palette_colors(im): - used_palette_colors = [] - - # check which colors are used - for i, count in enumerate(im.histogram()): - if count: - used_palette_colors.append(i) - - return used_palette_colors - def _get_color_table_size(palette_bytes): # calculate the palette size for the header import math From f28084ae3e1f5127c6f6f2aba87500bbb62c8312 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 29 Dec 2016 10:23:43 +1100 Subject: [PATCH 286/632] Removed unnecessary copy operation --- PIL/GifImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 9428590bc..7aae66e46 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -370,7 +370,7 @@ def _save(im, fp, filename, save_all=False): first_frame = None # delta frame - delta = ImageChops.subtract_modulo(im_frame, previous.copy()) + delta = ImageChops.subtract_modulo(im_frame, previous) bbox = delta.getbbox() if bbox: From b06669f670a8c486c826014fcb70b9c45d4b7af5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 29 Dec 2016 11:04:41 +1100 Subject: [PATCH 287/632] Resolved GifImagePlugin FIXME --- PIL/GifImagePlugin.py | 69 ++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 7aae66e46..7ad07abbf 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -340,51 +340,58 @@ def _save(im, fp, filename, save_all=False): im.encoderinfo["optimize"] = im.encoderinfo.get("optimize", True) if save_all: - previous = None - - first_frame = None - append_images = im.encoderinfo.get("append_images", []) + # To specify duration, add the time in milliseconds to getdata(), + # e.g. getdata(im_frame, duration=1000) if "duration" in im.encoderinfo: duration = im.encoderinfo["duration"] else: duration = None + im_frames = [] + append_images = im.encoderinfo.get("append_images", []) frame_count = 0 for imSequence in [im]+append_images: for im_frame in ImageSequence.Iterator(imSequence): - encoderinfo = im.encoderinfo.copy() im_frame = _convert_mode(im_frame) + + encoderinfo = im.encoderinfo.copy() if isinstance(duration, (list, tuple)): - encoderinfo["duration"] = duration[frame_count] + encoderinfo['duration'] = duration[frame_count] frame_count += 1 - # To specify duration, add the time in milliseconds to getdata(), - # e.g. getdata(im_frame, duration=1000) - if not previous: - # global header - first_frame = getheader(im_frame, palette, encoderinfo)[0] - first_frame += getdata(im_frame, (0, 0), **encoderinfo) - else: - if first_frame: - for s in first_frame: - fp.write(s) - first_frame = None - + if im_frames: # delta frame - delta = ImageChops.subtract_modulo(im_frame, previous) + previous = im_frames[-1] + delta = ImageChops.subtract_modulo(im_frame, + previous['im_frame']) bbox = delta.getbbox() - - if bbox: - # compress difference - encoderinfo['include_color_table'] = True - for s in getdata(im_frame.crop(bbox), - bbox[:2], **encoderinfo): - fp.write(s) - else: - # FIXME: what should we do in this case? - pass - previous = im_frame - if first_frame: + if not bbox: + # This frame is identical to the previous frame + if duration: + previous['encoderinfo']['duration'] += encoderinfo['duration'] + continue + else: + bbox = None + im_frames.append({ + "im_frame":im_frame, + "bbox":bbox, + "encoderinfo":encoderinfo + }) + if len(im_frames) < 2: save_all = False + else: + for data in im_frames: + if data['bbox'] is None: + # global header + header = getheader(data['im_frame'], palette, data['encoderinfo'])[0] + for s in header + getdata(data['im_frame'], + (0, 0), **data['encoderinfo']): + fp.write(s) + else: + # compress difference + data['encoderinfo']['include_color_table'] = True + for s in getdata(data['im_frame'].crop(data['bbox']), + data['bbox'][:2], **data['encoderinfo']): + fp.write(s) if not save_all: header = getheader(im_out, palette, im.encoderinfo)[0] for s in header: From bc8cd5fabfc192cb42e63011fe8aed53d87e1c16 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 29 Dec 2016 11:28:58 +1100 Subject: [PATCH 288/632] Added test --- Tests/test_file_gif.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 7b01bcbd3..1426d99e9 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -285,7 +285,7 @@ class TestFileGif(PillowTestCase): im_list = [ Image.new('L', (100, 100), '#000'), Image.new('L', (100, 100), '#111'), - Image.new('L', (100, 100), '#222'), + Image.new('L', (100, 100), '#222') ] #duration as list @@ -320,7 +320,31 @@ class TestFileGif(PillowTestCase): except EOFError: pass + def test_identical_frames(self): + duration_list = [1000, 1500, 2000, 4000] + out = self.tempfile('temp.gif') + im_list = [ + Image.new('L', (100, 100), '#000'), + Image.new('L', (100, 100), '#000'), + Image.new('L', (100, 100), '#000'), + Image.new('L', (100, 100), '#111') + ] + + #duration as list + im_list[0].save( + out, + save_all=True, + append_images=im_list[1:], + duration=duration_list + ) + reread = Image.open(out) + + # Assert that the first three frames were combined + self.assertEqual(reread.n_frames, 2) + + # Assert that the new duration is the total of the identical frames + self.assertEqual(reread.info['duration'], 4500) def test_number_of_loops(self): number_of_loops = 2 From af57ff8d45494006d363f2a3d208e305859fc148 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 28 Jan 2017 11:45:59 +1100 Subject: [PATCH 289/632] Simplified code --- PIL/GifImagePlugin.py | 38 ++++++++++++++++++-------------------- Tests/test_file_gif.py | 14 ++++---------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 7ad07abbf..c5ea5a6ad 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -294,7 +294,7 @@ except ImportError: RAWMODE = { "1": "L", "L": "L", - "P": "P", + "P": "P" } @@ -317,7 +317,6 @@ def _save_all(im, fp, filename): def _save(im, fp, filename, save_all=False): - im.encoderinfo.update(im.info) if _imaging_gif: # call external driver @@ -362,7 +361,7 @@ def _save(im, fp, filename, save_all=False): # delta frame previous = im_frames[-1] delta = ImageChops.subtract_modulo(im_frame, - previous['im_frame']) + previous['im']) bbox = delta.getbbox() if not bbox: # This frame is identical to the previous frame @@ -372,37 +371,36 @@ def _save(im, fp, filename, save_all=False): else: bbox = None im_frames.append({ - "im_frame":im_frame, - "bbox":bbox, - "encoderinfo":encoderinfo + 'im':im_frame, + 'bbox':bbox, + 'encoderinfo':encoderinfo }) if len(im_frames) < 2: save_all = False else: - for data in im_frames: - if data['bbox'] is None: + for frame_data in im_frames: + im_frame = frame_data['im'] + if not frame_data['bbox']: # global header - header = getheader(data['im_frame'], palette, data['encoderinfo'])[0] - for s in header + getdata(data['im_frame'], - (0, 0), **data['encoderinfo']): + for s in getheader(im_frame, palette, frame_data['encoderinfo'])[0]: fp.write(s) + offset = (0, 0) else: # compress difference - data['encoderinfo']['include_color_table'] = True - for s in getdata(data['im_frame'].crop(data['bbox']), - data['bbox'][:2], **data['encoderinfo']): - fp.write(s) + frame_data['encoderinfo']['include_color_table'] = True + + im_frame = im_frame.crop(frame_data['bbox']) + offset = frame_data['bbox'][:2] + for s in getdata(im_frame, offset, **frame_data['encoderinfo']): + fp.write(s) if not save_all: - header = getheader(im_out, palette, im.encoderinfo)[0] - for s in header: + for s in getheader(im_out, palette, im.encoderinfo)[0]: fp.write(s) + # local image header flags = 0 - if get_interlace(im): flags = flags | 64 - - # local image header _get_local_header(fp, im, (0, 0), flags) im_out.encoderconfig = (8, get_interlace(im)) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 1426d99e9..db7d3678c 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -269,11 +269,8 @@ class TestFileGif(PillowTestCase): duration = 1000 out = self.tempfile('temp.gif') - with open(out, "wb") as fp: - 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";") + im = Image.new('L', (100, 100), '#000') + im.save(out, duration=duration) reread = Image.open(out) self.assertEqual(reread.info['duration'], duration) @@ -350,11 +347,8 @@ class TestFileGif(PillowTestCase): number_of_loops = 2 out = self.tempfile('temp.gif') - with open(out, "wb") as fp: - 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";") + im = Image.new('L', (100, 100), '#000') + im.save(out, loop=number_of_loops) reread = Image.open(out) self.assertEqual(reread.info['loop'], number_of_loops) From a43295c3ddd7ed8a8b31bba96b175e4292b0fa94 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 18 Feb 2017 19:09:10 +1100 Subject: [PATCH 290/632] Extracted core of getdata into _write_frame_data --- PIL/GifImagePlugin.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index c5ea5a6ad..f4ac8eba5 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -391,8 +391,7 @@ def _save(im, fp, filename, save_all=False): im_frame = im_frame.crop(frame_data['bbox']) offset = frame_data['bbox'][:2] - for s in getdata(im_frame, offset, **frame_data['encoderinfo']): - fp.write(s) + _write_frame_data(fp, im_frame, offset, frame_data['encoderinfo']) if not save_all: for s in getheader(im_out, palette, im.encoderinfo)[0]: fp.write(s) @@ -714,6 +713,19 @@ def getheader(im, palette=None, info=None): header.append(_get_header_palette(palette_bytes)) return header, used_palette_colors +def _write_frame_data(fp, im_frame, offset, params): + try: + im_frame.encoderinfo = params + + # local image header + _get_local_header(fp, im_frame, offset, 0) + + ImageFile._save(im_frame, fp, [("gif", (0, 0)+im_frame.size, 0, + RAWMODE[im_frame.mode])]) + + fp.write(b"\0") # end of image data + finally: + del im_frame.encoderinfo def getdata(im, offset=(0, 0), **params): """Return a list of strings representing this image. @@ -730,18 +742,7 @@ def getdata(im, offset=(0, 0), **params): fp = Collector() - try: - im.encoderinfo = params - - # local image header - _get_local_header(fp, im, offset, 0) - - ImageFile._save(im, fp, [("gif", (0, 0)+im.size, 0, RAWMODE[im.mode])]) - - fp.write(b"\0") # end of image data - - finally: - del im.encoderinfo + _write_frame_data(fp, im, offset, params) return fp.data From 26cfa8cc628dc6e6a669cdfe8a5d74a1149491af Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 18 Feb 2017 19:02:52 +1100 Subject: [PATCH 291/632] Extracted core of getheader into _get_global_header --- PIL/GifImagePlugin.py | 55 ++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index f4ac8eba5..cf31643c3 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -382,7 +382,8 @@ def _save(im, fp, filename, save_all=False): im_frame = frame_data['im'] if not frame_data['bbox']: # global header - for s in getheader(im_frame, palette, frame_data['encoderinfo'])[0]: + for s in _get_global_header(im_frame, palette, + frame_data['encoderinfo']): fp.write(s) offset = (0, 0) else: @@ -393,7 +394,7 @@ def _save(im, fp, filename, save_all=False): offset = frame_data['bbox'][:2] _write_frame_data(fp, im_frame, offset, frame_data['encoderinfo']) if not save_all: - for s in getheader(im_out, palette, im.encoderinfo)[0]: + for s in _get_global_header(im_out, palette, im.encoderinfo): fp.write(s) # local image header @@ -665,7 +666,7 @@ def _get_palette_bytes(im, palette, info): # returning palette, _not_ padded to 768 bytes like our internal ones. return palette_bytes, used_palette_colors -def getheader(im, palette=None, info=None): +def _get_global_header(im, palette, info): """Return a list of strings representing a GIF header""" # Header Block @@ -683,34 +684,34 @@ def getheader(im, palette=None, info=None): if im.info.get("version") == b"89a": version = b"89a" - header = [ - b"GIF"+version + # signature + version - o16(im.size[0]) + # canvas width - o16(im.size[1]) # canvas height + palette_bytes = _get_palette_bytes(im, palette, info)[0] + color_table_size = _get_color_table_size(palette_bytes) + + background = info["background"] if "background" in info else 0 + + return [ + b"GIF"+version + # signature + version + o16(im.size[0]) + # canvas width + o16(im.size[1]) + # canvas height + + # Logical Screen Descriptor + # size of global color table + global color table flag + o8(color_table_size + 128) + # packed fields + # background + reserved/aspect + o8(background) + o8(0) + + + # Global Color Table + _get_header_palette(palette_bytes) ] - palette_bytes, used_palette_colors = _get_palette_bytes(im, palette, info) +def getheader(im, palette=None, info=[]): + used_palette_colors = _get_optimize(im, info) - # Logical Screen Descriptor - color_table_size = _get_color_table_size(palette_bytes) - # size of global color table + global color table flag - header.append(o8(color_table_size + 128)) # packed fields - # background + reserved/aspect - if info and "background" in info: - background = info["background"] - elif "background" in im.info: - # This elif is redundant within GifImagePlugin - # since im.info parameters are bundled into the info dictionary - # However, external scripts may call getheader directly - # So this maintains earlier behaviour - background = im.info["background"] - else: - background = 0 - header.append(o8(background) + o8(0)) - # end of Logical Screen Descriptor + if not "background" in info and "background" in im.info: + info["background"] = im.info["background"] + + header = _get_global_header(im, palette, info) - # Header + Logical Screen Descriptor + Global Color Table - header.append(_get_header_palette(palette_bytes)) return header, used_palette_colors def _write_frame_data(fp, im_frame, offset, params): From d45f1d835b2780ab68b999133eae3195b4d00c38 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 18 Feb 2017 19:03:44 +1100 Subject: [PATCH 292/632] Removed second return value from _get_palette_bytes --- PIL/GifImagePlugin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index cf31643c3..e4c1dd9c3 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -480,7 +480,7 @@ def _get_local_header(fp, im, offset, flags): include_color_table = im.encoderinfo.get('include_color_table') if include_color_table: palette = im.encoderinfo.get("palette", None) - palette_bytes = _get_palette_bytes(im, palette, im.encoderinfo)[0] + palette_bytes = _get_palette_bytes(im, palette, im.encoderinfo) color_table_size = _get_color_table_size(palette_bytes) if color_table_size: flags = flags | 128 # local color table flag @@ -664,7 +664,7 @@ def _get_palette_bytes(im, palette, info): palette_bytes = source_palette # returning palette, _not_ padded to 768 bytes like our internal ones. - return palette_bytes, used_palette_colors + return palette_bytes def _get_global_header(im, palette, info): """Return a list of strings representing a GIF header""" @@ -684,7 +684,7 @@ def _get_global_header(im, palette, info): if im.info.get("version") == b"89a": version = b"89a" - palette_bytes = _get_palette_bytes(im, palette, info)[0] + palette_bytes = _get_palette_bytes(im, palette, info) color_table_size = _get_color_table_size(palette_bytes) background = info["background"] if "background" in info else 0 From 87a14ce6de4c5de7b59c84808576a5a997659bdc Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 18 Feb 2017 21:23:42 +1100 Subject: [PATCH 293/632] Created _write_single_frame and _write_multiple_frames from _save --- PIL/GifImagePlugin.py | 152 +++++++++++++++++++++--------------------- 1 file changed, 77 insertions(+), 75 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index e4c1dd9c3..252740909 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -311,6 +311,79 @@ def _convert_mode(im, initial_call=False): return im.convert("P") return im.convert("L") +def _write_single_frame(im, fp, palette): + if im.mode in RAWMODE: + im_out = im.copy() + else: + im_out = _convert_mode(im, True) + + for s in _get_global_header(im_out, palette, im.encoderinfo): + fp.write(s) + + # local image header + flags = 0 + if get_interlace(im): + flags = flags | 64 + _get_local_header(fp, im, (0, 0), flags) + + 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 + +def _write_multiple_frames(im, fp, palette): + if "duration" in im.encoderinfo: + duration = im.encoderinfo["duration"] + else: + duration = None + + im_frames = [] + frame_count = 0 + for imSequence in [im]+im.encoderinfo.get("append_images", []): + for im_frame in ImageSequence.Iterator(imSequence): + im_frame = _convert_mode(im_frame) + + encoderinfo = im.encoderinfo.copy() + if isinstance(duration, (list, tuple)): + encoderinfo['duration'] = duration[frame_count] + frame_count += 1 + + if im_frames: + # delta frame + previous = im_frames[-1] + delta = ImageChops.subtract_modulo(im_frame, + previous['im']) + bbox = delta.getbbox() + if not bbox: + # This frame is identical to the previous frame + if duration: + previous['encoderinfo']['duration'] += encoderinfo['duration'] + continue + else: + bbox = None + im_frames.append({ + 'im':im_frame, + 'bbox':bbox, + 'encoderinfo':encoderinfo + }) + if len(im_frames) > 1: + for frame_data in im_frames: + im_frame = frame_data['im'] + if not frame_data['bbox']: + # global header + for s in _get_global_header(im_frame, palette, + frame_data['encoderinfo']): + fp.write(s) + offset = (0, 0) + else: + # compress difference + frame_data['encoderinfo']['include_color_table'] = True + + im_frame = im_frame.crop(frame_data['bbox']) + offset = frame_data['bbox'][:2] + _write_frame_data(fp, im_frame, offset, frame_data['encoderinfo']) + return True def _save_all(im, fp, filename): _save(im, fp, filename, save_all=True) @@ -326,11 +399,6 @@ def _save(im, fp, filename, save_all=False): except IOError: pass # write uncompressed file - if im.mode in RAWMODE: - im_out = im.copy() - else: - im_out = _convert_mode(im, True) - # header try: palette = im.encoderinfo["palette"] @@ -338,76 +406,8 @@ def _save(im, fp, filename, save_all=False): palette = None im.encoderinfo["optimize"] = im.encoderinfo.get("optimize", True) - if save_all: - # To specify duration, add the time in milliseconds to getdata(), - # e.g. getdata(im_frame, duration=1000) - if "duration" in im.encoderinfo: - duration = im.encoderinfo["duration"] - else: - duration = None - im_frames = [] - append_images = im.encoderinfo.get("append_images", []) - frame_count = 0 - for imSequence in [im]+append_images: - for im_frame in ImageSequence.Iterator(imSequence): - im_frame = _convert_mode(im_frame) - - encoderinfo = im.encoderinfo.copy() - if isinstance(duration, (list, tuple)): - encoderinfo['duration'] = duration[frame_count] - frame_count += 1 - - if im_frames: - # delta frame - previous = im_frames[-1] - delta = ImageChops.subtract_modulo(im_frame, - previous['im']) - bbox = delta.getbbox() - if not bbox: - # This frame is identical to the previous frame - if duration: - previous['encoderinfo']['duration'] += encoderinfo['duration'] - continue - else: - bbox = None - im_frames.append({ - 'im':im_frame, - 'bbox':bbox, - 'encoderinfo':encoderinfo - }) - if len(im_frames) < 2: - save_all = False - else: - for frame_data in im_frames: - im_frame = frame_data['im'] - if not frame_data['bbox']: - # global header - for s in _get_global_header(im_frame, palette, - frame_data['encoderinfo']): - fp.write(s) - offset = (0, 0) - else: - # compress difference - frame_data['encoderinfo']['include_color_table'] = True - - im_frame = im_frame.crop(frame_data['bbox']) - offset = frame_data['bbox'][:2] - _write_frame_data(fp, im_frame, offset, frame_data['encoderinfo']) - if not save_all: - for s in _get_global_header(im_out, palette, im.encoderinfo): - fp.write(s) - - # local image header - flags = 0 - if get_interlace(im): - flags = flags | 64 - _get_local_header(fp, im, (0, 0), flags) - - 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 + if not save_all or not _write_multiple_frames(im, fp, palette): + _write_single_frame(im, fp, palette) fp.write(b";") # end of file @@ -728,6 +728,8 @@ def _write_frame_data(fp, im_frame, offset, params): finally: del im_frame.encoderinfo +# To specify duration, add the time in milliseconds to getdata(), +# e.g. getdata(im_frame, duration=1000) def getdata(im, offset=(0, 0), **params): """Return a list of strings representing this image. The first string is a local image header, the rest contains From 24285fdc289d7c298a5803974a1fdb69be36f7f9 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 23 Feb 2017 03:25:05 -0800 Subject: [PATCH 294/632] Remove support for PIL plus external encoder --- PIL/GifImagePlugin.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 252740909..e00c22b8f 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -286,11 +286,6 @@ class GifImageFile(ImageFile.ImageFile): # -------------------------------------------------------------------- # Write GIF files -try: - import _imaging_gif -except ImportError: - _imaging_gif = None - RAWMODE = { "1": "L", "L": "L", @@ -391,13 +386,6 @@ def _save_all(im, fp, filename): def _save(im, fp, filename, save_all=False): im.encoderinfo.update(im.info) - if _imaging_gif: - # call external driver - try: - _imaging_gif.save(im, fp, filename) - return - except IOError: - pass # write uncompressed file # header try: From 1e9afb3ecb2d2325d11acda30a0c94b07949be5c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 23 Feb 2017 04:25:04 -0800 Subject: [PATCH 295/632] Refactor out the palette remapping to Image.Image --- PIL/GifImagePlugin.py | 79 ++++++++++++++----------------------------- PIL/Image.py | 77 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 53 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index e00c22b8f..2535a04dc 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -537,6 +537,16 @@ def _save_netpbm(im, fp, filename): _FORCE_OPTIMIZE = False def _get_optimize(im, info): + """ + Palette optimization is a potentially expensive operation. + + This function determines if the palette should be optimized using + some heuristics, then returns the list of palette entries in use. + + :param im: Image object + :param info: encoderinfo + :returns: list of indexes of palette entries in use, or None + """ if im.mode in ("P", "L") and info and info.get("optimize", 0): # Potentially expensive operation. @@ -579,6 +589,16 @@ def _get_header_palette(palette_bytes): return palette_bytes def _get_palette_bytes(im, palette, info): + """ + Gets the palette for inclusion in the gif header, if optimization is + requested or required, the palette is rewritten and the image is + mutatated in place. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: Bytes, len<=768 suitable for inclusion in gif header + """ if im.mode == "P": if palette and isinstance(palette, bytes): source_palette = palette[:768] @@ -594,61 +614,14 @@ def _get_palette_bytes(im, palette, info): used_palette_colors = _get_optimize(im, info) if used_palette_colors is not None: - palette_bytes = b"" - new_positions = [0]*256 - - # pick only the used colors from the palette - for i, oldPosition in enumerate(used_palette_colors): - palette_bytes += source_palette[oldPosition*3:oldPosition*3+3] - new_positions[oldPosition] = i - - # replace the palette color id of all pixel with the new id - - # Palette images are [0..255], mapped through a 1 or 3 - # byte/color map. We need to remap the whole image - # from palette 1 to palette 2. New_positions is - # an array of indexes into palette 1. Palette 2 is - # palette 1 with any holes removed. - - # We're going to leverage the convert mechanism to use the - # C code to remap the image from palette 1 to palette 2, - # by forcing the source image into 'L' mode and adding a - # mapping 'L' mode palette, then converting back to 'L' - # sans palette thus converting the image bytes, then - # assigning the optimized RGB palette. - - # perf reference, 9500x4000 gif, w/~135 colors - # 14 sec prepatch, 1 sec postpatch with optimization forced. - - mapping_palette = bytearray(new_positions) - - m_im = im.copy() - m_im.mode = 'P' - - m_im.palette = ImagePalette.ImagePalette("RGB", - palette=mapping_palette*3, - size=768) - #possibly set palette dirty, then - #m_im.putpalette(mapping_palette, 'L') # converts to 'P' - # or just force it. - # UNDONE -- this is part of the general issue with palettes - m_im.im.putpalette(*m_im.palette.getdata()) - - m_im = m_im.convert('L') - - # Internally, we require 768 bytes for a palette. - new_palette_bytes = (palette_bytes + - (768 - len(palette_bytes)) * b'\x00') - m_im.putpalette(new_palette_bytes) - m_im.palette = ImagePalette.ImagePalette("RGB", - palette=palette_bytes, - size=len(palette_bytes)) - + m_im = im.remap_palette(used_palette_colors, source_palette) + palette_bytes = m_im.palette.palette + # oh gawd, this is modifying the image in place so I can pass by ref. # REFACTOR SOONEST - im.frombytes(m_im.tobytes()) - - if not palette_bytes: + im.im = m_im.im + im.palette = m_im.palette + else: palette_bytes = source_palette # returning palette, _not_ padded to 768 bytes like our internal ones. diff --git a/PIL/Image.py b/PIL/Image.py index fd6bfecb6..c1ee3318c 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1514,6 +1514,83 @@ class Image(object): return self.pyaccess.putpixel(xy, value) return self.im.putpixel(xy, value) + def remap_palette(self, dest_map, source_palette=None): + """ + Rewrites the image to reorder the palette. + + :param dest_map: A list of indexes into the original palette. + e.g. [1,0] would swap a two item palette, and list(range(255)) + is the identity transform. + :param source_palette: Bytes or None. + :returns: An :py:class:`~PIL.Image.Image` object. + + """ + from . import ImagePalette + + if self.mode not in ("L", "P"): + raise ValueError("illegal image mode") + + if source_palette is None: + if self.mode == "P": + source_palette = self.im.getpalette("RGB")[:768] + else: # L-mode + source_palette = bytearray(i//3 for i in range(768)) + + + palette_bytes = b"" + new_positions = [0]*256 + + # pick only the used colors from the palette + for i, oldPosition in enumerate(dest_map): + palette_bytes += source_palette[oldPosition*3:oldPosition*3+3] + new_positions[oldPosition] = i + + # replace the palette color id of all pixel with the new id + + # Palette images are [0..255], mapped through a 1 or 3 + # byte/color map. We need to remap the whole image + # from palette 1 to palette 2. New_positions is + # an array of indexes into palette 1. Palette 2 is + # palette 1 with any holes removed. + + # We're going to leverage the convert mechanism to use the + # C code to remap the image from palette 1 to palette 2, + # by forcing the source image into 'L' mode and adding a + # mapping 'L' mode palette, then converting back to 'L' + # sans palette thus converting the image bytes, then + # assigning the optimized RGB palette. + + # perf reference, 9500x4000 gif, w/~135 colors + # 14 sec prepatch, 1 sec postpatch with optimization forced. + + mapping_palette = bytearray(new_positions) + + m_im = self.copy() + m_im.mode = 'P' + + m_im.palette = ImagePalette.ImagePalette("RGB", + palette=mapping_palette*3, + size=768) + #possibly set palette dirty, then + #m_im.putpalette(mapping_palette, 'L') # converts to 'P' + # or just force it. + # UNDONE -- this is part of the general issue with palettes + m_im.im.putpalette(*m_im.palette.getdata()) + + m_im = m_im.convert('L') + + # Internally, we require 768 bytes for a palette. + new_palette_bytes = (palette_bytes + + (768 - len(palette_bytes)) * b'\x00') + m_im.putpalette(new_palette_bytes) + m_im.palette = ImagePalette.ImagePalette("RGB", + palette=palette_bytes, + size=len(palette_bytes)) + + return m_im + + + def resize(self, size, resample=NEAREST): """ Returns a resized copy of this image. From cee397ab00ce6486365ff2b1be9345e92ecf9077 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 23 Feb 2017 06:14:04 -0800 Subject: [PATCH 296/632] Refactor get_palette to do one thing, and not mutate the image in place --- PIL/GifImagePlugin.py | 55 ++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 2535a04dc..4eabbf7a7 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -312,6 +312,8 @@ def _write_single_frame(im, fp, palette): else: im_out = _convert_mode(im, True) + im_out = _normalize_palette(im_out, palette, im.encoderinfo) + for s in _get_global_header(im_out, palette, im.encoderinfo): fp.write(s) @@ -338,7 +340,8 @@ def _write_multiple_frames(im, fp, palette): for imSequence in [im]+im.encoderinfo.get("append_images", []): for im_frame in ImageSequence.Iterator(imSequence): im_frame = _convert_mode(im_frame) - + im_frame = _normalize_palette(im_frame, palette, encoderinfo) + encoderinfo = im.encoderinfo.copy() if isinstance(duration, (list, tuple)): encoderinfo['duration'] = duration[frame_count] @@ -347,8 +350,12 @@ def _write_multiple_frames(im, fp, palette): if im_frames: # delta frame previous = im_frames[-1] - delta = ImageChops.subtract_modulo(im_frame, - previous['im']) + if _get_palette_bytes(im_frame) == _get_palette_bytes(previous['im']): + delta = ImageChops.subtract_modulo(im_frame, + previous['im']) + else: + delta = ImageChops.subtract_modulo(im_frame.convert('RGB'), + previous['im'].convert('RGB')) bbox = delta.getbbox() if not bbox: # This frame is identical to the previous frame @@ -362,6 +369,7 @@ def _write_multiple_frames(im, fp, palette): 'bbox':bbox, 'encoderinfo':encoderinfo }) + if len(im_frames) > 1: for frame_data in im_frames: im_frame = frame_data['im'] @@ -588,16 +596,17 @@ def _get_header_palette(palette_bytes): palette_bytes += o8(0) * 3 * actual_target_size_diff return palette_bytes -def _get_palette_bytes(im, palette, info): +def _normalize_palette(im, palette, info): """ - Gets the palette for inclusion in the gif header, if optimization is - requested or required, the palette is rewritten and the image is - mutatated in place. - + Normalizes the palette for image. + - Sets the palette to the incoming palette, if provided. + - Ensures that there's a palette for L mode images + - Optimizes the palette if necessary/desired. + :param im: Image object :param palette: bytes object containing the source palette, or .... :param info: encoderinfo - :returns: Bytes, len<=768 suitable for inclusion in gif header + :returns: Image object """ if im.mode == "P": if palette and isinstance(palette, bytes): @@ -609,23 +618,24 @@ def _get_palette_bytes(im, palette, info): source_palette = palette[:768] else: source_palette = bytearray(i//3 for i in range(768)) - - palette_bytes = None + im.palette = ImagePalette.ImagePalette("RGB", + palette=source_palette) used_palette_colors = _get_optimize(im, info) if used_palette_colors is not None: - m_im = im.remap_palette(used_palette_colors, source_palette) - palette_bytes = m_im.palette.palette - - # oh gawd, this is modifying the image in place so I can pass by ref. - # REFACTOR SOONEST - im.im = m_im.im - im.palette = m_im.palette - else: - palette_bytes = source_palette + return im.remap_palette(used_palette_colors, source_palette) - # returning palette, _not_ padded to 768 bytes like our internal ones. - return palette_bytes + im.palette.palette = source_palette + return im + +def _get_palette_bytes(im, *args): + """ + Gets the palette for inclusion in the gif header + + :param im: Image object + :returns: Bytes, len<=768 suitable for inclusion in gif header + """ + return im.palette.palette def _get_global_header(im, palette, info): """Return a list of strings representing a GIF header""" @@ -671,6 +681,7 @@ def getheader(im, palette=None, info=[]): if not "background" in info and "background" in im.info: info["background"] = im.info["background"] + im = _normalize_palette(im, palette, info) header = _get_global_header(im, palette, info) return header, used_palette_colors From b9618b3ce768311050410ad4313e1d0b49f5e6cc Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 23 Feb 2017 06:57:10 -0800 Subject: [PATCH 297/632] Encoderinfo fix --- PIL/GifImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 4eabbf7a7..35bba14ac 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -340,7 +340,7 @@ def _write_multiple_frames(im, fp, palette): for imSequence in [im]+im.encoderinfo.get("append_images", []): for im_frame in ImageSequence.Iterator(imSequence): im_frame = _convert_mode(im_frame) - im_frame = _normalize_palette(im_frame, palette, encoderinfo) + im_frame = _normalize_palette(im_frame, palette, im.encoderinfo) encoderinfo = im.encoderinfo.copy() if isinstance(duration, (list, tuple)): From 26e145c8a35924d9c197f4d3d55de79cbcd89563 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 23 Feb 2017 06:58:37 -0800 Subject: [PATCH 298/632] Refactor _convert_mode -> _normalize_mode --- PIL/GifImagePlugin.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 35bba14ac..e18350f18 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -293,25 +293,21 @@ RAWMODE = { } -def _convert_mode(im, initial_call=False): - # convert on the fly (EXPERIMENTAL -- I'm not sure PIL - # should automatically convert images on save...) +def _normalize_mode(im, initial_call=False): + if im.mode in RAWMODE: + return im if Image.getmodebase(im.mode) == "RGB": if initial_call: palette_size = 256 if im.palette: palette_size = len(im.palette.getdata()[1]) // 3 - return im.convert("P", palette=1, colors=palette_size) + return im.convert("P", palette=Image.ADAPTIVE, colors=palette_size) else: return im.convert("P") return im.convert("L") def _write_single_frame(im, fp, palette): - if im.mode in RAWMODE: - im_out = im.copy() - else: - im_out = _convert_mode(im, True) - + im_out = _normalize_mode(im, True) im_out = _normalize_palette(im_out, palette, im.encoderinfo) for s in _get_global_header(im_out, palette, im.encoderinfo): @@ -339,7 +335,7 @@ def _write_multiple_frames(im, fp, palette): frame_count = 0 for imSequence in [im]+im.encoderinfo.get("append_images", []): for im_frame in ImageSequence.Iterator(imSequence): - im_frame = _convert_mode(im_frame) + im_frame = _normalize_mode(im_frame) im_frame = _normalize_palette(im_frame, palette, im.encoderinfo) encoderinfo = im.encoderinfo.copy() From b315b6ecf38c1c68b4d5b10cb146965a09c3a1d1 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 23 Feb 2017 07:37:14 -0800 Subject: [PATCH 299/632] Don't requantize 'P' images --- PIL/GifImagePlugin.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index e18350f18..d3b902d32 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -295,6 +295,7 @@ RAWMODE = { def _normalize_mode(im, initial_call=False): if im.mode in RAWMODE: + im.load() return im if Image.getmodebase(im.mode) == "RGB": if initial_call: @@ -326,16 +327,15 @@ def _write_single_frame(im, fp, palette): fp.write(b"\0") # end of image data def _write_multiple_frames(im, fp, palette): - if "duration" in im.encoderinfo: - duration = im.encoderinfo["duration"] - else: - duration = None + + duration = im.encoderinfo.get("duration", None) im_frames = [] frame_count = 0 for imSequence in [im]+im.encoderinfo.get("append_images", []): for im_frame in ImageSequence.Iterator(imSequence): - im_frame = _normalize_mode(im_frame) + # a copy is required here since seek can still mutate the image + im_frame = _normalize_mode(im_frame.copy()) im_frame = _normalize_palette(im_frame, palette, im.encoderinfo) encoderinfo = im.encoderinfo.copy() From 321c6165c9649d2e4efc037ca96a26ecc533b2be Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 23 Feb 2017 07:38:46 -0800 Subject: [PATCH 300/632] removed extra params from _get_palette_bytes --- PIL/GifImagePlugin.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index d3b902d32..a64a4d752 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -337,7 +337,7 @@ def _write_multiple_frames(im, fp, palette): # a copy is required here since seek can still mutate the image im_frame = _normalize_mode(im_frame.copy()) im_frame = _normalize_palette(im_frame, palette, im.encoderinfo) - + encoderinfo = im.encoderinfo.copy() if isinstance(duration, (list, tuple)): encoderinfo['duration'] = duration[frame_count] @@ -365,7 +365,7 @@ def _write_multiple_frames(im, fp, palette): 'bbox':bbox, 'encoderinfo':encoderinfo }) - + if len(im_frames) > 1: for frame_data in im_frames: im_frame = frame_data['im'] @@ -472,7 +472,7 @@ def _get_local_header(fp, im, offset, flags): include_color_table = im.encoderinfo.get('include_color_table') if include_color_table: palette = im.encoderinfo.get("palette", None) - palette_bytes = _get_palette_bytes(im, palette, im.encoderinfo) + palette_bytes = _get_palette_bytes(im) color_table_size = _get_color_table_size(palette_bytes) if color_table_size: flags = flags | 128 # local color table flag @@ -543,12 +543,12 @@ _FORCE_OPTIMIZE = False def _get_optimize(im, info): """ Palette optimization is a potentially expensive operation. - + This function determines if the palette should be optimized using some heuristics, then returns the list of palette entries in use. - + :param im: Image object - :param info: encoderinfo + :param info: encoderinfo :returns: list of indexes of palette entries in use, or None """ if im.mode in ("P", "L") and info and info.get("optimize", 0): @@ -601,7 +601,7 @@ def _normalize_palette(im, palette, info): :param im: Image object :param palette: bytes object containing the source palette, or .... - :param info: encoderinfo + :param info: encoderinfo :returns: Image object """ if im.mode == "P": @@ -624,7 +624,7 @@ def _normalize_palette(im, palette, info): im.palette.palette = source_palette return im -def _get_palette_bytes(im, *args): +def _get_palette_bytes(im): """ Gets the palette for inclusion in the gif header @@ -651,7 +651,7 @@ def _get_global_header(im, palette, info): if im.info.get("version") == b"89a": version = b"89a" - palette_bytes = _get_palette_bytes(im, palette, info) + palette_bytes = _get_palette_bytes(im) color_table_size = _get_color_table_size(palette_bytes) background = info["background"] if "background" in info else 0 From f5e836b4429dfa1b6439d4602daba288476818a7 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 23 Feb 2017 07:41:42 -0800 Subject: [PATCH 301/632] removed extra param from _get_global_header --- PIL/GifImagePlugin.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index a64a4d752..06181d52d 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -311,7 +311,7 @@ def _write_single_frame(im, fp, palette): im_out = _normalize_mode(im, True) im_out = _normalize_palette(im_out, palette, im.encoderinfo) - for s in _get_global_header(im_out, palette, im.encoderinfo): + for s in _get_global_header(im_out, im.encoderinfo): fp.write(s) # local image header @@ -371,7 +371,7 @@ def _write_multiple_frames(im, fp, palette): im_frame = frame_data['im'] if not frame_data['bbox']: # global header - for s in _get_global_header(im_frame, palette, + for s in _get_global_header(im_frame, frame_data['encoderinfo']): fp.write(s) offset = (0, 0) @@ -633,7 +633,7 @@ def _get_palette_bytes(im): """ return im.palette.palette -def _get_global_header(im, palette, info): +def _get_global_header(im, info): """Return a list of strings representing a GIF header""" # Header Block @@ -678,7 +678,7 @@ def getheader(im, palette=None, info=[]): info["background"] = im.info["background"] im = _normalize_palette(im, palette, info) - header = _get_global_header(im, palette, info) + header = _get_global_header(im, info) return header, used_palette_colors From 872bce552f9f813837f7332c77e2b8c7ebf6a226 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 23 Feb 2017 07:58:30 -0800 Subject: [PATCH 302/632] Docstring Comments on methods --- PIL/GifImagePlugin.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 06181d52d..9f9cb9dbc 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -583,6 +583,13 @@ def _get_color_table_size(palette_bytes): return color_table_size def _get_header_palette(palette_bytes): + """ + Returns the palette, null padded to the next power of 2 (*3) bytes + suitable for direct inclusion in the GIF header + + :param palette_bytes: Unpadded palette bytes, in RGBRGB form + :returns: Null padded palette + """ color_table_size = _get_color_table_size(palette_bytes) # add the missing amount of bytes @@ -672,6 +679,17 @@ def _get_global_header(im, info): ] def getheader(im, palette=None, info=[]): + """ + Legacy Method to get Gif data from image. + + Warning:: May modify image data. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: tuple of(list of header items, optimized palette) + + """ used_palette_colors = _get_optimize(im, info) if not "background" in info and "background" in im.info: From aea2a4ca8d4acc592910ad916b7421b1bdd54354 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 23 Feb 2017 07:59:06 -0800 Subject: [PATCH 303/632] legacy getheader mutates the image --- PIL/GifImagePlugin.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 9f9cb9dbc..83dc8f173 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -695,7 +695,9 @@ def getheader(im, palette=None, info=[]): if not "background" in info and "background" in im.info: info["background"] = im.info["background"] - im = _normalize_palette(im, palette, info) + im_mod = _normalize_palette(im, palette, info) + im.palette = im_mod.palette + im.im = im_mod.im header = _get_global_header(im, info) return header, used_palette_colors From 9a36a51916dce941545bd23812da404c54b6ede8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 26 Jan 2017 19:39:59 +1100 Subject: [PATCH 304/632] Test from #2375, 0ebb4cd1c0f9aa5d79c5814f9f1f1c3243ffeb1f --- Tests/test_file_gif.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index db7d3678c..ee433e518 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -422,10 +422,10 @@ class TestFileGif(PillowTestCase): def test_transparent_optimize(self): # from issue #2195, if the transparent color is incorrectly - # optimized out, gif loses transparency Need a palette that - # isn't using the 0 color, and one that's > 128 items where - # the transparent color is actually the top palette entry to - # trigger the bug. + # optimized out, gif loses transparency + # Need a palette that isn't using the 0 color, and one + # that's > 128 items where the transparent color is actually + # the top palette entry to trigger the bug. from PIL import ImagePalette @@ -442,6 +442,16 @@ class TestFileGif(PillowTestCase): self.assertEqual(reloaded.info['transparency'], 253) + def test_bbox(self): + out = self.tempfile('temp.gif') + + im = Image.new('RGB', (100,100), '#fff') + ims = [Image.new("RGB", (100,100), '#000')] + im.save(out, save_all=True, append_images=ims) + + reread = Image.open(out) + self.assertEqual(reread.n_frames, 2) + if __name__ == '__main__': unittest.main() From ab7e07c54dac8d6209cfb224b323ee29c4d022fc Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 25 Feb 2017 13:50:49 +1100 Subject: [PATCH 305/632] Added comment that getdata is legacy --- PIL/GifImagePlugin.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 83dc8f173..5d8cb6f37 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -719,10 +719,14 @@ def _write_frame_data(fp, im_frame, offset, params): # To specify duration, add the time in milliseconds to getdata(), # e.g. getdata(im_frame, duration=1000) def getdata(im, offset=(0, 0), **params): - """Return a list of strings representing this image. - The first string is a local image header, the rest contains - encoded image data.""" + """ + Legacy Method + Return a list of strings representing this image. + The first string is a local image header, the rest contains + encoded image data. + + """ class Collector(object): data = [] From 46287eb62ab6a07e3151aba6ffbc0900a0a11d49 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 25 Feb 2017 02:24:53 -0800 Subject: [PATCH 306/632] Renamed _get_local_header to _write_local_header --- PIL/GifImagePlugin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 5d8cb6f37..b1a5f9326 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -318,7 +318,7 @@ def _write_single_frame(im, fp, palette): flags = 0 if get_interlace(im): flags = flags | 64 - _get_local_header(fp, im, (0, 0), flags) + _write_local_header(fp, im, (0, 0), flags) im_out.encoderconfig = (8, get_interlace(im)) ImageFile._save(im_out, fp, [("gif", (0, 0)+im.size, 0, @@ -417,7 +417,7 @@ def get_interlace(im): return interlace -def _get_local_header(fp, im, offset, flags): +def _write_local_header(fp, im, offset, flags): transparent_color_exists = False try: transparency = im.encoderinfo["transparency"] @@ -707,7 +707,7 @@ def _write_frame_data(fp, im_frame, offset, params): im_frame.encoderinfo = params # local image header - _get_local_header(fp, im_frame, offset, 0) + _write_local_header(fp, im_frame, offset, 0) ImageFile._save(im_frame, fp, [("gif", (0, 0)+im_frame.size, 0, RAWMODE[im_frame.mode])]) From 770c423181153f8c670a553b9cdb5925c1b9fa8f Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 25 Feb 2017 02:29:54 -0800 Subject: [PATCH 307/632] Regroup methods, add docstring comments --- PIL/GifImagePlugin.py | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index b1a5f9326..ac1dab0c6 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -533,9 +533,6 @@ def _save_netpbm(im, fp, filename): pass -# -------------------------------------------------------------------- -# GIF utilities - # Force optimization so that we can test performance against # cases where it took lots of memory and time previously. _FORCE_OPTIMIZE = False @@ -678,6 +675,23 @@ def _get_global_header(im, info): _get_header_palette(palette_bytes) ] +def _write_frame_data(fp, im_frame, offset, params): + try: + im_frame.encoderinfo = params + + # local image header + _write_local_header(fp, im_frame, offset, 0) + + ImageFile._save(im_frame, fp, [("gif", (0, 0)+im_frame.size, 0, + RAWMODE[im_frame.mode])]) + + fp.write(b"\0") # end of image data + finally: + del im_frame.encoderinfo + +# -------------------------------------------------------------------- +# Legacy GIF utilities + def getheader(im, palette=None, info=[]): """ Legacy Method to get Gif data from image. @@ -702,20 +716,6 @@ def getheader(im, palette=None, info=[]): return header, used_palette_colors -def _write_frame_data(fp, im_frame, offset, params): - try: - im_frame.encoderinfo = params - - # local image header - _write_local_header(fp, im_frame, offset, 0) - - ImageFile._save(im_frame, fp, [("gif", (0, 0)+im_frame.size, 0, - RAWMODE[im_frame.mode])]) - - fp.write(b"\0") # end of image data - finally: - del im_frame.encoderinfo - # To specify duration, add the time in milliseconds to getdata(), # e.g. getdata(im_frame, duration=1000) def getdata(im, offset=(0, 0), **params): @@ -726,6 +726,11 @@ def getdata(im, offset=(0, 0), **params): The first string is a local image header, the rest contains encoded image data. + :param im: Image object + :param offset: Tuple of (x, y) pixels. Defaults to (0,0) + :param **params: E.g. duration or other encoder info parameters + :returns: List of Bytes containing gif encoded frame data + """ class Collector(object): data = [] From abb7b7342e47655aca7069bf4fee8bf1b1090de5 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 3 Mar 2017 15:51:07 +0000 Subject: [PATCH 308/632] Added function docstring --- PIL/GifImagePlugin.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index ac1dab0c6..d6f70feee 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -24,8 +24,7 @@ # See the README file for information on usage and redistribution. # -from . import Image, ImageFile, ImagePalette, \ - ImageChops, ImageSequence +from . import Image, ImageFile, ImagePalette, ImageChops, ImageSequence from ._binary import i8, i16le as i16, o8, o16le as o16 __version__ = "0.9" @@ -294,6 +293,21 @@ RAWMODE = { def _normalize_mode(im, initial_call=False): + """ + Takes an image (or frame), returns an image in a mode that is appropriate + for saving in a Gif. + + It may return the original image, or it may return an image converted to + palette or 'L' mode. + + UNDONE: What is the point of mucking with the initial call palette, for + an image that shouldn't have a palette, or it would be a mode 'P' and + get returned in the RAWMODE clause. + + :param im: Image object + :param initial_call: Default false, set to true for a single frame. + :returns: Image object + """ if im.mode in RAWMODE: im.load() return im From f6b22bf0ab4eefa91cb2b29570a15436ae6a3713 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 3 Mar 2017 15:51:31 +0000 Subject: [PATCH 309/632] moved normalise_ functions together --- PIL/GifImagePlugin.py | 64 +++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index d6f70feee..7f8c2d316 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -321,6 +321,38 @@ def _normalize_mode(im, initial_call=False): return im.convert("P") return im.convert("L") +def _normalize_palette(im, palette, info): + """ + Normalizes the palette for image. + - Sets the palette to the incoming palette, if provided. + - Ensures that there's a palette for L mode images + - Optimizes the palette if necessary/desired. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: Image object + """ + if im.mode == "P": + if palette and isinstance(palette, bytes): + source_palette = palette[:768] + else: + source_palette = im.im.getpalette("RGB")[:768] + else: # L-mode + if palette and isinstance(palette, bytes): + source_palette = palette[:768] + else: + source_palette = bytearray(i//3 for i in range(768)) + im.palette = ImagePalette.ImagePalette("RGB", + palette=source_palette) + + used_palette_colors = _get_optimize(im, info) + if used_palette_colors is not None: + return im.remap_palette(used_palette_colors, source_palette) + + im.palette.palette = source_palette + return im + def _write_single_frame(im, fp, palette): im_out = _normalize_mode(im, True) im_out = _normalize_palette(im_out, palette, im.encoderinfo) @@ -610,38 +642,6 @@ def _get_header_palette(palette_bytes): palette_bytes += o8(0) * 3 * actual_target_size_diff return palette_bytes -def _normalize_palette(im, palette, info): - """ - Normalizes the palette for image. - - Sets the palette to the incoming palette, if provided. - - Ensures that there's a palette for L mode images - - Optimizes the palette if necessary/desired. - - :param im: Image object - :param palette: bytes object containing the source palette, or .... - :param info: encoderinfo - :returns: Image object - """ - if im.mode == "P": - if palette and isinstance(palette, bytes): - source_palette = palette[:768] - else: - source_palette = im.im.getpalette("RGB")[:768] - else: # L-mode - if palette and isinstance(palette, bytes): - source_palette = palette[:768] - else: - source_palette = bytearray(i//3 for i in range(768)) - im.palette = ImagePalette.ImagePalette("RGB", - palette=source_palette) - - used_palette_colors = _get_optimize(im, info) - if used_palette_colors is not None: - return im.remap_palette(used_palette_colors, source_palette) - - im.palette.palette = source_palette - return im - def _get_palette_bytes(im): """ Gets the palette for inclusion in the gif header From b7689627e8c2553ecdd275d4fc10b868e7d697b5 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 3 Mar 2017 08:25:01 -0800 Subject: [PATCH 310/632] Add tests for passing in a separate palette while saving a gif --- Tests/test_file_gif.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index ee433e518..2061bf664 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -1,7 +1,6 @@ from helper import unittest, PillowTestCase, hopper, netpbm_available -from PIL import Image -from PIL import GifImagePlugin +from PIL import Image, ImagePalette, GifImagePlugin from io import BytesIO @@ -452,6 +451,32 @@ class TestFileGif(PillowTestCase): reread = Image.open(out) self.assertEqual(reread.n_frames, 2) + def test_palette_save_L(self): + # generate an L mode image with a separate palette + + im = hopper('P') + im_l = im.split()[0] + palette = im.palette.getdata() + + out = self.tempfile('temp.gif') + im_l.save(out, palette=palette) + + reloaded = Image.open(out) + self.assert_image_equal(reloaded, im) + + def test_palette_save_P(self): + # pass in a different palette, then construct what the image + # would look like. + + im = hopper('P') + palette = ImagePalette.ImagePalette('RGB') + + out = self.tempfile('temp.gif') + im.save(out, palette=palette.getdata()) + + reloaded = Image.open(out) + im.putpalette(palette) + self.assert_image_equal(reloaded, im) if __name__ == '__main__': unittest.main() From 6559674032365757488a2509c5c0e83f18e2aeb0 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 3 Mar 2017 08:38:30 -0800 Subject: [PATCH 311/632] Test passing in an I mode image --- Tests/test_file_gif.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 2061bf664..f9ba9364d 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -478,5 +478,17 @@ class TestFileGif(PillowTestCase): im.putpalette(palette) self.assert_image_equal(reloaded, im) + def test_save_I(self): + # Test saving something that would trigger the auto-convert to 'L' + + im = hopper('I') + + out = self.tempfile('temp.gif') + im.save(out) + + reloaded = Image.open(out) + self.assert_image_equal(reloaded.convert('L'), im.convert('L')) + + if __name__ == '__main__': unittest.main() From 51b46e00c237c3689895e7d39abc6a583589c9b2 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 6 Mar 2017 14:46:55 -0800 Subject: [PATCH 312/632] Refactor out passed in palette handling, add ImagePalette as an option, document palette format --- PIL/GifImagePlugin.py | 22 +++++++++++++++------- Tests/test_file_gif.py | 26 +++++++++++++++++++++----- docs/handbook/image-file-formats.rst | 8 ++++++-- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 7f8c2d316..68c623395 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -27,6 +27,8 @@ from . import Image, ImageFile, ImagePalette, ImageChops, ImageSequence from ._binary import i8, i16le as i16, o8, o16le as o16 +import itertools + __version__ = "0.9" @@ -333,15 +335,22 @@ def _normalize_palette(im, palette, info): :param info: encoderinfo :returns: Image object """ + source_palette = None + if palette: + # a bytes palette + if isinstance(palette, (bytes, bytearray, list)): + source_palette = bytearray(palette[:768]) + if isinstance(palette, ImagePalette.ImagePalette): + source_palette = bytearray(itertools.chain.from_iterable( + zip(palette.palette[:256], + palette.palette[256:512], + palette.palette[512:768]))) + if im.mode == "P": - if palette and isinstance(palette, bytes): - source_palette = palette[:768] - else: + if not source_palette: source_palette = im.im.getpalette("RGB")[:768] else: # L-mode - if palette and isinstance(palette, bytes): - source_palette = palette[:768] - else: + if not source_palette: source_palette = bytearray(i//3 for i in range(768)) im.palette = ImagePalette.ImagePalette("RGB", palette=source_palette) @@ -436,7 +445,6 @@ def _save_all(im, fp, filename): def _save(im, fp, filename, save_all=False): im.encoderinfo.update(im.info) - # header try: palette = im.encoderinfo["palette"] diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index f9ba9364d..482a0a472 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -455,24 +455,40 @@ class TestFileGif(PillowTestCase): # generate an L mode image with a separate palette im = hopper('P') - im_l = im.split()[0] - palette = im.palette.getdata() + im_l = Image.frombytes('L', im.size, im.tobytes()) + palette = bytes(bytearray(im.getpalette())) out = self.tempfile('temp.gif') im_l.save(out, palette=palette) reloaded = Image.open(out) - self.assert_image_equal(reloaded, im) + self.assert_image_equal(reloaded.convert('RGB'), im.convert('RGB')) + def test_palette_save_P(self): # pass in a different palette, then construct what the image # would look like. + # Forcing a non-straight grayscale palette. im = hopper('P') - palette = ImagePalette.ImagePalette('RGB') + palette = bytes(bytearray([255-i//3 for i in range(768)])) out = self.tempfile('temp.gif') - im.save(out, palette=palette.getdata()) + im.save(out, palette=palette) + + reloaded = Image.open(out) + im.putpalette(palette) + self.assert_image_equal(reloaded, im) + + def test_palette_save_ImagePalette(self): + # pass in a different palette, as an ImagePalette.ImagePalette + # effectively the same as test_palette_save_P + + im = hopper('P') + palette = ImagePalette.ImagePalette('RGB', list(range(256))[::-1]*3) + + out = self.tempfile('temp.gif') + im.save(out, palette=palette) reloaded = Image.open(out) im.putpalette(palette) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 694027a47..760c6019d 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -124,8 +124,12 @@ are available:: eliminating unused colors. This is only useful if the palette can be compressed to the next smaller power of 2 elements. -**palette** - Use the specified palette for the saved image. +**palette** + Use the specified palette for the saved image. The palette should + be a bytes or bytearray object containing the palette entries in + RGBRGB... form. It should be no more than 768 bytes. Alternately, + the palette can be passed in as an + :py:class:`PIL.ImagePalette.ImagePalette` object. Reading local images ~~~~~~~~~~~~~~~~~~~~ From 676d0c3b3b6581ecd9bc3a6d5511062c802d4093 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 7 Mar 2017 01:32:01 -0800 Subject: [PATCH 313/632] Can't use objects in default args --- PIL/GifImagePlugin.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 68c623395..e55460f2c 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -714,7 +714,7 @@ def _write_frame_data(fp, im_frame, offset, params): # -------------------------------------------------------------------- # Legacy GIF utilities -def getheader(im, palette=None, info=[]): +def getheader(im, palette=None, info=None): """ Legacy Method to get Gif data from image. @@ -728,6 +728,9 @@ def getheader(im, palette=None, info=[]): """ used_palette_colors = _get_optimize(im, info) + if info is None: + info = {} + if not "background" in info and "background" in im.info: info["background"] = im.info["background"] From 1428e4140ae87de42a937e63ae20f01ab630dafe Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 7 Mar 2017 01:52:31 -0800 Subject: [PATCH 314/632] Test for identical handling of getheader/getdata --- PIL/GifImagePlugin.py | 6 +++--- Tests/images/gif_header_data.pkl | 17 +++++++++++++++++ Tests/test_file_gif.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 Tests/images/gif_header_data.pkl diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index e55460f2c..087b2d1c3 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -685,13 +685,13 @@ def _get_global_header(im, info): return [ b"GIF"+version + # signature + version o16(im.size[0]) + # canvas width - o16(im.size[1]) + # canvas height + o16(im.size[1]), # canvas height # Logical Screen Descriptor # size of global color table + global color table flag - o8(color_table_size + 128) + # packed fields + o8(color_table_size + 128), # packed fields # background + reserved/aspect - o8(background) + o8(0) + + o8(background) + o8(0), # Global Color Table _get_header_palette(palette_bytes) diff --git a/Tests/images/gif_header_data.pkl b/Tests/images/gif_header_data.pkl new file mode 100644 index 000000000..b08e7a5fe --- /dev/null +++ b/Tests/images/gif_header_data.pkl @@ -0,0 +1,17 @@ +(((lp1 +S'GIF87a\x10\x00\x10\x00' +p2 +aS'\x87' +aS'\x00\x00' +p3 +aS'\xff\xff\xff\xfe\xfe\xfe\xfd\xfd\xfd\xfc\xfc\xfc\xfb\xfb\xfb\xfa\xfa\xfa\xf9\xf9\xf9\xf8\xf8\xf8\xf7\xf7\xf7\xf6\xf6\xf6\xf5\xf5\xf5\xf4\xf4\xf4\xf3\xf3\xf3\xf2\xf2\xf2\xf1\xf1\xf1\xf0\xf0\xf0\xef\xef\xef\xee\xee\xee\xed\xed\xed\xec\xec\xec\xeb\xeb\xeb\xea\xea\xea\xe9\xe9\xe9\xe8\xe8\xe8\xe7\xe7\xe7\xe6\xe6\xe6\xe5\xe5\xe5\xe4\xe4\xe4\xe3\xe3\xe3\xe2\xe2\xe2\xe1\xe1\xe1\xe0\xe0\xe0\xdf\xdf\xdf\xde\xde\xde\xdd\xdd\xdd\xdc\xdc\xdc\xdb\xdb\xdb\xda\xda\xda\xd9\xd9\xd9\xd8\xd8\xd8\xd7\xd7\xd7\xd6\xd6\xd6\xd5\xd5\xd5\xd4\xd4\xd4\xd3\xd3\xd3\xd2\xd2\xd2\xd1\xd1\xd1\xd0\xd0\xd0\xcf\xcf\xcf\xce\xce\xce\xcd\xcd\xcd\xcc\xcc\xcc\xcb\xcb\xcb\xca\xca\xca\xc9\xc9\xc9\xc8\xc8\xc8\xc7\xc7\xc7\xc6\xc6\xc6\xc5\xc5\xc5\xc4\xc4\xc4\xc3\xc3\xc3\xc2\xc2\xc2\xc1\xc1\xc1\xc0\xc0\xc0\xbf\xbf\xbf\xbe\xbe\xbe\xbd\xbd\xbd\xbc\xbc\xbc\xbb\xbb\xbb\xba\xba\xba\xb9\xb9\xb9\xb8\xb8\xb8\xb7\xb7\xb7\xb6\xb6\xb6\xb5\xb5\xb5\xb4\xb4\xb4\xb3\xb3\xb3\xb2\xb2\xb2\xb1\xb1\xb1\xb0\xb0\xb0\xaf\xaf\xaf\xae\xae\xae\xad\xad\xad\xac\xac\xac\xab\xab\xab\xaa\xaa\xaa\xa9\xa9\xa9\xa8\xa8\xa8\xa7\xa7\xa7\xa6\xa6\xa6\xa5\xa5\xa5\xa4\xa4\xa4\xa3\xa3\xa3\xa2\xa2\xa2\xa1\xa1\xa1\xa0\xa0\xa0\x9f\x9f\x9f\x9e\x9e\x9e\x9d\x9d\x9d\x9c\x9c\x9c\x9b\x9b\x9b\x9a\x9a\x9a\x99\x99\x99\x98\x98\x98\x97\x97\x97\x96\x96\x96\x95\x95\x95\x94\x94\x94\x93\x93\x93\x92\x92\x92\x91\x91\x91\x90\x90\x90\x8f\x8f\x8f\x8e\x8e\x8e\x8d\x8d\x8d\x8c\x8c\x8c\x8b\x8b\x8b\x8a\x8a\x8a\x89\x89\x89\x88\x88\x88\x87\x87\x87\x86\x86\x86\x85\x85\x85\x84\x84\x84\x83\x83\x83\x82\x82\x82\x81\x81\x81\x80\x80\x80\x7f\x7f\x7f~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))(((\'\'\'&&&%%%$$$###"""!!! \x1f\x1f\x1f\x1e\x1e\x1e\x1d\x1d\x1d\x1c\x1c\x1c\x1b\x1b\x1b\x1a\x1a\x1a\x19\x19\x19\x18\x18\x18\x17\x17\x17\x16\x16\x16\x15\x15\x15\x14\x14\x14\x13\x13\x13\x12\x12\x12\x11\x11\x11\x10\x10\x10\x0f\x0f\x0f\x0e\x0e\x0e\r\r\r\x0c\x0c\x0c\x0b\x0b\x0b\n\n\n\t\t\t\x08\x08\x08\x07\x07\x07\x06\x06\x06\x05\x05\x05\x04\x04\x04\x03\x03\x03\x02\x02\x02\x01\x01\x01\x00\x00\x00' +p4 +aNtp5 +(lp6 +S',\x00\x00\x00\x00\x10\x00\x10\x00\x00' +p7 +aS'\x08' +aS'o\x00\x11\x08\x1cH\xb0 \x02\x0c\x08\x13*\\\x88\x01\x85\xc3\x87\x10#\xa2\xc0A\xb1\xa2\xc5\x8b8\x90h\xdc\xc8\xb1#\x12, C\x8a\x1c\x89\x05\x8d\xc9\x93(S\xa2\xc1\xc3\xb2\xa5\xcb\x97x\x10\xc9\x9cI\xb3&"L8s\xea\xdc\x89\t\x95\xcf\x9f@\x83\xa2\xc2E\xb4\xa8\xd1\xa3\xb8\x90)]\xca\xb4)2lP\xa3J\x9d\x8a\r\x9d\xd5\xabX\xb3\xa2\xc3\xc7\xb5\xab\xd7\xaf\xf8\x02\x02' +p8 +aS'\x00' +at. \ No newline at end of file diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 482a0a472..05a28995c 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -505,6 +505,35 @@ class TestFileGif(PillowTestCase): reloaded = Image.open(out) self.assert_image_equal(reloaded.convert('L'), im.convert('L')) + def test_getdata(self): + # test getheader/getdata against legacy values + # Create a 'P' image with holes in the palette + im = Image._wedge().resize((16,16)) + im.putpalette(ImagePalette.ImagePalette('RGB')) + im.info = {'background':0} + + passed_palette = bytes(bytearray([255-i//3 for i in range(768)])) + + GifImagePlugin._FORCE_OPTIMIZE = True + try: + h = GifImagePlugin.getheader(im, passed_palette) + d = GifImagePlugin.getdata(im) + + import cPickle as pickle + # Enable to get target values on pre-refactor version + # with open('Tests/images/gif_header_data.pkl', 'wb') as f: + # f.write(pickle.dumps((h,d))) + with open('Tests/images/gif_header_data.pkl', 'rb') as f: + (h_target,d_target) = pickle.loads(f.read()) + + self.assertEqual(h, h_target) + self.assertEqual(d, d_target) + finally: + GifImagePlugin._FORCE_OPTIMIZE = False + + + + if __name__ == '__main__': unittest.main() From 4483dfbcb9e10ad25ba24a8bc2ff59bebabd542f Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 7 Mar 2017 02:36:58 -0800 Subject: [PATCH 315/632] py3, pep8 --- Tests/test_file_gif.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 05a28995c..9bbaa4974 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -508,9 +508,9 @@ class TestFileGif(PillowTestCase): def test_getdata(self): # test getheader/getdata against legacy values # Create a 'P' image with holes in the palette - im = Image._wedge().resize((16,16)) + im = Image._wedge().resize((16, 16)) im.putpalette(ImagePalette.ImagePalette('RGB')) - im.info = {'background':0} + im.info = {'background': 0} passed_palette = bytes(bytearray([255-i//3 for i in range(768)])) @@ -519,12 +519,12 @@ class TestFileGif(PillowTestCase): h = GifImagePlugin.getheader(im, passed_palette) d = GifImagePlugin.getdata(im) - import cPickle as pickle + import pickle # Enable to get target values on pre-refactor version - # with open('Tests/images/gif_header_data.pkl', 'wb') as f: - # f.write(pickle.dumps((h,d))) + #with open('Tests/images/gif_header_data.pkl', 'wb') as f: + # pickle.dump((h, d), f, 1) with open('Tests/images/gif_header_data.pkl', 'rb') as f: - (h_target,d_target) = pickle.loads(f.read()) + (h_target, d_target) = pickle.load(f) self.assertEqual(h, h_target) self.assertEqual(d, d_target) From f72ceda7c6577de1b5a41ad8bddd3f1608371431 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 7 Mar 2017 02:39:55 -0800 Subject: [PATCH 316/632] version 1 pickle for x-verson compatibility --- Tests/images/gif_header_data.pkl | Bin 2707 -> 1543 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Tests/images/gif_header_data.pkl b/Tests/images/gif_header_data.pkl index b08e7a5fed26dd0a534c1f64a274df9b1b34305a..50f01aa0e08c7d7ca4d423ad0950553828c284e5 100644 GIT binary patch literal 1543 zcmXxkhffqy5C-t$Xvfix-lfCQd+)usqnD!{M{f^~-a({^fQVQ?^bkc+x{5uS_m8!kAb{VTBoV3YnpTN&aUd5i`O}s$j;L&FhIo{4e>#(QopLqo3pl zN8iaEN8iX-j=qpvj&8^`M_1&MqYHA*(P#3Bqcif6qYvbiqxa+;M}Mjqb>4?qfPRVqYbjo(HdFhXoWoB zXqnvSXo)Oxv_R&$0RECcfPRx-fPRu6fWDJEK;Ot$Kwro$pc`@x=!#qdx*+F(K9f&? z&d5hVAIK@7_v9U*6Y>_&G0_5gLtXc?@WW zYy;XNj{t3whk!Q7I-oVO3TTBq0JKc*16m@BfELI+2CZ-CMPE+ zCML$m$H&ITMn^|SMn*Im&G7K>(9jTLY;bUJU|^uXzrU}queZ0ir>Cd8ySuBatFyDS zqobp}yOS6f?KQ&Ur2U0qdG zRaseCQBhG|Uan9m%F4=0OG`^iN{Wk%i;9X03kwSh3i9*w^YZd?b8~ZYa zGcz+XGSbu2)6&vXQ&Uq?Qj(LClai7W6B82>65`|I%DvTTwGk7ot>SWoE#k;9UL6&?d|RC>}+jqZES3;t*x!BtSl`pEi5c# zGMTx#xtW=nsi~=niHWhXu~aHGGBT1#B!-5D1_lQD`uci$db+y0VzF39M@QIG%mg=* zse+lQi#5z#$z*a|O}Oa-g-cj-GGWL9hb$G$3ZLOI3A4t?M!{?`Iv1h=k%h!L7cSkz zCK4|0Mtb literal 2707 zcmY+`=T_=U0EXfJUWHxk37|~uz4uo&tpTb{{K>`SWP92C1xxUV+k1x z2P{dzSPWw+FqUD)GQ?Q&j3vidvW&%NEPRJjLqdOw_C#n;g!V*ePlWbFXitRpL}*Wh z_C#n;g!V*ePlWbFXitRpq#>q1MSCo?$3lB7w8uhwEVRc$dn~laLVGN<$3lB7w8uhw zEVRc$d)yGwpQ1ey+9RPo651o7Jrdd@p*<4XBcVMK+9RPo651o7Jrdd@p*?B{=}*xf z3hklL9t!QD&>jlyq0k-*?V->f3hklL9t!QD&>jlyq0k;SSo%}6TcO5|%jKu1r^m;~ zhlhvz`}@1QyW88_o12^K>+7qlt5T_yBuN~{Q51z?Xsx}xyu7%$I6pr>J3A}Z{+*tl zo}8Q+S9B>FMe2?#^T~#V+^g?Ck95 z=xA?mZ)GFx9>=)xI#*zA)9kFx9>=)xI#*zA)9kFx9>= z)xI#*zA)9kFx9>=)owjdTNBXl3GH6pOVK^59@QzTy}HMudsJ$Vsz+&xQco!Lgi=o^ z^@LJSDD{L=Pbf_nDfuS5Q7I2KvC0`{mD8t9|2_YI!Q)oH;lu6{W!>Dnky{Yh@W>sKf%}p?ySuNuQ@Oi_TS>UPja%K-Cy%pjw6f%ER|ft8 D@8Y0k From 25bc5c76ab96aed7c40cd14c536d59be053b6327 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 31 May 2016 01:10:01 -0700 Subject: [PATCH 317/632] Pure python decoder registry --- PIL/Image.py | 39 +++++++++++++++++++++++ PIL/ImageFile.py | 80 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) diff --git a/PIL/Image.py b/PIL/Image.py index fd6bfecb6..cb0a19bad 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -208,6 +208,8 @@ MIME = {} SAVE = {} SAVE_ALL = {} EXTENSION = {} +DECODERS = {} +ENCODERS = {} # -------------------------------------------------------------------- # Modes supported by this version @@ -413,6 +415,11 @@ def _getdecoder(mode, decoder_name, args, extra=()): elif not isinstance(args, tuple): args = (args,) + try: + decoder = DECODERS[decoder_name] + return decoder(mode, *args + extra) + except KeyError: + pass try: # get decoder decoder = getattr(core, decoder_name + "_decoder") @@ -430,6 +437,11 @@ def _getencoder(mode, encoder_name, args, extra=()): elif not isinstance(args, tuple): args = (args,) + try: + encoder = ENCODERS[encoder_name] + return encoder(mode, *args + extra) + except KeyError: + pass try: # get encoder encoder = getattr(core, encoder_name + "_encoder") @@ -2526,6 +2538,33 @@ def registered_extensions(): init() return EXTENSION +def register_decoder(name, decoder): + """ + Registers an image decoder. This function should not be + used in application code. + + :param name: The name of the decoder + :param decoder: A callable(mode, args) that returns an + ImageFile.PyDecoder object + + .. versionadded:: 3.3.0 + """ + DECODERS[name] = decoder + + +def register_encoder(name, encoder): + """ + Registers an image encoder. This function should not be + used in application code. + + :param name: The name of the encoder + :param encoder: A callable(mode, args) that returns an + ImageFile.PyEncoder object + + .. versionadded:: 3.3.0 + """ + ENCODERS[name] = encoder + # -------------------------------------------------------------------- # Simple display support. User code may override this. diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 8f3ee524c..f9b966221 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -520,3 +520,83 @@ def _safe_read(fp, size): data.append(block) size -= len(block) return b"".join(data) + + +class PyCodecState(object): + def __init__(self): + self.xsize = 0 + self.ysize = 0 + self.xoff = 0 + self.yoff = 0 + + def extents(self): + return (self.xoff, self.yoff, + self.xoff+self.xsize, self.yoff+self.ysize) + +class PyDecoder(object): + _handles_eof = False + _pulls_fd = False + + def __init__(self, mode, *args): + self.im = None + self.state = PyCodecState() + self.fd = None + self.mode = mode + self.init(args) + + def init(self, args): + self.args = args + + @property + def handles_eof(self): + return self._handles_eof + + @property + def pulls_fd(self): + return self._pulls_fd + + def decode(self, buffer): + raise NotImplementedError() + + def cleanup(self): + pass + + def setfd(self, fd): + self.fd = fd + + def setimage(self, im, extents=None): + # following c code + self.im = im + + if extents: + (x0, y0, x1, y1) = extents + else: + (x0, y0, x1, y1) = (0, 0, 0, 0) + + + if x0 ==0 and x1 ==0: + self.state.xsize, self.state.ysize = self.im.size + else: + self.state.xoff = x0 + self.state.yoff = y0 + self.state.xsize = x1 - x0 + self.state.ysize = y1 - y0 + + if self.state.xsize <= 0 or self.state.ysize <= 0: + raise ValueError("Size Cannot be Negative") + + if (self.state.xsize + self.state.xoff > self.im.size[0] or + self.state.ysize + self.state.yoff > self.im.size[1]): + raise ValueError("Tile cannot extend outside image") + + def set_as_raw(self, data, rawmode=None): + if not rawmode: + rawmode = self.mode + d = Image._getdecoder(self.mode, 'raw', (rawmode)) + d.setimage(self.im, self.state.extents()) + s = d.decode(data) + + if s[0] >= 0: + raise ValueError("not enough image data") + if s[1] != 0: + raise ValueError("cannot decode image data") From be26453ac0a8d0d5bab68780256c157c238a41b1 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 5 Jul 2016 05:04:11 -0700 Subject: [PATCH 318/632] python decoder docs --- .../writing-your-own-file-decoder.rst | 68 +++++++++++++------ 1 file changed, 47 insertions(+), 21 deletions(-) diff --git a/docs/handbook/writing-your-own-file-decoder.rst b/docs/handbook/writing-your-own-file-decoder.rst index f72851179..ec3ceea06 100644 --- a/docs/handbook/writing-your-own-file-decoder.rst +++ b/docs/handbook/writing-your-own-file-decoder.rst @@ -9,7 +9,10 @@ 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 image plugin 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 + image plugin manually. Pillow decodes files in 2 stages: @@ -23,21 +26,19 @@ Pillow decodes files in 2 stages: called, which sets up a decoder for each tile and feeds the data to it. -A decoder plug-in should contain a decoder class, based on the -:py:class:`PIL.ImageFile.ImageFile` base class. This class should provide an -:py:meth:`_open` method, which reads the file header and sets up at least the -:py:attr:`~PIL.Image.Image.mode` and :py:attr:`~PIL.Image.Image.size` -attributes. To be able to load the file, the method must also create a list of -:py:attr:`tile` descriptors. The class must be explicitly registered, via a -call to the :py:mod:`~PIL.Image` module. +A image plug-in should contain a format handler derived from the +:py:class:`PIL.ImageFile.ImageFile` base class. This class should +provide an :py:meth:`_open` method, which reads the file header and +sets up at least the :py:attr:`~PIL.Image.Image.mode` and +:py:attr:`~PIL.Image.Image.size` attributes. To be able to load the +file, the method must also create a list of :py:attr:`tile` +descriptors, which contain a decoder name, extents of the tile, and +any decoder specific data. The format handler class must be explicitly +registered, via a call to the :py:mod:`~PIL.Image` module. -For performance reasons, it is important that the :py:meth:`_open` method -quickly rejects files that do not have the appropriate contents. - -The ``raw`` decoder is useful for uncompressed image formats, but many -formats require more control of the decoding context, either with a -decoder written in ``C`` or by linking in an external library to do -the decoding. (Examples of this include PNG, Tiff, and Jpeg support) +.. note:: For performance reasons, it is important that the +:py:meth:`_open` method quickly rejects files that do not have the +appropriate contents. Example ------- @@ -94,12 +95,12 @@ true color. The format handler must always set the :py:attr:`~PIL.Image.Image.size` and :py:attr:`~PIL.Image.Image.mode` attributes. If these are not set, the file cannot be opened. To -simplify the decoder, the calling code considers exceptions like +simplify the plugin, the calling code considers exceptions like :py:exc:`SyntaxError`, :py:exc:`KeyError`, :py:exc:`IndexError`, :py:exc:`EOFError` and :py:exc:`struct.error` as a failure to identify the file. -Note that the decoder must be explicitly registered using +Note that the image plugin must be explicitly registered using :py:func:`PIL.Image.register_open`. Although not required, it is also a good idea to register any extensions used by this format. @@ -137,6 +138,9 @@ The fields are used as follows: Note that the :py:attr:`tile` attribute contains a list of tile descriptors, not just a single descriptor. +Decoders +======== + The raw decoder --------------- @@ -304,13 +308,14 @@ The fields are used as follows: .. _file-decoders: -Writing Your Own File Decoder -============================= +Writing Your Own File Decoder in C +================================== There are 3 stages in a file decoder's lifetime: -1. Setup: Pillow looks for a function named ``[decodername]_decoder`` - on the internal core image object. That function is called with the ``args`` tuple +1. Setup: Pillow looks for a function in the decoder registry, falling + back to a function named ``[decodername]_decoder`` on the internal + core image object. That function is called with the ``args`` tuple from the ``tile`` setup in the ``_open`` method. 2. Decoding: The decoder's decode function is repeatedly called with @@ -391,3 +396,24 @@ The cleanup function is called after the decoder returns a negative value, or if there is a read error from the file. This function should free any allocated memory and release any resources from external libraries. + + +Writing Your Own File Decoder in Python +======================================= + +Python file decoders should derive from +:py:class:`PIL.ImageFile.PyDecoder` and should at least override the +decode method. File decoders should be registered using +:py:meth:`PIL.Image.register_decoder`. As in the C implementation of +the file decoders, there are three stages in the lifetime of a Python +based file decoder: + +1. Setup: Pillow looks for the decoder in the registry, then + instantiates the class. + +2. Decoding: The decoder instance's ``decode`` method is repeatedly + called with a buffer of data to be interpreted. + +3. Cleanup: The decoder instance's ``cleanup`` method is called. + + From 1c0d1c547e6e9c4a1c138f078b823eb85a07f38f Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 8 Jul 2016 10:52:30 +0100 Subject: [PATCH 319/632] PyDecoder documentation --- PIL/ImageFile.py | 50 +++++++++++++++++++ .../writing-your-own-file-decoder.rst | 5 +- docs/reference/ImageFile.rst | 6 +++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index f9b966221..edce2fb5a 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -534,6 +534,13 @@ class PyCodecState(object): self.xoff+self.xsize, self.yoff+self.ysize) class PyDecoder(object): + """ + Python implementation of a format decoder. Override this class and + add the decoding logic in the `decode` method. + + See :ref:`Writing Your Own File Decoder in Python` + """ + _handles_eof = False _pulls_fd = False @@ -545,6 +552,12 @@ class PyDecoder(object): self.init(args) def init(self, args): + """ + Override to perform decoder specific initialization + + :param args: Array of args items from the tile entry + :returns: None + """ self.args = args @property @@ -556,15 +569,43 @@ class PyDecoder(object): return self._pulls_fd def decode(self, buffer): + """ + Override to perform the decoding process. + + :param buffer: A bytes object with the data to be decoded. If `handles_eof` + is set, then `buffer` will be empty and `self.fd` will be set. + :returns: A tuple of (bytes consumed, errcode). If finished with decoding + return <0 for the bytes consumed. Err codes are from `ERRORS` + """ raise NotImplementedError() def cleanup(self): + """ + Override to perform decoder specific cleanup + + :returns: None + """ pass def setfd(self, fd): + """ + Called from ImageFile to set the python file like object + + :param fd: A python file like object + :returns: None + """ self.fd = fd def setimage(self, im, extents=None): + """ + Called from ImageFile to set the core output image for the decoder + + :param im: A core image object + :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle + for this tile + :returns: None + """ + # following c code self.im = im @@ -590,6 +631,15 @@ class PyDecoder(object): raise ValueError("Tile cannot extend outside image") def set_as_raw(self, data, rawmode=None): + """ + Convenience method to set the internal image from a stream of raw data + + :param data: Bytes to be set + :param rawmode: The rawmode to be used for the decoder. If not specified, + it will default to the mode of the image + :returns: None + """ + if not rawmode: rawmode = self.mode d = Image._getdecoder(self.mode, 'raw', (rawmode)) diff --git a/docs/handbook/writing-your-own-file-decoder.rst b/docs/handbook/writing-your-own-file-decoder.rst index ec3ceea06..ed1f2dc34 100644 --- a/docs/handbook/writing-your-own-file-decoder.rst +++ b/docs/handbook/writing-your-own-file-decoder.rst @@ -37,8 +37,8 @@ any decoder specific data. The format handler class must be explicitly registered, via a call to the :py:mod:`~PIL.Image` module. .. note:: For performance reasons, it is important that the -:py:meth:`_open` method quickly rejects files that do not have the -appropriate contents. + :py:meth:`_open` method quickly rejects files that do not have the + appropriate contents. Example ------- @@ -397,6 +397,7 @@ value, or if there is a read error from the file. This function should free any allocated memory and release any resources from external libraries. +.. _file-decoders-py: Writing Your Own File Decoder in Python ======================================= diff --git a/docs/reference/ImageFile.rst b/docs/reference/ImageFile.rst index 9612658e9..aa20080f9 100644 --- a/docs/reference/ImageFile.rst +++ b/docs/reference/ImageFile.rst @@ -39,3 +39,9 @@ Example: Parse an image .. autoclass:: PIL.ImageFile.Parser() :members: + +:py:class:`~PIL.ImageFile.PyDecoder` +------------------------------------ + +.. autoclass:: PIL.ImageFile.PyDecoder() + :members: From 36a22e2d6315065bac8dd51b067f0f4b4a7fbf9d Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 8 Jul 2016 10:52:56 +0100 Subject: [PATCH 320/632] s/lena/hopper/ --- docs/reference/ImageFile.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/ImageFile.rst b/docs/reference/ImageFile.rst index aa20080f9..d93dfb3a3 100644 --- a/docs/reference/ImageFile.rst +++ b/docs/reference/ImageFile.rst @@ -19,7 +19,7 @@ Example: Parse an image from PIL import ImageFile - fp = open("lena.pgm", "rb") + fp = open("hopper.pgm", "rb") p = ImageFile.Parser() From c5d32d2b2367db8e3bda6b3695b54a7cf91b79ff Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 21 Feb 2017 02:37:51 -0800 Subject: [PATCH 321/632] Moving DdsDecoder python implementation to examples --- docs/example/DdsImagePlugin.py | 286 +++++++++++++++++++++++++++++++++ 1 file changed, 286 insertions(+) create mode 100644 docs/example/DdsImagePlugin.py diff --git a/docs/example/DdsImagePlugin.py b/docs/example/DdsImagePlugin.py new file mode 100644 index 000000000..dd048a32f --- /dev/null +++ b/docs/example/DdsImagePlugin.py @@ -0,0 +1,286 @@ +""" +A Pillow loader for .dds files (S3TC-compressed aka DXTC) +Jerome Leclanche + +Documentation: + http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ +""" + +import struct +from io import BytesIO +from PIL import Image, ImageFile + + +# Magic ("DDS ") +DDS_MAGIC = 0x20534444 + +# DDS flags +DDSD_CAPS = 0x1 +DDSD_HEIGHT = 0x2 +DDSD_WIDTH = 0x4 +DDSD_PITCH = 0x8 +DDSD_PIXELFORMAT = 0x1000 +DDSD_MIPMAPCOUNT = 0x20000 +DDSD_LINEARSIZE = 0x80000 +DDSD_DEPTH = 0x800000 + +# DDS caps +DDSCAPS_COMPLEX = 0x8 +DDSCAPS_TEXTURE = 0x1000 +DDSCAPS_MIPMAP = 0x400000 + +DDSCAPS2_CUBEMAP = 0x200 +DDSCAPS2_CUBEMAP_POSITIVEX = 0x400 +DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800 +DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000 +DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000 +DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000 +DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000 +DDSCAPS2_VOLUME = 0x200000 + +# Pixel Format +DDPF_ALPHAPIXELS = 0x1 +DDPF_ALPHA = 0x2 +DDPF_FOURCC = 0x4 +DDPF_PALETTEINDEXED8 = 0x20 +DDPF_RGB = 0x40 +DDPF_LUMINANCE = 0x20000 + + +# dds.h + +DDS_FOURCC = DDPF_FOURCC +DDS_RGB = DDPF_RGB +DDS_RGBA = DDPF_RGB | DDPF_ALPHAPIXELS +DDS_LUMINANCE = DDPF_LUMINANCE +DDS_LUMINANCEA = DDPF_LUMINANCE | DDPF_ALPHAPIXELS +DDS_ALPHA = DDPF_ALPHA +DDS_PAL8 = DDPF_PALETTEINDEXED8 + +DDS_HEADER_FLAGS_TEXTURE = (DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | + DDSD_PIXELFORMAT) +DDS_HEADER_FLAGS_MIPMAP = DDSD_MIPMAPCOUNT +DDS_HEADER_FLAGS_VOLUME = DDSD_DEPTH +DDS_HEADER_FLAGS_PITCH = DDSD_PITCH +DDS_HEADER_FLAGS_LINEARSIZE = DDSD_LINEARSIZE + +DDS_HEIGHT = DDSD_HEIGHT +DDS_WIDTH = DDSD_WIDTH + +DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS_TEXTURE +DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS_COMPLEX | DDSCAPS_MIPMAP +DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS_COMPLEX + +DDS_CUBEMAP_POSITIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX +DDS_CUBEMAP_NEGATIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX +DDS_CUBEMAP_POSITIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY +DDS_CUBEMAP_NEGATIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY +DDS_CUBEMAP_POSITIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ +DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ + + +# DXT1 +DXT1_FOURCC = 0x31545844 + +# DXT3 +DXT3_FOURCC = 0x33545844 + +# DXT5 +DXT5_FOURCC = 0x35545844 + + +def _decode565(bits): + a = ((bits >> 11) & 0x1f) << 3 + b = ((bits >> 5) & 0x3f) << 2 + c = (bits & 0x1f) << 3 + return a, b, c + + +def _c2a(a, b): + return (2 * a + b) // 3 + + +def _c2b(a, b): + return (a + b) // 2 + + +def _c3(a, b): + return (2 * b + a) // 3 + + +def _dxt1(data, width, height): + # TODO implement this function as pixel format in decode.c + ret = bytearray(4 * width * height) + + for y in range(0, height, 4): + for x in range(0, width, 4): + color0, color1, bits = struct.unpack("> 2 + if control == 0: + r, g, b = r0, g0, b0 + elif control == 1: + r, g, b = r1, g1, b1 + elif control == 2: + if color0 > color1: + r, g, b = _c2a(r0, r1), _c2a(g0, g1), _c2a(b0, b1) + else: + r, g, b = _c2b(r0, r1), _c2b(g0, g1), _c2b(b0, b1) + elif control == 3: + if color0 > color1: + r, g, b = _c3(r0, r1), _c3(g0, g1), _c3(b0, b1) + else: + r, g, b = 0, 0, 0 + + idx = 4 * ((y + j) * width + (x + i)) + ret[idx:idx+4] = struct.pack('4B', r, g, b, 255) + + return bytes(ret) + + +def _dxtc_alpha(a0, a1, ac0, ac1, ai): + if ai <= 12: + ac = (ac0 >> ai) & 7 + elif ai == 15: + ac = (ac0 >> 15) | ((ac1 << 1) & 6) + else: + ac = (ac1 >> (ai - 16)) & 7 + + if ac == 0: + alpha = a0 + elif ac == 1: + alpha = a1 + elif a0 > a1: + alpha = ((8 - ac) * a0 + (ac - 1) * a1) // 7 + elif ac == 6: + alpha = 0 + elif ac == 7: + alpha = 0xff + else: + alpha = ((6 - ac) * a0 + (ac - 1) * a1) // 5 + + return alpha + + +def _dxt5(data, width, height): + # TODO implement this function as pixel format in decode.c + ret = bytearray(4 * width * height) + + for y in range(0, height, 4): + for x in range(0, width, 4): + a0, a1, ac0, ac1, c0, c1, code = struct.unpack("<2BHI2HI", + data.read(16)) + + r0, g0, b0 = _decode565(c0) + r1, g1, b1 = _decode565(c1) + + for j in range(4): + for i in range(4): + ai = 3 * (4 * j + i) + alpha = _dxtc_alpha(a0, a1, ac0, ac1, ai) + + cc = (code >> 2 * (4 * j + i)) & 3 + if cc == 0: + r, g, b = r0, g0, b0 + elif cc == 1: + r, g, b = r1, g1, b1 + elif cc == 2: + r, g, b = _c2a(r0, r1), _c2a(g0, g1), _c2a(b0, b1) + elif cc == 3: + r, g, b = _c3(r0, r1), _c3(g0, g1), _c3(b0, b1) + + idx = 4 * ((y + j) * width + (x + i)) + ret[idx:idx+4] = struct.pack('4B', r, g, b, alpha) + + return bytes(ret) + + +class DdsImageFile(ImageFile.ImageFile): + format = "DDS" + format_description = "DirectDraw Surface" + + def _open(self): + magic, header_size = struct.unpack(" Date: Sun, 29 Jan 2017 22:03:45 +0200 Subject: [PATCH 322/632] Created by forcing Pillow to save with checksum=0 --- Tests/images/hopper_bad_checksum.msp | Bin 0 -> 2080 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/hopper_bad_checksum.msp diff --git a/Tests/images/hopper_bad_checksum.msp b/Tests/images/hopper_bad_checksum.msp new file mode 100644 index 0000000000000000000000000000000000000000..248074a2294cda91ee55cb12e48de9db84190f2b GIT binary patch literal 2080 zcmZ8iZ%iD=6@N3g*bCIk9tnJCrFgmCxn`X<=?7a;TiJ8yaJf_6!e!@Zmk5*AAEG5^ zA~km0C@BNw1K~?CVp|ER>WOj^H|uq1mAxp~4%gO|66Xs>UTkqTCYCC>xU|;_5;wJ> z@2>sSz0=Nn^WOWtKlA2o;-%9k1PCDi`&H@xdqTNyKblNNtN)Zl*`5jZs7lXH7R)@n z-KveSH^Jei!()-DCICewPE9M5`E=)$!vWOzSZVz`%c-_Do|Y1lI*9i8XaC?SC)O5C zYCuSY{dn%2+g?I+75|#NGbg%FuGMke=j6_n`h;bn*JhzeH0h-udPi z4(eh7248z(!;Q5i5A7UZZy&21{Hzk+nwrZSvzPalO5&xapO_Q>oN>%q=ji^cr)H9W z7suZChLuV=>F`PMihy5jJzo2ItUFpTo`1Gf8G|R2EgfR=L^{v4y)WDnI#%f(@QCD5 zZO-P(|F9?k2prs2&fkzeXoB%~bixd_x3JP4Efhr45JEwY z(ioP{(I=XOK$d90Q|4p=DAZ0&K|G$4vkKO)#DM6CC#B??1}p(ir;-DsU`{&Ft`kPN zQM>@0$9P(S5fG%f?XC_R4(A;0G|_VRgPr22iS`njG$vg8L3y(a?Wde60Z=-zxcJle za_KyJ_z=Cf|8iqHu;#fXWnncDjtZ-1(B3pL94Q}m0Sq6Kcl?$mMCZJ6k3quYuiuCp z$eFTo8rX=Rx8~+XQ5*FisqhB|gMZFwHU4%baRy;Rf2d>9eqbKcn?E34|9bP9H!_x4;_ zxtS?v?V<)M{OK^?Tybr*aIt@NXpotA2JgI3(^n&)eVkb=fBN7DmUJzt3t-bcdw1Z9 z46?rM<7v>Wdy;S4S2zL$plWc*_Kz)GM9$+}#eToz&$@x%n?d{xw6pq5V682bZ9fzE zTvs7fw*M9>`JVK#pm?1QEI8&z&s@Y{IL|5!_La~2c80&s2W*#XL_6Y@3qC)z;CtNT zOoj59*Mh!PCyV&LmD8bk`{s`x6vzFl|ACT-l>HxieVgy0IN;_C8$P`nTXr+k<6bY9 zZb^WjO?&#-rd2b@QRUJC-Ez(rF?h?jud8q|sL!mqy)A(qNRR0B%=_^(13m`pA!JzS zUkkcj6G`vC^`pJkoG+a$w|$@6Sf3*s@}fKNuFErW)q_a=m#jIt_Bg|PEp&mMf5JE2 ztef^^fJXqLsUO+N1zH_p7|}KnLPorWl*~u`)B4@(x6_}4otn3(&Z3uRc?ci z<#XY8dTJ?TOc)txaWgKbODbg{JMs2qwa!`%vLI(VA=H*OUIdcmy`0>~2t$Wk`DM_J z6_1DeIt4U3PV_QBvlV2?2Fl|y?VN*Q`oNN;PbXm#6!^J_0?h-Qe2NViy4I0?h%Wf;NH$~}@)7VjDdB}D+ev;O^*W7!Fw`TT&wRO}V=FdVL@-doj|)8&>>QwOD~fg4 zdH0=l0$L<)5~|>h-C6ndx}bRR2ZmKhK>H9MT1PwpPw4oDp~c0LqU)f_;o2-3`h0&$ z!_qPTYE=wF;)xLk0%uST814_jR|F0c27Dceu4_jlAr({vwC5>cz~91MTp;q*IXqy1 z=Yasz2?1kCD9CFthVO(5hvutdfl&~ZAk};ebXB7`FIAj)I(%^s)4>e)FR`j#xN!-` zJ5u{GU5c}^`Q<9Ut{r#x2tp|U+qxSv9up+FR;DsK`%bC^!;8QXsG!+8jmYK(f2((WLy uu@MF;t8S?BL4w`5yMRY literal 0 HcmV?d00001 From e44773c76c1efe2ea3fb5ad20b062c16df621d28 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 29 Jan 2017 22:28:41 +0200 Subject: [PATCH 323/632] Test with bad checksum --- PIL/MspImagePlugin.py | 7 ++++++- Tests/test_file_msp.py | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/PIL/MspImagePlugin.py b/PIL/MspImagePlugin.py index b60a21d69..11d31880c 100644 --- a/PIL/MspImagePlugin.py +++ b/PIL/MspImagePlugin.py @@ -15,7 +15,11 @@ # # See the README file for information on usage and redistribution. # - +# More info on this format: https://archive.org/details/gg243631 +# Page 313: +# Figure 205. Windows Paint Version 1: "DanM" Format +# Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03 +# from . import Image, ImageFile from ._binary import i16le as i16, o16le as o16 @@ -92,6 +96,7 @@ def _save(im, fp, filename): # image body ImageFile._save(im, fp, [("raw", (0, 0)+im.size, 32, ("1", 0, 1))]) + # # registry diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py index e174d0061..44fc0ec3b 100644 --- a/Tests/test_file_msp.py +++ b/Tests/test_file_msp.py @@ -24,6 +24,15 @@ class TestFileMsp(PillowTestCase): self.assertRaises(SyntaxError, lambda: MspImagePlugin.MspImageFile(invalid_file)) + def test_bad_checksum(self): + # Arrange + # This was created by forcing Pillow to save with checksum=0 + bad_checksum = "Tests/images/hopper_bad_checksum.msp" + + # Act / Assert + self.assertRaises(SyntaxError, + lambda: MspImagePlugin.MspImageFile(bad_checksum)) + def test_open(self): # Arrange # Act From 98b19a9f68245b3786c37ed58b0a72d573c35174 Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 30 Jan 2017 08:21:48 +0200 Subject: [PATCH 324/632] Test Windows v2 MSP files --- Tests/test_file_msp.py | 17 ++++++++++++++++- depends/install_extra_test_images.sh | 8 +++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py index 44fc0ec3b..5d13132ae 100644 --- a/Tests/test_file_msp.py +++ b/Tests/test_file_msp.py @@ -2,7 +2,10 @@ from helper import unittest, PillowTestCase, hopper from PIL import Image, MspImagePlugin +import os + TEST_FILE = "Tests/images/hopper.msp" +EXTRA_DIR = "Tests/images/picins" class TestFileMsp(PillowTestCase): @@ -33,7 +36,7 @@ class TestFileMsp(PillowTestCase): self.assertRaises(SyntaxError, lambda: MspImagePlugin.MspImageFile(bad_checksum)) - def test_open(self): + def test_open_windows_v1(self): # Arrange # Act im = Image.open(TEST_FILE) @@ -41,6 +44,18 @@ class TestFileMsp(PillowTestCase): # Assert self.assertEqual(im.size, (128, 128)) self.assert_image_equal(im, hopper("1"), 4) + self.assertIsInstance(im, MspImagePlugin.MspImageFile) + + @unittest.skipIf(not os.path.exists(EXTRA_DIR), + "Extra image files not installed") + def test_others_windows_v2(self): + files = (os.path.join(EXTRA_DIR, f) for f in os.listdir(EXTRA_DIR) + if os.path.splitext(f)[1] == '.msp') + for path in files: + with Image.open(path) as im: + self.assertEqual(im.mode, "1") + self.assertGreater(im.size, (360, 332)) + self.assertIsInstance(im, MspImagePlugin.MspImageFile) def test_cannot_save_wrong_mode(self): # Arrange diff --git a/depends/install_extra_test_images.sh b/depends/install_extra_test_images.sh index 00ed219d6..667c74e6d 100755 --- a/depends/install_extra_test_images.sh +++ b/depends/install_extra_test_images.sh @@ -1,11 +1,9 @@ #!/bin/bash # install extra test images -if [ ! -f test_images.tar.gz ]; then - wget -O 'test_images.tar.gz' 'https://github.com/python-pillow/pillow-depends/blob/master/test_images.tar.gz?raw=true' -fi - rm -r test_images -tar -xvzf test_images.tar.gz + +# Use SVN to just fetch a single git subdirectory +svn checkout https://github.com/python-pillow/pillow-depends/trunk/test_images cp -r test_images/* ../Tests/images From 38c6771be0325e81eed275b95693e707c5cfb76a Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 30 Jan 2017 09:20:15 +0200 Subject: [PATCH 325/632] Load MSP files to test MSP decoder --- Tests/test_file_msp.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py index 5d13132ae..721b4425e 100644 --- a/Tests/test_file_msp.py +++ b/Tests/test_file_msp.py @@ -1,6 +1,6 @@ from helper import unittest, PillowTestCase, hopper -from PIL import Image, MspImagePlugin +from PIL import Image, ImageFile, MspImagePlugin import os @@ -48,14 +48,22 @@ class TestFileMsp(PillowTestCase): @unittest.skipIf(not os.path.exists(EXTRA_DIR), "Extra image files not installed") - def test_others_windows_v2(self): + def test_open_windows_v2(self): + # Arrange + ImageFile.LOAD_TRUNCATED_IMAGES = True files = (os.path.join(EXTRA_DIR, f) for f in os.listdir(EXTRA_DIR) if os.path.splitext(f)[1] == '.msp') for path in files: + + # Act with Image.open(path) as im: + im.load() + + # Assert self.assertEqual(im.mode, "1") self.assertGreater(im.size, (360, 332)) self.assertIsInstance(im, MspImagePlugin.MspImageFile) + ImageFile.LOAD_TRUNCATED_IMAGES = False def test_cannot_save_wrong_mode(self): # Arrange From 8840f2b0fb1cdd7acd0ac0ac0389a5a5c1530445 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 30 Jan 2017 15:32:31 +0200 Subject: [PATCH 326/632] Remove redundant assert and message --- Tests/test_file_msp.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py index 721b4425e..e0b059037 100644 --- a/Tests/test_file_msp.py +++ b/Tests/test_file_msp.py @@ -42,8 +42,7 @@ class TestFileMsp(PillowTestCase): im = Image.open(TEST_FILE) # Assert - self.assertEqual(im.size, (128, 128)) - self.assert_image_equal(im, hopper("1"), 4) + self.assert_image_equal(im, hopper("1")) self.assertIsInstance(im, MspImagePlugin.MspImageFile) @unittest.skipIf(not os.path.exists(EXTRA_DIR), From 069ad8cbb0dbac22469921dc8be6ca6126f2e5bc Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 30 Jan 2017 15:33:18 +0200 Subject: [PATCH 327/632] Assert some pixel values --- Tests/test_file_msp.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py index e0b059037..389b5cb96 100644 --- a/Tests/test_file_msp.py +++ b/Tests/test_file_msp.py @@ -62,6 +62,11 @@ class TestFileMsp(PillowTestCase): self.assertEqual(im.mode, "1") self.assertGreater(im.size, (360, 332)) self.assertIsInstance(im, MspImagePlugin.MspImageFile) + if "mandel" in path: + self.assertEqual(im.getpixel((0, 0)), 0) + elif "mexhat" in path: + self.assertEqual(im.getpixel((0, 0)), 255) + self.assertEqual(im.getpixel((200, 25)), 255) ImageFile.LOAD_TRUNCATED_IMAGES = False def test_cannot_save_wrong_mode(self): From 949932f45fb3a57b83417ceb873772c04af2691c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 21 Feb 2017 05:09:32 -0800 Subject: [PATCH 328/632] Pure Python MSP Decoder --- PIL/MspImagePlugin.py | 91 +++++++++++++++++++++++++++++++++++++++++- _imaging.c | 2 - decode.c | 21 ---------- libImaging/MspDecode.c | 91 ------------------------------------------ setup.py | 2 +- 5 files changed, 90 insertions(+), 117 deletions(-) delete mode 100644 libImaging/MspDecode.c diff --git a/PIL/MspImagePlugin.py b/PIL/MspImagePlugin.py index 11d31880c..60a4f01f8 100644 --- a/PIL/MspImagePlugin.py +++ b/PIL/MspImagePlugin.py @@ -1,6 +1,5 @@ # # The Python Imaging Library. -# $Id$ # # MSP file handling # @@ -9,9 +8,11 @@ # History: # 95-09-05 fl Created # 97-01-03 fl Read/write MSP images +# 17-02-21 es Fixed RLE interpretation # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1995-97. +# Copyright (c) Eric Soroos 2017. # # See the README file for information on usage and redistribution. # @@ -20,9 +21,11 @@ # Figure 205. Windows Paint Version 1: "DanM" Format # Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03 # +# See also: http://www.fileformat.info/format/mspaint/egff.htm from . import Image, ImageFile from ._binary import i16le as i16, o16le as o16 +import struct, io __version__ = "0.1" @@ -64,7 +67,91 @@ class MspImageFile(ImageFile.ImageFile): if s[:4] == b"DanM": self.tile = [("raw", (0, 0)+self.size, 32, ("1", 0, 1))] else: - self.tile = [("msp", (0, 0)+self.size, 32+2*self.size[1], None)] + self.tile = [("MSP", (0, 0)+self.size, 32, None)] + + +class MspDecoder(ImageFile.PyDecoder): + # The algo for the MSP decoder is from + # http://www.fileformat.info/format/mspaint/egff.htm + # cc-by-attribution -- That page references is taken from the + # Encyclopedia of Graphics File Formats and is licensed by + # O'Reilly under the Creative Common/Attribution license + # + # For RLE encoded files, the 32byte header is followed by a scan + # line map, encoded as one 16bit word of encoded byte length per + # line. + # + # NOTE: the encoded length of the line can be 0. This was not + # handled in the previous version of this encoder, and there's no + # mention of how to handle it in the documentation. From the few + # examples I've seen, I've assumed that it is a fill of the + # background color, in this case, white. + # + # + # Pseudocode of the decoder: + # Read a BYTE value as the RunType + # If the RunType value is zero + # Read next byte as the RunCount + # Read the next byte as the RunValue + # Write the RunValue byte RunCount times + # If the RunType value is non-zero + # Use this value as the RunCount + # Read and write the next RunCount bytes literally + # + # e.g.: + # 0x00 03 ff 05 00 01 02 03 04 + # would yield the bytes: + # 0xff ff ff 00 01 02 03 04 + # + # which are then interpreted as a bit packed mode '1' image + + + _pulls_fd = True + + def decode(self, buffer): + + img = io.BytesIO() + blank_line = bytearray((0xff,)*((self.state.xsize+7)//8)) + try: + last_pos = 0 + self.fd.seek(32) + rowmap = struct.unpack_from("<%dH" % (self.state.ysize), + self.fd.read(self.state.ysize*2)) + except struct.error: + raise IOError("Truncated MSP file in row map") + + for x, rowlen in enumerate(rowmap): + try: + if rowlen == 0: + img.write(blank_line) + continue + row = self.fd.read(rowlen) + if len(row) != rowlen: + raise IOError("Truncated MSP file, expected %d bytes on row %s", + (rowlen, x)) + idx = 0 + while idx < rowlen: + runtype = row[idx] + idx += 1 + if runtype == 0: + (runcount, runval) = struct.unpack("Bc", row[idx:idx+2]) + img.write(runval * runcount) + idx += 2 + else: + runcount = runtype + img.write(row[idx:idx+runcount]) + idx += runcount + + except struct.error: + raise IOError("Corrupted MSP file in row %d" %x) + + self.set_as_raw(img.getvalue(), ("1", 0, 1)) + + return 0,0 + + +Image.register_decoder('MSP', MspDecoder) + # # write MSP files (uncompressed only) diff --git a/_imaging.c b/_imaging.c index aa2e04778..ddb56c7ab 100644 --- a/_imaging.c +++ b/_imaging.c @@ -3290,7 +3290,6 @@ extern PyObject* PyImaging_JpegDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_Jpeg2KDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_TiffLzwDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_LibTiffDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_MspDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_PackbitsDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_PcdDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_PcxDecoderNew(PyObject* self, PyObject* args); @@ -3368,7 +3367,6 @@ static PyMethodDef functions[] = { {"libtiff_decoder", (PyCFunction)PyImaging_LibTiffDecoderNew, 1}, {"libtiff_encoder", (PyCFunction)PyImaging_LibTiffEncoderNew, 1}, #endif - {"msp_decoder", (PyCFunction)PyImaging_MspDecoderNew, 1}, {"packbits_decoder", (PyCFunction)PyImaging_PackbitsDecoderNew, 1}, {"pcd_decoder", (PyCFunction)PyImaging_PcdDecoderNew, 1}, {"pcx_decoder", (PyCFunction)PyImaging_PcxDecoderNew, 1}, diff --git a/decode.c b/decode.c index 91de1075e..d7fe02fae 100644 --- a/decode.c +++ b/decode.c @@ -557,27 +557,6 @@ PyImaging_LibTiffDecoderNew(PyObject* self, PyObject* args) #endif -/* -------------------------------------------------------------------- */ -/* MSP */ -/* -------------------------------------------------------------------- */ - -PyObject* -PyImaging_MspDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; - - decoder = PyImaging_DecoderNew(0); - if (decoder == NULL) - return NULL; - - if (get_unpacker(decoder, "1", "1") < 0) - return NULL; - - decoder->decode = ImagingMspDecode; - - return (PyObject*) decoder; -} - /* -------------------------------------------------------------------- */ /* PackBits */ diff --git a/libImaging/MspDecode.c b/libImaging/MspDecode.c deleted file mode 100644 index b611098d8..000000000 --- a/libImaging/MspDecode.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * The Python Imaging Library. - * $Id$ - * - * decoder for MSP version 2 data. - * - * history: - * 97-01-03 fl Created - * - * Copyright (c) Fredrik Lundh 1997. - * Copyright (c) Secret Labs AB 1997. - * - * See the README file for information on usage and redistribution. - */ - - -#include "Imaging.h" - - -int -ImagingMspDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -{ - int n; - UINT8* ptr; - - ptr = buf; - - for (;;) { - - if (bytes < 1) - return ptr - buf; - - if (ptr[0] == 0) { - - /* Run (3 bytes block) */ - if (bytes < 3) - break; - - n = ptr[1]; - - if (state->x + n > state->bytes) { - state->errcode = IMAGING_CODEC_OVERRUN; - return -1; - } - - memset(state->buffer + state->x, ptr[2], n); - - ptr += 3; - bytes -= 3; - - } else { - - /* Literal (1+n bytes block) */ - n = ptr[0]; - - if (bytes < 1 + n) - break; - - if (state->x + n > state->bytes) { - state->errcode = IMAGING_CODEC_OVERRUN; - return -1; - } - - memcpy(state->buffer + state->x, ptr + 1, n); - - ptr += 1 + n; - bytes -= 1 + n; - - } - - state->x += n; - - if (state->x >= state->bytes) { - - /* Got a full line, unpack it */ - state->shuffle((UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, state->buffer, - state->xsize); - - state->x = 0; - - if (++state->y >= state->ysize) { - /* End of file (errcode = 0) */ - return -1; - } - } - - } - - return ptr - buf; -} diff --git a/setup.py b/setup.py index 1dc146d26..4c20810ef 100755 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ _LIB_IMAGING = ( "Draw", "Effects", "EpsEncode", "File", "Fill", "Filter", "FliDecode", "Geometry", "GetBBox", "GifDecode", "GifEncode", "HexDecode", "Histo", "JpegDecode", "JpegEncode", "LzwDecode", "Matrix", "ModeFilter", - "MspDecode", "Negative", "Offset", "Pack", "PackDecode", "Palette", "Paste", + "Negative", "Offset", "Pack", "PackDecode", "Palette", "Paste", "Quant", "QuantOctree", "QuantHash", "QuantHeap", "PcdDecode", "PcxDecode", "PcxEncode", "Point", "RankFilter", "RawDecode", "RawEncode", "Storage", "SunRleDecode", "TgaRleDecode", "Unpack", "UnpackYCC", "UnsharpMask", From 7fe29ec1c3fad62ef71ac6666aab5415678ef217 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 21 Feb 2017 05:37:27 -0800 Subject: [PATCH 329/632] Added more additional files --- Tests/test_file_msp.py | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py index 389b5cb96..cfcca0b1a 100644 --- a/Tests/test_file_msp.py +++ b/Tests/test_file_msp.py @@ -6,6 +6,7 @@ import os TEST_FILE = "Tests/images/hopper.msp" EXTRA_DIR = "Tests/images/picins" +YA_EXTRA_DIR = "Tests/images/msp" class TestFileMsp(PillowTestCase): @@ -45,29 +46,30 @@ class TestFileMsp(PillowTestCase): self.assert_image_equal(im, hopper("1")) self.assertIsInstance(im, MspImagePlugin.MspImageFile) + def _assert_file_image_equal(self, source_path, target_path): + with Image.open(source_path) as im: + target = Image.open(target_path) + self.assert_image_equal(im, target) + @unittest.skipIf(not os.path.exists(EXTRA_DIR), "Extra image files not installed") def test_open_windows_v2(self): - # Arrange - ImageFile.LOAD_TRUNCATED_IMAGES = True + files = (os.path.join(EXTRA_DIR, f) for f in os.listdir(EXTRA_DIR) if os.path.splitext(f)[1] == '.msp') for path in files: + self._assert_file_image_equal(path, + path.replace('.msp','.png')) - # Act - with Image.open(path) as im: - im.load() + @unittest.skipIf(not os.path.exists(YA_EXTRA_DIR), + "Even More Extra image files not installed") + def test_msp_v2(self): + for f in os.listdir(YA_EXTRA_DIR): + if not '.MSP' in f: continue + path = os.path.join(YA_EXTRA_DIR, f) + self._assert_file_image_equal(path, + path.replace('.MSP','.png')) - # Assert - self.assertEqual(im.mode, "1") - self.assertGreater(im.size, (360, 332)) - self.assertIsInstance(im, MspImagePlugin.MspImageFile) - if "mandel" in path: - self.assertEqual(im.getpixel((0, 0)), 0) - elif "mexhat" in path: - self.assertEqual(im.getpixel((0, 0)), 255) - self.assertEqual(im.getpixel((200, 25)), 255) - ImageFile.LOAD_TRUNCATED_IMAGES = False def test_cannot_save_wrong_mode(self): # Arrange From f13b335a60f996aeabe5482401dc875934051a55 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 21 Feb 2017 06:36:26 -0800 Subject: [PATCH 330/632] Py2.7 compatibility --- PIL/MspImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/MspImagePlugin.py b/PIL/MspImagePlugin.py index 60a4f01f8..8f6e705ae 100644 --- a/PIL/MspImagePlugin.py +++ b/PIL/MspImagePlugin.py @@ -24,7 +24,7 @@ # See also: http://www.fileformat.info/format/mspaint/egff.htm from . import Image, ImageFile -from ._binary import i16le as i16, o16le as o16 +from ._binary import i16le as i16, o16le as o16, i8 import struct, io __version__ = "0.1" @@ -131,7 +131,7 @@ class MspDecoder(ImageFile.PyDecoder): (rowlen, x)) idx = 0 while idx < rowlen: - runtype = row[idx] + runtype = i8(row[idx]) idx += 1 if runtype == 0: (runcount, runval) = struct.unpack("Bc", row[idx:idx+2]) From b668db33cdbc71d6c933f332987594c8a9497a1b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 21 Feb 2017 06:40:45 -0800 Subject: [PATCH 331/632] Updated versionadded to reflect 6-9 month slip [ci skip] --- PIL/Image.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index cb0a19bad..2b747da4a 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -2547,7 +2547,7 @@ def register_decoder(name, decoder): :param decoder: A callable(mode, args) that returns an ImageFile.PyDecoder object - .. versionadded:: 3.3.0 + .. versionadded:: 4.1.0 """ DECODERS[name] = decoder @@ -2561,7 +2561,7 @@ def register_encoder(name, encoder): :param encoder: A callable(mode, args) that returns an ImageFile.PyEncoder object - .. versionadded:: 3.3.0 + .. versionadded:: 4.1.0 """ ENCODERS[name] = encoder From c2cd5fe3d15f1530a69eb9e4fb85b91633e7d19a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 23 Feb 2017 02:19:32 -0800 Subject: [PATCH 332/632] handles_eof was removed in 4.0 --- PIL/ImageFile.py | 5 ----- docs/handbook/writing-your-own-file-decoder.rst | 3 --- 2 files changed, 8 deletions(-) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index edce2fb5a..7406f5752 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -541,7 +541,6 @@ class PyDecoder(object): See :ref:`Writing Your Own File Decoder in Python` """ - _handles_eof = False _pulls_fd = False def __init__(self, mode, *args): @@ -560,10 +559,6 @@ class PyDecoder(object): """ self.args = args - @property - def handles_eof(self): - return self._handles_eof - @property def pulls_fd(self): return self._pulls_fd diff --git a/docs/handbook/writing-your-own-file-decoder.rst b/docs/handbook/writing-your-own-file-decoder.rst index ed1f2dc34..07468dc4a 100644 --- a/docs/handbook/writing-your-own-file-decoder.rst +++ b/docs/handbook/writing-your-own-file-decoder.rst @@ -354,9 +354,6 @@ interest in this object are: member is an opaque struct that can be used by the decoder to store any format specific state or options. -**handles_eof** - UNDONE, set if your code handles EOF errors. - **pulls_fd** **EXPERIMENTAL** -- **WARNING**, interface may change. If set to 1, ``state->fd`` will be a pointer to the Python file like object. The From 38f43c1e5feb1d13249f5163ffb578742d31ed12 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 23 Feb 2017 02:20:25 -0800 Subject: [PATCH 333/632] review lint --- PIL/ImageFile.py | 4 ++-- PIL/MspImagePlugin.py | 15 +++++++-------- Tests/test_file_msp.py | 2 +- docs/handbook/writing-your-own-file-decoder.rst | 8 ++++---- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 7406f5752..423a4363f 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -610,7 +610,7 @@ class PyDecoder(object): (x0, y0, x1, y1) = (0, 0, 0, 0) - if x0 ==0 and x1 ==0: + if x0 == 0 and x1 == 0: self.state.xsize, self.state.ysize = self.im.size else: self.state.xoff = x0 @@ -619,7 +619,7 @@ class PyDecoder(object): self.state.ysize = y1 - y0 if self.state.xsize <= 0 or self.state.ysize <= 0: - raise ValueError("Size Cannot be Negative") + raise ValueError("Size cannot be negative") if (self.state.xsize + self.state.xoff > self.im.size[0] or self.state.ysize + self.state.yoff > self.im.size[1]): diff --git a/PIL/MspImagePlugin.py b/PIL/MspImagePlugin.py index 8f6e705ae..11e983a3a 100644 --- a/PIL/MspImagePlugin.py +++ b/PIL/MspImagePlugin.py @@ -90,13 +90,13 @@ class MspDecoder(ImageFile.PyDecoder): # # Pseudocode of the decoder: # Read a BYTE value as the RunType - # If the RunType value is zero - # Read next byte as the RunCount - # Read the next byte as the RunValue - # Write the RunValue byte RunCount times - # If the RunType value is non-zero - # Use this value as the RunCount - # Read and write the next RunCount bytes literally + # If the RunType value is zero + # Read next byte as the RunCount + # Read the next byte as the RunValue + # Write the RunValue byte RunCount times + # If the RunType value is non-zero + # Use this value as the RunCount + # Read and write the next RunCount bytes literally # # e.g.: # 0x00 03 ff 05 00 01 02 03 04 @@ -113,7 +113,6 @@ class MspDecoder(ImageFile.PyDecoder): img = io.BytesIO() blank_line = bytearray((0xff,)*((self.state.xsize+7)//8)) try: - last_pos = 0 self.fd.seek(32) rowmap = struct.unpack_from("<%dH" % (self.state.ysize), self.fd.read(self.state.ysize*2)) diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py index cfcca0b1a..dbffe7369 100644 --- a/Tests/test_file_msp.py +++ b/Tests/test_file_msp.py @@ -1,6 +1,6 @@ from helper import unittest, PillowTestCase, hopper -from PIL import Image, ImageFile, MspImagePlugin +from PIL import Image, MspImagePlugin import os diff --git a/docs/handbook/writing-your-own-file-decoder.rst b/docs/handbook/writing-your-own-file-decoder.rst index 07468dc4a..0292a7880 100644 --- a/docs/handbook/writing-your-own-file-decoder.rst +++ b/docs/handbook/writing-your-own-file-decoder.rst @@ -26,14 +26,14 @@ Pillow decodes files in 2 stages: called, which sets up a decoder for each tile and feeds the data to it. -A image plug-in should contain a format handler derived from the +An image plug-in should contain a format handler derived from the :py:class:`PIL.ImageFile.ImageFile` base class. This class should provide an :py:meth:`_open` method, which reads the file header and sets up at least the :py:attr:`~PIL.Image.Image.mode` and :py:attr:`~PIL.Image.Image.size` attributes. To be able to load the file, the method must also create a list of :py:attr:`tile` descriptors, which contain a decoder name, extents of the tile, and -any decoder specific data. The format handler class must be explicitly +any decoder-specific data. The format handler class must be explicitly registered, via a call to the :py:mod:`~PIL.Image` module. .. note:: For performance reasons, it is important that the @@ -403,8 +403,8 @@ Python file decoders should derive from :py:class:`PIL.ImageFile.PyDecoder` and should at least override the decode method. File decoders should be registered using :py:meth:`PIL.Image.register_decoder`. As in the C implementation of -the file decoders, there are three stages in the lifetime of a Python -based file decoder: +the file decoders, there are three stages in the lifetime of a +Python-based file decoder: 1. Setup: Pillow looks for the decoder in the registry, then instantiates the class. From 40a94d4a428219aed517a336963e73872b415266 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 11 Mar 2017 15:34:43 +0000 Subject: [PATCH 334/632] Propagage ValueError out, rather than swallowing --- PIL/ImageFile.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 423a4363f..2765ced20 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -193,10 +193,7 @@ class ImageFile(Image.Image): decoder = Image._getdecoder(self.mode, decoder_name, args, self.decoderconfig) seek(offset) - try: - decoder.setimage(self.im, extents) - except ValueError: - continue + decoder.setimage(self.im, extents) if decoder.pulls_fd: decoder.setfd(self.fp) status, err_code = decoder.decode(b"") From d70de6eb2dbc1c4d673830ca6eba495966ee041a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 11 Mar 2017 15:35:03 +0000 Subject: [PATCH 335/632] UnitTest PyDecoder --- Tests/test_imagefile.py | 64 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index 65f54eb8c..dbd48cabc 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -135,5 +135,69 @@ class TestImageFile(PillowTestCase): finally: ImageFile.LOAD_TRUNCATED_IMAGES = False + +class MockPyDecoder(ImageFile.PyDecoder): + def decode(self, buffer): + #eof + return (-1, 0) + +xoff, yoff, xsize, ysize = 10, 20, 100, 100 +class MockImageFile(ImageFile.ImageFile): + def _open(self): + self.rawmode = 'RGBA' + self.mode = 'RGBA' + self.size = (200, 200) + self.tile = [("MOCK", (xoff, yoff, xoff+xsize, yoff+ysize), 32, None)] + +class TestPyDecoder(PillowTestCase): + + def get_decoder(self): + decoder = MockPyDecoder(None) + + def closure(mode, *args): + decoder.__init__(mode, *args) + return decoder + + Image.register_decoder('MOCK', closure) + return decoder + + def test_setimage(self): + buf = BytesIO(b'\x00'*255) + + im = MockImageFile(buf) + d = self.get_decoder() + + im.load() + + self.assertEqual(d.state.xoff, xoff) + self.assertEqual(d.state.yoff, yoff) + self.assertEqual(d.state.xsize, xsize) + self.assertEqual(d.state.ysize, ysize) + + + def test_negsize(self): + buf = BytesIO(b'\x00'*255) + + im = MockImageFile(buf) + im.tile = [("MOCK", (xoff, yoff, -10, yoff+ysize), 32, None)] + d = self.get_decoder() + + self.assertRaises(ValueError, im.load) + + im.tile = [("MOCK", (xoff, yoff, xoff+xsize, -10), 32, None)] + self.assertRaises(ValueError, im.load) + + def test_oversize(self): + buf = BytesIO(b'\x00'*255) + + im = MockImageFile(buf) + im.tile = [("MOCK", (xoff, yoff, xoff+xsize + 100, yoff+ysize), 32, None)] + d = self.get_decoder() + + self.assertRaises(ValueError, im.load) + + im.tile = [("MOCK", (xoff, yoff, xoff+xsize, yoff+ysize + 100), 32, None)] + self.assertRaises(ValueError, im.load) + if __name__ == '__main__': unittest.main() From 31c1a651a3e2151968c158a9de09a1aee78adc5f Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 11 Mar 2017 16:30:04 +0000 Subject: [PATCH 336/632] fixed wording --- PIL/ImageFile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 2765ced20..9425669e2 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -581,9 +581,9 @@ class PyDecoder(object): def setfd(self, fd): """ - Called from ImageFile to set the python file like object + Called from ImageFile to set the python file-like object - :param fd: A python file like object + :param fd: A python file-like object :returns: None """ self.fd = fd From 382833061e6918d3cfd126f895b1c05b480f777a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 11 Mar 2017 16:30:28 +0000 Subject: [PATCH 337/632] Trigger set_as_raw error --- Tests/test_imagefile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index dbd48cabc..13c833242 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -174,6 +174,7 @@ class TestPyDecoder(PillowTestCase): self.assertEqual(d.state.xsize, xsize) self.assertEqual(d.state.ysize, ysize) + self.assertRaises(ValueError, lambda: d.set_as_raw(b'\x00')) def test_negsize(self): buf = BytesIO(b'\x00'*255) From d718d351b145b134584654ef7aca358925e035a7 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 11 Mar 2017 16:43:44 +0000 Subject: [PATCH 338/632] Testing empty extents --- Tests/test_imagefile.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index 13c833242..d9ae74579 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -176,6 +176,20 @@ class TestPyDecoder(PillowTestCase): self.assertRaises(ValueError, lambda: d.set_as_raw(b'\x00')) + def test_extents_none(self): + buf = BytesIO(b'\x00'*255) + + im = MockImageFile(buf) + im.tile = [("MOCK", None, 32, None)] + d = self.get_decoder() + + im.load() + + self.assertEqual(d.state.xoff, 0) + self.assertEqual(d.state.yoff, 0) + self.assertEqual(d.state.xsize, 200) + self.assertEqual(d.state.ysize, 200) + def test_negsize(self): buf = BytesIO(b'\x00'*255) From 184d4f8dc0761a808a894cb602eaa8cc100a1acd Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 11 Mar 2017 17:03:09 +0000 Subject: [PATCH 339/632] Test encode registry --- Tests/test_image.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Tests/test_image.py b/Tests/test_image.py index 6aefc4f73..e7366c3cb 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -375,5 +375,30 @@ class TestImage(PillowTestCase): self.assert_image_equal(im, target) +class MockEncoder(object):pass + +def mock_encode(*args): + encoder = MockEncoder() + encoder.args = args + return encoder + +class TestRegistry(PillowTestCase): + + def test_encode_registry(self): + + Image.register_encoder('MOCK', mock_encode) + self.assert_('MOCK' in Image.ENCODERS) + + enc = Image._getencoder('RGB', 'MOCK', ('args',), extra=('extra',)) + + self.assertIsInstance(enc, MockEncoder) + self.assertEqual(enc.args, ('RGB', 'args', 'extra')) + + def test_encode_registry_fail(self): + self.assertRaises(IOError, lambda: Image._getencoder('RGB', + 'DoesNotExist', + ('args',), + extra=('extra',))) + if __name__ == '__main__': unittest.main() From be39c79c1beb1ec5be89ac7e7d51f3e47a348501 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 12 Mar 2017 17:17:54 +0000 Subject: [PATCH 340/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 05f748fa3..be8add223 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Reorganized GifImagePlugin, fixes #2314. #2374 + [radarhere, wiredfool] + - Doc: Reordered operating systems in Compatibility Matrix #2436 [radarhere] From 8b649d6e7924c0d44797068c388f2f20d021925c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 12 Mar 2017 17:21:35 +0000 Subject: [PATCH 341/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index be8add223..0fb82d008 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Pure Python Decoders, including Python decoder to fix for MSP images #1938 + [wiredfool, hugovk] + - Reorganized GifImagePlugin, fixes #2314. #2374 [radarhere, wiredfool] From 88ec0bb52fe9c4a37e1d10c68f0dc99dfa306597 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 17 Jul 2016 06:29:36 +0300 Subject: [PATCH 342/632] close file in case of failures --- PIL/Image.py | 5 +++++ PIL/ImageFile.py | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/PIL/Image.py b/PIL/Image.py index 1c6019a10..c1dd9e3d1 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -2391,6 +2391,7 @@ def open(fp, mode="r"): if mode != "r": raise ValueError("bad mode %r" % mode) + exclusive_fp = False filename = "" if isPath(fp): filename = fp @@ -2404,11 +2405,13 @@ def open(fp, mode="r"): if filename: fp = builtins.open(filename, "rb") + exclusive_fp = True try: fp.seek(0) except (AttributeError, io.UnsupportedOperation): fp = io.BytesIO(fp.read()) + exclusive_fp = True prefix = fp.read(16) @@ -2439,6 +2442,8 @@ def open(fp, mode="r"): if im: return im + if exclusive_fp: + fp.close() raise IOError("cannot identify image file %r" % (filename if filename else fp)) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 9425669e2..57391bcce 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -88,10 +88,12 @@ class ImageFile(Image.Image): # filename self.fp = open(fp, "rb") self.filename = fp + self._exclusive_fp = True else: # stream self.fp = fp self.filename = filename + self._exclusive_fp = False try: self._open() @@ -100,6 +102,9 @@ class ImageFile(Image.Image): KeyError, # unsupported mode EOFError, # got header but not the first frame struct.error) as v: + # close the file only if we have opened it this constructor + if self._exclusive_fp: + self.fp.close() raise SyntaxError(v) if not self.mode or self.size[0] <= 0: From 091d0c400caebc1268091a13251071c59e02077e Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 17 Jul 2016 06:33:23 +0300 Subject: [PATCH 343/632] close fp if it was opened in ImageFile constructor --- PIL/ImageFile.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 57391bcce..e1f7aed84 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -120,6 +120,8 @@ class ImageFile(Image.Image): # raise exception if something's wrong. must be called # directly after open, and closes file when finished. + if self._exclusive_fp: + self.fp.close() self.fp = None def load(self): @@ -239,7 +241,9 @@ class ImageFile(Image.Image): self.tile = [] self.readonly = readonly - self.fp = None # might be shared + if self._exclusive_fp: + self.fp.close() + self.fp = None if not self.map and not LOAD_TRUNCATED_IMAGES and err_code < 0: # still raised if decoder fails to return anything From 58484db50942611911fbbaeb7a39494d1cd9a0d1 Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 17 Jul 2016 09:22:50 +0300 Subject: [PATCH 344/632] close files after loading for some file types --- PIL/DcxImagePlugin.py | 1 + PIL/FliImagePlugin.py | 1 + PIL/GifImagePlugin.py | 1 + PIL/ImImagePlugin.py | 1 + PIL/Image.py | 2 ++ PIL/ImageFile.py | 3 ++- PIL/MicImagePlugin.py | 1 + PIL/MpoImagePlugin.py | 1 + PIL/SpiderImagePlugin.py | 1 + PIL/TiffImagePlugin.py | 1 + PIL/XpmImagePlugin.py | 2 -- 11 files changed, 12 insertions(+), 3 deletions(-) diff --git a/PIL/DcxImagePlugin.py b/PIL/DcxImagePlugin.py index 5663dff5f..93412f004 100644 --- a/PIL/DcxImagePlugin.py +++ b/PIL/DcxImagePlugin.py @@ -58,6 +58,7 @@ class DcxImageFile(PcxImageFile): self._offset.append(offset) self.__fp = self.fp + self._exclusive_fp = False self.seek(0) @property diff --git a/PIL/FliImagePlugin.py b/PIL/FliImagePlugin.py index 429b5e26f..021598c48 100644 --- a/PIL/FliImagePlugin.py +++ b/PIL/FliImagePlugin.py @@ -84,6 +84,7 @@ class FliImageFile(ImageFile.ImageFile): # set things up to decode first frame self.__frame = -1 self.__fp = self.fp + self._exclusive_fp = False self.__rewind = self.fp.tell() self._n_frames = None self._is_animated = None diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 087b2d1c3..da316f995 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -80,6 +80,7 @@ class GifImageFile(ImageFile.ImageFile): break self.__fp = self.fp # FIXME: hack + self._exclusive_fp = False self.__rewind = self.fp.tell() self._n_frames = None self._is_animated = None diff --git a/PIL/ImImagePlugin.py b/PIL/ImImagePlugin.py index b0edac409..807f19bcf 100644 --- a/PIL/ImImagePlugin.py +++ b/PIL/ImImagePlugin.py @@ -234,6 +234,7 @@ class ImImageFile(ImageFile.ImageFile): self.__offset = offs = self.fp.tell() self.__fp = self.fp # FIXME: hack + self._exclusive_fp = False if self.rawmode[:2] == "F;": diff --git a/PIL/Image.py b/PIL/Image.py index c1dd9e3d1..ed229a143 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -2440,6 +2440,8 @@ def open(fp, mode="r"): im = _open_core(fp, filename, prefix) if im: + if getattr(im, '_exclusive_fp', 'undef') is None: + im._exclusive_fp = exclusive_fp return im if exclusive_fp: diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index e1f7aed84..a43851ed7 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -93,7 +93,8 @@ class ImageFile(Image.Image): # stream self.fp = fp self.filename = filename - self._exclusive_fp = False + # can be overridden + self._exclusive_fp = None try: self._open() diff --git a/PIL/MicImagePlugin.py b/PIL/MicImagePlugin.py index a70838b07..549421e5f 100644 --- a/PIL/MicImagePlugin.py +++ b/PIL/MicImagePlugin.py @@ -64,6 +64,7 @@ class MicImageFile(TiffImagePlugin.TiffImageFile): raise SyntaxError("not an MIC file; no image entries") self.__fp = self.fp + self._exclusive_fp = False self.frame = 0 if len(self.images) > 1: diff --git a/PIL/MpoImagePlugin.py b/PIL/MpoImagePlugin.py index 9341c530c..02a66542d 100644 --- a/PIL/MpoImagePlugin.py +++ b/PIL/MpoImagePlugin.py @@ -53,6 +53,7 @@ class MpoImageFile(JpegImagePlugin.JpegImageFile): assert self.__framecount == len(self.__mpoffsets) del self.info['mpoffset'] # no longer needed self.__fp = self.fp # FIXME: hack + self._exclusive_fp = False self.__fp.seek(self.__mpoffsets[0]) # get ready to read first frame self.__frame = 0 self.offset = 0 diff --git a/PIL/SpiderImagePlugin.py b/PIL/SpiderImagePlugin.py index f26775ed8..a2822266e 100644 --- a/PIL/SpiderImagePlugin.py +++ b/PIL/SpiderImagePlugin.py @@ -154,6 +154,7 @@ class SpiderImageFile(ImageFile.ImageFile): ("raw", (0, 0) + self.size, offset, (self.rawmode, 0, 1))] self.__fp = self.fp # FIXME: hack + self._exclusive_fp = False @property def n_frames(self): diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 1cce43d74..4b93295b7 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -901,6 +901,7 @@ class TiffImageFile(ImageFile.ImageFile): self.__first = self.__next = self.tag_v2.next self.__frame = -1 self.__fp = self.fp + self._exclusive_fp = False self._frame_pos = [] self._n_frames = None self._is_animated = None diff --git a/PIL/XpmImagePlugin.py b/PIL/XpmImagePlugin.py index 87736aff9..b6e69802d 100644 --- a/PIL/XpmImagePlugin.py +++ b/PIL/XpmImagePlugin.py @@ -116,8 +116,6 @@ class XpmImageFile(ImageFile.ImageFile): for i in range(ysize): s[i] = self.fp.readline()[1:xsize+1].ljust(xsize) - self.fp = None - return b"".join(s) # From 1242b778720328ef5ef7ca051255401ec0947ccb Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 13 Mar 2017 07:58:24 +0200 Subject: [PATCH 345/632] Fix typos --- Tests/test_file_fli.py | 1 - Tests/test_file_ico.py | 1 - Tests/test_file_pixar.py | 3 +-- Tests/test_file_psd.py | 1 - Tests/test_file_xpm.py | 1 - 5 files changed, 1 insertion(+), 6 deletions(-) diff --git a/Tests/test_file_fli.py b/Tests/test_file_fli.py index a49301de1..a2ba0d03c 100644 --- a/Tests/test_file_fli.py +++ b/Tests/test_file_fli.py @@ -2,7 +2,6 @@ from helper import unittest, PillowTestCase from PIL import Image, FliImagePlugin -# sample ppm stream # created as an export of a palette image from Gimp2.6 # save as...-> hopper.fli, default options. test_file = "Tests/images/hopper.fli" diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 3904340f3..4eb9435bd 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -3,7 +3,6 @@ from helper import unittest, PillowTestCase, hopper import io from PIL import Image, IcoImagePlugin -# sample ppm stream TEST_ICO_FILE = "Tests/images/hopper.ico" diff --git a/Tests/test_file_pixar.py b/Tests/test_file_pixar.py index 3078b438b..b6b3f934d 100644 --- a/Tests/test_file_pixar.py +++ b/Tests/test_file_pixar.py @@ -2,11 +2,10 @@ from helper import hopper, unittest, PillowTestCase from PIL import Image, PixarImagePlugin -# sample ppm stream TEST_FILE = "Tests/images/hopper.pxr" -class TestImagePsd(PillowTestCase): +class TestFilePixar(PillowTestCase): def test_sanity(self): im = Image.open(TEST_FILE) diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index 04a171cbb..cb5145f51 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -2,7 +2,6 @@ from helper import hopper, unittest, PillowTestCase from PIL import Image, PsdImagePlugin -# sample ppm stream test_file = "Tests/images/hopper.psd" diff --git a/Tests/test_file_xpm.py b/Tests/test_file_xpm.py index 5940620ba..d8cc4fa3a 100644 --- a/Tests/test_file_xpm.py +++ b/Tests/test_file_xpm.py @@ -2,7 +2,6 @@ from helper import unittest, PillowTestCase, hopper from PIL import Image, XpmImagePlugin -# sample ppm stream TEST_FILE = "Tests/images/hopper.xpm" From 92c32ccf374d93849806ef9efbe259ca91571025 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 13 Mar 2017 07:58:47 +0200 Subject: [PATCH 346/632] Created in Microsoft Image Composer 1.5 from hopper.png --- Tests/images/hopper.mic | Bin 0 -> 96414 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/hopper.mic diff --git a/Tests/images/hopper.mic b/Tests/images/hopper.mic new file mode 100644 index 0000000000000000000000000000000000000000..fe6792f29458daf9134c92b8699f4379d41fecf5 GIT binary patch literal 96414 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

rI|qH1R$sHr3_yna{`C+Vw(2_ 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 SwzsrqFl_B@EbXmVg8u`)O39S~ literal 0 HcmV?d00001 From b7d14b04b684bb4eb44d15bfc04a740f3a526641 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 13 Mar 2017 08:18:13 +0200 Subject: [PATCH 347/632] Test MicImagePlugin for correctness --- PIL/MicImagePlugin.py | 1 + Tests/test_file_mic.py | 40 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/PIL/MicImagePlugin.py b/PIL/MicImagePlugin.py index a70838b07..21f3773fb 100644 --- a/PIL/MicImagePlugin.py +++ b/PIL/MicImagePlugin.py @@ -96,6 +96,7 @@ class MicImageFile(TiffImagePlugin.TiffImageFile): return self.frame + # # -------------------------------------------------------------------- diff --git a/Tests/test_file_mic.py b/Tests/test_file_mic.py index 044248f3a..a2be6c126 100644 --- a/Tests/test_file_mic.py +++ b/Tests/test_file_mic.py @@ -1,10 +1,46 @@ -from helper import unittest, PillowTestCase +from helper import unittest, PillowTestCase, hopper -from PIL import MicImagePlugin +from PIL import Image, MicImagePlugin + +TEST_FILE = "Tests/images/hopper.mic" class TestFileMic(PillowTestCase): + def test_sanity(self): + im = Image.open(TEST_FILE) + im.load() + self.assertEqual(im.mode, "RGBA") + self.assertEqual(im.size, (128, 128)) + self.assertEqual(im.format, "MIC") + + im2 = hopper("RGBA") + self.assert_image_similar(im, im2, 123.5) + + def test_n_frames(self): + im = Image.open(TEST_FILE) + + self.assertEqual(im.n_frames, 1) + + def test_is_animated(self): + im = Image.open(TEST_FILE) + + self.assertFalse(im.is_animated) + + def test_tell(self): + im = Image.open(TEST_FILE) + + self.assertEqual(im.tell(), 0) + + def test_seek(self): + im = Image.open(TEST_FILE) + + im.seek(0) + self.assertEqual(im.tell(), 0) + + self.assertRaises(EOFError, lambda: im.seek(99)) + self.assertEqual(im.tell(), 0) + def test_invalid_file(self): # Test an invalid OLE file invalid_file = "Tests/images/flower.jpg" From 92acfca46f033798e722b5f377974c5b184f2e38 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 14 Mar 2017 11:26:11 +0200 Subject: [PATCH 348/632] Test getting DPI from EXIF --- Tests/images/photoshop-200dpi.jpg | Bin 0 -> 10953 bytes Tests/test_file_jpeg.py | 12 ++++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 Tests/images/photoshop-200dpi.jpg diff --git a/Tests/images/photoshop-200dpi.jpg b/Tests/images/photoshop-200dpi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72455a147ad2b21c9b6c8b1e2dc8f85d20ea5617 GIT binary patch literal 10953 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 z z*+<*(Q#Z9CKC#((9;>MF7Ai$9Jxf)&(|Y52P8 zDk3NX><9RWL*V~v2+Xxw8h$mv`%m6R1?PgXpvmSQrT7S5cb%69NqgZ%hyeAe?chiN z?J2osJ4U++{I$>^A|&m-;fUr`5;2el_zXS;Rs2(B;Tr|J3hu|ProsxhpFj>Hs z(ee`IVz^9Oy@t(IpT`+w8$ zia_3ev@VifVd}3k(2s)x$J7*r>0_e1xi#0>c@41N zf_NSr2KZ}!?`wYhxhmr8cRKLHAfQF;po*vAja_O=Ai*1Y)zlD}>Xjt~2dyemU`QG< z^D1cDN3HI_8(>j(9I!uaJBB8}6&e_D9s4)*XtKQ$b1+J_&}ym=I?rBy&sarN?BwM~*>jgOY93s42|>aV)XeRscBb3*#dT9P z^I#UYGsQM)^(km=qiUw%4X14_v~FeK)9z;Hxo^DmF1$r|T633oH@~eX_DJx5oTk?_ zSeVjZvnwy=6LKhaq!IE)rr6C>6xefIcDk_6_in4@EsnG=8tT~pulD9=58xN}+YXcV zob4sV-h4t;%UeLwSm^+A5wLdivLQ8w*xOm))%|0 literal 0 HcmV?d00001 diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index f90a29162..f543119f6 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -167,14 +167,14 @@ class TestFileJpeg(PillowTestCase): def test_progressive_large_buffer_highest_quality(self): f = self.tempfile('temp.jpg') - im = self.gen_random_image((255,255)) + im = self.gen_random_image((255, 255)) # this requires more bytes than pixels in the image im.save(f, format="JPEG", progressive=True, quality=100) def test_progressive_cmyk_buffer(self): # Issue 2272, quality 90 cmyk image is tripping the large buffer bug. f = BytesIO() - im = self.gen_random_image((256,256), 'CMYK') + im = self.gen_random_image((256, 256), 'CMYK') im.save(f, format='JPEG', progressive=True, quality=94) def test_large_exif(self): @@ -500,6 +500,14 @@ class TestFileJpeg(PillowTestCase): reloaded.load() self.assertEqual(im.info['dpi'], reloaded.info['dpi']) + def test_dpi_from_exif(self): + # Arrange + # This Photoshop CC 2017 image has DPI in EXIF not metadata + im = Image.open("Tests/images/photoshop-200dpi.jpg") + + # Act / Assert + self.assertEqual(im.info.get("dpi"), 200) + if __name__ == '__main__': unittest.main() From 07a96209597c5e8dfe785c757d7051ce67a980fb Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 14 Mar 2017 11:49:10 +0200 Subject: [PATCH 349/632] If DPI isn't in JPEG header, fetch from EXIF --- PIL/JpegImagePlugin.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 7a29d8bff..ae420551b 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -117,6 +117,11 @@ def APP(self, marker): # plus constant header size self.info["mpoffset"] = self.fp.tell() - n + 4 + # If DPI isn't in JPEG header, fetch from EXIF + if "dpi" not in self.info and "exif" in self.info: + x_resolution = self._getexif()[0x011A] + self.info["dpi"] = x_resolution[0] / x_resolution[1] + def COM(self, marker): # From b69b70198f4e5e0690367154c84fec5d66c3cc66 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 1 Jan 2017 23:17:39 +0000 Subject: [PATCH 350/632] Closing only single frame TIFF images --- PIL/TiffImagePlugin.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 4b93295b7..ef271bcf3 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -970,6 +970,7 @@ class TiffImageFile(ImageFile.ImageFile): self.__frame += 1 self.fp.seek(self._frame_pos[frame]) self.tag_v2.load(self.fp) + self.__next = self.tag_v2.next # fill the legacy tag/ifd entries self.tag = self.ifd = ImageFileDirectory_v1.from_v2(self.tag_v2) self.__frame = frame @@ -1009,6 +1010,12 @@ class TiffImageFile(ImageFile.ImageFile): return self._load_libtiff() return super(TiffImageFile, self).load() + def load_end(self): + # allow closing if we're on the first frame, there's no next + # This is the ImageFile.load path only, libtiff specific below. + if self.__frame == 0 and not self.__next: + self._exclusive_fp = True + def _load_libtiff(self): """ Overload method triggered when we detect a compressed tiff Calls out to libtiff """ @@ -1087,15 +1094,13 @@ class TiffImageFile(ImageFile.ImageFile): self.readonly = 0 # libtiff closed the fp in a, we need to close self.fp, if possible if hasattr(self.fp, 'close'): - if not self.__next: + if self.__frame == 0 and not self.__next: self.fp.close() self.fp = None # might be shared if err < 0: raise IOError(err) - self.load_end() - return Image.Image.load(self) def _setup(self): From 5bdf1e49985408ef9898260733f5dd8ddf2673c0 Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Thu, 17 Nov 2016 13:43:11 +0100 Subject: [PATCH 351/632] Test for libtiff, n_frames and seek. --- Tests/test_file_libtiff.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 7839c4053..2bd289fa9 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -401,6 +401,19 @@ class TestFileLibTiff(LibTiffTestCase): TiffImagePlugin.READ_LIBTIFF = False + def test_multipage_nframes(self): + # issue #862 + TiffImagePlugin.READ_LIBTIFF = True + im = Image.open('Tests/images/multipage.tiff') + frames = im.n_frames + self.assertEqual(frames, 3) + for idx in range(frames): + im.seek(0) + # Should not raise ValueError: I/O operation on closed file + im.load() + + TiffImagePlugin.READ_LIBTIFF = False + def test__next(self): TiffImagePlugin.READ_LIBTIFF = True im = Image.open('Tests/images/hopper.tif') From e8122600f6171d7786b011433e7fbbeae793d8ca Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Fri, 4 Nov 2016 17:09:30 +0100 Subject: [PATCH 352/632] Test for: Close file handle in TiffImagePlugin when image is closed. --- Tests/test_file_tiff.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index cf00551ba..9fefec633 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -1,6 +1,7 @@ import logging from io import BytesIO import struct +import sys from helper import unittest, PillowTestCase, hopper, py3 @@ -468,6 +469,21 @@ class TestFileTiff(PillowTestCase): self.assertEqual(b'Dummy value', reloaded.info['icc_profile']) +@unittest.skipUnless(sys.platform.startswith('win32'), "Windows only") +class TestFileTiffW32(PillowTestCase): + def test_fd_leak(self): + tmpfile = self.tempfile("temp.tif") + import os + + with Image.open("Tests/images/uint16_1_4660.tif") as im: + im.save(tmpfile) + + im = Image.open(tmpfile) + im.load() + self.assertRaises(Exception, lambda: os.remove(tmpfile)) + + im.close() + os.remove(tmpfile) if __name__ == '__main__': unittest.main() From e4e0e0d2bf7e0c31b65137540282988c1c31ca82 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 2 Jan 2017 20:37:41 +0000 Subject: [PATCH 353/632] Adjusted test to match expected behavior --- Tests/test_file_tiff.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 9fefec633..32267fad8 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -479,10 +479,9 @@ class TestFileTiffW32(PillowTestCase): im.save(tmpfile) im = Image.open(tmpfile) - im.load() self.assertRaises(Exception, lambda: os.remove(tmpfile)) - - im.close() + im.load() + # this should not fail, as load should have closed the file. os.remove(tmpfile) if __name__ == '__main__': From 900c5e5bf21c4f1ec113f4773c2764c403608841 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 2 Jan 2017 20:56:19 +0000 Subject: [PATCH 354/632] added unix test for fd leak --- Tests/test_file_tiff.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 32267fad8..7e3ce583d 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -469,6 +469,22 @@ class TestFileTiff(PillowTestCase): self.assertEqual(b'Dummy value', reloaded.info['icc_profile']) + def test_close_on_load(self): + # same as test_fd_leak, but runs on unixlike os + tmpfile = self.tempfile("temp.tif") + import os + + with Image.open("Tests/images/uint16_1_4660.tif") as im: + im.save(tmpfile) + + im = Image.open(tmpfile) + fp = im.fp + self.assertFalse(fp.closed) + im.load() + self.assertTrue(fp.closed) + + + @unittest.skipUnless(sys.platform.startswith('win32'), "Windows only") class TestFileTiffW32(PillowTestCase): def test_fd_leak(self): @@ -479,8 +495,11 @@ class TestFileTiffW32(PillowTestCase): im.save(tmpfile) im = Image.open(tmpfile) + fp = im.fp + self.assertFalse(fp.closed) self.assertRaises(Exception, lambda: os.remove(tmpfile)) im.load() + self.assertTrue(fp.closed) # this should not fail, as load should have closed the file. os.remove(tmpfile) From 140c4b54c02052412a377f6c8e5d41bbdac8e627 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Wed, 22 Mar 2017 10:15:29 -0700 Subject: [PATCH 355/632] Remove superfluous import of FixTk The `_imaging` module does not link against libtcl/libtk. `FixTk` is imported by `import Tkinter` if necessary. The `FixTk` module is for Python 2.x on Windows only. --- PIL/Image.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 1c6019a10..bcc94af9d 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -46,15 +46,6 @@ class _imaging_not_installed(object): # Limit to around a quarter gigabyte for a 24 bit (3 bpp) image MAX_IMAGE_PIXELS = int(1024 * 1024 * 1024 // 4 // 3) -try: - # give Tk a chance to set up the environment, in case we're - # using an _imaging module linked against libtcl/libtk (use - # __import__ to hide this from naive packagers; we don't really - # depend on Tk unless ImageTk is used, and that module already - # imports Tkinter) - __import__("FixTk") -except ImportError: - pass try: # If the _imaging C module is not present, Pillow will not load. From c6dc1f287852ec1fbe10f7309934dc7680fb2105 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Wed, 22 Mar 2017 10:32:42 -0700 Subject: [PATCH 356/632] Fix import of tkinter/Tkinter Do not try to import the `tkinter` module on Python 2.x. `tkinter` is part of the `tkinter3000` package (Widget Construction Kit for Tkinter). --- PIL/ImageTk.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PIL/ImageTk.py b/PIL/ImageTk.py index 8c6d1a9c2..a19ed1d0d 100644 --- a/PIL/ImageTk.py +++ b/PIL/ImageTk.py @@ -25,12 +25,12 @@ # See the README file for information on usage and redistribution. # -try: +import sys + +if sys.version_info[0] > 2: import tkinter -except ImportError: - import Tkinter - tkinter = Tkinter - del Tkinter +else: + import Tkinter as tkinter # required for pypy, which always has cffi installed try: From f5a74e1862e84fd64875258bbe807d35abe8600b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 22 Mar 2017 21:19:10 +0000 Subject: [PATCH 357/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 0fb82d008..e2a2fa670 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Remove superfluous import of FixTk #2455 + [cgohlke) + +- Fix import of tkinter/Tkinter #2456 + [cgohlke) + - Pure Python Decoders, including Python decoder to fix for MSP images #1938 [wiredfool, hugovk] From 878881b1b9997cb9891ce03590f0e988f955d930 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 20 Dec 2016 07:40:06 -0800 Subject: [PATCH 358/632] Fix Access to be reloaded if the python interpreter is restarted when embedded. Fixes #2268. --- Tests/test_image_access.py | 34 +++++++++++++++++++++++++++++++++- libImaging/Access.c | 2 +- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 005bd5d35..92e8913a8 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -7,7 +7,7 @@ except ImportError: pass from PIL import Image - +import sys class AccessTest(PillowTestCase): # initial value @@ -249,5 +249,37 @@ class TestCffi(AccessTest): self.assertEqual(px[i, 0], 0) +class TestEmbeddable(unittest.TestCase): + @unittest.skipIf(not sys.platform.startswith('win32'), "requires Windows") + def test_embeddable(self): + import subprocess + from distutils import ccompiler + + with open('embed_pil.c', 'w') as fh: + fh.write(""" +#include "Python.h" + +int main(int argc, char* argv[]) +{ + Py_SetPythonHome( "%s" ); + + Py_InitializeEx( 0 ); + Py_DECREF(PyImport_ImportModule( "PIL.Image" )); + Py_Finalize(); + + Py_InitializeEx( 0 ); + Py_DECREF(PyImport_ImportModule( "PIL.Image" )); + Py_Finalize(); + + return 0; +} + """ % sys.prefix.replace('\\', '\\\\')) + + compiler = ccompiler.new_compiler() + objects = compiler.compile(['embed_pil.c']) + compiler.link_executable(objects, 'embed_pil') + + subprocess.call(['embed_pil.exe']) + if __name__ == '__main__': unittest.main() diff --git a/libImaging/Access.c b/libImaging/Access.c index 059f2aaeb..292968f1c 100644 --- a/libImaging/Access.c +++ b/libImaging/Access.c @@ -32,7 +32,7 @@ add_item(const char* mode) { UINT32 i = hash(mode); /* printf("hash %s => %d\n", mode, i); */ - if (access_table[i].mode) { + if (access_table[i].mode && strcmp(access_table[i].mode, mode) != 0) { fprintf(stderr, "AccessInit: hash collision: %d for both %s and %s\n", i, mode, access_table[i].mode); exit(1); From 6c1f923368d2ad2dacb5b02f82aeedd39f016441 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 11 Jan 2017 14:12:31 -0800 Subject: [PATCH 359/632] fixed test on python27 OMM --- Tests/test_image_access.py | 40 +++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 92e8913a8..d27a0f2e5 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -250,10 +250,14 @@ class TestCffi(AccessTest): class TestEmbeddable(unittest.TestCase): - @unittest.skipIf(not sys.platform.startswith('win32'), "requires Windows") + @unittest.skipIf(not sys.platform.startswith('win32') or + sys.version_info[:2] in ((3, 3), (3, 4)), + "requires Python 2.7 or >=3.5 for Windows") def test_embeddable(self): import subprocess - from distutils import ccompiler + import ctypes + import setuptools + from distutils import ccompiler, sysconfig with open('embed_pil.c', 'w') as fh: fh.write(""" @@ -261,25 +265,43 @@ class TestEmbeddable(unittest.TestCase): int main(int argc, char* argv[]) { - Py_SetPythonHome( "%s" ); + char *home = "%s"; +#if PY_MAJOR_VERSION >= 3 + wchar_t *whome = Py_DecodeLocale(home, NULL); + Py_SetPythonHome(whome); +#else + Py_SetPythonHome(home); +#endif - Py_InitializeEx( 0 ); - Py_DECREF(PyImport_ImportModule( "PIL.Image" )); + Py_InitializeEx(0); + Py_DECREF(PyImport_ImportModule("PIL.Image")); Py_Finalize(); - Py_InitializeEx( 0 ); - Py_DECREF(PyImport_ImportModule( "PIL.Image" )); + Py_InitializeEx(0); + Py_DECREF(PyImport_ImportModule("PIL.Image")); Py_Finalize(); +#if PY_MAJOR_VERSION >= 3 + PyMem_RawFree(whome); +#endif + return 0; -} +} """ % sys.prefix.replace('\\', '\\\\')) compiler = ccompiler.new_compiler() + compiler.add_include_dir(sysconfig.get_python_inc()) + compiler.add_library_dir(sysconfig.get_config_var('LIBDIR')) objects = compiler.compile(['embed_pil.c']) compiler.link_executable(objects, 'embed_pil') - subprocess.call(['embed_pil.exe']) + # do not display the Windows Error Reporting dialog + ctypes.windll.kernel32.SetErrorMode(0x0002) + + process = subprocess.Popen(['embed_pil.exe']) + process.communicate() + self.assertEqual(process.returncode, 0) + if __name__ == '__main__': unittest.main() From 51f5a0123c1845059930564cad38eb34a0c232f2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 24 Mar 2017 19:42:58 +1100 Subject: [PATCH 360/632] Fixed scripts import of tkinter/Tkinter --- Scripts/enhancer.py | 27 ++++++++++++++------------- Scripts/painter.py | 20 +++++++++++--------- Scripts/player.py | 17 +++++++++-------- Scripts/thresholder.py | 28 +++++++++++++++------------- Scripts/viewer.py | 21 +++++++++++---------- 5 files changed, 60 insertions(+), 53 deletions(-) diff --git a/Scripts/enhancer.py b/Scripts/enhancer.py index 4976e4409..ee333974f 100644 --- a/Scripts/enhancer.py +++ b/Scripts/enhancer.py @@ -7,21 +7,22 @@ # drag the slider to modify the image. # -try: - from tkinter import Tk, Toplevel, Frame, Label, Scale, HORIZONTAL -except ImportError: - from Tkinter import Tk, Toplevel, Frame, Label, Scale, HORIZONTAL +import sys + +if sys.version_info[0] > 2: + import tkinter +else: + import Tkinter as tkinter from PIL import Image, ImageTk, ImageEnhance -import sys # # enhancer widget -class Enhance(Frame): +class Enhance(tkinter.Frame): def __init__(self, master, image, name, enhancer, lo, hi): - Frame.__init__(self, master) + tkinter.Frame.__init__(self, master) # set up the image self.tkim = ImageTk.PhotoImage(image.mode, image.size) @@ -29,10 +30,10 @@ class Enhance(Frame): self.update("1.0") # normalize # image window - Label(self, image=self.tkim).pack() + tkinter.Label(self, image=self.tkim).pack() # scale - s = Scale(self, label=name, orient=HORIZONTAL, + s = tkinter.Scale(self, label=name, orient=tkinter.HORIZONTAL, from_=lo, to=hi, resolution=0.01, command=self.update) s.set(self.value) @@ -49,15 +50,15 @@ if len(sys.argv) != 2: print("Usage: enhancer file") sys.exit(1) -root = Tk() +root = tkinter.Tk() im = Image.open(sys.argv[1]) im.thumbnail((200, 200)) Enhance(root, im, "Color", ImageEnhance.Color, 0.0, 4.0).pack() -Enhance(Toplevel(), im, "Sharpness", ImageEnhance.Sharpness, -2.0, 2.0).pack() -Enhance(Toplevel(), im, "Brightness", ImageEnhance.Brightness, -1.0, 3.0).pack() -Enhance(Toplevel(), im, "Contrast", ImageEnhance.Contrast, -1.0, 3.0).pack() +Enhance(tkinter.Toplevel(), im, "Sharpness", ImageEnhance.Sharpness, -2.0, 2.0).pack() +Enhance(tkinter.Toplevel(), im, "Brightness", ImageEnhance.Brightness, -1.0, 3.0).pack() +Enhance(tkinter.Toplevel(), im, "Contrast", ImageEnhance.Contrast, -1.0, 3.0).pack() root.mainloop() diff --git a/Scripts/painter.py b/Scripts/painter.py index 79470e8e5..30d55c2b6 100644 --- a/Scripts/painter.py +++ b/Scripts/painter.py @@ -9,21 +9,23 @@ # the image into a set of tiles. # -try: - from tkinter import Tk, Canvas, NW -except ImportError: - from Tkinter import Tk, Canvas, NW +import sys + +if sys.version_info[0] > 2: + import tkinter +else: + import Tkinter as tkinter from PIL import Image, ImageTk -import sys # # painter widget -class PaintCanvas(Canvas): +class PaintCanvas(tkinter.Canvas): def __init__(self, master, image): - Canvas.__init__(self, master, width=image.size[0], height=image.size[1]) + tkinter.Canvas.__init__(self, master, + width=image.size[0], height=image.size[1]) # fill the canvas self.tile = {} @@ -33,7 +35,7 @@ class PaintCanvas(Canvas): for y in range(0, ysize, tilesize): 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.create_image(x, y, image=tile, anchor=tkinter.NW) self.tile[(x, y)] = box, tile self.image = image @@ -70,7 +72,7 @@ if len(sys.argv) != 2: print("Usage: painter file") sys.exit(1) -root = Tk() +root = tkinter.Tk() im = Image.open(sys.argv[1]) diff --git a/Scripts/player.py b/Scripts/player.py index 40873ff5f..dcf7d9307 100644 --- a/Scripts/player.py +++ b/Scripts/player.py @@ -6,19 +6,20 @@ from __future__ import print_function -try: - from tkinter import * -except ImportError: - from Tkinter import * +import sys + +if sys.version_info[0] > 2: + import tkinter +else: + import Tkinter as tkinter from PIL import Image, ImageTk -import sys # -------------------------------------------------------------------- # an image animation player -class UI(Label): +class UI(tkinter.Label): def __init__(self, master, im): if isinstance(im, list): @@ -34,7 +35,7 @@ class UI(Label): else: self.image = ImageTk.PhotoImage(im) - Label.__init__(self, master, image=self.image, bg="black", bd=0) + tkinter.Label.__init__(self, master, image=self.image, bg="black", bd=0) self.update() @@ -78,7 +79,7 @@ if __name__ == "__main__": filename = sys.argv[1] - root = Tk() + root = tkinter.Tk() root.title(filename) if len(sys.argv) > 2: diff --git a/Scripts/thresholder.py b/Scripts/thresholder.py index c2e87d56a..c6c62ff19 100644 --- a/Scripts/thresholder.py +++ b/Scripts/thresholder.py @@ -7,32 +7,34 @@ # as a dynamically updated overlay # -try: - from tkinter import * -except ImportError: - from Tkinter import * +import sys + +if sys.version_info[0] > 2: + import tkinter +else: + import Tkinter as tkinter from PIL import Image, ImageTk -import sys # # an image viewer -class UI(Frame): +class UI(tkinter.Frame): def __init__(self, master, im, value=128): - Frame.__init__(self, master) + tkinter.Frame.__init__(self, master) self.image = im self.value = value - self.canvas = Canvas(self, width=im.size[0], height=im.size[1]) + self.canvas = tkinter.Canvas(self, width=im.size[0], height=im.size[1]) self.backdrop = ImageTk.PhotoImage(im) - self.canvas.create_image(0, 0, image=self.backdrop, anchor=NW) + self.canvas.create_image(0, 0, image=self.backdrop, anchor=tkinter.NW) self.canvas.pack() - scale = Scale(self, orient=HORIZONTAL, from_=0, to=255, - resolution=1, command=self.update_scale, length=256) + scale = tkinter.Scale(self, orient=tkinter.HORIZONTAL, from_=0, to=255, + resolution=1, command=self.update_scale, + length=256) scale.set(value) scale.bind("", self.redraw) scale.pack() @@ -54,7 +56,7 @@ class UI(Frame): # update canvas self.canvas.delete("overlay") - self.canvas.create_image(0, 0, image=self.overlay, anchor=NW, + self.canvas.create_image(0, 0, image=self.overlay, anchor=tkinter.NW, tags="overlay") # -------------------------------------------------------------------- @@ -64,7 +66,7 @@ if len(sys.argv) != 2: print("Usage: thresholder file") sys.exit(1) -root = Tk() +root = tkinter.Tk() im = Image.open(sys.argv[1]) diff --git a/Scripts/viewer.py b/Scripts/viewer.py index f9bccec4f..c5b0b55ca 100644 --- a/Scripts/viewer.py +++ b/Scripts/viewer.py @@ -6,10 +6,12 @@ from __future__ import print_function -try: - from tkinter import Tk, Label -except ImportError: - from Tkinter import Tk, Label +import sys + +if sys.version_info[0] > 2: + import tkinter +else: + import Tkinter as tkinter from PIL import Image, ImageTk @@ -17,34 +19,33 @@ from PIL import Image, ImageTk # an image viewer -class UI(Label): +class UI(tkinter.Label): def __init__(self, master, im): if im.mode == "1": # bitmap image self.image = ImageTk.BitmapImage(im, foreground="white") - Label.__init__(self, master, image=self.image, bg="black", bd=0) + tkinter.Label.__init__(self, master, image=self.image, bd=0, + bg="black") else: # photo image self.image = ImageTk.PhotoImage(im) - Label.__init__(self, master, image=self.image, bd=0) + tkinter.Label.__init__(self, master, image=self.image, bd=0) # # script interface if __name__ == "__main__": - import sys - if not sys.argv[1:]: print("Syntax: python viewer.py imagefile") sys.exit(1) filename = sys.argv[1] - root = Tk() + root = tkinter.Tk() root.title(filename) im = Image.open(filename) From 298d20a082f4f10702fc5f49d417d26a9df140d5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 25 Mar 2017 23:13:00 +1100 Subject: [PATCH 361/632] Updated libtiff to 4.0.7 --- winbuild/config.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/winbuild/config.py b/winbuild/config.py index 77327874c..ca78aadcc 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -31,10 +31,10 @@ libs = { 'dir': 'jpeg-9b', }, 'tiff': { - 'url': 'ftp://ftp.remotesensing.org/pub/libtiff/tiff-4.0.6.zip', - 'filename': PILLOW_DEPENDS_DIR + 'tiff-4.0.6.zip', - 'hash': 'md5:f5b485d750b2001255ed64224b98b857', - 'dir': 'tiff-4.0.6', + 'url': 'ftp://ftp.remotesensing.org/pub/libtiff/tiff-4.0.7.zip', + 'filename': PILLOW_DEPENDS_DIR + 'tiff-4.0.7.zip', + 'hash': 'md5:876ad5f2f471954ddec915b77e7f75dd', + 'dir': 'tiff-4.0.7', }, 'freetype': { 'url': 'https://download.savannah.gnu.org/releases/freetype/freetype-2.7.1.tar.gz', From 76907f2a2c1765a9bedc3a192c919f1b8a83a6cb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 25 Mar 2017 23:14:14 +1100 Subject: [PATCH 362/632] Updated libimagequant to 2.9.0 --- depends/install_imagequant.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index 4a8c0e6be..ded691b7c 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.8.2 +archive=libimagequant-2.9.0 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz From 8f94bba44e3dc6df296ca513ebbd48551ddf6b72 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 25 Mar 2017 18:41:18 +0200 Subject: [PATCH 363/632] Only clone the most recent commit to reduce download size --- appveyor.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index deb6d3b1a..808917d6b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,7 +3,7 @@ clone_folder: c:\pillow init: - ECHO %PYTHON% #- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) -# Uncomment previous line to get RDP access during the build. +# Uncomment previous line to get RDP access during the build. environment: X64_EXT: -x64 @@ -16,7 +16,7 @@ environment: - PYTHON: C:/Python33-x64 install: -- git clone https://github.com/python-pillow/pillow-depends.git c:\pillow-depends +- git clone --depth 1 https://github.com/python-pillow/pillow-depends.git c:\pillow-depends - xcopy c:\pillow-depends\*.zip c:\pillow\winbuild\ - xcopy c:\pillow-depends\*.tar.gz c:\pillow\winbuild\ - xcopy /s c:\pillow-depends\test_images\* c:\pillow\tests\images @@ -53,15 +53,15 @@ after_test: deploy: provider: S3 - access_key_id: AKIAIRAXC62ZNTVQJMOQ + access_key_id: AKIAIRAXC62ZNTVQJMOQ secret_access_key: secure: Hwb6klTqtBeMgxAjRoDltiiqpuH8xbwD4UooDzBSiCWXjuFj1lyl4kHgHwTCCGqi bucket: pillow-nightly folder: win/$(APPVEYOR_BUILD_NUMBER)/ artifact: /.*egg|wheel/ - on: + on: branch: master - + # Uncomment the following line to get RDP access after the build/test and block for # up to the timeout limit (~1hr) # From 59d62e869639aba5a60451e8a17fc4f8028093c5 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 25 Mar 2017 21:05:44 +0200 Subject: [PATCH 364/632] Download and extract zip instead of cloning dependencies, no need for git history --- appveyor.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 808917d6b..fa2efc0f4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -16,7 +16,9 @@ environment: - PYTHON: C:/Python33-x64 install: -- git clone --depth 1 https://github.com/python-pillow/pillow-depends.git c:\pillow-depends +- curl -fsSL -o pillow-depends.zip https://github.com/python-pillow/pillow-depends/archive/master.zip +- 7z x pillow-depends.zip -oc:\ +- mv c:\pillow-depends-master c:\pillow-depends - xcopy c:\pillow-depends\*.zip c:\pillow\winbuild\ - xcopy c:\pillow-depends\*.tar.gz c:\pillow\winbuild\ - xcopy /s c:\pillow-depends\test_images\* c:\pillow\tests\images From 304f7e063709fbc377d896095497ff066eda8f92 Mon Sep 17 00:00:00 2001 From: hugovk Date: Fri, 3 Feb 2017 08:58:42 +0200 Subject: [PATCH 365/632] Add Codecov --- .travis/after_success.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis/after_success.sh b/.travis/after_success.sh index 906ade61b..9ce684eb1 100755 --- a/.travis/after_success.sh +++ b/.travis/after_success.sh @@ -10,8 +10,10 @@ gem install coveralls-lcov coveralls-lcov -v -n coverage.filtered.info > coverage.c.json coverage report +pip install codecov pip install coveralls-merge coveralls-merge coverage.c.json +codecov if [ "$DOCKER" == "" ]; then pip install pep8 pyflakes From ca3b975074181342f9a76036a3e1d7d06b46f198 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 26 Mar 2017 22:14:57 +0300 Subject: [PATCH 366/632] Run faster Dockers last so slower jobs don't hold up the build --- .travis.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 20d1ef5bd..8fc19a876 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ notifications: # 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. +# Then run the remainder, with fastest Docker jobs last. matrix: fast_finish: true @@ -14,17 +14,17 @@ matrix: - python: "pypy3" - python: '3.6' - python: '2.7' + - python: "2.7_with_system_site_packages" # For PyQt4 + - python: '3.5' + - python: '3.4' + - python: '3.3' - env: DOCKER="alpine" - env: DOCKER="arch" # contains PyQt5 - env: DOCKER="ubuntu-trusty-x86" - env: DOCKER="ubuntu-xenial-amd64" - env: DOCKER="ubuntu-precise-amd64" - env: DOCKER="debian-stretch-x86" - - python: "2.7_with_system_site_packages" # For PyQt4 - - python: '3.5' - - python: '3.4' - - python: '3.3' - + dist: trusty sudo: required @@ -53,7 +53,7 @@ script: after_success: - .travis/after_success.sh - + after_failure: - | if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then From 78754327c5dbb09cb0783c98bc09efd7630d9c15 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 27 Mar 2017 09:08:16 +1100 Subject: [PATCH 367/632] Removed winbuild checksum verification --- winbuild/build_dep.py | 18 ++---------------- winbuild/config.py | 12 ------------ 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/winbuild/build_dep.py b/winbuild/build_dep.py index c932a2fcb..a059b1ee8 100644 --- a/winbuild/build_dep.py +++ b/winbuild/build_dep.py @@ -1,7 +1,6 @@ from unzip import unzip from untar import untar import os -import hashlib from config import compilers, compiler_from_env, libs @@ -14,19 +13,6 @@ build_dir = _relpath('build') inc_dir = _relpath('depends') -def check_hash(filename, checksum): - if not checksum: - return filename - - (algo, value) = checksum.split(':') - h = hashlib.new(algo) - with open(filename, 'rb') as f: - h.update(f.read()) - if not(h.hexdigest().lower() == value): - raise ValueError('Checksum Mismatch for %s' % filename) - return filename - - def check_sig(filename, signame): # UNDONE -- need gpg return filename @@ -57,8 +43,8 @@ def extract(src, dest): def extract_libs(): for name, lib in libs.items(): + filename = lib['filename'] if name == 'openjpeg': - filename = check_hash(lib['filename'], lib['hash']) for compiler in compilers.values(): if not os.path.exists(os.path.join( build_dir, lib['dir']+compiler['inc_dir'])): @@ -67,7 +53,7 @@ def extract_libs(): os.path.join( build_dir, lib['dir']+compiler['inc_dir'])) else: - extract(check_hash(lib['filename'], lib['hash']), build_dir) + extract(filename, build_dir) def extract_openjpeg(compiler): diff --git a/winbuild/config.py b/winbuild/config.py index ca78aadcc..ee27d1053 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -15,75 +15,63 @@ X64_EXT = os.environ.get('X64_EXT', "x64") libs = { # 'openjpeg': { # 'filename': 'openjpeg-2.0.0-win32-x86.zip', - # 'hash': 'sha1:xxx', # 'version': '2.0' # }, 'zlib': { 'url': 'http://zlib.net/zlib1211.zip', 'filename': PILLOW_DEPENDS_DIR + 'zlib1211.zip', - 'hash': 'md5:16b41357b2cd81bca5e1947238e64465', 'dir': 'zlib-1.2.11', }, 'jpeg': { 'url': 'http://www.ijg.org/files/jpegsr9b.zip', 'filename': PILLOW_DEPENDS_DIR + 'jpegsr9b.zip', - 'hash': 'md5:a21b8024d78ba05857a75272b4fa95ec', # not found - generated by wiredfool 'dir': 'jpeg-9b', }, 'tiff': { 'url': 'ftp://ftp.remotesensing.org/pub/libtiff/tiff-4.0.7.zip', 'filename': PILLOW_DEPENDS_DIR + 'tiff-4.0.7.zip', - 'hash': 'md5:876ad5f2f471954ddec915b77e7f75dd', 'dir': 'tiff-4.0.7', }, 'freetype': { 'url': 'https://download.savannah.gnu.org/releases/freetype/freetype-2.7.1.tar.gz', 'filename': PILLOW_DEPENDS_DIR + 'freetype-2.7.1.tar.gz', - 'hash': 'md5:78701bee8d249578d83bb9a2f3aa3616', 'dir': 'freetype-2.7.1', }, 'lcms': { 'url': SF_MIRROR+'/project/lcms/lcms/2.7/lcms2-2.7.zip', 'filename': PILLOW_DEPENDS_DIR + 'lcms2-2.7.zip', - 'hash': 'sha1:7ff1a5b721ca719760ba6eb4ec6f38d5e65381cf', 'dir': 'lcms2-2.7', }, 'tcl-8.5': { 'url': SF_MIRROR+'/project/tcl/Tcl/8.5.19/tcl8519-src.zip', 'filename': PILLOW_DEPENDS_DIR + 'tcl8519-src.zip', - 'hash': 'sha1:9de57fd34bd688716c16c978db96fa16a5fde924', 'dir': '', }, 'tk-8.5': { 'url': SF_MIRROR+'/project/tcl/Tcl/8.5.19/tk8519-src.zip', 'filename': PILLOW_DEPENDS_DIR + 'tk8519-src.zip', - 'hash': 'sha1:78d0d2c81e024e0b48bfd7b2cc16718f08f46ed9', 'dir': '', 'version': '8.5.19', }, 'tcl-8.6': { 'url': SF_MIRROR+'/project/tcl/Tcl/8.6.6/tcl866-src.zip', 'filename': PILLOW_DEPENDS_DIR + 'tcl866-src.zip', - 'hash': 'md5:45dae95abc12a5f8c29dca5baf169a13', 'dir': '', }, 'tk-8.6': { 'url': SF_MIRROR+'/project/tcl/Tcl/8.6.6/tk866-src.zip', 'filename': PILLOW_DEPENDS_DIR + 'tk866-src.zip', - 'hash': 'md5:5004cc0ed2ab820406a36a0c0553b917', 'dir': '', 'version': '8.6.6', }, 'webp': { 'url': 'http://downloads.webmproject.org/releases/webp/libwebp-0.6.0.tar.gz', 'filename': PILLOW_DEPENDS_DIR + 'libwebp-0.6.0.tar.gz', - 'hash': 'sha1:156d24fff454bfccd1f44434e226a10d9eb38186', 'dir': 'libwebp-0.6.0', }, 'openjpeg': { 'url': SF_MIRROR+'/project/openjpeg/openjpeg/2.1.2/openjpeg-2.1.2.tar.gz', 'filename': PILLOW_DEPENDS_DIR + 'openjpeg-2.1.2.tar.gz', - 'hash': 'md5:40a7bfdcc66280b3c1402a0eb1a27624', 'dir': 'openjpeg-2.1.2', }, } From 40e604c74303597eca48656febd0e41be79afb45 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Sun, 26 Mar 2017 23:30:05 -0700 Subject: [PATCH 368/632] Set ContainerIO test file as binary --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index 0d357a22f..983b58729 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ *.ppm binary +*.container binary From 7ea19607553c664a2e34115d639ccddf65e1d2c0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 27 Mar 2017 20:04:42 +1100 Subject: [PATCH 369/632] Corrected libtiff URL --- winbuild/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winbuild/config.py b/winbuild/config.py index ee27d1053..b5a762d12 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -28,7 +28,7 @@ libs = { 'dir': 'jpeg-9b', }, 'tiff': { - 'url': 'ftp://ftp.remotesensing.org/pub/libtiff/tiff-4.0.7.zip', + 'url': 'ftp://download.osgeo.org/libtiff/tiff-4.0.7.zip', 'filename': PILLOW_DEPENDS_DIR + 'tiff-4.0.7.zip', 'dir': 'tiff-4.0.7', }, From 2152b26515fddab64c6f1e73c7eb0028d8ab1212 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 29 Mar 2017 21:31:34 +0100 Subject: [PATCH 370/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e2a2fa670..47283e3d7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,15 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ +- Fetch DPI from EXIF if not specified in JPEG header #2449 + [hugovk] + +- Removed winbuild checksum verification #2468 + [radarhere] + +- Git: Set ContainerIO test file as binary #2469 + [cgohlke] + - Remove superfluous import of FixTk #2455 [cgohlke) From 4dd7b943385a91adde29f9f2dc6166f4b6cd8069 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 31 Mar 2017 13:02:56 +1100 Subject: [PATCH 371/632] Return copy on Image crop if crop dimensions match Image dimensions --- PIL/Image.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index bcc94af9d..e2e80a82a 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1032,6 +1032,9 @@ class Image(object): x0, y0, x1, y1 = map(int, map(round, box)) + if x0 == 0 and y0 == 0 and (x1, y1) == self.size: + return self.copy() + if x1 < x0: x1 = x0 if y1 < y0: @@ -1520,16 +1523,16 @@ class Image(object): def remap_palette(self, dest_map, source_palette=None): """ Rewrites the image to reorder the palette. - + :param dest_map: A list of indexes into the original palette. e.g. [1,0] would swap a two item palette, and list(range(255)) is the identity transform. :param source_palette: Bytes or None. - :returns: An :py:class:`~PIL.Image.Image` object. - + :returns: An :py:class:`~PIL.Image.Image` object. + """ from . import ImagePalette - + if self.mode not in ("L", "P"): raise ValueError("illegal image mode") @@ -1538,7 +1541,7 @@ class Image(object): source_palette = self.im.getpalette("RGB")[:768] else: # L-mode source_palette = bytearray(i//3 for i in range(768)) - + palette_bytes = b"" new_positions = [0]*256 @@ -1591,8 +1594,8 @@ class Image(object): size=len(palette_bytes)) return m_im - - + + def resize(self, size, resample=NEAREST): """ @@ -2615,7 +2618,7 @@ def register_decoder(name, decoder): :param decoder: A callable(mode, args) that returns an ImageFile.PyDecoder object - .. versionadded:: 4.1.0 + .. versionadded:: 4.1.0 """ DECODERS[name] = decoder From 8cd70e74cc9b12153da2e39f9e1185c59646f85a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 20 Dec 2016 20:47:59 +1100 Subject: [PATCH 372/632] Set executable flag on scripts with shebang line --- Scripts/createfontdatachunk.py | 0 Scripts/enhancer.py | 0 Scripts/explode.py | 0 Scripts/gifmaker.py | 0 Scripts/painter.py | 0 Scripts/pilconvert.py | 0 Scripts/pildriver.py | 0 Scripts/pilfile.py | 0 Scripts/pilfont.py | 0 Scripts/player.py | 0 Scripts/thresholder.py | 0 Scripts/viewer.py | 0 Tests/32bit_segfault_check.py | 0 Tests/check_imaging_leaks.py | 0 winbuild/build.py | 0 winbuild/test.py | 0 16 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 Scripts/createfontdatachunk.py mode change 100644 => 100755 Scripts/enhancer.py mode change 100644 => 100755 Scripts/explode.py mode change 100644 => 100755 Scripts/gifmaker.py mode change 100644 => 100755 Scripts/painter.py mode change 100644 => 100755 Scripts/pilconvert.py mode change 100644 => 100755 Scripts/pildriver.py mode change 100644 => 100755 Scripts/pilfile.py mode change 100644 => 100755 Scripts/pilfont.py mode change 100644 => 100755 Scripts/player.py mode change 100644 => 100755 Scripts/thresholder.py mode change 100644 => 100755 Scripts/viewer.py mode change 100644 => 100755 Tests/32bit_segfault_check.py mode change 100644 => 100755 Tests/check_imaging_leaks.py mode change 100644 => 100755 winbuild/build.py mode change 100644 => 100755 winbuild/test.py diff --git a/Scripts/createfontdatachunk.py b/Scripts/createfontdatachunk.py old mode 100644 new mode 100755 diff --git a/Scripts/enhancer.py b/Scripts/enhancer.py old mode 100644 new mode 100755 diff --git a/Scripts/explode.py b/Scripts/explode.py old mode 100644 new mode 100755 diff --git a/Scripts/gifmaker.py b/Scripts/gifmaker.py old mode 100644 new mode 100755 diff --git a/Scripts/painter.py b/Scripts/painter.py old mode 100644 new mode 100755 diff --git a/Scripts/pilconvert.py b/Scripts/pilconvert.py old mode 100644 new mode 100755 diff --git a/Scripts/pildriver.py b/Scripts/pildriver.py old mode 100644 new mode 100755 diff --git a/Scripts/pilfile.py b/Scripts/pilfile.py old mode 100644 new mode 100755 diff --git a/Scripts/pilfont.py b/Scripts/pilfont.py old mode 100644 new mode 100755 diff --git a/Scripts/player.py b/Scripts/player.py old mode 100644 new mode 100755 diff --git a/Scripts/thresholder.py b/Scripts/thresholder.py old mode 100644 new mode 100755 diff --git a/Scripts/viewer.py b/Scripts/viewer.py old mode 100644 new mode 100755 diff --git a/Tests/32bit_segfault_check.py b/Tests/32bit_segfault_check.py old mode 100644 new mode 100755 diff --git a/Tests/check_imaging_leaks.py b/Tests/check_imaging_leaks.py old mode 100644 new mode 100755 diff --git a/winbuild/build.py b/winbuild/build.py old mode 100644 new mode 100755 diff --git a/winbuild/test.py b/winbuild/test.py old mode 100644 new mode 100755 From 86c1704646034aafa115d77eb8cdcc153c30d09a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 14 Mar 2017 23:16:38 +0000 Subject: [PATCH 373/632] add _close_exclusive_fp_after_load flag --- PIL/DcxImagePlugin.py | 4 ++-- PIL/FliImagePlugin.py | 4 ++-- PIL/GifImagePlugin.py | 3 ++- PIL/ImImagePlugin.py | 2 +- PIL/Image.py | 12 ++++++++++-- PIL/ImageFile.py | 6 +++--- PIL/MicImagePlugin.py | 2 +- PIL/MpoImagePlugin.py | 4 ++-- PIL/SpiderImagePlugin.py | 2 +- PIL/TiffImagePlugin.py | 8 ++++---- Tests/test_file_tiff.py | 1 - 11 files changed, 28 insertions(+), 20 deletions(-) diff --git a/PIL/DcxImagePlugin.py b/PIL/DcxImagePlugin.py index 93412f004..797b8a5a8 100644 --- a/PIL/DcxImagePlugin.py +++ b/PIL/DcxImagePlugin.py @@ -41,7 +41,8 @@ class DcxImageFile(PcxImageFile): format = "DCX" format_description = "Intel DCX" - + _close_exclusive_fp_after_loading = False + def _open(self): # Header @@ -58,7 +59,6 @@ class DcxImageFile(PcxImageFile): self._offset.append(offset) self.__fp = self.fp - self._exclusive_fp = False self.seek(0) @property diff --git a/PIL/FliImagePlugin.py b/PIL/FliImagePlugin.py index 021598c48..a2d0e0fab 100644 --- a/PIL/FliImagePlugin.py +++ b/PIL/FliImagePlugin.py @@ -37,7 +37,8 @@ class FliImageFile(ImageFile.ImageFile): format = "FLI" format_description = "Autodesk FLI/FLC Animation" - + _close_exclusive_fp_after_loading = False + def _open(self): # HEAD @@ -84,7 +85,6 @@ class FliImageFile(ImageFile.ImageFile): # set things up to decode first frame self.__frame = -1 self.__fp = self.fp - self._exclusive_fp = False self.__rewind = self.fp.tell() self._n_frames = None self._is_animated = None diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index da316f995..83161c320 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -47,6 +47,8 @@ class GifImageFile(ImageFile.ImageFile): format = "GIF" format_description = "Compuserve GIF" + _close_exclusive_fp_after_loading = False + global_palette = None def data(self): @@ -80,7 +82,6 @@ class GifImageFile(ImageFile.ImageFile): break self.__fp = self.fp # FIXME: hack - self._exclusive_fp = False self.__rewind = self.fp.tell() self._n_frames = None self._is_animated = None diff --git a/PIL/ImImagePlugin.py b/PIL/ImImagePlugin.py index 807f19bcf..3371b303f 100644 --- a/PIL/ImImagePlugin.py +++ b/PIL/ImImagePlugin.py @@ -109,6 +109,7 @@ class ImImageFile(ImageFile.ImageFile): format = "IM" format_description = "IFUNC Image Memory" + _close_exclusive_fp_after_loading = False def _open(self): @@ -234,7 +235,6 @@ class ImImageFile(ImageFile.ImageFile): self.__offset = offs = self.fp.tell() self.__fp = self.fp # FIXME: hack - self._exclusive_fp = False if self.rawmode[:2] == "F;": diff --git a/PIL/Image.py b/PIL/Image.py index ed229a143..60981cb3c 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -506,6 +506,7 @@ class Image(object): """ format = None format_description = None + _close_exclusive_fp_after_loading = True def __init__(self): # FIXME: take "new" parameters / other image? @@ -560,6 +561,7 @@ class Image(object): """ try: self.fp.close() + self.fp = None except Exception as msg: logger.debug("Error closing: %s", msg) @@ -568,6 +570,13 @@ class Image(object): # object is gone. self.im = deferred_error(ValueError("Operation on closed image")) + if sys.version_info >= (3,4,0): + def __del__(self): + if (hasattr(self, 'fp') and hasattr(self, '_exclusive_fp') + and self.fp and self._exclusive_fp): + self.fp.close() + self.fp = None + def _copy(self): self.load() self.im = self.im.copy() @@ -2440,8 +2449,7 @@ def open(fp, mode="r"): im = _open_core(fp, filename, prefix) if im: - if getattr(im, '_exclusive_fp', 'undef') is None: - im._exclusive_fp = exclusive_fp + im._exclusive_fp = exclusive_fp return im if exclusive_fp: diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index a43851ed7..b28aa798e 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -242,7 +242,9 @@ class ImageFile(Image.Image): self.tile = [] self.readonly = readonly - if self._exclusive_fp: + self.load_end() + + if self._exclusive_fp and self._close_exclusive_fp_after_loading: self.fp.close() self.fp = None @@ -250,8 +252,6 @@ class ImageFile(Image.Image): # still raised if decoder fails to return anything raise_ioerror(err_code) - self.load_end() - return Image.Image.load(self) def load_prepare(self): diff --git a/PIL/MicImagePlugin.py b/PIL/MicImagePlugin.py index 549421e5f..0c5d09455 100644 --- a/PIL/MicImagePlugin.py +++ b/PIL/MicImagePlugin.py @@ -39,6 +39,7 @@ class MicImageFile(TiffImagePlugin.TiffImageFile): format = "MIC" format_description = "Microsoft Image Composer" + _close_exclusive_fp_after_loading = False def _open(self): @@ -64,7 +65,6 @@ class MicImageFile(TiffImagePlugin.TiffImageFile): raise SyntaxError("not an MIC file; no image entries") self.__fp = self.fp - self._exclusive_fp = False self.frame = 0 if len(self.images) > 1: diff --git a/PIL/MpoImagePlugin.py b/PIL/MpoImagePlugin.py index 02a66542d..b12307f00 100644 --- a/PIL/MpoImagePlugin.py +++ b/PIL/MpoImagePlugin.py @@ -39,7 +39,8 @@ class MpoImageFile(JpegImagePlugin.JpegImageFile): format = "MPO" format_description = "MPO (CIPA DC-007)" - + _close_exclusive_fp_after_loading = False + def _open(self): self.fp.seek(0) # prep the fp in order to pass the JPEG test JpegImagePlugin.JpegImageFile._open(self) @@ -53,7 +54,6 @@ class MpoImageFile(JpegImagePlugin.JpegImageFile): assert self.__framecount == len(self.__mpoffsets) del self.info['mpoffset'] # no longer needed self.__fp = self.fp # FIXME: hack - self._exclusive_fp = False self.__fp.seek(self.__mpoffsets[0]) # get ready to read first frame self.__frame = 0 self.offset = 0 diff --git a/PIL/SpiderImagePlugin.py b/PIL/SpiderImagePlugin.py index a2822266e..6730bd104 100644 --- a/PIL/SpiderImagePlugin.py +++ b/PIL/SpiderImagePlugin.py @@ -97,6 +97,7 @@ class SpiderImageFile(ImageFile.ImageFile): format = "SPIDER" format_description = "Spider 2D image" + _close_exclusive_fp_after_loading = False def _open(self): # check header @@ -154,7 +155,6 @@ class SpiderImageFile(ImageFile.ImageFile): ("raw", (0, 0) + self.size, offset, (self.rawmode, 0, 1))] self.__fp = self.fp # FIXME: hack - self._exclusive_fp = False @property def n_frames(self): diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index ef271bcf3..e80fc12ad 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -884,6 +884,7 @@ class TiffImageFile(ImageFile.ImageFile): format = "TIFF" format_description = "Adobe TIFF" + _close_exclusive_fp_after_loading = False def _open(self): "Open the first image in a TIFF file" @@ -901,7 +902,6 @@ class TiffImageFile(ImageFile.ImageFile): self.__first = self.__next = self.tag_v2.next self.__frame = -1 self.__fp = self.fp - self._exclusive_fp = False self._frame_pos = [] self._n_frames = None self._is_animated = None @@ -1014,7 +1014,7 @@ class TiffImageFile(ImageFile.ImageFile): # allow closing if we're on the first frame, there's no next # This is the ImageFile.load path only, libtiff specific below. if self.__frame == 0 and not self.__next: - self._exclusive_fp = True + self._close_exclusive_fp_after_loading = True def _load_libtiff(self): """ Overload method triggered when we detect a compressed tiff @@ -1093,10 +1093,10 @@ class TiffImageFile(ImageFile.ImageFile): self.tile = [] self.readonly = 0 # libtiff closed the fp in a, we need to close self.fp, if possible - if hasattr(self.fp, 'close'): + if self._exclusive_fp: if self.__frame == 0 and not self.__next: self.fp.close() - self.fp = None # might be shared + self.fp = None # might be shared if err < 0: raise IOError(err) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 7e3ce583d..12189a0eb 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -472,7 +472,6 @@ class TestFileTiff(PillowTestCase): def test_close_on_load(self): # same as test_fd_leak, but runs on unixlike os tmpfile = self.tempfile("temp.tif") - import os with Image.open("Tests/images/uint16_1_4660.tif") as im: im.save(tmpfile) From db338ca19a122afc4937bf76d805562ee86533ed Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 1 Apr 2017 17:18:38 +0100 Subject: [PATCH 374/632] open file check for windows, on jpeg where we don't mmap the file --- Tests/test_file_jpeg.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index f90a29162..6679ec9af 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -3,6 +3,7 @@ from helper import djpeg_available, cjpeg_available from io import BytesIO import os +import sys from PIL import Image from PIL import ImageFile @@ -501,5 +502,27 @@ class TestFileJpeg(PillowTestCase): self.assertEqual(im.info['dpi'], reloaded.info['dpi']) +@unittest.skipUnless(sys.platform.startswith('win32'), "Windows only") +class TestFileCloseW32(PillowTestCase): + def setUp(self): + if "jpeg_encoder" not in codecs or "jpeg_decoder" not in codecs: + self.skipTest("jpeg support not available") + + def test_fd_leak(self): + tmpfile = self.tempfile("temp.jpg") + import os + + with Image.open("Tests/images/hopper.jpg") as im: + im.save(tmpfile) + + im = Image.open(tmpfile) + fp = im.fp + self.assertFalse(fp.closed) + self.assertRaises(Exception, lambda: os.remove(tmpfile)) + im.load() + self.assertTrue(fp.closed) + # this should not fail, as load should have closed the file. + os.remove(tmpfile) + if __name__ == '__main__': unittest.main() From 06b61f4e5be227075181b911e3bed50a0c780843 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 3 Apr 2017 08:05:56 -0700 Subject: [PATCH 375/632] close the mmap when closing the image #2194 --- PIL/Image.py | 3 +++ Tests/test_file_tiff.py | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/PIL/Image.py b/PIL/Image.py index 60981cb3c..4e458dde5 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -565,6 +565,9 @@ class Image(object): except Exception as msg: logger.debug("Error closing: %s", msg) + if getattr(self, 'map', None): + self.map = None + # Instead of simply setting to None, we're setting up a # deferred error that will better explain that the core image # object is gone. diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 12189a0eb..81f135115 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -490,6 +490,7 @@ class TestFileTiffW32(PillowTestCase): tmpfile = self.tempfile("temp.tif") import os + # this is an mmaped file. with Image.open("Tests/images/uint16_1_4660.tif") as im: im.save(tmpfile) @@ -499,7 +500,12 @@ class TestFileTiffW32(PillowTestCase): self.assertRaises(Exception, lambda: os.remove(tmpfile)) im.load() self.assertTrue(fp.closed) - # this should not fail, as load should have closed the file. + + # this closes the mmap + im.close() + + # this should not fail, as load should have closed the file pointer, + # and close should have closed the mmap os.remove(tmpfile) if __name__ == '__main__': From 1c7e8a18d5f0d8061f270883d4dba3439fa4f206 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 11 Jan 2017 15:45:19 -0800 Subject: [PATCH 376/632] fix for appveyor environment? --- Tests/test_image_access.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index d27a0f2e5..676042a41 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -8,6 +8,7 @@ except ImportError: from PIL import Image import sys +import os class AccessTest(PillowTestCase): # initial value @@ -291,17 +292,22 @@ int main(int argc, char* argv[]) compiler = ccompiler.new_compiler() compiler.add_include_dir(sysconfig.get_python_inc()) - compiler.add_library_dir(sysconfig.get_config_var('LIBDIR')) + + libdir = sysconfig.get_config_var('LIBDIR') or sysconfig.get_python_inc().replace('include', 'libs') + print (libdir) + compiler.add_library_dir(libdir) objects = compiler.compile(['embed_pil.c']) compiler.link_executable(objects, 'embed_pil') + + env = os.environ.copy() + env["PATH"] = sys.prefix + ';' + env["PATH"] # do not display the Windows Error Reporting dialog ctypes.windll.kernel32.SetErrorMode(0x0002) - process = subprocess.Popen(['embed_pil.exe']) + process = subprocess.Popen(['embed_pil.exe'], env=env) process.communicate() self.assertEqual(process.returncode, 0) - if __name__ == '__main__': unittest.main() From fe0a33173bb9a025ea4d0a76c05d76f3992eb55c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 3 Apr 2017 11:17:30 -0700 Subject: [PATCH 377/632] Give up on appveyor for now, disable test --- Tests/test_image_access.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 676042a41..87387bff1 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, hopper +from helper import unittest, PillowTestCase, hopper, on_appveyor try: from PIL import PyAccess @@ -252,7 +252,9 @@ class TestCffi(AccessTest): class TestEmbeddable(unittest.TestCase): @unittest.skipIf(not sys.platform.startswith('win32') or - sys.version_info[:2] in ((3, 3), (3, 4)), + sys.version_info[:2] in ((3, 3), (3, 4)) or + on_appveyor(), # failing on appveyor when run from + # subprocess, not from shell "requires Python 2.7 or >=3.5 for Windows") def test_embeddable(self): import subprocess From 14ae66f63d0906b87085275f6dc89f313048f45d Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 3 Apr 2017 13:21:32 -0700 Subject: [PATCH 378/632] Release notes for 4.1.0 --- docs/releasenotes/4.1.0.rst | 86 +++++++++++++++++++++++++++++++++++++ docs/releasenotes/index.rst | 1 + 2 files changed, 87 insertions(+) create mode 100644 docs/releasenotes/4.1.0.rst diff --git a/docs/releasenotes/4.1.0.rst b/docs/releasenotes/4.1.0.rst new file mode 100644 index 000000000..b57385cdb --- /dev/null +++ b/docs/releasenotes/4.1.0.rst @@ -0,0 +1,86 @@ +4.1.0 +----- + +Removed Deprecated Items +======================== + +Several deprecated items have been removed. + +* Support for spaces in tiff kwargs the parameters for 'x resolution', 'y + resolution', 'resolution unit', and 'date time' has been + removed. Underscores should be used instead. + +* The methods :py:meth:`PIL.ImageDraw.ImageDraw.setink`, + :py:meth:`PIL.ImageDraw.ImageDraw.setfill`, and + :py:meth:`PIL.ImageDraw.ImageDraw.setfont` have been removed. + + +Closing Files When Opening Images +================================= + +The file handling when opening images has been overhauled. Previously, +there Pillow would attempt to close some, but not all image formats +after loading the image data, but not all. Now, the following behavior +is specified: + +* For images where an open file is passed in, it is the + responsibility of the calling code to close the file. + +* For images where Pillow opens the file and the file is known to have + only one frame, the file is closed after loading. + +* If the file has more than one frame, or if it can't be determined, + then the file is left open to permit seeking to subsequent + frames. It will be closed, eventually, in the ``close`` or + ``__del__`` methods + +* If the image is memory mapped, then we can't close the mapping to + the underlying file until we are done with the image. The mapping + will be closed in the ``close`` or ``__del__`` method. + + +Changes to GIF Handling When Saving +=================================== + +The :py:class:`PIL.GifImagePlugin` code has been refactored to fix the flow when +saving images. There are two external changes that arise from this: + +* An :py:class:`PIL.ImagePalette.ImagePalette` object is now accepted + as a specified palette argument in :py:meth:`PIL.Image.Image.save()`. + +* The image to be saved is no longer modified in place by any of the + operations of the save function. Previously it was modified when + optimizing the image palette. + +This refactor fixed some bugs with palette handling when saving +multiple frame GIFs. + +New Method: Image.remap_palette +=============================== + +The method :py:meth:`PIL.Image.Image.remap_palette()` has been +added. This method was hoisted from the GifImagePlugin code used to +optimize the palette. + +Added Decoder Registry and Support for Python Based Decoders +============================================================ + +There is now a decoder registry similar to the image plugin +registries. Image plugins can register a decoder, and it will be +called when the decoding is requested. This allows for the creation of +pure Python decoders. While the python decoders will not be as fast as +their C based counterparts, they may be easier and quicker to develop +or safer to run. + +Tests +===== + +Many tests have been added, including correctness tests for image +formats that have been previously untested. + +We are now running automated tests in Docker containers against more +Linux versions than are provided on TravisCi, which is currently +Ubuntu 14.04 x64. This Pillow release is tested on 64 bit Alpine, +Arch, Ubuntu 12.04 and 16.04, and 32 bit Debian Stretch and Ubuntu +14.04. This also covers a wider range of dependency versions than are +provided on Travis natively. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index e32bf7e40..1dd6eb8af 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -6,6 +6,7 @@ Release Notes .. toctree:: :maxdepth: 2 + 4.1.0 4.0.0 3.4.0 3.3.2 From 2030bf76f68b0c751f1f8f4ce5ea005e40b250e9 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 3 Apr 2017 13:21:50 -0700 Subject: [PATCH 379/632] New Image methods --- docs/reference/Image.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index ac8b6f506..6dcc816e5 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -88,10 +88,13 @@ Registering plugins ignore them. .. autofunction:: register_open +.. autofunction:: register_decoder .. autofunction:: register_mime .. autofunction:: register_save +.. autofunction:: register_encoder .. autofunction:: register_extension + The Image Class --------------- @@ -135,6 +138,7 @@ ITU-R 709, using the D65 luminant) to the CIE XYZ color space: .. automethod:: PIL.Image.Image.putpixel .. automethod:: PIL.Image.Image.quantize .. automethod:: PIL.Image.Image.resize +.. automethod:: PIL.Image.Image.remap_palette .. automethod:: PIL.Image.Image.rotate .. automethod:: PIL.Image.Image.save .. automethod:: PIL.Image.Image.seek From 275d2fa3cc0213063a5f83cedcc944d78ffc4dd0 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 3 Apr 2017 13:54:37 -0700 Subject: [PATCH 380/632] compatibility matrix split --- docs/installation.rst | 133 +++++++++++++++++++++++++----------------- 1 file changed, 81 insertions(+), 52 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 334bc1638..a53d22a43 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -325,64 +325,93 @@ Prerequisites are installed on **Fedora 23** with:: Platform Support ---------------- -Current platform support for Pillow. Binary distributions are contributed for -each release on a volunteer basis, but the source should compile and run -everywhere platform support is listed. In general, we aim to support all -current versions of Linux, macOS, and Windows. +Current platform support for Pillow. Binary distributions are +contributed for each release on a volunteer basis, but the source +should compile and run everywhere platform support is listed. In +general, we aim to support all current versions of Linux, macOS, and +Windows. Note that Android is not currently supported, but there have +been reports of success. + +Continuous Integration Targets +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +These platforms are built and tested for every change. + ++----------------------------------+-------------------------------+-----------------------+ +|**Operating system** |**Tested Python versions** |**Tested Architecture**| ++----------------------------------+-------------------------------+-----------------------+ +| Alpine | 2.7 |x86-64 | ++----------------------------------+-------------------------------+-----------------------+ +| Arch | 2.7 |x86-64 | ++----------------------------------+-------------------------------+-----------------------+ +| Debian Stretch | 2.7 |x86 | ++----------------------------------+-------------------------------+-----------------------+ +| Mac OS X 10.10 Yosemite* | 2.7, 3.3, 3.4, 3.5, 3.6 |x86-64 | ++----------------------------------+-------------------------------+-----------------------+ +| Ubuntu Linux 16.04 LTS | 2.7 |x86-64 | ++----------------------------------+-------------------------------+-----------------------+ +| Ubuntu Linux 14.04 LTS | 2.7, 3.3, 3.4, 3.5, 3.6, |x86-64 | +| | pypy, pypy3 | | +| | | | +| | 2.7 |x86 | ++----------------------------------+-------------------------------+-----------------------+ +| Ubuntu Linux 12.04 LTS | 2.7 |x86-64 | ++----------------------------------+-------------------------------+-----------------------+ +| Windows Server 2012 R2 | 2.7,3.3,3.4 |x86, x86-64 | ++----------------------------------+-------------------------------+-----------------------+ + +* Mac OS X CI is not run for every commit, but is run for every release. + +Other Platforms +^^^^^^^^^^^^^^^ + +These platforms have been reported to work at the versions mentioned. .. note:: Contributors please test Pillow on your platform then update this document and send a pull request. -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -|**Operating system** |**Supported**|**Tested Python versions** |**Latest tested Pillow version**|**Tested processors** | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| macOS 10.12 Sierra |Yes | 3.4,3.5,3.6 | 4.0.0 |x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Mac OS X 10.11 El Capitan |Yes | 2.7,3.3,3.4,3.5 | 3.4.1 |x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Mac OS X 10.10 Yosemite |Yes | 2.7,3.3,3.4 | 3.0.0 |x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Mac OS X 10.9 Mavericks |Yes | 2.7,3.2,3.3,3.4 | 3.0.0 |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 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| CentOS 6.3 |Yes | 2.7,3.3 | |x86 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Fedora 23 |Yes | 2.7,3.4 | 3.1.0 |x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Ubuntu Linux 14.04 LTS |Yes | 2.7,3.4 | 3.1.0 |x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Ubuntu Linux 12.04 LTS |Yes | 2.6,2.7,3.2,3.3,3.4,3.5 | 3.4.1 (CI target) |x86,x86-64 | -| | | PyPy5.3.1,PyPy3 v2.4.0 | | | -| | | | | | -| | | 2.7,3.2 | 3.4.1 |ppc | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Ubuntu Linux 10.04 LTS |Yes | 2.6 | 2.3.0 |x86,x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Debian 8.2 Jessie |Yes | 2.7,3.4 | 3.1.0 |x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Raspian Jessie |Yes | 2.7,3.4 | 3.1.0 |arm | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Gentoo Linux |Yes | 2.7,3.2 | 2.1.0 |x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Arch Linux |Yes | 2.7,3.6 | 4.0.0 |x86,x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| FreeBSD 10.2 |Yes | 2.7,3.4 | 3.1.0 |x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Windows 8.1 Pro |Yes | 2.6,2.7,3.2,3.3,3.4 | 2.4.0 |x86,x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Windows 8 Pro |Yes | 2.6,2.7,3.2,3.3,3.4a3 | 2.2.0 |x86,x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Windows 7 Pro |Yes | 2.7,3.2,3.3 | 3.4.1 |x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Windows Server 2012 R2 |Yes | 2.7,3.3,3.4 | 3.4.1 (CI target) |x86,x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ -| Windows Server 2008 R2 Enterprise|Yes | 3.3 | |x86-64 | -+----------------------------------+-------------+------------------------------+--------------------------------+-----------------------+ ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +|**Operating system** |**Tested Python versions** |**Latest tested Pillow version**|**Tested processors** | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| macOS 10.12 Sierra | 3.4,3.5,3.6 | 4.0.0 |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Mac OS X 10.11 El Capitan | 2.7,3.3,3.4,3.5 | 4.1.0 |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Mac OS X 10.9 Mavericks | 2.7,3.2,3.3,3.4 | 3.0.0 |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Mac OS X 10.8 Mountain Lion | 2.6,2.7,3.2,3.3 | |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Redhat Linux 6 | 2.6 | |x86 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| CentOS 6.3 | 2.7,3.3 | |x86 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Fedora 23 | 2.7,3.4 | 3.1.0 |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Ubuntu Linux 12.04 LTS | 2.6,2.7,3.2,3.3,3.4,3.5 | 3.4.1 |x86,x86-64 | +| | PyPy5.3.1,PyPy3 v2.4.0 | | | +| | | | | +| | 2.7,3.2 | 3.4.1 |ppc | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Ubuntu Linux 10.04 LTS | 2.6 | 2.3.0 |x86,x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Debian 8.2 Jessie | 2.7,3.4 | 3.1.0 |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Raspian Jessie | 2.7,3.4 | 3.1.0 |arm | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Gentoo Linux | 2.7,3.2 | 2.1.0 |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| FreeBSD 10.2 | 2.7,3.4 | 3.1.0 |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Windows 8.1 Pro | 2.6,2.7,3.2,3.3,3.4 | 2.4.0 |x86,x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Windows 8 Pro | 2.6,2.7,3.2,3.3,3.4a3 | 2.2.0 |x86,x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Windows 7 Pro | 2.7,3.2,3.3 | 3.4.1 |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Windows Server 2008 R2 Enterprise| 3.3 | |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ Old Versions ------------ From 53df62647af19f47819380373b7b4abd1ffe79ff Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 4 Apr 2017 01:28:33 +0300 Subject: [PATCH 381/632] DPI is a tuple (#2472) * DPI is a tuple * Some EXIF only contains an X resolution for DPI * Refactor * Test with no DPI in EXIF * Handle EXIF with no DPI * Created with: exiftool "-*resolution*"= photoshop-200dpi.jpg * Test when not in EXIF, DPI==72,72 * Use X resolution for Y, default to 72,72 dpi * Created with: exiftool -exif:ResolutionUnit=cm photoshop-200dpi.jpg * Test for EXIF with dpcm instead of dpi * Convert dpcm to dpi, and default to inches if unit unknown --- PIL/JpegImagePlugin.py | 13 +++++++++++-- Tests/images/exif-200dpcm.jpg | Bin 0 -> 10949 bytes Tests/images/no-dpi-in-exif.jpg | Bin 0 -> 10897 bytes Tests/test_file_jpeg.py | 22 +++++++++++++++++++++- 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 Tests/images/exif-200dpcm.jpg create mode 100644 Tests/images/no-dpi-in-exif.jpg diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index ae420551b..22ac2eaba 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -119,8 +119,17 @@ def APP(self, marker): # If DPI isn't in JPEG header, fetch from EXIF if "dpi" not in self.info and "exif" in self.info: - x_resolution = self._getexif()[0x011A] - self.info["dpi"] = x_resolution[0] / x_resolution[1] + exif = self._getexif() + try: + resolution_unit = exif[0x0128] + x_resolution = exif[0x011A] + dpi = x_resolution[0] / x_resolution[1] + if resolution_unit == 3: # cm + # 1 dpcm = 2.54 dpi + dpi *= 2.54 + self.info["dpi"] = dpi, dpi + except KeyError: + self.info["dpi"] = 72, 72 def COM(self, marker): diff --git a/Tests/images/exif-200dpcm.jpg b/Tests/images/exif-200dpcm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..efa55613b8da191f38b1cc0e0b1f50b234ed1ea2 GIT binary patch literal 10949 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 VB_h`L5NlhB_JIhkE literal 0 HcmV?d00001 diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index f543119f6..21436edc1 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -506,7 +506,27 @@ class TestFileJpeg(PillowTestCase): im = Image.open("Tests/images/photoshop-200dpi.jpg") # Act / Assert - self.assertEqual(im.info.get("dpi"), 200) + self.assertEqual(im.info.get("dpi"), (200, 200)) + + def test_dpi_from_dpcm_exif(self): + # Arrange + # This is photoshop-200dpi.jpg with EXIF resolution unit set to cm: + # exiftool -exif:ResolutionUnit=cm photoshop-200dpi.jpg + im = Image.open("Tests/images/exif-200dpcm.jpg") + + # Act / Assert + self.assertEqual(im.info.get("dpi"), (508, 508)) + + def test_no_dpi_in_exif(self): + # Arrange + # This is photoshop-200dpi.jpg with resolution removed from EXIF: + # exiftool "-*resolution*"= photoshop-200dpi.jpg + im = Image.open("Tests/images/no-dpi-in-exif.jpg") + + # Act / Assert + # "When the image resolution is unknown, 72 [dpi] is designated." + # http://www.exiv2.org/tags.html + self.assertEqual(im.info.get("dpi"), (72, 72)) if __name__ == '__main__': From ca76dfd2f207e6080bc0650290ff7744406f8427 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 3 Apr 2017 23:33:18 +0100 Subject: [PATCH 382/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 47283e3d7..520b5109b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,13 @@ Changelog (Pillow) 4.1.0 (unreleased) ------------------ -- Fetch DPI from EXIF if not specified in JPEG header #2449 +- Close files after loading if possible #2330 + [homm, wiredfool] + +- Fix Image Access to be reloadable when embedding the Python interpreter #2296 + [wiredfool, cgohlke] + +- Fetch DPI from EXIF if not specified in JPEG header #2449, #2472 [hugovk] - Removed winbuild checksum verification #2468 From 4a908271afbc8f3222b49084ff23899c8db6642d Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 4 Apr 2017 08:55:36 +0300 Subject: [PATCH 383/632] Escape asterisk, update name [CI skip] --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index a53d22a43..e094aae80 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -360,7 +360,7 @@ These platforms are built and tested for every change. | Windows Server 2012 R2 | 2.7,3.3,3.4 |x86, x86-64 | +----------------------------------+-------------------------------+-----------------------+ -* Mac OS X CI is not run for every commit, but is run for every release. +\* macOS CI is not run for every commit, but is run for every release. Other Platforms ^^^^^^^^^^^^^^^ From 8aecfeea65746de6b317fc15569078cfd94af51c Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 4 Apr 2017 09:38:00 +0300 Subject: [PATCH 384/632] Typos [CI skip] --- docs/releasenotes/4.1.0.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/releasenotes/4.1.0.rst b/docs/releasenotes/4.1.0.rst index b57385cdb..a6fb9d2af 100644 --- a/docs/releasenotes/4.1.0.rst +++ b/docs/releasenotes/4.1.0.rst @@ -6,7 +6,7 @@ Removed Deprecated Items Several deprecated items have been removed. -* Support for spaces in tiff kwargs the parameters for 'x resolution', 'y +* Support for spaces in tiff kwargs in the parameters for 'x resolution', 'y resolution', 'resolution unit', and 'date time' has been removed. Underscores should be used instead. @@ -19,8 +19,8 @@ Closing Files When Opening Images ================================= The file handling when opening images has been overhauled. Previously, -there Pillow would attempt to close some, but not all image formats -after loading the image data, but not all. Now, the following behavior +Pillow would attempt to close some, but not all image formats +after loading the image data. Now, the following behavior is specified: * For images where an open file is passed in, it is the @@ -32,7 +32,7 @@ is specified: * If the file has more than one frame, or if it can't be determined, then the file is left open to permit seeking to subsequent frames. It will be closed, eventually, in the ``close`` or - ``__del__`` methods + ``__del__`` methods. * If the image is memory mapped, then we can't close the mapping to the underlying file until we are done with the image. The mapping @@ -68,7 +68,7 @@ Added Decoder Registry and Support for Python Based Decoders There is now a decoder registry similar to the image plugin registries. Image plugins can register a decoder, and it will be called when the decoding is requested. This allows for the creation of -pure Python decoders. While the python decoders will not be as fast as +pure Python decoders. While the Python decoders will not be as fast as their C based counterparts, they may be easier and quicker to develop or safer to run. @@ -79,8 +79,8 @@ Many tests have been added, including correctness tests for image formats that have been previously untested. We are now running automated tests in Docker containers against more -Linux versions than are provided on TravisCi, which is currently -Ubuntu 14.04 x64. This Pillow release is tested on 64 bit Alpine, -Arch, Ubuntu 12.04 and 16.04, and 32 bit Debian Stretch and Ubuntu +Linux versions than are provided on Travis CI, which is currently +Ubuntu 14.04 x64. This Pillow release is tested on 64-bit Alpine, +Arch, Ubuntu 12.04 and 16.04, and 32-bit Debian Stretch and Ubuntu 14.04. This also covers a wider range of dependency versions than are provided on Travis natively. From f95c15893335774f4adbd44f8f8c79612aecfec7 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 4 Apr 2017 00:27:20 -0700 Subject: [PATCH 385/632] added non-exclusive fd for test --- Tests/test_file_tiff.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 81f135115..1e182fb1a 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -469,8 +469,8 @@ class TestFileTiff(PillowTestCase): self.assertEqual(b'Dummy value', reloaded.info['icc_profile']) - def test_close_on_load(self): - # same as test_fd_leak, but runs on unixlike os + def test_close_on_load_exclusive(self): + # similar to test_fd_leak, but runs on unixlike os tmpfile = self.tempfile("temp.tif") with Image.open("Tests/images/uint16_1_4660.tif") as im: @@ -482,6 +482,19 @@ class TestFileTiff(PillowTestCase): im.load() self.assertTrue(fp.closed) + def test_close_on_load_nonexclusive(self): + tmpfile = self.tempfile("temp.tif") + + with Image.open("Tests/images/uint16_1_4660.tif") as im: + im.save(tmpfile) + + f = open(tmpfile, 'rb') + im = Image.open(f) + fp = im.fp + self.assertFalse(fp.closed) + im.load() + self.assertFalse(fp.closed) + @unittest.skipUnless(sys.platform.startswith('win32'), "Windows only") From 890af534280b3eb63b97bdcd9500715790b0a784 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 4 Apr 2017 09:49:58 +0100 Subject: [PATCH 386/632] Still old version --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index e094aae80..88bbf2799 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -360,7 +360,7 @@ These platforms are built and tested for every change. | Windows Server 2012 R2 | 2.7,3.3,3.4 |x86, x86-64 | +----------------------------------+-------------------------------+-----------------------+ -\* macOS CI is not run for every commit, but is run for every release. +\* Mac OS X CI is not run for every commit, but is run for every release. Other Platforms ^^^^^^^^^^^^^^^ From 38eff7400426de4b1a0b0d3e88c552d695c89252 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 3 Apr 2017 15:44:20 -0700 Subject: [PATCH 387/632] 4.1.0 version bump --- CHANGES.rst | 2 +- PIL/__init__.py | 2 +- _imaging.c | 2 +- appveyor.yml | 2 +- setup.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 520b5109b..2f51c3630 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,7 +1,7 @@ Changelog (Pillow) ================== -4.1.0 (unreleased) +4.1.0 (2017-04-03) ------------------ - Close files after loading if possible #2330 diff --git a/PIL/__init__.py b/PIL/__init__.py index 7a32533d9..ce19b0ea6 100644 --- a/PIL/__init__.py +++ b/PIL/__init__.py @@ -12,7 +12,7 @@ # ;-) VERSION = '1.1.7' # PIL version -PILLOW_VERSION = '4.1.0.dev0' # Pillow +PILLOW_VERSION = '4.1.0' # Pillow __version__ = PILLOW_VERSION diff --git a/_imaging.c b/_imaging.c index ddb56c7ab..326444a53 100644 --- a/_imaging.c +++ b/_imaging.c @@ -71,7 +71,7 @@ * See the README file for information on usage and redistribution. */ -#define PILLOW_VERSION "4.1.0.dev0" +#define PILLOW_VERSION "4.1.0" #include "Python.h" diff --git a/appveyor.yml b/appveyor.yml index deb6d3b1a..fbf5dd383 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 4.1.pre.{build} +version: 4.1.0.{build} clone_folder: c:\pillow init: - ECHO %PYTHON% diff --git a/setup.py b/setup.py index 4c20810ef..ff3c19f45 100755 --- a/setup.py +++ b/setup.py @@ -102,7 +102,7 @@ except (ImportError, OSError): _tkinter = None NAME = 'Pillow' -PILLOW_VERSION = '4.1.0.dev0' +PILLOW_VERSION = '4.1.0' JPEG_ROOT = None JPEG2K_ROOT = None ZLIB_ROOT = None From c7b7f5aa692989df04c3e39ac5768e85ab0e3da0 Mon Sep 17 00:00:00 2001 From: Bjorn Date: Tue, 4 Apr 2017 23:10:22 +0200 Subject: [PATCH 388/632] Add missing colon in :command:`...` --- docs/reference/ImageFont.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index 166d977a6..696d57b39 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -9,7 +9,7 @@ this class store bitmap fonts, and are used with the :py:meth:`PIL.ImageDraw.Draw.text` method. PIL uses its own font file format to store bitmap fonts. You can use the -:command`pilfont` utility to convert BDF and PCF font descriptors (X window +:command:`pilfont` utility to convert BDF and PCF font descriptors (X window font formats) to this format. Starting with version 1.1.4, PIL can be configured to support TrueType and From b2933dc1c40910c0677a9410162112acbc61de53 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 11 Apr 2017 13:45:48 +0300 Subject: [PATCH 389/632] Image from Simon Conseil with permission: https://github.com/python-pillow/Pillow/issues/2481#issuecomment-293215833 --- Tests/images/exif-72dpi-int.jpg | Bin 0 -> 71056 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/exif-72dpi-int.jpg diff --git a/Tests/images/exif-72dpi-int.jpg b/Tests/images/exif-72dpi-int.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b60190d26cac6445ca646baa769bc09297535a8 GIT binary patch literal 71056 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

& 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 Rop!rjt}A_{>_ Date: Tue, 11 Apr 2017 13:53:01 +0300 Subject: [PATCH 390/632] Test file with DPI in EXIF but not metadata, and XResolution is an int rather than tuple --- Tests/test_file_jpeg.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 9bea7985d..f4cfe8d60 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -501,14 +501,24 @@ class TestFileJpeg(PillowTestCase): reloaded.load() self.assertEqual(im.info['dpi'], reloaded.info['dpi']) - def test_dpi_from_exif(self): + def test_dpi_tuple_from_exif(self): # Arrange # This Photoshop CC 2017 image has DPI in EXIF not metadata + # EXIF XResolution is (2000000, 10000) im = Image.open("Tests/images/photoshop-200dpi.jpg") # Act / Assert self.assertEqual(im.info.get("dpi"), (200, 200)) + def test_dpi_int_from_exif(self): + # Arrange + # This image has DPI in EXIF not metadata + # EXIF XResolution is 72 + im = Image.open("Tests/images/exif-72dpi-int.jpg") + + # Act / Assert + self.assertEqual(im.info.get("dpi"), (72, 72)) + def test_dpi_from_dpcm_exif(self): # Arrange # This is photoshop-200dpi.jpg with EXIF resolution unit set to cm: @@ -535,7 +545,7 @@ class TestFileCloseW32(PillowTestCase): def setUp(self): if "jpeg_encoder" not in codecs or "jpeg_decoder" not in codecs: self.skipTest("jpeg support not available") - + def test_fd_leak(self): tmpfile = self.tempfile("temp.jpg") import os @@ -549,8 +559,9 @@ class TestFileCloseW32(PillowTestCase): self.assertRaises(Exception, lambda: os.remove(tmpfile)) im.load() self.assertTrue(fp.closed) - # this should not fail, as load should have closed the file. + # this should not fail, as load should have closed the file. os.remove(tmpfile) + if __name__ == '__main__': unittest.main() From 8b06fa9a2183eede2fdf9ebeb1e9dc43f3f1ba1e Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 11 Apr 2017 14:07:31 +0300 Subject: [PATCH 391/632] Fix for file with DPI in EXIF but not metadata, and XResolution is an int rather than tuple --- PIL/JpegImagePlugin.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 22ac2eaba..bb2816c13 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -123,7 +123,10 @@ def APP(self, marker): try: resolution_unit = exif[0x0128] x_resolution = exif[0x011A] - dpi = x_resolution[0] / x_resolution[1] + try: + dpi = x_resolution[0] / x_resolution[1] + except TypeError: + dpi = x_resolution if resolution_unit == 3: # cm # 1 dpcm = 2.54 dpi dpi *= 2.54 From 45cbd2566470890bd5bc2fe20c4257f5e1a0d981 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 12 Apr 2017 22:41:39 +0300 Subject: [PATCH 392/632] Remove broken downloads badge Let's remove the downloads badge as it's broken and showing 0 downloads/month. See also https://github.com/python-pillow/Pillow/issues/2396 and https://github.com/badges/shields/issues/716. [CI skip] --- docs/index.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index b8455be60..0a9a5722f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -26,10 +26,6 @@ Pillow is the friendly PIL fork by `Alex Clark and Contributors Date: Wed, 19 Apr 2017 03:02:45 -0700 Subject: [PATCH 393/632] 4.2.0.pre0 version bump --- PIL/__init__.py | 2 +- _imaging.c | 2 +- appveyor.yml | 2 +- setup.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/PIL/__init__.py b/PIL/__init__.py index ce19b0ea6..b8a071db1 100644 --- a/PIL/__init__.py +++ b/PIL/__init__.py @@ -12,7 +12,7 @@ # ;-) VERSION = '1.1.7' # PIL version -PILLOW_VERSION = '4.1.0' # Pillow +PILLOW_VERSION = '4.2.0.dev0' # Pillow __version__ = PILLOW_VERSION diff --git a/_imaging.c b/_imaging.c index 326444a53..7c66a63bc 100644 --- a/_imaging.c +++ b/_imaging.c @@ -71,7 +71,7 @@ * See the README file for information on usage and redistribution. */ -#define PILLOW_VERSION "4.1.0" +#define PILLOW_VERSION "4.2.0.dev0" #include "Python.h" diff --git a/appveyor.yml b/appveyor.yml index fbf5dd383..156810d65 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 4.1.0.{build} +version: 4.2.pre.{build} clone_folder: c:\pillow init: - ECHO %PYTHON% diff --git a/setup.py b/setup.py index ff3c19f45..51106692d 100755 --- a/setup.py +++ b/setup.py @@ -102,7 +102,7 @@ except (ImportError, OSError): _tkinter = None NAME = 'Pillow' -PILLOW_VERSION = '4.1.0' +PILLOW_VERSION = '4.2.0.dev0' JPEG_ROOT = None JPEG2K_ROOT = None ZLIB_ROOT = None From 8397ee333937dfd9e857b6fb8848a9dc60a339e6 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Apr 2017 11:38:42 +0100 Subject: [PATCH 394/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 2f51c3630..6c2ef30fc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,18 @@ Changelog (Pillow) ================== +4.2.0 (unreleased) +------------------ + +- Test: Optimize CI speed #2464, #2466 + [hugovk] + +- Docs: Removed broken download counter badge #2487 + [hugovk] + +- Docs: Fixed rst syntax error #2477 + [thebjorn] + 4.1.0 (2017-04-03) ------------------ From 591a06eac96107fdd4a1849ec6577b6f50fe7cf9 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Apr 2017 11:55:22 +0100 Subject: [PATCH 395/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 6c2ef30fc..584c0feff 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Return copy on Image crop if crop dimensions match the image #2471 + [radarhere] + - Test: Optimize CI speed #2464, #2466 [hugovk] From 71056d339a6d273e5b802cbc33eb6385de188636 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Apr 2017 12:10:37 +0100 Subject: [PATCH 396/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 584c0feff..8c56efd86 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Fix for file with DPI in EXIF but not metadata, and XResolution is an int rather than tuple #2484 + [hugovk] + - Return copy on Image crop if crop dimensions match the image #2471 [radarhere] From c3717da45a3665ee86eaa1c1d5d7d955c828d50e Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Apr 2017 12:56:13 -0700 Subject: [PATCH 397/632] Undef PySlice_GetIndicesEx, see https://bugs.python.org/issue29943 --- _webp.c | 1 + libImaging/ImPlatform.h | 5 +++++ path.c | 1 + 3 files changed, 7 insertions(+) diff --git a/_webp.c b/_webp.c index a8c6d40af..c45d1ff77 100644 --- a/_webp.c +++ b/_webp.c @@ -1,5 +1,6 @@ #define PY_SSIZE_T_CLEAN #include +#include "Imaging.h" #include "py3.h" #include #include diff --git a/libImaging/ImPlatform.h b/libImaging/ImPlatform.h index a04bd9dcd..71c2e0d8e 100644 --- a/libImaging/ImPlatform.h +++ b/libImaging/ImPlatform.h @@ -9,6 +9,11 @@ #include "Python.h" +/* Workaround issue #2479 */ +#if PY_VERSION_HEX < 0x03070000 && defined(PySlice_GetIndicesEx) +#undef PySlice_GetIndicesEx +#endif + /* Check that we have an ANSI compliant compiler */ #ifndef HAVE_PROTOTYPES #error Sorry, this library requires support for ANSI prototypes. diff --git a/path.c b/path.c index 824fbdd89..4715e0679 100644 --- a/path.c +++ b/path.c @@ -27,6 +27,7 @@ #include "Python.h" +#include "Imaging.h" #include From 4e160cd981c104835f6e959883118d8c68c3dc9d Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Apr 2017 13:27:59 -0700 Subject: [PATCH 398/632] Disable undef on pypy --- libImaging/ImPlatform.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libImaging/ImPlatform.h b/libImaging/ImPlatform.h index 71c2e0d8e..7b42510d4 100644 --- a/libImaging/ImPlatform.h +++ b/libImaging/ImPlatform.h @@ -10,7 +10,7 @@ #include "Python.h" /* Workaround issue #2479 */ -#if PY_VERSION_HEX < 0x03070000 && defined(PySlice_GetIndicesEx) +#if PY_VERSION_HEX < 0x03070000 && defined(PySlice_GetIndicesEx) && !defined(PYPY_VERSION) #undef PySlice_GetIndicesEx #endif From 272377097aab10be8178de78c2934b987a20131f Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 20 Apr 2017 11:46:26 +0100 Subject: [PATCH 399/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 8c56efd86..205d8da53 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Undef PySlice_GetIndicesEx, see https://bugs.python.org/issue29943 #2493 + [cgohlke] + - Fix for file with DPI in EXIF but not metadata, and XResolution is an int rather than tuple #2484 [hugovk] From a34adc1bd0f04bdf30cba4916c9d21e35438375f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 24 Mar 2017 20:39:48 +1100 Subject: [PATCH 400/632] Removed unnecessary brackets --- docs/example/DdsImagePlugin.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/example/DdsImagePlugin.py b/docs/example/DdsImagePlugin.py index dd048a32f..00eb10edb 100644 --- a/docs/example/DdsImagePlugin.py +++ b/docs/example/DdsImagePlugin.py @@ -144,7 +144,7 @@ def _dxt1(data, width, height): else: r, g, b = 0, 0, 0 - idx = 4 * ((y + j) * width + (x + i)) + idx = 4 * ((y + j) * width + x + i) ret[idx:idx+4] = struct.pack('4B', r, g, b, 255) return bytes(ret) @@ -201,7 +201,7 @@ def _dxt5(data, width, height): elif cc == 3: r, g, b = _c3(r0, r1), _c3(g0, g1), _c3(b0, b1) - idx = 4 * ((y + j) * width + (x + i)) + idx = 4 * ((y + j) * width + x + i) ret[idx:idx+4] = struct.pack('4B', r, g, b, alpha) return bytes(ret) @@ -241,8 +241,7 @@ class DdsImageFile(ImageFile.ImageFile): self.decoder = "DXT5" codec = _dxt5 else: - raise NotImplementedError("Unimplemented pixel format %r" % - (fourcc)) + raise NotImplementedError("Unimplemented pixel format %r" % fourcc) self.tile = [ (self.decoder, (0, 0) + self.size, 0, (self.mode, 0, 1)) From 17a111cba7b5ea1d626361061fd0312548860610 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 24 Mar 2017 20:43:03 +1100 Subject: [PATCH 401/632] Removed unused variable --- mp_compile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mp_compile.py b/mp_compile.py index 7448c8a09..31833dee3 100644 --- a/mp_compile.py +++ b/mp_compile.py @@ -73,7 +73,7 @@ def install(): try: # bug, only enable if we can make a Pool. see issue #790 and # https://stackoverflow.com/questions/6033599/oserror-38-errno-38-with-multiprocessing - pool = Pool(2) + Pool(2) CCompiler.compile = _mp_compile except Exception as msg: print("Exception installing mp_compile, proceeding without:" From 37b293f5937655169c2f59e80d272eefb65cbbc7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 20 Apr 2017 21:14:23 +1000 Subject: [PATCH 402/632] Flake8 fixes --- PIL/BmpImagePlugin.py | 2 +- PIL/GifImagePlugin.py | 48 ++++++++++++++++++++------------- PIL/Image.py | 16 +++++------ PIL/ImageCms.py | 1 - PIL/ImageFile.py | 22 +++++++-------- PIL/MspImagePlugin.py | 20 +++++++------- PIL/SgiImagePlugin.py | 10 +++---- PIL/SunImagePlugin.py | 5 ++-- PIL/TiffImagePlugin.py | 16 ++++++----- PIL/WmfImagePlugin.py | 2 +- PIL/_binary.py | 2 ++ Tests/helper.py | 2 ++ Tests/test_file_gif.py | 34 +++++++++++------------ Tests/test_file_libtiff.py | 3 ++- Tests/test_file_msp.py | 8 +++--- Tests/test_file_ppm.py | 1 - Tests/test_file_sgi.py | 3 +-- Tests/test_file_sun.py | 16 +++++------ Tests/test_file_wmf.py | 1 + Tests/test_image.py | 5 +++- Tests/test_image_access.py | 1 - Tests/test_image_convert.py | 1 - Tests/test_image_copy.py | 2 +- Tests/test_image_crop.py | 11 ++++---- Tests/test_image_fromqpixmap.py | 3 ++- Tests/test_image_paste.py | 6 ++--- Tests/test_image_resample.py | 14 +++++----- Tests/test_image_resize.py | 4 +-- Tests/test_image_rotate.py | 20 +++++++------- Tests/test_image_toqimage.py | 8 +++--- Tests/test_image_toqpixmap.py | 2 +- Tests/test_imagecms.py | 2 +- Tests/test_imagedraw.py | 1 - Tests/test_imagefile.py | 5 +++- Tests/test_imagepalette.py | 6 ++--- Tests/test_imagesequence.py | 1 - Tests/test_imagetk.py | 35 +++++++++++------------- docs/example/DdsImagePlugin.py | 8 +++--- 38 files changed, 177 insertions(+), 170 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 1afe303ab..cf18eab66 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -131,7 +131,7 @@ 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), (0x0, 0x0, 0x0, 0x0), (0xff000000, 0xff0000, 0xff00, 0x0) ], + 32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000), (0x0, 0x0, 0x0, 0x0), (0xff000000, 0xff0000, 0xff00, 0x0)], 24: [(0xff0000, 0xff00, 0xff)], 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)] } diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 83161c320..b20fdd452 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -307,7 +307,7 @@ def _normalize_mode(im, initial_call=False): UNDONE: What is the point of mucking with the initial call palette, for an image that shouldn't have a palette, or it would be a mode 'P' and get returned in the RAWMODE clause. - + :param im: Image object :param initial_call: Default false, set to true for a single frame. :returns: Image object @@ -325,6 +325,7 @@ def _normalize_mode(im, initial_call=False): return im.convert("P") return im.convert("L") + def _normalize_palette(im, palette, info): """ Normalizes the palette for image. @@ -334,7 +335,7 @@ def _normalize_palette(im, palette, info): :param im: Image object :param palette: bytes object containing the source palette, or .... - :param info: encoderinfo + :param info: encoderinfo :returns: Image object """ source_palette = None @@ -347,7 +348,7 @@ def _normalize_palette(im, palette, info): zip(palette.palette[:256], palette.palette[256:512], palette.palette[512:768]))) - + if im.mode == "P": if not source_palette: source_palette = im.im.getpalette("RGB")[:768] @@ -364,6 +365,7 @@ def _normalize_palette(im, palette, info): im.palette.palette = source_palette return im + def _write_single_frame(im, fp, palette): im_out = _normalize_mode(im, True) im_out = _normalize_palette(im_out, palette, im.encoderinfo) @@ -383,6 +385,7 @@ def _write_single_frame(im, fp, palette): fp.write(b"\0") # end of image data + def _write_multiple_frames(im, fp, palette): duration = im.encoderinfo.get("duration", None) @@ -418,9 +421,9 @@ def _write_multiple_frames(im, fp, palette): else: bbox = None im_frames.append({ - 'im':im_frame, - 'bbox':bbox, - 'encoderinfo':encoderinfo + 'im': im_frame, + 'bbox': bbox, + 'encoderinfo': encoderinfo }) if len(im_frames) > 1: @@ -441,6 +444,7 @@ def _write_multiple_frames(im, fp, palette): _write_frame_data(fp, im_frame, offset, frame_data['encoderinfo']) return True + def _save_all(im, fp, filename): _save(im, fp, filename, save_all=True) @@ -593,6 +597,7 @@ def _save_netpbm(im, fp, filename): # cases where it took lots of memory and time previously. _FORCE_OPTIMIZE = False + def _get_optimize(im, info): """ Palette optimization is a potentially expensive operation. @@ -624,9 +629,10 @@ def _get_optimize(im, info): used_palette_colors.append(i) if optimise or (len(used_palette_colors) <= 128 and - max(used_palette_colors) > len(used_palette_colors)): + max(used_palette_colors) > len(used_palette_colors)): return used_palette_colors + def _get_color_table_size(palette_bytes): # calculate the palette size for the header import math @@ -635,6 +641,7 @@ def _get_color_table_size(palette_bytes): color_table_size = 0 return color_table_size + def _get_header_palette(palette_bytes): """ Returns the palette, null padded to the next power of 2 (*3) bytes @@ -652,14 +659,16 @@ def _get_header_palette(palette_bytes): palette_bytes += o8(0) * 3 * actual_target_size_diff return palette_bytes -def _get_palette_bytes(im): - """ - Gets the palette for inclusion in the gif header - :param im: Image object - :returns: Bytes, len<=768 suitable for inclusion in gif header - """ - return im.palette.palette +def _get_palette_bytes(im): + """ + Gets the palette for inclusion in the gif header + + :param im: Image object + :returns: Bytes, len<=768 suitable for inclusion in gif header + """ + return im.palette.palette + def _get_global_header(im, info): """Return a list of strings representing a GIF header""" @@ -671,7 +680,7 @@ def _get_global_header(im, info): for extensionKey in ["transparency", "duration", "loop", "comment"]: if info and extensionKey in info: if ((extensionKey == "duration" and info[extensionKey] == 0) or - (extensionKey == "comment" and not (1 <= len(info[extensionKey]) <= 255))): + (extensionKey == "comment" and not (1 <= len(info[extensionKey]) <= 255))): continue version = b"89a" break @@ -693,12 +702,13 @@ def _get_global_header(im, info): # size of global color table + global color table flag o8(color_table_size + 128), # packed fields # background + reserved/aspect - o8(background) + o8(0), + o8(background) + o8(0), # Global Color Table _get_header_palette(palette_bytes) ] + def _write_frame_data(fp, im_frame, offset, params): try: im_frame.encoderinfo = params @@ -716,6 +726,7 @@ def _write_frame_data(fp, im_frame, offset, params): # -------------------------------------------------------------------- # Legacy GIF utilities + def getheader(im, palette=None, info=None): """ Legacy Method to get Gif data from image. @@ -724,7 +735,7 @@ def getheader(im, palette=None, info=None): :param im: Image object :param palette: bytes object containing the source palette, or .... - :param info: encoderinfo + :param info: encoderinfo :returns: tuple of(list of header items, optimized palette) """ @@ -733,7 +744,7 @@ def getheader(im, palette=None, info=None): if info is None: info = {} - if not "background" in info and "background" in im.info: + if "background" not in info and "background" in im.info: info["background"] = im.info["background"] im_mod = _normalize_palette(im, palette, info) @@ -743,6 +754,7 @@ def getheader(im, palette=None, info=None): return header, used_palette_colors + # To specify duration, add the time in milliseconds to getdata(), # e.g. getdata(im_frame, duration=1000) def getdata(im, offset=(0, 0), **params): diff --git a/PIL/Image.py b/PIL/Image.py index ec995c8f4..c11c4cb3f 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -558,16 +558,16 @@ class Image(object): if getattr(self, 'map', None): self.map = None - + # Instead of simply setting to None, we're setting up a # deferred error that will better explain that the core image # object is gone. self.im = deferred_error(ValueError("Operation on closed image")) - if sys.version_info >= (3,4,0): + if sys.version_info >= (3, 4, 0): def __del__(self): - if (hasattr(self, 'fp') and hasattr(self, '_exclusive_fp') - and self.fp and self._exclusive_fp): + if (hasattr(self, 'fp') and hasattr(self, '_exclusive_fp') + and self.fp and self._exclusive_fp): self.fp.close() self.fp = None @@ -1554,7 +1554,6 @@ class Image(object): else: # L-mode source_palette = bytearray(i//3 for i in range(768)) - palette_bytes = b"" new_positions = [0]*256 @@ -1589,8 +1588,8 @@ class Image(object): m_im.palette = ImagePalette.ImagePalette("RGB", palette=mapping_palette*3, size=768) - #possibly set palette dirty, then - #m_im.putpalette(mapping_palette, 'L') # converts to 'P' + # possibly set palette dirty, then + # m_im.putpalette(mapping_palette, 'L') # converts to 'P' # or just force it. # UNDONE -- this is part of the general issue with palettes m_im.im.putpalette(*m_im.palette.getdata()) @@ -1607,8 +1606,6 @@ class Image(object): return m_im - - def resize(self, size, resample=NEAREST): """ Returns a resized copy of this image. @@ -2627,6 +2624,7 @@ def registered_extensions(): init() return EXTENSION + def register_decoder(name, decoder): """ Registers an image decoder. This function should not be diff --git a/PIL/ImageCms.py b/PIL/ImageCms.py index 267afa4c6..40fb1ad0a 100644 --- a/PIL/ImageCms.py +++ b/PIL/ImageCms.py @@ -166,7 +166,6 @@ class ImageCmsProfile(object): self._set(profile) else: raise TypeError("Invalid type for Profile") - def _set(self, profile, filename=None): self.profile = profile diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index b28aa798e..124a3a347 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -160,7 +160,7 @@ class ImageFile(Image.Image): # try memory mapping decoder_name, extents, offset, args = self.tile[0] if decoder_name == "raw" and len(args) >= 3 and args[0] == self.mode \ - and args[0] in Image._MAPMODES: + and args[0] in Image._MAPMODES: try: if hasattr(Image.core, "map"): # use built-in mapper WIN32 only @@ -199,7 +199,7 @@ class ImageFile(Image.Image): for decoder_name, extents, offset, args in self.tile: decoder = Image._getdecoder(self.mode, decoder_name, - args, self.decoderconfig) + args, self.decoderconfig) seek(offset) decoder.setimage(self.im, extents) if decoder.pulls_fd: @@ -540,6 +540,7 @@ class PyCodecState(object): return (self.xoff, self.yoff, self.xoff+self.xsize, self.yoff+self.ysize) + class PyDecoder(object): """ Python implementation of a format decoder. Override this class and @@ -565,7 +566,7 @@ class PyDecoder(object): :returns: None """ self.args = args - + @property def pulls_fd(self): return self._pulls_fd @@ -597,7 +598,7 @@ class PyDecoder(object): :returns: None """ self.fd = fd - + def setimage(self, im, extents=None): """ Called from ImageFile to set the core output image for the decoder @@ -607,7 +608,7 @@ class PyDecoder(object): for this tile :returns: None """ - + # following c code self.im = im @@ -616,7 +617,6 @@ class PyDecoder(object): else: (x0, y0, x1, y1) = (0, 0, 0, 0) - if x0 == 0 and x1 == 0: self.state.xsize, self.state.ysize = self.im.size else: @@ -627,11 +627,11 @@ class PyDecoder(object): if self.state.xsize <= 0 or self.state.ysize <= 0: raise ValueError("Size cannot be negative") - + if (self.state.xsize + self.state.xoff > self.im.size[0] or - self.state.ysize + self.state.yoff > self.im.size[1]): + self.state.ysize + self.state.yoff > self.im.size[1]): raise ValueError("Tile cannot extend outside image") - + def set_as_raw(self, data, rawmode=None): """ Convenience method to set the internal image from a stream of raw data @@ -641,13 +641,13 @@ class PyDecoder(object): it will default to the mode of the image :returns: None """ - + if not rawmode: rawmode = self.mode d = Image._getdecoder(self.mode, 'raw', (rawmode)) d.setimage(self.im, self.state.extents()) s = d.decode(data) - + if s[0] >= 0: raise ValueError("not enough image data") if s[1] != 0: diff --git a/PIL/MspImagePlugin.py b/PIL/MspImagePlugin.py index 11e983a3a..5ea3c1c49 100644 --- a/PIL/MspImagePlugin.py +++ b/PIL/MspImagePlugin.py @@ -25,7 +25,8 @@ from . import Image, ImageFile from ._binary import i16le as i16, o16le as o16, i8 -import struct, io +import struct +import io __version__ = "0.1" @@ -97,7 +98,7 @@ class MspDecoder(ImageFile.PyDecoder): # If the RunType value is non-zero # Use this value as the RunCount # Read and write the next RunCount bytes literally - # + # # e.g.: # 0x00 03 ff 05 00 01 02 03 04 # would yield the bytes: @@ -105,11 +106,10 @@ class MspDecoder(ImageFile.PyDecoder): # # which are then interpreted as a bit packed mode '1' image - _pulls_fd = True def decode(self, buffer): - + img = io.BytesIO() blank_line = bytearray((0xff,)*((self.state.xsize+7)//8)) try: @@ -140,17 +140,17 @@ class MspDecoder(ImageFile.PyDecoder): runcount = runtype img.write(row[idx:idx+runcount]) idx += runcount - + except struct.error: - raise IOError("Corrupted MSP file in row %d" %x) - + raise IOError("Corrupted MSP file in row %d" % x) + self.set_as_raw(img.getvalue(), ("1", 0, 1)) - - return 0,0 + + return 0, 0 Image.register_decoder('MSP', MspDecoder) - + # # write MSP files (uncompressed only) diff --git a/PIL/SgiImagePlugin.py b/PIL/SgiImagePlugin.py index 973c68567..bca7eb13f 100644 --- a/PIL/SgiImagePlugin.py +++ b/PIL/SgiImagePlugin.py @@ -124,14 +124,14 @@ def _save(im, fp, filename): fp.write(struct.pack('>l', pinmin)) fp.write(struct.pack('>l', pinmax)) - fp.write(struct.pack('4s', b'')) # dummy - fp.write(struct.pack('79s', imgName)) # truncates to 79 chars - fp.write(struct.pack('s', b'')) # force null byte after imgname + fp.write(struct.pack('4s', b'')) # dummy + fp.write(struct.pack('79s', imgName)) # truncates to 79 chars + fp.write(struct.pack('s', b'')) # force null byte after imgname fp.write(struct.pack('>l', colormap)) - fp.write(struct.pack('404s', b'')) # dummy + fp.write(struct.pack('404s', b'')) # dummy - #assert we've got the right number of bands. + # assert we've got the right number of bands. if len(im.getbands()) != z: raise ValueError("incorrect number of bands in SGI write: %s vs %s" % (z, len(im.getbands()))) diff --git a/PIL/SunImagePlugin.py b/PIL/SunImagePlugin.py index b57883df6..536aa134a 100644 --- a/PIL/SunImagePlugin.py +++ b/PIL/SunImagePlugin.py @@ -52,7 +52,6 @@ class SunImageFile(ImageFile.ImageFile): # DWORD ColorMapLength; /* Size of the color map in bytes */ # } SUNRASTER; - # HEAD s = self.fp.read(32) if i32(s) != 0x59a66a95: @@ -63,9 +62,9 @@ class SunImageFile(ImageFile.ImageFile): self.size = i32(s[4:8]), i32(s[8:12]) depth = i32(s[12:16]) - data_length = i32(s[16:20]) # unreliable, ignore. + data_length = i32(s[16:20]) # unreliable, ignore. file_type = i32(s[20:24]) - palette_type = i32(s[24:28]) # 0: None, 1: RGB, 2: Raw/arbitrary + palette_type = i32(s[24:28]) # 0: None, 1: RGB, 2: Raw/arbitrary palette_length = i32(s[28:32]) if depth == 1: diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index e80fc12ad..f9709e83b 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -616,7 +616,8 @@ class ImageFileDirectory_v2(collections.MutableMapping): @_register_loader(5, 8) def load_rational(self, data, legacy_api=True): vals = self._unpack("{}L".format(len(data) // 4), data) - combine = lambda a, b: (a, b) if legacy_api else IFDRational(a, b) + + def combine(a, b): return (a, b) if legacy_api else IFDRational(a, b) return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) @@ -636,7 +637,8 @@ class ImageFileDirectory_v2(collections.MutableMapping): @_register_loader(10, 8) def load_signed_rational(self, data, legacy_api=True): vals = self._unpack("{}l".format(len(data) // 4), data) - combine = lambda a, b: (a, b) if legacy_api else IFDRational(a, b) + + def combine(a, b): return (a, b) if legacy_api else IFDRational(a, b) return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) @@ -1136,7 +1138,7 @@ class TiffImageFile(ImageFile.ImageFile): sampleFormat = self.tag_v2.get(SAMPLEFORMAT, (1,)) if (len(sampleFormat) > 1 - and max(sampleFormat) == min(sampleFormat) == 1): + and max(sampleFormat) == min(sampleFormat) == 1): # SAMPLEFORMAT is properly per band, so an RGB image will # be (1,1,1). But, we don't support per band pixel types, # and anything more than one band is a uint8. So, just @@ -1174,7 +1176,7 @@ class TiffImageFile(ImageFile.ImageFile): self.info["dpi"] = xres, yres elif resunit == 3: # dots per centimeter. convert to dpi self.info["dpi"] = xres * 2.54, yres * 2.54 - elif resunit is None: # used to default to 1, but now 2) + elif resunit is None: # used to default to 1, but now 2) self.info["dpi"] = xres, yres # For backward compatibility, we also preserve the old behavior. self.info["resolution"] = xres, yres @@ -1492,6 +1494,7 @@ def _save(im, fp, filename): # just to access o32 and o16 (using correct byte order) im._debug_multipage = ifd + class AppendingTiffWriter: fieldSizes = [ 0, # None @@ -1679,12 +1682,12 @@ class AppendingTiffWriter: def fixIFD(self): numTags = self.readShort() - #trace("fixing IFD at %X; number of tags: %u (0x%X)", self.f.tell()-2, + # trace("fixing IFD at %X; number of tags: %u (0x%X)", self.f.tell()-2, # numTags, numTags) for i in range(numTags): tag, fieldType, count = struct.unpack(self.tagFormat, self.f.read(8)) - #trace(" at %X: tag %u (0x%X), type %u, count %u", self.f.tell()-8, + # trace(" at %X: tag %u (0x%X), type %u, count %u", self.f.tell()-8, # tag, tag, fieldType, count) fieldSize = self.fieldSizes[fieldType] @@ -1737,6 +1740,7 @@ class AppendingTiffWriter: else: self.rewriteLastLong(offset) + def _save_all(im, fp, filename): if not hasattr(im, "n_frames"): return _save(im, fp, filename) diff --git a/PIL/WmfImagePlugin.py b/PIL/WmfImagePlugin.py index f7076c0d9..584523fc7 100644 --- a/PIL/WmfImagePlugin.py +++ b/PIL/WmfImagePlugin.py @@ -25,7 +25,6 @@ from . import Image, ImageFile from ._binary import i16le as word, si16le as short, i32le as dword, si32le as _long - __version__ = "0.2" _handler = None @@ -66,6 +65,7 @@ if hasattr(Image.core, "drawwmf"): # -------------------------------------------------------------------- # Read WMF file + def _accept(prefix): return ( prefix[:6] == b"\xd7\xcd\xc6\x9a\x00\x00" or diff --git a/PIL/_binary.py b/PIL/_binary.py index 17ee67b11..b15f796c0 100644 --- a/PIL/_binary.py +++ b/PIL/_binary.py @@ -37,6 +37,7 @@ def i16le(c, o=0): """ return unpack(">> im = Image.open('Tests/images/hopper.ppm') - # >>> im = im.rotate(45, resample=Image.BICUBIC, expand=True) + # >>> im = im.rotate(45, resample=Image.BICUBIC, expand=True) # >>> im.save('Tests/images/hopper_45.png') target = Image.open('Tests/images/hopper_45.png') @@ -52,7 +52,7 @@ class TestImageRotate(PillowTestCase): target_origin = target.size[1]/2 target = target.crop((0, target_origin, 128, target_origin + 128)) - im = im.rotate(45, center=(0,0), resample=Image.BICUBIC) + im = im.rotate(45, center=(0, 0), resample=Image.BICUBIC) self.assert_image_similar(im, target, 15) @@ -62,7 +62,7 @@ class TestImageRotate(PillowTestCase): target_origin = target.size[1] / 2 - 14 target = target.crop((6, target_origin, 128 + 6, target_origin + 128)) - im = im.rotate(45, center=(14,14), resample=Image.BICUBIC) + im = im.rotate(45, center=(14, 14), resample=Image.BICUBIC) self.assert_image_similar(im, target, 10) @@ -73,7 +73,7 @@ class TestImageRotate(PillowTestCase): target = target.crop((target_origin, target_origin, target_origin + 128, target_origin + 128)) - im = im.rotate(45, translate=(5,5), resample=Image.BICUBIC) + im = im.rotate(45, translate=(5, 5), resample=Image.BICUBIC) self.assert_image_similar(im, target, 1) @@ -81,14 +81,14 @@ class TestImageRotate(PillowTestCase): # if the center is -1,-1 and we rotate by 90<=x<=270 the # resulting image should be black for angle in (90, 180, 270): - im = hopper().rotate(angle, center=(-1,-1)) + im = hopper().rotate(angle, center=(-1, -1)) self.assert_image_equal(im, Image.new('RGB', im.size, 'black')) def test_fastpath_translate(self): # if we post-translate by -128 # resulting image should be black for angle in (0, 90, 180, 270): - im = hopper().rotate(angle, translate=(-128,-128)) + im = hopper().rotate(angle, translate=(-128, -128)) self.assert_image_equal(im, Image.new('RGB', im.size, 'black')) def test_center(self): @@ -97,8 +97,6 @@ class TestImageRotate(PillowTestCase): self.rotate(im, im.mode, 45, translate=(im.size[0]/2, 0)) self.rotate(im, im.mode, 45, center=(0, 0), translate=(im.size[0]/2, 0)) - - if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_toqimage.py b/Tests/test_image_toqimage.py index 435a07765..6d7715c80 100644 --- a/Tests/test_image_toqimage.py +++ b/Tests/test_image_toqimage.py @@ -20,7 +20,8 @@ if ImageQt.qt_is_installed: from PySide import QtGui from PySide.QtGui import QWidget, QHBoxLayout, QLabel, QApplication QT_VERSION = 4 - + + class TestToQImage(PillowQtTestCase, PillowTestCase): def test_sanity(self): @@ -45,12 +46,12 @@ class TestToQImage(PillowQtTestCase, PillowTestCase): # libpng warning: Invalid color type/bit depth combination in IHDR # libpng error: Invalid IHDR data continue - + # Test saving the file tempfile = self.tempfile('temp_{}.png'.format(mode)) data.save(tempfile) - # Check that it actually worked. + # Check that it actually worked. reloaded = Image.open(tempfile) # Gray images appear to come back in palette mode. # They're roughly equivalent @@ -58,7 +59,6 @@ class TestToQImage(PillowQtTestCase, PillowTestCase): src = src.convert('P') self.assert_image_equal(reloaded, src) - def test_segfault(self): PillowQtTestCase.setUp(self) diff --git a/Tests/test_image_toqpixmap.py b/Tests/test_image_toqpixmap.py index 137a875fe..c6555d7ff 100644 --- a/Tests/test_image_toqpixmap.py +++ b/Tests/test_image_toqpixmap.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, hopper, distro +from helper import unittest, PillowTestCase, hopper from test_imageqt import PillowQtTestCase, PillowQPixmapTestCase from PIL import ImageQt diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index d0168b141..21493e8d5 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -344,7 +344,7 @@ class TestImageCms(PillowTestCase): chans = [] bands = ImageMode.getmode(mode).bands for band_ndx in range(len(bands)): - channel_type = 'L' # 8-bit unorm + channel_type = 'L' # 8-bit unorm channel_pattern = hopper(channel_type) # paste pattern with varying offsets to avoid correlation diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index b0a4f2f1e..441a34a88 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -310,7 +310,6 @@ class TestImageDraw(PillowTestCase): self.assert_image_equal(im, im_floodfill) del draw - @unittest.skipIf(hasattr(sys, 'pypy_version_info'), "Causes fatal RPython error on PyPy") def test_floodfill_border(self): diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index d9ae74579..d44f5b2e6 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -138,10 +138,12 @@ class TestImageFile(PillowTestCase): class MockPyDecoder(ImageFile.PyDecoder): def decode(self, buffer): - #eof + # eof return (-1, 0) xoff, yoff, xsize, ysize = 10, 20, 100, 100 + + class MockImageFile(ImageFile.ImageFile): def _open(self): self.rawmode = 'RGBA' @@ -149,6 +151,7 @@ class MockImageFile(ImageFile.ImageFile): self.size = (200, 200) self.tile = [("MOCK", (xoff, yoff, xoff+xsize, yoff+ysize), 32, None)] + class TestPyDecoder(PillowTestCase): def get_decoder(self): diff --git a/Tests/test_imagepalette.py b/Tests/test_imagepalette.py index f80fa34c8..248138377 100644 --- a/Tests/test_imagepalette.py +++ b/Tests/test_imagepalette.py @@ -128,16 +128,16 @@ class TestImagePalette(PillowTestCase): def test_2bit_palette(self): # issue #2258, 2 bit palettes are corrupted. outfile = self.tempfile('temp.png') - + rgb = b'\x00' * 2 + b'\x01' * 2 + b'\x02' * 2 img = Image.frombytes('P', (6, 1), rgb) - img.putpalette(b'\xFF\x00\x00\x00\xFF\x00\x00\x00\xFF') # RGB + img.putpalette(b'\xFF\x00\x00\x00\xFF\x00\x00\x00\xFF') # RGB img.save(outfile, format='PNG') reloaded = Image.open(outfile) self.assert_image_equal(img, reloaded) - + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagesequence.py b/Tests/test_imagesequence.py index c2d62f38c..e50b13924 100644 --- a/Tests/test_imagesequence.py +++ b/Tests/test_imagesequence.py @@ -62,7 +62,6 @@ class TestImageSequence(PillowTestCase): self.assert_image_equal(frame, firstFrame) break - def test_palette_mmap(self): # Using mmap in ImageFile can require to reload the palette. im = Image.open('Tests/images/multipage-mmap.tiff') diff --git a/Tests/test_imagetk.py b/Tests/test_imagetk.py index 1d5a281a6..8c8723927 100644 --- a/Tests/test_imagetk.py +++ b/Tests/test_imagetk.py @@ -10,9 +10,10 @@ try: except (OSError, ImportError) as v: # Skipped via setUp() HAS_TK = False - + TK_MODES = ('1', 'L', 'P', 'RGB', 'RGBA') + class TestImageTk(PillowTestCase): def setUp(self): @@ -21,7 +22,7 @@ class TestImageTk(PillowTestCase): try: # setup tk app = tk.Frame() - #root = tk.Tk() + # root = tk.Tk() except (tk.TclError) as v: self.skipTest("TCL Error: %s" % v) @@ -46,12 +47,11 @@ class TestImageTk(PillowTestCase): im = ImageTk._get_image_from_kw(kw) self.assertEqual(im, None) - def test_photoimage(self): for mode in TK_MODES: # test as image: im = hopper(mode) - + # this should not crash im_tk = ImageTk.PhotoImage(im) @@ -59,35 +59,32 @@ class TestImageTk(PillowTestCase): self.assertEqual(im_tk.height(), im.height) # _tkinter.TclError: this function is not yet supported - #reloaded = ImageTk.getimage(im_tk) - #self.assert_image_equal(reloaded, im) - - + # reloaded = ImageTk.getimage(im_tk) + # self.assert_image_equal(reloaded, im) def test_photoimage_blank(self): # test a image using mode/size: for mode in TK_MODES: - im_tk = ImageTk.PhotoImage(mode, (100,100)) - + im_tk = ImageTk.PhotoImage(mode, (100, 100)) + self.assertEqual(im_tk.width(), 100) self.assertEqual(im_tk.height(), 100) - - #reloaded = ImageTk.getimage(im_tk) - #self.assert_image_equal(reloaded, im) + + # reloaded = ImageTk.getimage(im_tk) + # self.assert_image_equal(reloaded, im) def test_bitmapimage(self): im = hopper('1') # this should not crash im_tk = ImageTk.BitmapImage(im) - + self.assertEqual(im_tk.width(), im.width) self.assertEqual(im_tk.height(), im.height) - - #reloaded = ImageTk.getimage(im_tk) - #self.assert_image_equal(reloaded, im) - - + # reloaded = ImageTk.getimage(im_tk) + # self.assert_image_equal(reloaded, im) + + if __name__ == '__main__': unittest.main() diff --git a/docs/example/DdsImagePlugin.py b/docs/example/DdsImagePlugin.py index 00eb10edb..29e13b920 100644 --- a/docs/example/DdsImagePlugin.py +++ b/docs/example/DdsImagePlugin.py @@ -233,7 +233,6 @@ class DdsImageFile(ImageFile.ImageFile): bitcount, rmask, gmask, bmask, amask = struct.unpack("<5I", header.read(20)) - if fourcc == b"DXT1": self.decoder = "DXT1" codec = _dxt1 @@ -247,7 +246,6 @@ class DdsImageFile(ImageFile.ImageFile): (self.decoder, (0, 0) + self.size, 0, (self.mode, 0, 1)) ] - def load_seek(self, pos): pass @@ -260,8 +258,8 @@ class DXT1Decoder(ImageFile.PyDecoder): self.set_as_raw(_dxt1(self.fd, self.state.xsize, self.state.ysize)) except struct.error: raise IOError("Truncated DDS file") - - return 0,0 + return 0, 0 + class DXT5Decoder(ImageFile.PyDecoder): _pulls_fd = True @@ -271,7 +269,7 @@ class DXT5Decoder(ImageFile.PyDecoder): self.set_as_raw(_dxt5(self.fd, self.state.xsize, self.state.ysize)) except struct.error: raise IOError("Truncated DDS file") - return 0,0 + return 0, 0 Image.register_decoder('DXT1', DXT1Decoder) Image.register_decoder('DXT5', DXT5Decoder) From cde8b89f73dc4471a64063c1a63a0838e2aa7ad0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 28 Apr 2017 19:26:49 +1000 Subject: [PATCH 403/632] Updated Sierra tested Pillow version [ci skip] --- docs/installation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 88bbf2799..607a59d6f 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -365,7 +365,7 @@ These platforms are built and tested for every change. Other Platforms ^^^^^^^^^^^^^^^ -These platforms have been reported to work at the versions mentioned. +These platforms have been reported to work at the versions mentioned. .. note:: @@ -375,7 +375,7 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ |**Operating system** |**Tested Python versions** |**Latest tested Pillow version**|**Tested processors** | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| macOS 10.12 Sierra | 3.4,3.5,3.6 | 4.0.0 |x86-64 | +| macOS 10.12 Sierra | 2.7,3.4,3.5,3.6 | 4.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Mac OS X 10.11 El Capitan | 2.7,3.3,3.4,3.5 | 4.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ From 5a33416c724b7ce5d2de68af704954bbe447e698 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 20 Apr 2017 04:28:08 -0700 Subject: [PATCH 404/632] 4.1.1 release notes --- docs/releasenotes/4.1.1.rst | 24 ++++++++++++++++++++++++ docs/releasenotes/index.rst | 1 + 2 files changed, 25 insertions(+) create mode 100644 docs/releasenotes/4.1.1.rst diff --git a/docs/releasenotes/4.1.1.rst b/docs/releasenotes/4.1.1.rst new file mode 100644 index 000000000..7aa3c1fbf --- /dev/null +++ b/docs/releasenotes/4.1.1.rst @@ -0,0 +1,24 @@ +4.1.1 +----- + +Fix Regression with reading DPI from EXIF data +============================================== + +Some JPEG images don't contain DPI information in the image metadata, +but do contain it in the EXIF data. A patch was added in 4.1.0 to read +from the EXIF data, but it did not accept all possible types that +could be included there. This fix adds the ability to read ints as +well as rational values. + + +Incompatibility between 3.6.0 and 3.6.1 +======================================= + +CPython 3.6.1 added a new symbol, PySlice_GetIndicesEx, which was not +present in 3.6.0. This had the effect of causing binaries compiled on +CPython 3.6.1 to not work on installations of C-Python 3.6.0. This fix +undefines PySlice_GetIndicesEx if it exists to restore compatibility +with both 3.6.0 and 3.6.1. See https://bugs.python.org/issue29943 for +more details. + + diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 1dd6eb8af..27851ec7a 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -6,6 +6,7 @@ Release Notes .. toctree:: :maxdepth: 2 + 4.1.1 4.1.0 4.0.0 3.4.0 From 535338396ad87802355ea056d2e7f6fab1d74cf2 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 20 Apr 2017 04:38:03 -0700 Subject: [PATCH 405/632] Updated CHANGES.rst [ci skip] --- CHANGES.rst | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 205d8da53..dcbff8be1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,24 +4,27 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Return copy on Image crop if crop dimensions match the image #2471 + [radarhere] + +- Test: Optimize CI speed #2464, #2466 + [hugovk] + +4.1.1 (2017-04-28) +------------------ + - Undef PySlice_GetIndicesEx, see https://bugs.python.org/issue29943 #2493 [cgohlke] - Fix for file with DPI in EXIF but not metadata, and XResolution is an int rather than tuple #2484 [hugovk] -- Return copy on Image crop if crop dimensions match the image #2471 - [radarhere] - -- Test: Optimize CI speed #2464, #2466 - [hugovk] - - Docs: Removed broken download counter badge #2487 [hugovk] - Docs: Fixed rst syntax error #2477 [thebjorn] - + 4.1.0 (2017-04-03) ------------------ @@ -39,7 +42,7 @@ Changelog (Pillow) - Git: Set ContainerIO test file as binary #2469 [cgohlke] - + - Remove superfluous import of FixTk #2455 [cgohlke) @@ -48,7 +51,7 @@ Changelog (Pillow) - Pure Python Decoders, including Python decoder to fix for MSP images #1938 [wiredfool, hugovk] - + - Reorganized GifImagePlugin, fixes #2314. #2374 [radarhere, wiredfool] @@ -57,10 +60,10 @@ Changelog (Pillow) - Test: Additional tests for BurfStub, Eps, Container, GribStub, IPTC, Wmf, XVThumb, ImageDraw, ImageMorph ImageShow #2425 [radarhere] - + - Health fixes #2437 [radarhere] - + - Test: Correctness tests ContainerIO, XVThumbImagePlugin, BufrStubImagePlugin, GribStubImagePlugin, FitsStubImagePlugin, Hdf5StubImagePlugin, PixarImageFile, PsdImageFile #2443, #2442, #2441, #2440, #2431, #2430, #2428, #2427 [hugovk] From 6a7f4983afaf25d56ebb6408c1cdc5654f34bb2a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 3 May 2017 20:22:55 +1000 Subject: [PATCH 406/632] Corrected syntax in release notes [ci skip] --- docs/releasenotes/3.3.2.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/3.3.2.rst b/docs/releasenotes/3.3.2.rst index 141413093..68a09a3c8 100644 --- a/docs/releasenotes/3.3.2.rst +++ b/docs/releasenotes/3.3.2.rst @@ -11,7 +11,7 @@ disclosure or corruption. Specifically, when parameters from the image are passed into ``Image.core.map_buffer``, the size of the image was calculated with -``xsize``*``ysize``*``bytes_per_pixel``. This will overflow if the +``xsize`` * ``ysize`` * ``bytes_per_pixel``. This will overflow if the result is larger than SIZE_MAX. This is possible on a 32-bit system. Furthermore this ``size`` value was added to a potentially attacker From 9bcafef97345cb1c2c781103944734c6cfe7fbc3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 May 2017 11:57:24 +1000 Subject: [PATCH 407/632] Updated Sierra tested Pillow version [ci skip] --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index 607a59d6f..c36b97489 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -375,7 +375,7 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ |**Operating system** |**Tested Python versions** |**Latest tested Pillow version**|**Tested processors** | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| macOS 10.12 Sierra | 2.7,3.4,3.5,3.6 | 4.1.0 |x86-64 | +| macOS 10.12 Sierra | 2.7,3.4,3.5,3.6 | 4.1.1 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Mac OS X 10.11 El Capitan | 2.7,3.3,3.4,3.5 | 4.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ From 424a09ecadadbf1320e0041a0cd8295f8711a076 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 May 2017 23:20:34 +1000 Subject: [PATCH 408/632] Updated references to point to existing files [ci skip] --- CHANGES.rst | 2 +- docs/handbook/tutorial.rst | 16 ++++++++-------- docs/reference/ImageDraw.rst | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index dcbff8be1..2c68769c6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2529,7 +2529,7 @@ Pre-fork import numpy, Image - im = Image.open('lena.jpg') + im = Image.open('hopper.jpg') a = numpy.asarray(im) # a is readonly diff --git a/docs/handbook/tutorial.rst b/docs/handbook/tutorial.rst index 6b4add945..245d4fc2c 100644 --- a/docs/handbook/tutorial.rst +++ b/docs/handbook/tutorial.rst @@ -13,7 +13,7 @@ To load an image from a file, use the :py:func:`~PIL.Image.open` function in the :py:mod:`~PIL.Image` module:: >>> from PIL import Image - >>> im = Image.open("lena.ppm") + >>> im = Image.open("hopper.ppm") If successful, this function returns an :py:class:`~PIL.Image.Image` object. You can now use instance attributes to examine the file contents:: @@ -276,7 +276,7 @@ Converting between modes :: - im = Image.open("lena.ppm").convert("L") + im = Image.open("hopper.ppm").convert("L") The library supports transformations between each supported mode and the “L” and “RGB” modes. To convert between other modes, you may have to use an @@ -435,8 +435,8 @@ Drawing Postscript from PIL import Image from PIL import PSDraw - im = Image.open("lena.ppm") - title = "lena" + im = Image.open("hopper.ppm") + title = "hopper" box = (1*72, 2*72, 7*72, 10*72) # in points ps = PSDraw.PSDraw() # default is sys.stdout @@ -459,7 +459,7 @@ As described earlier, the :py:func:`~PIL.Image.open` function of the :py:mod:`~PIL.Image` module is used to open an image file. In most cases, you simply pass it the filename as an argument:: - im = Image.open("lena.ppm") + im = Image.open("hopper.ppm") If everything goes well, the result is an :py:class:`PIL.Image.Image` object. Otherwise, an :exc:`IOError` exception is raised. @@ -473,7 +473,7 @@ Reading from an open file :: - fp = open("lena.ppm", "rb") + fp = open("hopper.ppm", "rb") im = Image.open(fp) To read an image from string data, use the :py:class:`~StringIO.StringIO` @@ -499,9 +499,9 @@ Reading from a tar archive :: - from PIL import TarIO + from PIL import Image, TarIO - fp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm") + fp = TarIO.TarIO("Tests/images/hopper.tar", "hopper.jpg") im = Image.open(fp) Controlling the decoder diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 842407c90..3f1bb7b8d 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -20,7 +20,7 @@ Example: Draw a gray cross over an image from PIL import Image, ImageDraw - im = Image.open("lena.pgm") + im = Image.open("hopper.jpg") draw = ImageDraw.Draw(im) draw.line((0, 0) + im.size, fill=128) @@ -81,7 +81,7 @@ Example: Draw Partial Opacity Text from PIL import Image, ImageDraw, ImageFont # get an image - base = Image.open('Pillow/Tests/images/lena.png').convert('RGBA') + base = Image.open('Pillow/Tests/images/hopper.png').convert('RGBA') # make a blank image for the text, initialized to transparent text color txt = Image.new('RGBA', base.size, (255,255,255,0)) From 07e93eb17a4e4a43a38bff28b5d833b03f8456cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Tue, 9 May 2017 12:18:14 +0300 Subject: [PATCH 409/632] Spelling fixes --- .travis/after_success.sh | 2 +- CHANGES.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis/after_success.sh b/.travis/after_success.sh index 906ade61b..96781fbbd 100755 --- a/.travis/after_success.sh +++ b/.travis/after_success.sh @@ -37,7 +37,7 @@ if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "mas export $(cat .to_export_back) if [ "$BUILD_LEADER" = "YES" ]; then if [ "$BUILD_AGGREGATE_STATUS" = "others_succeeded" ]; then - echo "All jobs succeded! Triggering macOS build..." + echo "All jobs succeeded! Triggering macOS build..." # Trigger a macOS build at the pillow-wheels repo ./build_children.sh else diff --git a/CHANGES.rst b/CHANGES.rst index dcbff8be1..435cf5a16 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3372,7 +3372,7 @@ Pre-fork to any other format, via a lookup table. That table should contain 256 values for each band in the output image. - + Some file drivers (including FLI/FLC, GIF, and IM) accidently + + Some file drivers (including FLI/FLC, GIF, and IM) accidentally overwrote the offset method with an internal attribute. All drivers have been updated to use private attributes where possible. From 8b8f150d3756b4f128d2346232eb499da5ad96ee Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 10 May 2017 11:24:07 +0100 Subject: [PATCH 410/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index df1f55029..abecc9df4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Doc: Updated references to point to existing files #2507 + [radarhere] + - Return copy on Image crop if crop dimensions match the image #2471 [radarhere] @@ -2529,7 +2532,7 @@ Pre-fork import numpy, Image - im = Image.open('hopper.jpg') + im = Image.open('lena.jpg') a = numpy.asarray(im) # a is readonly From f7da3590507725a5a8173de80d2b9df0552bc9e7 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 10 May 2017 03:27:25 -0700 Subject: [PATCH 411/632] added region for s3 deployment on appveyor --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 24d971919..ddec4db22 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -55,6 +55,7 @@ after_test: deploy: provider: S3 + region: us-west-2 access_key_id: AKIAIRAXC62ZNTVQJMOQ secret_access_key: secure: Hwb6klTqtBeMgxAjRoDltiiqpuH8xbwD4UooDzBSiCWXjuFj1lyl4kHgHwTCCGqi From 468e1a5a65db89a78ba09361e845d4ed2ca255d4 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Apr 2017 06:43:25 -0700 Subject: [PATCH 412/632] Pypi doesn't accept multiple source archives anymore --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 60f4aa421..6f60606a8 100644 --- a/Makefile +++ b/Makefile @@ -84,7 +84,7 @@ release-test: viewdoc sdist: - python setup.py sdist --format=gztar,zip + python setup.py sdist --format=gztar test: python test-installed.py @@ -95,10 +95,10 @@ upload-test: # username: # password: # repository = http://test.pythonpackages.com - python setup.py sdist --format=gztar,zip upload -r test + python setup.py sdist --format=gztar upload -r test upload: - python setup.py sdist --format=gztar,zip upload + python setup.py sdist --format=gztar upload readme: viewdoc From 771170d572069b8a656721e6262cea77f12ae638 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Apr 2017 06:55:00 -0700 Subject: [PATCH 413/632] Update RELEASING.md for pypi, process changes --- RELEASING.md | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 181ad1d6d..a56404d5a 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -7,6 +7,7 @@ Released quarterly on the first day of January, April, July, October. * [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/1174 * [ ] Develop and prepare release in ``master`` branch. * [ ] Check [Travis CI](https://travis-ci.org/python-pillow/Pillow) and [AppVeyor CI](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in ``master`` branch. +* [ ] Check that all of the wheel builds [Pillow Wheel Builder](https://github.com/python-pillow/pillow-wheels) pass the tests in TravisCI. * [ ] In compliance with https://www.python.org/dev/peps/pep-0440/, update version identifier in: ``` PIL/__init__.py setup.py _imaging.c appveyor.yml @@ -20,12 +21,12 @@ Released quarterly on the first day of January, April, July, October. $ git push --all $ git push --tags ``` -* [ ] Create and upload source distributions e.g.: +* [ ] Create source distributions e.g.: ``` $ make sdist - $ make upload ``` -* [ ] Create and upload [binary distributions](#binary-distributions) +* [ ] Create binary distributions [binary distributions](#binary-distributions) +* [ ] Upload all binaries and source distributions with ``twine upload dist/Pillow-4.1.0-*`` * [ ] Manually hide old versions on PyPI such that only the latest major release is visible when viewing https://pypi.python.org/pypi/Pillow (https://pypi.python.org/pypi?:action=pkg_edit&name=Pillow) ## Point Release @@ -53,11 +54,11 @@ Released as needed for security, installation or critical bug fixes. $ git tag 2.9.1 $ git push --tags ``` -* [ ] Create and upload source distributions e.g.: +* [ ] Create source distributions e.g.: ``` - $ make sdistup + $ make sdist ``` -* [ ] Create and upload [binary distributions](#binary-distributions) +* [ ] Create [binary distributions](#binary-distributions) ## Embargoed Release @@ -76,11 +77,11 @@ Released as needed privately to individual vendors for critical security-related git push origin 2.5.x git push origin --tags ``` -* [ ] Create and upload source distributions e.g.: +* [ ] Create source distributions e.g.: ``` - $ make sdistup + $ make sdist ``` -* [ ] Create and upload [binary distributions](#binary-distributions) +* [ ] Create [binary distributions](#binary-distributions) ## Binary Distributions @@ -88,8 +89,8 @@ Released as needed privately to individual vendors for critical security-related * [ ] 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 *``. -### macOS -* [ ] Use the [Pillow macOS Wheel Builder](https://github.com/python-pillow/pillow-wheels): +### Mac and Linux +* [ ] Use the [Pillow Wheel Builder](https://github.com/python-pillow/pillow-wheels): ``` $ git checkout https://github.com/python-pillow/pillow-wheels $ cd pillow-wheels @@ -97,12 +98,13 @@ Released as needed privately to individual vendors for critical security-related $ git submodule update $ cd Pillow $ git fetch --all - $ git commit -a -m "Pillow -> 2.9.0" - $ git push + $ git checkout [[release tag]] + $ cd .. + $ git commit -m "Pillow -> 2.9.0" Pillow + $ git push ``` -* [ ] Download distributions from the [Pillow macOS Wheel Builder container](http://cdf58691c5cf45771290-6a3b6a0f5f6ab91aadc447b2a897dd9a.r50.cf2.rackcdn.com/) and ``twine upload *``. +* [ ] Download distributions from the [Pillow Wheel Builder container](http://a365fff413fe338398b6-1c8a9b3114517dc5fe17b7c3f8c63a43.r19.cf2.rackcdn.com/). -### Linux ## Publicize Release From 8999ccb570e97ee7bbf5c3fdfab042119eebc42a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 19 Apr 2017 07:39:39 -0700 Subject: [PATCH 414/632] single version for build --- PIL/__init__.py | 6 ++++-- PIL/version.py | 2 ++ _imaging.c | 2 -- setup.py | 10 +++++++++- 4 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 PIL/version.py diff --git a/PIL/__init__.py b/PIL/__init__.py index b8a071db1..f418e9e03 100644 --- a/PIL/__init__.py +++ b/PIL/__init__.py @@ -11,8 +11,10 @@ # ;-) -VERSION = '1.1.7' # PIL version -PILLOW_VERSION = '4.2.0.dev0' # Pillow +from . import version + + +PILLOW_VERSION = version.__version__ __version__ = PILLOW_VERSION diff --git a/PIL/version.py b/PIL/version.py new file mode 100644 index 000000000..9c3d2f1a3 --- /dev/null +++ b/PIL/version.py @@ -0,0 +1,2 @@ +# Master version for Pillow +__version__ = '4.1.0' diff --git a/_imaging.c b/_imaging.c index 7c66a63bc..9ff706ced 100644 --- a/_imaging.c +++ b/_imaging.c @@ -71,8 +71,6 @@ * See the README file for information on usage and redistribution. */ -#define PILLOW_VERSION "4.2.0.dev0" - #include "Python.h" #ifdef HAVE_LIBZ diff --git a/setup.py b/setup.py index 51106692d..c2248c3b3 100755 --- a/setup.py +++ b/setup.py @@ -95,6 +95,12 @@ def _read(file): return fp.read() +def get_version(): + version_file = 'PIL/version.py' + with open(version_file, 'ra') as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + try: import _tkinter except (ImportError, OSError): @@ -102,7 +108,7 @@ except (ImportError, OSError): _tkinter = None NAME = 'Pillow' -PILLOW_VERSION = '4.2.0.dev0' +PILLOW_VERSION = get_version() JPEG_ROOT = None JPEG2K_ROOT = None ZLIB_ROOT = None @@ -578,6 +584,8 @@ class pil_build_ext(build_ext): if struct.unpack("h", "\0\1".encode('ascii'))[0] == 1: defs.append(("WORDS_BIGENDIAN", None)) + defs.append(("PILLOW_VERSION", '"%s"'%PILLOW_VERSION)) + exts = [(Extension("PIL._imaging", files, libraries=libs, From 4f1bab5c1b9ce3aa72233d518a68db22f1a759c0 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 10 May 2017 03:48:47 -0700 Subject: [PATCH 415/632] current version --- PIL/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/version.py b/PIL/version.py index 9c3d2f1a3..2233af6a3 100644 --- a/PIL/version.py +++ b/PIL/version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = '4.1.0' +__version__ = '4.2.0.dev0' From b53af906d797fea736966e87c47318b039005160 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 10 May 2017 11:54:58 +0100 Subject: [PATCH 416/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index abecc9df4..3c6280b2e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- CI: Added region for s3 deployment on appveyor #2515 + [wiredfool] + - Doc: Updated references to point to existing files #2507 [radarhere] From cdd2236dd20e3d9ce748fdf3eaeebd79ca500829 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 10 May 2017 04:43:08 -0700 Subject: [PATCH 417/632] Restore PIL version --- PIL/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/__init__.py b/PIL/__init__.py index f418e9e03..5603bb05f 100644 --- a/PIL/__init__.py +++ b/PIL/__init__.py @@ -13,7 +13,7 @@ from . import version - +VERSION = '1.1.7' # PIL Version PILLOW_VERSION = version.__version__ __version__ = PILLOW_VERSION From 67d6e007519e8ccd68772935a82c763bb15eba8c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 10 May 2017 04:59:37 -0700 Subject: [PATCH 418/632] py3x fixes --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c2248c3b3..9aa6fbf26 100755 --- a/setup.py +++ b/setup.py @@ -97,7 +97,7 @@ def _read(file): def get_version(): version_file = 'PIL/version.py' - with open(version_file, 'ra') as f: + with open(version_file, 'r') as f: exec(compile(f.read(), version_file, 'exec')) return locals()['__version__'] From 23ed3cf4c2f1c40ee6e6c0a8c267278b678fa793 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 11 May 2017 20:21:08 +0100 Subject: [PATCH 419/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3c6280b2e..ab5e91851 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Doc: Release Process Changes #2516 + [wiredfool] + - CI: Added region for s3 deployment on appveyor #2515 [wiredfool] From 9608e5050e772652739f74fcb9d5b4734490e7d8 Mon Sep 17 00:00:00 2001 From: adw1n Date: Fri, 12 May 2017 00:20:22 +0200 Subject: [PATCH 420/632] Fixed mistakes in error handling when PyArg_ParseTuple raises an exception. --- _webp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_webp.c b/_webp.c index c45d1ff77..70830ec8b 100644 --- a/_webp.c +++ b/_webp.c @@ -29,7 +29,7 @@ PyObject* WebPEncode_wrapper(PyObject* self, PyObject* args) if (!PyArg_ParseTuple(args, "s#iiifss#s#", (char**)&rgb, &size, &width, &height, &lossless, &quality_factor, &mode, &icc_bytes, &icc_size, &exif_bytes, &exif_size)) { - Py_RETURN_NONE; + return NULL; } if (strcmp(mode, "RGBA")==0){ if (size < width * height * 4){ @@ -145,7 +145,7 @@ PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) char* mode = "RGB"; if (!PyArg_ParseTuple(args, "S", &webp_string)) { - Py_RETURN_NONE; + return NULL; } if (!WebPInitDecoderConfig(&config)) { From 9385de58a75835170434dd572ad245041681045c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 12 May 2017 02:55:44 -0700 Subject: [PATCH 421/632] Remove WITH_DEBUG compilation flag, non-debug code relies on interface existence --- _imaging.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/_imaging.c b/_imaging.c index 7c66a63bc..af15cae91 100644 --- a/_imaging.c +++ b/_imaging.c @@ -96,8 +96,6 @@ #define WITH_THREADING /* "friendly" threading support */ #define WITH_UNSHARPMASK /* Kevin Cazabon's unsharpmask module */ -#define WITH_DEBUG /* extra debugging interfaces */ - #undef VERBOSE #define CLIP(x) ((x) <= 0 ? 0 : (x) < 256 ? (x) : 255) @@ -2922,8 +2920,6 @@ _getcodecstatus(PyObject* self, PyObject* args) /* -------------------------------------------------------------------- */ -#ifdef WITH_DEBUG - static PyObject* _save_ppm(ImagingObject* self, PyObject* args) { @@ -2939,7 +2935,6 @@ _save_ppm(ImagingObject* self, PyObject* args) return Py_None; } -#endif /* -------------------------------------------------------------------- */ @@ -3035,9 +3030,7 @@ static struct PyMethodDef methods[] = { {"new_array", (PyCFunction)_new_array, 1}, {"new_block", (PyCFunction)_new_block, 1}, -#ifdef WITH_DEBUG {"save_ppm", (PyCFunction)_save_ppm, 1}, -#endif {NULL, NULL} /* sentinel */ }; From eda1a1e88ec8854e5c95f9ee229990de4e937239 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 May 2017 23:20:34 +1000 Subject: [PATCH 422/632] Updated references to point to existing files [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index ab5e91851..4b56e85d7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2538,7 +2538,7 @@ Pre-fork import numpy, Image - im = Image.open('lena.jpg') + im = Image.open('hopper.jpg') a = numpy.asarray(im) # a is readonly From 6ce11c9e8ca7f1c9a39eb983cdf91994c5f45f6d Mon Sep 17 00:00:00 2001 From: adw1n Date: Fri, 12 May 2017 17:11:58 +0200 Subject: [PATCH 423/632] Added tests that call _webp.WebPEncode and _webp.WebPDecode with invalid number of arguments. --- Tests/test_file_webp.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index 88f2e5f5b..a15ca97df 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -77,6 +77,11 @@ class TestFileWebp(PillowTestCase): self.assertRaises(IOError, lambda: hopper("L").save(temp_file)) + def test_WebPEncode_with_invalid_args(self): + self.assertRaises(TypeError, _webp.WebPEncode) + + def test_WebPDecode_with_invalid_args(self): + self.assertRaises(TypeError, _webp.WebPDecode) if __name__ == '__main__': unittest.main() From 80806d349f498d35a1d5855180ac29eef3eb105a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 13 May 2017 14:26:52 +1000 Subject: [PATCH 424/632] Added append_images to PDF saving --- PIL/PdfImagePlugin.py | 163 ++++++++++++++++++++++------------------- Tests/test_file_pdf.py | 6 ++ 2 files changed, 94 insertions(+), 75 deletions(-) diff --git a/PIL/PdfImagePlugin.py b/PIL/PdfImagePlugin.py index b615fe1e0..a6ca0320a 100644 --- a/PIL/PdfImagePlugin.py +++ b/PIL/PdfImagePlugin.py @@ -20,7 +20,7 @@ # Image plugin for PDF images (output only). ## -from . import Image, ImageFile +from . import Image, ImageFile, ImageSequence from ._binary import i8 import io @@ -133,13 +133,24 @@ def _save(im, fp, filename, save_all=False): # # pages - numberOfPages = 1 + ims = [im] if save_all: - try: - numberOfPages = im.n_frames - except AttributeError: - # Image format does not have n_frames. It is a single frame image - pass + append_images = im.encoderinfo.get("append_images", []) + for append_im in append_images: + if append_im.mode != im.mode: + append_im = append_im.convert(im.mode) + append_im.encoderinfo = im.encoderinfo.copy() + ims.append(append_im) + numberOfPages = 0 + for im in ims: + im_numberOfPages = 1 + if save_all: + try: + im_numberOfPages = im.n_frames + except AttributeError: + # Image format does not have n_frames. It is a single frame image + pass + numberOfPages += im_numberOfPages pages = [str(pageNumber*3+4)+" 0 R" for pageNumber in range(0, numberOfPages)] @@ -151,90 +162,92 @@ def _save(im, fp, filename, save_all=False): Kids="["+"\n".join(pages)+"]") _endobj(fp) - for pageNumber in range(0, numberOfPages): - im.seek(pageNumber) + pageNumber = 0 + for imSequence in ims: + for im in ImageSequence.Iterator(imSequence): + # + # image - # - # image + op = io.BytesIO() - op = io.BytesIO() + if filter == "/ASCIIHexDecode": + if bits == 1: + # FIXME: the hex encoder doesn't support packed 1-bit + # images; do things the hard way... + data = im.tobytes("raw", "1") + im = Image.new("L", (len(data), 1), None) + im.putdata(data) + ImageFile._save(im, op, [("hex", (0, 0)+im.size, 0, im.mode)]) + elif filter == "/DCTDecode": + Image.SAVE["JPEG"](im, op, filename) + elif filter == "/FlateDecode": + ImageFile._save(im, op, [("zip", (0, 0)+im.size, 0, im.mode)]) + elif filter == "/RunLengthDecode": + ImageFile._save(im, op, [("packbits", (0, 0)+im.size, 0, im.mode)]) + else: + raise ValueError("unsupported PDF filter (%s)" % filter) - if filter == "/ASCIIHexDecode": - if bits == 1: - # FIXME: the hex encoder doesn't support packed 1-bit - # images; do things the hard way... - data = im.tobytes("raw", "1") - im = Image.new("L", (len(data), 1), None) - im.putdata(data) - ImageFile._save(im, op, [("hex", (0, 0)+im.size, 0, im.mode)]) - elif filter == "/DCTDecode": - Image.SAVE["JPEG"](im, op, filename) - elif filter == "/FlateDecode": - ImageFile._save(im, op, [("zip", (0, 0)+im.size, 0, im.mode)]) - elif filter == "/RunLengthDecode": - ImageFile._save(im, op, [("packbits", (0, 0)+im.size, 0, im.mode)]) - else: - raise ValueError("unsupported PDF filter (%s)" % filter) + # + # Get image characteristics - # - # Get image characteristics + width, height = im.size - width, height = im.size + xref.append(fp.tell()) + _obj( + fp, pageNumber*3+3, + Type="/XObject", + Subtype="/Image", + Width=width, # * 72.0 / resolution, + Height=height, # * 72.0 / resolution, + Length=len(op.getvalue()), + Filter=filter, + BitsPerComponent=bits, + DecodeParams=params, + ColorSpace=colorspace) - xref.append(fp.tell()) - _obj( - fp, pageNumber*3+3, - Type="/XObject", - Subtype="/Image", - Width=width, # * 72.0 / resolution, - Height=height, # * 72.0 / resolution, - Length=len(op.getvalue()), - Filter=filter, - BitsPerComponent=bits, - DecodeParams=params, - ColorSpace=colorspace) + fp.write("stream\n") + fp.fp.write(op.getvalue()) + fp.write("\nendstream\n") - fp.write("stream\n") - fp.fp.write(op.getvalue()) - fp.write("\nendstream\n") + _endobj(fp) - _endobj(fp) + # + # page - # - # page + xref.append(fp.tell()) + _obj(fp, pageNumber*3+4) + fp.write( + "<<\n/Type /Page\n/Parent 2 0 R\n" + "/Resources <<\n/ProcSet [ /PDF %s ]\n" + "/XObject << /image %d 0 R >>\n>>\n" + "/MediaBox [ 0 0 %d %d ]\n/Contents %d 0 R\n>>\n" % ( + procset, + pageNumber*3+3, + int(width * 72.0 / resolution), + int(height * 72.0 / resolution), + pageNumber*3+5)) + _endobj(fp) - xref.append(fp.tell()) - _obj(fp, pageNumber*3+4) - fp.write( - "<<\n/Type /Page\n/Parent 2 0 R\n" - "/Resources <<\n/ProcSet [ /PDF %s ]\n" - "/XObject << /image %d 0 R >>\n>>\n" - "/MediaBox [ 0 0 %d %d ]\n/Contents %d 0 R\n>>\n" % ( - procset, - pageNumber*3+3, - int(width * 72.0 / resolution), - int(height * 72.0 / resolution), - pageNumber*3+5)) - _endobj(fp) + # + # page contents - # - # page contents + op = TextWriter(io.BytesIO()) - op = TextWriter(io.BytesIO()) + op.write( + "q %d 0 0 %d 0 0 cm /image Do Q\n" % ( + int(width * 72.0 / resolution), + int(height * 72.0 / resolution))) - op.write( - "q %d 0 0 %d 0 0 cm /image Do Q\n" % ( - int(width * 72.0 / resolution), - int(height * 72.0 / resolution))) + xref.append(fp.tell()) + _obj(fp, pageNumber*3+5, Length=len(op.fp.getvalue())) - xref.append(fp.tell()) - _obj(fp, pageNumber*3+5, Length=len(op.fp.getvalue())) + fp.write("stream\n") + fp.fp.write(op.fp.getvalue()) + fp.write("\nendstream\n") - fp.write("stream\n") - fp.fp.write(op.fp.getvalue()) - fp.write("\nendstream\n") + _endobj(fp) - _endobj(fp) + pageNumber += 1 # # trailer diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index cfefe2f9e..2caa4cdab 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -74,6 +74,12 @@ class TestFilePdf(PillowTestCase): self.assertTrue(os.path.isfile(outfile)) self.assertGreater(os.path.getsize(outfile), 0) + # Append images + im.save(outfile, save_all=True, append_images=[hopper()]) + + self.assertTrue(os.path.isfile(outfile)) + self.assertGreater(os.path.getsize(outfile), 0) + if __name__ == '__main__': unittest.main() From 2c9eb17fdcca061635de9e5462d31c2844ea3037 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 13 May 2017 12:49:47 +0300 Subject: [PATCH 425/632] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 4b56e85d7..8e8549b44 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Flake8 #2460 + [radarhere] + - Doc: Release Process Changes #2516 [wiredfool] From f785f76961548ed6a1f9f697b2f26ff318326960 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 13 May 2017 13:21:20 +0300 Subject: [PATCH 426/632] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 8e8549b44..049e4592d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Set executable flag on scripts with shebang line #2295 + [radarhere] + - Flake8 #2460 [radarhere] From a2cb304f62e060fc8f8145aafc31143fd941dc9e Mon Sep 17 00:00:00 2001 From: Hin-Tak Leung Date: Mon, 8 May 2017 21:19:16 +0100 Subject: [PATCH 427/632] use PNG as intermediate format for viewing --- PIL/ImageShow.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PIL/ImageShow.py b/PIL/ImageShow.py index 33f059d74..d03dc4627 100644 --- a/PIL/ImageShow.py +++ b/PIL/ImageShow.py @@ -115,7 +115,7 @@ if sys.platform == "win32": elif sys.platform == "darwin": class MacViewer(Viewer): - format = "BMP" + format = "PNG" def get_command(self, file, **options): # on darwin open returns immediately resulting in the temp @@ -142,6 +142,8 @@ else: return None class UnixViewer(Viewer): + format = "PNG" + def show_file(self, file, **options): command, executable = self.get_command_ex(file, **options) command = "(%s %s; rm -f %s)&" % (command, quote(file), From 74da5878c5b42ef8fee193bf4c3940611674cec9 Mon Sep 17 00:00:00 2001 From: Hin-Tak Leung Date: Wed, 10 May 2017 04:24:01 +0100 Subject: [PATCH 428/632] Do not down-convert if image is RGBA when showing. The down-convert code would convert all RGB-based modes (P RGB RGBX RGBA CMYK YCbCr LAB HSV) to RGB; but png can handle it! --- PIL/ImageShow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/ImageShow.py b/PIL/ImageShow.py index d03dc4627..23e0126a7 100644 --- a/PIL/ImageShow.py +++ b/PIL/ImageShow.py @@ -69,7 +69,7 @@ class Viewer(object): # FIXME: auto-contrast if max() > 255? else: base = Image.getmodebase(image.mode) - if base != image.mode and image.mode != "1": + if base != image.mode and image.mode != "1" and image.mode != "RGBA": image = image.convert(base) return self.show_image(image, **options) From 9f8aeb5d8e9405fcda137b030b16f30efa18278e Mon Sep 17 00:00:00 2001 From: Hin-Tak Leung Date: Wed, 10 May 2017 21:07:31 +0100 Subject: [PATCH 429/632] put compress_level=1 inside Image._dump() Better alternative to setting compress_level=1 than the secret handshake in the last attempt. The last in a series of changes to fix https://github.com/python-pillow/Pillow/issues/2508 --- PIL/Image.py | 6 +++--- PIL/ImageShow.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index c11c4cb3f..3026d1388 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -577,7 +577,7 @@ class Image(object): self.pyaccess = None self.readonly = 0 - def _dump(self, file=None, format=None): + def _dump(self, file=None, format=None, **options): import tempfile suffix = '' if format: @@ -588,11 +588,11 @@ class Image(object): self.load() if not format or format == "PPM": - self.im.save_ppm(file) + self.im.save_ppm(file, **options) else: if not file.endswith(format): file = file + "." + format - self.save(file, format) + self.save(file, format, **options) return file def __eq__(self, other): diff --git a/PIL/ImageShow.py b/PIL/ImageShow.py index 23e0126a7..6ea574d73 100644 --- a/PIL/ImageShow.py +++ b/PIL/ImageShow.py @@ -87,7 +87,7 @@ class Viewer(object): def save_image(self, image): """Save to temporary file, and return filename""" - return image._dump(format=self.get_format(image)) + return image._dump(format=self.get_format(image), compress_level=1) def show_image(self, image, **options): """Display given image""" From dd5bfec11ce11fe63414a7332cf80504bdd27918 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 13 May 2017 14:07:18 +0100 Subject: [PATCH 430/632] save_ppm doesn't take kwargs --- PIL/Image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/Image.py b/PIL/Image.py index 3026d1388..c8315ba76 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -588,7 +588,7 @@ class Image(object): self.load() if not format or format == "PPM": - self.im.save_ppm(file, **options) + self.im.save_ppm(file) else: if not file.endswith(format): file = file + "." + format From 86bde427c30eb856e733046602185e618cf89438 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 13 May 2017 14:08:08 +0100 Subject: [PATCH 431/632] refactor out options --- PIL/ImageShow.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PIL/ImageShow.py b/PIL/ImageShow.py index 6ea574d73..a0978ab39 100644 --- a/PIL/ImageShow.py +++ b/PIL/ImageShow.py @@ -77,6 +77,7 @@ class Viewer(object): # hook methods format = None + options = {} def get_format(self, image): """Return format name, or None to save as PGM/PPM""" @@ -87,7 +88,7 @@ class Viewer(object): def save_image(self, image): """Save to temporary file, and return filename""" - return image._dump(format=self.get_format(image), compress_level=1) + return image._dump(format=self.get_format(image), **self.options) def show_image(self, image, **options): """Display given image""" @@ -116,6 +117,7 @@ elif sys.platform == "darwin": class MacViewer(Viewer): format = "PNG" + options = {'compress-level': 1} def get_command(self, file, **options): # on darwin open returns immediately resulting in the temp @@ -143,6 +145,7 @@ else: class UnixViewer(Viewer): format = "PNG" + options = {'compress-level': 1} def show_file(self, file, **options): command, executable = self.get_command_ex(file, **options) From 38613f72dac69ba718dbcd8d3a45fa542d3f2ee3 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 13 May 2017 14:26:25 +0100 Subject: [PATCH 432/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 049e4592d..41f6a49fc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Fix return value on parameter parse error in _webp.c #2521 + [adw1n] + - Set executable flag on scripts with shebang line #2295 [radarhere] From 7f3a9c43da2e17fc6b3fd5f7a2e8017c7ac103c9 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 13 May 2017 14:28:48 +0100 Subject: [PATCH 433/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 41f6a49fc..21aa7fa89 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Remove WITH_DEBUG compilation flag #2522 + [wiredfool] + - Fix return value on parameter parse error in _webp.c #2521 [adw1n] From 82c51e4df9c972d631b759b65070102db0372fae Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 13 May 2017 17:00:53 +0300 Subject: [PATCH 434/632] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 21aa7fa89..993ef5eaf 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Use PNG for Image.show() #2527 + [HinTak, wiredfool] + - Remove WITH_DEBUG compilation flag #2522 [wiredfool] From 94ca4f2db26c8cc468882c7efd21e54d4e2b1783 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 13 May 2017 18:25:14 +0300 Subject: [PATCH 435/632] Disable Codecov PR comment https://docs.codecov.io/v4.3.6/docs/pull-request-comments --- codecov.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 codecov.yml diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 000000000..db2472009 --- /dev/null +++ b/codecov.yml @@ -0,0 +1 @@ +comment: off From e763c2281fbd81a3e341c4a8b280adf398e07ffd Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Fri, 12 May 2017 18:48:03 -0400 Subject: [PATCH 436/632] Update ImageFile.py --- PIL/ImageFile.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 124a3a347..7c5465f7d 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -380,11 +380,8 @@ class Parser(object): # attempt to open this file try: - try: - fp = io.BytesIO(self.data) + with io.BytesIO(self.data) as fp: im = Image.open(fp) - finally: - fp.close() # explicitly close the virtual file except IOError: # traceback.print_exc() pass # not enough data @@ -432,12 +429,11 @@ class Parser(object): if self.data: # incremental parsing not possible; reopen the file # not that we have all data - try: - fp = io.BytesIO(self.data) - self.image = Image.open(fp) - finally: - self.image.load() - fp.close() # explicitly close the virtual file + with io.BytesIO(self.data) as fp: + try: + self.image = Image.open(fp) + finally: + self.image.load() return self.image From a6874f01ac3634485f848b7c5ec7ea9172d2da82 Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Sat, 13 May 2017 12:07:05 -0400 Subject: [PATCH 437/632] Add test --- Tests/test_imagefile.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index d44f5b2e6..d150d996d 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -95,6 +95,11 @@ class TestImageFile(PillowTestCase): def test_raise_ioerror(self): self.assertRaises(IOError, lambda: ImageFile.raise_ioerror(1)) + def test_raise_typeerror(self): + with self.assertRaises(TypeError): + parser = ImageFile.Parser() + parser.feed(1) + def test_truncated_with_errors(self): if "zip_encoder" not in codecs: self.skipTest("PNG (zlib) encoder not available") From bb7596d8b6a6accb7ab6df0df3756fef5f70acdc Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 14 May 2017 12:08:39 +0300 Subject: [PATCH 438/632] Fix option typo --- PIL/ImageShow.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/ImageShow.py b/PIL/ImageShow.py index a0978ab39..f59ba9bad 100644 --- a/PIL/ImageShow.py +++ b/PIL/ImageShow.py @@ -117,7 +117,7 @@ elif sys.platform == "darwin": class MacViewer(Viewer): format = "PNG" - options = {'compress-level': 1} + options = {'compress_level': 1} def get_command(self, file, **options): # on darwin open returns immediately resulting in the temp @@ -145,7 +145,7 @@ else: class UnixViewer(Viewer): format = "PNG" - options = {'compress-level': 1} + options = {'compress_level': 1} def show_file(self, file, **options): command, executable = self.get_command_ex(file, **options) From 18dcc438c174b4057af96e816b0847c1d21ed514 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 15 May 2017 19:56:16 +1000 Subject: [PATCH 439/632] Fixed URL --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index a4a21e697..84ac7135e 100644 --- a/tox.ini +++ b/tox.ini @@ -1,4 +1,4 @@ -# Tox (https://testrun.org/tox/latest/) is a tool for running tests +# Tox (https://tox.readthedocs.io/en/latest/) is a tool for running tests # in multiple virtualenvs. This configuration file will run the # test suite on all supported python versions. To use it, "pip install tox" # and then run "tox" from this directory. From ddb40228fdb6c2936c17a5c3291f370222a58515 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 15 May 2017 13:08:52 +0300 Subject: [PATCH 440/632] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 993ef5eaf..104e8a820 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Test: Use Codecov for coverage #2528 + [hugovk] + - Use PNG for Image.show() #2527 [HinTak, wiredfool] From f60095f9735d6b58763ab2d8b5dfd892a9d207e1 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 15 May 2017 15:22:38 +0300 Subject: [PATCH 441/632] Ignore test_images downloaded for tests --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 95ed4bac5..aa45f946f 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,9 @@ htmlcov/ nosetests.xml coverage.xml +# Test files +test_images + # Translations *.mo From 3db194476245eeafa2c78a7f680cff15082d776a Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 15 May 2017 17:09:29 +0300 Subject: [PATCH 442/632] Test drawing polygons with sloped and flat lines --- Tests/images/imagedraw_polygon_kite.png | Bin 0 -> 647 bytes Tests/test_imagedraw.py | 17 +++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 Tests/images/imagedraw_polygon_kite.png diff --git a/Tests/images/imagedraw_polygon_kite.png b/Tests/images/imagedraw_polygon_kite.png new file mode 100644 index 0000000000000000000000000000000000000000..e48d6660fe2202e2deec1d5843beb4dfc39d4aec GIT binary patch literal 647 zcmV;20(kw2P)4PPC0GZ2i8AcR*IR=SQEnYFvb{Tj4{TTVmWKiz(qN~j#S=s zygs*#s!`5QN_$bIt)rjm<>=Ru$~h(JAI`n31E7#&S^t8nUm%RjtE`itkUv>XQ1y!? zaXFKv0t&g2H3X{uMloDIWa)xJ)@4nDst1w5Wm=XIP{^n(5m5Dj0=O*7vIYv-k|hqR z9()y-Az5ZYArrE;f~wzW375Vs`=F4ftYe_+H=W0&Cd&~hq##QLR6T)7T&HDu1clDY zQU_HwhwG3m*PzgLS*AdhP2k!qD+VaEOO{zsWuv&Z$O;Au3CnT;s%!|Cq^zi*kc=#M zpvwAj3CIc$3N6WU4XUgY*SxHIK%p5~VL+Aj;2M^7At*E;DZvI zy~ov%MNnmw^;7el_0b$6r6;8)XA`$$b>m;d?|MFGwPhg^<0ts%>HgnvKo+`|7_T}E zT+f=3g>EBu`<2q6Yw%05&?UsKzPmGe-%v&ticRd^JJJ(t9fW0}ki;%sMKiZPYnLn( ziP()R|EAZJZkL4u5W8-*^2$2+bFz?MVs|}ZvH0wcf-K~Yn2Cv=A-4X!p{6Y4g_y1R z?IR}gjI;?^$T%^h(~>17wXcIMS;!_aTeJDwIx)e$XpG82rihuCL{D?XWcSaqE(=*8 z=0+CkCnmnX57{^HbY!x>C h4l>3VV~nxDeF3HkH?Ycoy&M1l002ovPDHLkV1ib~E${#U literal 0 HcmV?d00001 diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 441a34a88..11e990bcb 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -30,6 +30,8 @@ BBOX2 = [X0, Y0, X1, Y1] POINTS1 = [(10, 10), (20, 40), (30, 30)] POINTS2 = [10, 10, 20, 40, 30, 30] +KITE_POINTS = [(10, 50), (70, 10), (90, 50), (70, 90), (10, 50)] + class TestImageDraw(PillowTestCase): @@ -267,6 +269,21 @@ class TestImageDraw(PillowTestCase): def test_polygon2(self): self.helper_polygon(POINTS2) + def test_polygon_kite(self): + # Test drawing lines of different gradients (dx>dy, dy>dx) and + # vertical (dx==0) and horizontal (dy==0) lines + # Arrange + im = Image.new("RGB", (W, H)) + draw = ImageDraw.Draw(im) + + # Act + draw.polygon(KITE_POINTS, fill="blue", outline="yellow") + del draw + + # Assert + self.assert_image_equal( + im, Image.open("Tests/images/imagedraw_polygon_kite.png")) + def helper_rectangle(self, bbox): # Arrange im = Image.new("RGB", (W, H)) From d4a350cd79e07578356f99276aaa9b662b4593b7 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 15 May 2017 18:04:33 +0300 Subject: [PATCH 443/632] Test chord in RGB and L modes --- Tests/images/imagedraw_chord.png | Bin 326 -> 0 bytes Tests/images/imagedraw_chord_RGB.png | Bin 0 -> 324 bytes Tests/test_imagedraw.py | 17 ++++++++++------- 3 files changed, 10 insertions(+), 7 deletions(-) delete mode 100644 Tests/images/imagedraw_chord.png create mode 100644 Tests/images/imagedraw_chord_RGB.png diff --git a/Tests/images/imagedraw_chord.png b/Tests/images/imagedraw_chord.png deleted file mode 100644 index db3b35310235b1c7ab6e368d08f3bf89b9836777..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^DImUz33VYkl1=nX|dqBVT;otL=PqD@Cub z;$2<(Q7d|t+$rnTn(Kcp*>>*yf#>4CDh^JY@$Oe#xmVO0!f&cvEFGQ N0Z&&ymvv4FO#l*njdTD2 diff --git a/Tests/images/imagedraw_chord_RGB.png b/Tests/images/imagedraw_chord_RGB.png new file mode 100644 index 0000000000000000000000000000000000000000..af6fc766007870d6dd75c4e0b673415af90459a1 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^DImiL4E4Qefit@`FJTWf4%EDt3lk&SPw>2k|{! L{an^LB{Ts5P4tBx literal 0 HcmV?d00001 diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 11e990bcb..66a92b01d 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -94,10 +94,11 @@ class TestImageDraw(PillowTestCase): self.assert_image_equal( im, Image.open("Tests/images/imagedraw_bitmap.png")) - def helper_chord(self, bbox, start, end): + def helper_chord(self, mode, bbox, start, end): # Arrange - im = Image.new("RGB", (W, H)) + im = Image.new(mode, (W, H)) draw = ImageDraw.Draw(im) + expected = "Tests/images/imagedraw_chord_{}.png".format(mode) # Act draw.chord(bbox, start, end, fill="red", outline="yellow") @@ -105,15 +106,17 @@ class TestImageDraw(PillowTestCase): # Assert self.assert_image_similar( - im, Image.open("Tests/images/imagedraw_chord.png"), 1) + im, Image.open(expected), 1) def test_chord1(self): - self.helper_chord(BBOX1, 0, 180) - self.helper_chord(BBOX1, 0.5, 180.4) + for mode in ["RGB", "L"]: + self.helper_chord(mode, BBOX1, 0, 180) + self.helper_chord(mode, BBOX1, 0.5, 180.4) def test_chord2(self): - self.helper_chord(BBOX2, 0, 180) - self.helper_chord(BBOX2, 0.5, 180.4) + for mode in ["RGB", "L"]: + self.helper_chord(mode, BBOX2, 0, 180) + self.helper_chord(mode, BBOX2, 0.5, 180.4) def helper_ellipse(self, bbox): # Arrange From de1f156fcda5572ff0c0ac0dc2f773fc4f41a7de Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 15 May 2017 18:13:36 +0300 Subject: [PATCH 444/632] Add test file --- Tests/images/imagedraw_chord_L.png | Bin 0 -> 257 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/imagedraw_chord_L.png diff --git a/Tests/images/imagedraw_chord_L.png b/Tests/images/imagedraw_chord_L.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a0078d042113d2b6eddb217c68bd678d2d451b GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^DIm-NBp5 Date: Mon, 15 May 2017 18:23:00 +0300 Subject: [PATCH 445/632] Test ellipse in RGB and L modes --- Tests/images/imagedraw_ellipse_L.png | Bin 0 -> 359 bytes ...draw_ellipse.png => imagedraw_ellipse_RGB.png} | Bin Tests/test_imagedraw.py | 13 ++++++++----- 3 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 Tests/images/imagedraw_ellipse_L.png rename Tests/images/{imagedraw_ellipse.png => imagedraw_ellipse_RGB.png} (100%) diff --git a/Tests/images/imagedraw_ellipse_L.png b/Tests/images/imagedraw_ellipse_L.png new file mode 100644 index 0000000000000000000000000000000000000000..e47e6e441c16afcc1edb2f7c2a715fd36469c096 GIT binary patch literal 359 zcmV-t0hs=YP)m&+JP z12C;W<_gD!v>jjv@;Dyk2vNXTkamoCV+_jk90SvS7<$r47y^J3MkbLABaDJ*hCz`@ zG(&p?q&W;=;!!xnm>kC`l6XN>TPVaVmV6rq@rxzgG>IRCd!5h9X%R@FBLE%ayOUf2 zsm&I>gCwc7g!%uWCxHYq5Hc4Z)%W)ym9v4k#m?@PiOf;unlM#dMitOvcxMcx_Q01##LUPo^@7rs&hJvn-&8Q)gS?d{$T( zYa?MUa5`bWxm&>{TcVXSc;B^gKC1saM^O|-Q4~d^^#U`BI$YHAaJK*e002ovPDHLk FV1jb^l;r>b literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_ellipse.png b/Tests/images/imagedraw_ellipse_RGB.png similarity index 100% rename from Tests/images/imagedraw_ellipse.png rename to Tests/images/imagedraw_ellipse_RGB.png diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 66a92b01d..e9c82872d 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -118,10 +118,11 @@ class TestImageDraw(PillowTestCase): self.helper_chord(mode, BBOX2, 0, 180) self.helper_chord(mode, BBOX2, 0.5, 180.4) - def helper_ellipse(self, bbox): + def helper_ellipse(self, mode, bbox): # Arrange - im = Image.new("RGB", (W, H)) + im = Image.new(mode, (W, H)) draw = ImageDraw.Draw(im) + expected = "Tests/images/imagedraw_ellipse_{}.png".format(mode) # Act draw.ellipse(bbox, fill="green", outline="blue") @@ -129,13 +130,15 @@ class TestImageDraw(PillowTestCase): # Assert self.assert_image_similar( - im, Image.open("Tests/images/imagedraw_ellipse.png"), 1) + im, Image.open(expected), 1) def test_ellipse1(self): - self.helper_ellipse(BBOX1) + for mode in ["RGB", "L"]: + self.helper_ellipse(mode, BBOX1) def test_ellipse2(self): - self.helper_ellipse(BBOX2) + for mode in ["RGB", "L"]: + self.helper_ellipse(mode, BBOX2) def test_ellipse_edge(self): # Arrange From ae9181f0a4d3011335cb0a2890b0d0ff007d748c Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 15 May 2017 18:24:12 +0300 Subject: [PATCH 446/632] Test polygons in RGB and L modes --- Tests/images/imagedraw_polygon_kite_L.png | Bin 0 -> 499 bytes ...ite.png => imagedraw_polygon_kite_RGB.png} | Bin Tests/test_imagedraw.py | 20 ++++++++++-------- 3 files changed, 11 insertions(+), 9 deletions(-) create mode 100644 Tests/images/imagedraw_polygon_kite_L.png rename Tests/images/{imagedraw_polygon_kite.png => imagedraw_polygon_kite_RGB.png} (100%) diff --git a/Tests/images/imagedraw_polygon_kite_L.png b/Tests/images/imagedraw_polygon_kite_L.png new file mode 100644 index 0000000000000000000000000000000000000000..241d86bf40d72676f7e2652e42a9d0bea15f9f9f GIT binary patch literal 499 zcmVFD&LA4 zzc)90)l2XT@Os*}lqI(e%94KuEGadKhe1u!FknR~NSq7`k_!VCl&r+hAS; z%U~uEFrcRl5;=oGB4R*C=_NZD^b#QhT1q3?#9*hS`A;6r&(G&eSft6er>lKW9{r^~ zm|bst_w9NNmp5QGeTDn=WR#%C>{%HvYy4D#7_()!a@}`X5|o%7JIG-#ypSNnY}nP0 z=aaPr4Mu;`nw%MLB?vI`)9>sY?~zc&s5=tV-ilK~2_xdy, dy>dx) and # vertical (dx==0) and horizontal (dy==0) lines - # Arrange - im = Image.new("RGB", (W, H)) - draw = ImageDraw.Draw(im) + for mode in ["RGB", "L"]: + # Arrange + im = Image.new(mode, (W, H)) + draw = ImageDraw.Draw(im) + expected = "Tests/images/imagedraw_polygon_kite_{}.png".format(mode) - # Act - draw.polygon(KITE_POINTS, fill="blue", outline="yellow") - del draw + # Act + draw.polygon(KITE_POINTS, fill="blue", outline="yellow") + del draw - # Assert - self.assert_image_equal( - im, Image.open("Tests/images/imagedraw_polygon_kite.png")) + # Assert + self.assert_image_equal( + im, Image.open(expected)) def helper_rectangle(self, bbox): # Arrange From 2968313bb61a595460181f4a9d14593c1448efc2 Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 15 May 2017 21:17:33 +0300 Subject: [PATCH 447/632] Remove unrunnable code: ImagingDrawWideLine is only called (in _imaging.c) when (width <= 1) is false --- libImaging/Draw.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/libImaging/Draw.c b/libImaging/Draw.c index ca26282be..72c1599be 100644 --- a/libImaging/Draw.c +++ b/libImaging/Draw.c @@ -605,11 +605,6 @@ ImagingDrawWideLine(Imaging im, int x0, int y0, int x1, int y1, DRAWINIT(); - if (width <= 1) { - draw->line(im, x0, y0, x1, y1, ink); - return 0; - } - dx = x1-x0; dy = y1-y0; if (dx == 0 && dy == 0) { From 5871b7a5ba483907a527907f32c5c52524b33df0 Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 15 May 2017 21:32:54 +0300 Subject: [PATCH 448/632] Test drawing a wide "line" from one point to another just draws a single point --- Tests/images/imagedraw_wide_line_dot.png | Bin 0 -> 116 bytes Tests/test_imagedraw.py | 14 ++++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 Tests/images/imagedraw_wide_line_dot.png diff --git a/Tests/images/imagedraw_wide_line_dot.png b/Tests/images/imagedraw_wide_line_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f0e789c5dfe76ba193f53005bc35a82e306027 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^DIme2O0uLsBt3u)enFlU0 Date: Mon, 15 May 2017 21:44:28 +0300 Subject: [PATCH 449/632] Test drawing a rectangle bigger than the image --- Tests/images/imagedraw_big_rectangle.png | Bin 0 -> 290 bytes Tests/test_imagedraw.py | 17 +++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 Tests/images/imagedraw_big_rectangle.png diff --git a/Tests/images/imagedraw_big_rectangle.png b/Tests/images/imagedraw_big_rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..fa2370b28736b1ca060e8f6a8d4be89cd64e28c3 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^DIm}q Date: Mon, 15 May 2017 22:58:51 +0300 Subject: [PATCH 450/632] Test limits of arc/ellipse's start and end --- Tests/images/imagedraw_arc_end_le_start.png | Bin 0 -> 218 bytes Tests/images/imagedraw_arc_no_loops.png | Bin 0 -> 384 bytes Tests/test_imagedraw.py | 33 ++++++++++++++++++-- 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 Tests/images/imagedraw_arc_end_le_start.png create mode 100644 Tests/images/imagedraw_arc_no_loops.png diff --git a/Tests/images/imagedraw_arc_end_le_start.png b/Tests/images/imagedraw_arc_end_le_start.png new file mode 100644 index 0000000000000000000000000000000000000000..aee48e1c6bb7e6c04513e728aa43c61ab03c4657 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^DImtq3>U{-hS)9CgZ-hT&vd#zJ4M3 z?)%ki-CqM{od|xkp-(%WE?Zx44>wDrPHyVk5-4*-sQhh>vqjpm6?loyK6JKsD zixZo<^YNxN4H1ohlYgqSsU5pjA1T}^D!>h~3Pzr~%Xt2l*A27h)1QEZJYD@<);T3K F0RYYuS9bsa literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_arc_no_loops.png b/Tests/images/imagedraw_arc_no_loops.png new file mode 100644 index 0000000000000000000000000000000000000000..e45ad57a5c382d5b01f06a841cbe164acdf76fed GIT binary patch literal 384 zcmV-`0e}99P)w000000002D9oYeXwANmK;5hQ5 zCMWpa(Th56er&XyfuECqW9FZH_d~PC>owKH$|h;8U0$1Vf3S){6Wgt?3G>;cvT4&; zzOTs>Si7(J(N`@iEBCl@zXtto?mxWP@s(cIGJRDDIwC{=)38EQr#eagRVQNiB%?0y zT&r_fo%-f+WCbWIpl4at&cRd7R7GQTOyx8TP*#Al0+bb?tN>*NC@Vl&0iDaLc3)a8 z&mYyodFqfxS*hxri5@Fw8d6q;gR4S@TPg%yQ$E?1?B4OjpIlUG4?${L;V83BNmHlUzm!566$^ifX e00000OZf&4$QD(^?NrJD0000 Date: Mon, 15 May 2017 22:59:25 +0300 Subject: [PATCH 451/632] Remove unexposed and unused code --- libImaging/Draw.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/libImaging/Draw.c b/libImaging/Draw.c index 72c1599be..65ab34a66 100644 --- a/libImaging/Draw.c +++ b/libImaging/Draw.c @@ -1025,20 +1025,6 @@ ImagingOutlineCurve(ImagingOutline outline, float x1, float y1, return 0; } -int -ImagingOutlineCurve2(ImagingOutline outline, float cx, float cy, - float x3, float y3) -{ - /* add bezier curve based on three control points (as - in the Flash file format) */ - - return ImagingOutlineCurve( - outline, - (outline->x + cx + cx)/3, (outline->y + cy + cy)/3, - (cx + cx + x3)/3, (cy + cy + y3)/3, - x3, y3); -} - int ImagingOutlineClose(ImagingOutline outline) { From 08c72a1720501900caef086bfbd1b96f5564541f Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 16 May 2017 10:33:38 +0300 Subject: [PATCH 452/632] flake8 --- PIL/ImageDraw.py | 1 + Tests/test_imagedraw.py | 13 ++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index ddf669f78..71e29ee48 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -283,6 +283,7 @@ def Draw(im, mode=None): except AttributeError: return ImageDraw(im, mode) + # experimental access to the outline API try: Outline = Image.core.outline diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 0166818d2..2ca5d0882 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -136,8 +136,7 @@ class TestImageDraw(PillowTestCase): del draw # Assert - self.assert_image_similar( - im, Image.open(expected), 1) + self.assert_image_similar(im, Image.open(expected), 1) def test_chord1(self): for mode in ["RGB", "L"]: @@ -160,8 +159,7 @@ class TestImageDraw(PillowTestCase): del draw # Assert - self.assert_image_similar( - im, Image.open(expected), 1) + self.assert_image_similar(im, Image.open(expected), 1) def test_ellipse1(self): for mode in ["RGB", "L"]: @@ -313,15 +311,15 @@ class TestImageDraw(PillowTestCase): # Arrange im = Image.new(mode, (W, H)) draw = ImageDraw.Draw(im) - expected = "Tests/images/imagedraw_polygon_kite_{}.png".format(mode) + expected = "Tests/images/imagedraw_polygon_kite_{}.png".format( + mode) # Act draw.polygon(KITE_POINTS, fill="blue", outline="yellow") del draw # Assert - self.assert_image_equal( - im, Image.open(expected)) + self.assert_image_equal(im, Image.open(expected)) def helper_rectangle(self, bbox): # Arrange @@ -564,5 +562,6 @@ class TestImageDraw(PillowTestCase): # Assert self.assert_image_similar(im, Image.open(expected), 1) + if __name__ == '__main__': unittest.main() From 79b251ab802608917e4ed4162c091d3fe447bdb7 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 17 May 2017 17:13:09 +0300 Subject: [PATCH 453/632] [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 104e8a820..dda1ba14c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Raise TypeError and not also UnboundLocalError in ImageFile.Parser() #2525 + [joshblum] + - Test: Use Codecov for coverage #2528 [hugovk] From 13824d4d70501d55f681c73f2d0708c0b698a965 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 18 May 2017 19:08:20 +1000 Subject: [PATCH 454/632] Updated freetype to 2.8 --- winbuild/config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/config.py b/winbuild/config.py index b5a762d12..2b0310b4d 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -33,9 +33,9 @@ libs = { 'dir': 'tiff-4.0.7', }, 'freetype': { - 'url': 'https://download.savannah.gnu.org/releases/freetype/freetype-2.7.1.tar.gz', - 'filename': PILLOW_DEPENDS_DIR + 'freetype-2.7.1.tar.gz', - 'dir': 'freetype-2.7.1', + 'url': 'https://download.savannah.gnu.org/releases/freetype/freetype-2.8.tar.gz', + 'filename': PILLOW_DEPENDS_DIR + 'freetype-2.8.tar.gz', + 'dir': 'freetype-2.8', }, 'lcms': { 'url': SF_MIRROR+'/project/lcms/lcms/2.7/lcms2-2.7.zip', From 875d2039e9fefa23697f4266e6a7394ced6951e4 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 18 May 2017 14:06:19 +0300 Subject: [PATCH 455/632] [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index dda1ba14c..e7fa7a67c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Update FreeType to 2.8 + [radarhere] + - Raise TypeError and not also UnboundLocalError in ImageFile.Parser() #2525 [joshblum] From 3fa2fa54486eb91bf03341f4754a8104cebaca9f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 20 May 2017 20:43:32 +1000 Subject: [PATCH 456/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index e7fa7a67c..9233fb918 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,7 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ -- Update FreeType to 2.8 +- Update FreeType to 2.8 #2535 [radarhere] - Raise TypeError and not also UnboundLocalError in ImageFile.Parser() #2525 @@ -18,7 +18,7 @@ Changelog (Pillow) - Remove WITH_DEBUG compilation flag #2522 [wiredfool] - + - Fix return value on parameter parse error in _webp.c #2521 [adw1n] @@ -30,12 +30,12 @@ Changelog (Pillow) - Doc: Release Process Changes #2516 [wiredfool] - + - CI: Added region for s3 deployment on appveyor #2515 [wiredfool] - + - Doc: Updated references to point to existing files #2507 - [radarhere] + [radarhere] - Return copy on Image crop if crop dimensions match the image #2471 [radarhere] From e40f32ab7dab0610e7a3880375e883d8eedd5afc Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 May 2017 19:34:50 +1000 Subject: [PATCH 457/632] Updated libtiff to 4.0.8 --- winbuild/config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/config.py b/winbuild/config.py index 2b0310b4d..177bb66b5 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -28,9 +28,9 @@ libs = { 'dir': 'jpeg-9b', }, 'tiff': { - 'url': 'ftp://download.osgeo.org/libtiff/tiff-4.0.7.zip', - 'filename': PILLOW_DEPENDS_DIR + 'tiff-4.0.7.zip', - 'dir': 'tiff-4.0.7', + 'url': 'ftp://download.osgeo.org/libtiff/tiff-4.0.8.zip', + 'filename': PILLOW_DEPENDS_DIR + 'tiff-4.0.8.zip', + 'dir': 'tiff-4.0.8', }, 'freetype': { 'url': 'https://download.savannah.gnu.org/releases/freetype/freetype-2.8.tar.gz', From 59a3e47e4efb2f3db2c873ef96ba6c7efa908556 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 22 May 2017 15:08:11 +0300 Subject: [PATCH 458/632] [CI skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 9233fb918..118cdbb70 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,7 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ -- Update FreeType to 2.8 #2535 +- Dependencies: Update FreeType to 2.8 and LibTIFF to 4.0.8 #2535 #2537 [radarhere] - Raise TypeError and not also UnboundLocalError in ImageFile.Parser() #2525 From f42cbe6e28b0171f7164fc03b11d7b3b14fcf9f8 Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 22 May 2017 23:02:08 +0300 Subject: [PATCH 459/632] Remove code 'not yet implemented' since May 10, 2003 --- path.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/path.c b/path.c index 4715e0679..b56ea838e 100644 --- a/path.c +++ b/path.c @@ -313,22 +313,6 @@ path_compact(PyPathObject* self, PyObject* args) return Py_BuildValue("i", i); /* number of removed vertices */ } -static PyObject* -path_clip_polygon(PyPathObject* self, PyObject* args) -{ - /* Clip path representing a single polygon */ - PyErr_SetString(PyExc_RuntimeError, "not yet implemented"); - return NULL; -} - -static PyObject* -path_clip_polyline(PyPathObject* self, PyObject* args) -{ - /* Clip path representing a single polyline (outline) */ - PyErr_SetString(PyExc_RuntimeError, "not yet implemented"); - return NULL; -} - static PyObject* path_getbbox(PyPathObject* self, PyObject* args) { @@ -534,8 +518,6 @@ path_transform(PyPathObject* self, PyObject* args) static struct PyMethodDef methods[] = { {"getbbox", (PyCFunction)path_getbbox, 1}, {"tolist", (PyCFunction)path_tolist, 1}, - {"clip_polygon", (PyCFunction)path_clip_polygon, 1}, - {"clip_polyline", (PyCFunction)path_clip_polyline, 1}, {"compact", (PyCFunction)path_compact, 1}, {"map", (PyCFunction)path_map, 1}, {"transform", (PyCFunction)path_transform, 1}, From 497f0d319f073d03b605f0c792065da620d538ba Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 23 May 2017 10:57:44 +0100 Subject: [PATCH 460/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 118cdbb70..a44f5e908 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Remove 'not yet implemented' methods from PIL 1.1.4 #2538 + [hugovk] + - Dependencies: Update FreeType to 2.8 and LibTIFF to 4.0.8 #2535 #2537 [radarhere] From a26a584812d7e9b1f4d1d98797ea95e10b1e52d6 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 22 May 2017 19:38:38 +0300 Subject: [PATCH 461/632] Do not raise SyntaxError for wrong chunks (just ignore them) --- PIL/PngImagePlugin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index 5e5eb14c7..e329a6c0d 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -113,7 +113,8 @@ class ChunkStream(object): length = i32(s) if not is_cid(cid): - raise SyntaxError("broken PNG file (chunk %s)" % repr(cid)) + if not ImageFile.LOAD_TRUNCATED_IMAGES: + raise SyntaxError("broken PNG file (chunk %s)" % repr(cid)) return cid, pos, length From 873d9ec08921a67dfbcfa41cc2ad0a263711c225 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 22 May 2017 19:38:57 +0300 Subject: [PATCH 462/632] fix memory leak if loading is failed --- libImaging/ZipDecode.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libImaging/ZipDecode.c b/libImaging/ZipDecode.c index 37cb2866c..2f6cdce34 100644 --- a/libImaging/ZipDecode.c +++ b/libImaging/ZipDecode.c @@ -85,6 +85,7 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) err = inflateInit(&context->z_stream); if (err < 0) { state->errcode = IMAGING_CODEC_CONFIG; + free(context->previous); return -1; } From 8c69132579967861972b1a3634da97961464ea8d Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 23 May 2017 17:26:13 +0300 Subject: [PATCH 463/632] fix another memory leak --- decode.c | 1 + libImaging/Imaging.h | 1 + libImaging/ZipDecode.c | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/decode.c b/decode.c index d7fe02fae..f749a40a7 100644 --- a/decode.c +++ b/decode.c @@ -779,6 +779,7 @@ PyImaging_ZipDecoderNew(PyObject* self, PyObject* args) return NULL; decoder->decode = ImagingZipDecode; + decoder->cleanup = ImagingZipDecodeCleanup; ((ZIPSTATE*)decoder->state.context)->interlaced = interlaced; diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index 2030821f2..99fff7f67 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -455,6 +455,7 @@ extern int ImagingXbmEncode(Imaging im, ImagingCodecState state, #ifdef HAVE_LIBZ extern int ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); +extern int ImagingZipDecodeCleanup(ImagingCodecState state); extern int ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingZipEncodeCleanup(ImagingCodecState state); diff --git a/libImaging/ZipDecode.c b/libImaging/ZipDecode.c index 2f6cdce34..dc5a7684e 100644 --- a/libImaging/ZipDecode.c +++ b/libImaging/ZipDecode.c @@ -86,6 +86,7 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) if (err < 0) { state->errcode = IMAGING_CODEC_CONFIG; free(context->previous); + context->previous = NULL; return -1; } @@ -127,6 +128,7 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) else state->errcode = IMAGING_CODEC_CONFIG; free(context->previous); + context->previous = NULL; inflateEnd(&context->z_stream); return -1; } @@ -192,6 +194,7 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) default: state->errcode = IMAGING_CODEC_UNKNOWN; free(context->previous); + context->previous = NULL; inflateEnd(&context->z_stream); return -1; } @@ -259,6 +262,7 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) state->errcode = IMAGING_CODEC_BROKEN; */ free(context->previous); + context->previous = NULL; inflateEnd(&context->z_stream); return -1; /* end of file (errcode=0) */ @@ -275,4 +279,20 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) } + +int ImagingZipDecodeCleanup(ImagingCodecState state){ + /* called to fee the decompression engine when the decode terminates + due to a corrupt or truncated image + */ + ZIPSTATE* context = (ZIPSTATE*) state->context; + + /* Clean up */ + if (context->previous) { + inflateEnd(&context->z_stream); + free(context->previous); + context->previous = NULL; + } + return -1; +} + #endif From c39fea8bff906e24a83b2d7460eaaa939b35ebc3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 24 May 2017 19:53:23 +1000 Subject: [PATCH 464/632] Updated libimagequant to 2.9.1 --- depends/install_imagequant.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index ded691b7c..75e023551 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.9.0 +archive=libimagequant-2.9.1 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz From c37fa5ab21f0fb24e35a73102be1d804dd1411ff Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 24 May 2017 17:00:33 +0300 Subject: [PATCH 465/632] [CI skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index a44f5e908..2b683bc4f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -7,7 +7,7 @@ Changelog (Pillow) - Remove 'not yet implemented' methods from PIL 1.1.4 #2538 [hugovk] -- Dependencies: Update FreeType to 2.8 and LibTIFF to 4.0.8 #2535 #2537 +- Dependencies: Update FreeType to 2.8, LibTIFF to 4.0.8 and libimagequant to 2.9.1 #2535 #2537 #2540 [radarhere] - Raise TypeError and not also UnboundLocalError in ImageFile.Parser() #2525 From e6da335206d7f091b8d032dca2aa0e34532e7083 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 25 May 2017 13:59:11 +0300 Subject: [PATCH 466/632] =?UTF-8?q?fee=20=E2=86=92=20free?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libImaging/JpegDecode.c | 2 +- libImaging/ZipDecode.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libImaging/JpegDecode.c b/libImaging/JpegDecode.c index 6ebdb8f93..4bb929b6a 100644 --- a/libImaging/JpegDecode.c +++ b/libImaging/JpegDecode.c @@ -268,7 +268,7 @@ ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) /* -------------------------------------------------------------------- */ int ImagingJpegDecodeCleanup(ImagingCodecState state){ - /* called to fee the decompression engine when the decode terminates + /* called to free the decompression engine when the decode terminates due to a corrupt or truncated image */ JPEGSTATE* context = (JPEGSTATE*) state->context; diff --git a/libImaging/ZipDecode.c b/libImaging/ZipDecode.c index dc5a7684e..e96e3200c 100644 --- a/libImaging/ZipDecode.c +++ b/libImaging/ZipDecode.c @@ -281,7 +281,7 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) int ImagingZipDecodeCleanup(ImagingCodecState state){ - /* called to fee the decompression engine when the decode terminates + /* called to free the decompression engine when the decode terminates due to a corrupt or truncated image */ ZIPSTATE* context = (ZIPSTATE*) state->context; From a8a499cce23ede474393bf879b6d3c825d691fe1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 25 May 2017 21:06:13 +1000 Subject: [PATCH 467/632] Fixed typo --- libImaging/JpegDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libImaging/JpegDecode.c b/libImaging/JpegDecode.c index 6ebdb8f93..4bb929b6a 100644 --- a/libImaging/JpegDecode.c +++ b/libImaging/JpegDecode.c @@ -268,7 +268,7 @@ ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) /* -------------------------------------------------------------------- */ int ImagingJpegDecodeCleanup(ImagingCodecState state){ - /* called to fee the decompression engine when the decode terminates + /* called to free the decompression engine when the decode terminates due to a corrupt or truncated image */ JPEGSTATE* context = (JPEGSTATE*) state->context; From 092d97f82903c20f1ba25c09be39ad9fc5d78aac Mon Sep 17 00:00:00 2001 From: Melvyn Sopacua Date: Fri, 26 May 2017 13:44:26 +0200 Subject: [PATCH 468/632] Fix compilation on FreeBSD with 2 openjpegs When openjpeg 1.5 is installed (Calligra 2.x, for example) and OpenJPEG 2.1 is installed, the subdirectory is added twice. Since the 2nd time is ignored, it is ranked after the more general /usr/local/include and openjpeg.h from the 1.5 version is picked up. Fix this in a more general way: - If a directory is added that already is in path - But where is specified Then remove the subdir from path and insert it at the spot requested. A FIXME is added to the code bit explaining the real issue, but lack investigative spirit / time to dive down the rabbit hole. --- setup.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/setup.py b/setup.py index 51106692d..bf7291804 100755 --- a/setup.py +++ b/setup.py @@ -63,6 +63,9 @@ def _add_directory(path, subdir, where=None): else: _dbg('Inserting path %s', subdir) path.insert(where, subdir) + elif subdir in path and where is not None: + path.remove(subdir) + path.insert(where, subdir) def _find_include_file(self, include): @@ -462,6 +465,9 @@ class pil_build_ext(build_ext): # Add the directory to the include path so we can include # rather than having to cope with the versioned # include path + print() + print("====> Adding {} to {}".format(best_path, self.compiler.include_dirs)) + print() _add_directory(self.compiler.include_dirs, best_path, 0) feature.jpeg2000 = 'openjp2' feature.openjpeg_version = '.'.join(str(x) for x in best_version) From 5d7480a91bc277f4dda5a879ec138e9c11f6a61f Mon Sep 17 00:00:00 2001 From: Melvyn Sopacua Date: Fri, 26 May 2017 13:48:38 +0200 Subject: [PATCH 469/632] Add the FIXME and remove debug code --- setup.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index bf7291804..c24d7bbb8 100755 --- a/setup.py +++ b/setup.py @@ -465,9 +465,10 @@ class pil_build_ext(build_ext): # Add the directory to the include path so we can include # rather than having to cope with the versioned # include path - print() - print("====> Adding {} to {}".format(best_path, self.compiler.include_dirs)) - print() + # FIXME (melvyn-sopacua): + # At this point it's possible that best_path is already in + # self.compiler.include_dirs. Should investigate how that is + # possible. _add_directory(self.compiler.include_dirs, best_path, 0) feature.jpeg2000 = 'openjp2' feature.openjpeg_version = '.'.join(str(x) for x in best_version) From 3d5370e1b296007684d5007c2e5994f20cbfabb0 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 May 2017 13:25:07 +0000 Subject: [PATCH 470/632] Updated installation matrix for Freebsd --- docs/installation.rst | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index c36b97489..be1b18988 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -159,7 +159,7 @@ Many of Pillow's features require external libraries: * Pillow has been tested with openjpeg **2.0.0** and **2.1.0**. * Pillow does **not** support the earlier **1.5** series which ships - with Ubuntu and Debian. + with Ubuntu <= 14.04 and Debian Jessie. * **libimagequant** provides improved color quantization @@ -265,7 +265,7 @@ Windows build in the ``winbuild`` directory. Building on FreeBSD ^^^^^^^^^^^^^^^^^^^ -.. Note:: Only FreeBSD 10 tested +.. Note:: Only FreeBSD 10 and 11 tested Make sure you have Python's development libraries installed.:: @@ -275,9 +275,9 @@ Or for Python 3:: $ sudo pkg install python3 -Prerequisites are installed on **FreeBSD 10** with:: +Prerequisites are installed on **FreeBSD 10 or 11** with:: - $ sudo pkg install jpeg tiff webp lcms2 freetype2 + $ sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 openjpeg Building on Linux @@ -404,6 +404,10 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ | FreeBSD 10.2 | 2.7,3.4 | 3.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ +| FreeBSD 10.3 | 2.7,3.4,3.5 | 4.1.1 |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| FreeBSD 11.0 | 2.7,3.4,3.5,3.6 | 4.1.1 |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ | Windows 8.1 Pro | 2.6,2.7,3.2,3.3,3.4 | 2.4.0 |x86,x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Windows 8 Pro | 2.6,2.7,3.2,3.3,3.4a3 | 2.2.0 |x86,x86-64 | From f23c2b42630d97fd436a41cc58f6b62cdf74b90e Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 27 May 2017 14:34:28 +0100 Subject: [PATCH 471/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 2b683bc4f..3960155ca 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Build: Ignore OpenJpeg 1.5 on FreeBSD #2544 + [melvyn-sopacua] + - Remove 'not yet implemented' methods from PIL 1.1.4 #2538 [hugovk] From 551e5205d5b90f3181e434e9018041867855965a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 27 May 2017 17:10:52 +0100 Subject: [PATCH 472/632] Update ISSUE_TEMPLATE.md Added notes about image hosting. --- .github/ISSUE_TEMPLATE.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 2ab0121ae..0fe0099fd 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -6,7 +6,9 @@ ### What versions of Pillow and Python are you using? -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. If you are using a framework such as plone, django, or buildout, try to replicate the issue just using Pillow. +Please include **code** that reproduces the issue and whenever possible, an **image** that demonstrates the issue. Please upload images to Github, not to third party file hosting sites. If necessary, add the image to a zip or tar archive. + +The best reproductions are self-contained scripts with minimal dependencies. If you are using a framework such as plone, django, or buildout, try to replicate the issue just using Pillow. ```python code goes here From 20b61b105053e2007fff34bf52994cde5fc47e55 Mon Sep 17 00:00:00 2001 From: hugovk Date: Tue, 23 May 2017 10:17:36 +0300 Subject: [PATCH 473/632] Remove unused function --- _imaging.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/_imaging.c b/_imaging.c index af15cae91..f6e3eed16 100644 --- a/_imaging.c +++ b/_imaging.c @@ -631,18 +631,6 @@ _new(PyObject* self, PyObject* args) return PyImagingNew(ImagingNew(mode, xsize, ysize)); } -static PyObject* -_new_array(PyObject* self, PyObject* args) -{ - char* mode; - int xsize, ysize; - - if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) - return NULL; - - return PyImagingNew(ImagingNewArray(mode, xsize, ysize)); -} - static PyObject* _new_block(PyObject* self, PyObject* args) { @@ -3027,7 +3015,6 @@ static struct PyMethodDef methods[] = { #endif /* Misc. */ - {"new_array", (PyCFunction)_new_array, 1}, {"new_block", (PyCFunction)_new_block, 1}, {"save_ppm", (PyCFunction)_save_ppm, 1}, From 4e1dacd984a497081c8984074d15246290202685 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 27 May 2017 19:34:53 +0300 Subject: [PATCH 474/632] Caps and hyphen [CI skip] --- .github/ISSUE_TEMPLATE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 0fe0099fd..6c91b6427 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -6,9 +6,9 @@ ### What versions of Pillow and Python are you using? -Please include **code** that reproduces the issue and whenever possible, an **image** that demonstrates the issue. Please upload images to Github, not to third party file hosting sites. If necessary, add the image to a zip or tar archive. +Please include **code** that reproduces the issue and whenever possible, an **image** that demonstrates the issue. Please upload images to GitHub, not to third-party file hosting sites. If necessary, add the image to a zip or tar archive. -The best reproductions are self-contained scripts with minimal dependencies. If you are using a framework such as plone, django, or buildout, try to replicate the issue just using Pillow. +The best reproductions are self-contained scripts with minimal dependencies. If you are using a framework such as plone, Django, or buildout, try to replicate the issue just using Pillow. ```python code goes here From 08c8a7a35eb116445ed564dd13aaa2183757aa6a Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 27 May 2017 19:57:19 +0300 Subject: [PATCH 475/632] [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3960155ca..52f8cea43 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Docs: Update install docs for FreeBSD #2546 + [wiredfool] + - Build: Ignore OpenJpeg 1.5 on FreeBSD #2544 [melvyn-sopacua] From d85dffd15077ff6a040e0334866b81f6c4500551 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 27 May 2017 21:52:43 +0300 Subject: [PATCH 476/632] Remove functions deprecated and warning since 2.0 (15 Mar 2013) and raising exceptions since 3.0 (1 Oct 2015) --- PIL/ImageWin.py | 8 -------- Tests/test_imagewin.py | 9 --------- docs/releasenotes/4.2.0.rst | 9 +++++++++ docs/releasenotes/index.rst | 1 + 4 files changed, 10 insertions(+), 17 deletions(-) create mode 100644 docs/releasenotes/4.2.0.rst diff --git a/PIL/ImageWin.py b/PIL/ImageWin.py index cc4dced97..d8398e92b 100644 --- a/PIL/ImageWin.py +++ b/PIL/ImageWin.py @@ -182,14 +182,6 @@ class Dib(object): """ return self.image.tobytes() - def fromstring(self, *args, **kw): - raise NotImplementedError("fromstring() has been removed. " + - "Please use frombytes() instead.") - - def tostring(self, *args, **kw): - raise NotImplementedError("tostring() has been removed. " + - "Please use tobytes() instead.") - class Window(object): """Create a Window with the given title size.""" diff --git a/Tests/test_imagewin.py b/Tests/test_imagewin.py index d802b1fb2..70bf28247 100644 --- a/Tests/test_imagewin.py +++ b/Tests/test_imagewin.py @@ -107,15 +107,6 @@ class TestImageWinDib(PillowTestCase): # Confirm they're the same self.assertEqual(dib1.tobytes(), dib2.tobytes()) - def test_removed_methods(self): - # Arrange - im = hopper() - dib = ImageWin.Dib(im) - - # Act/Assert - self.assertRaises(Exception, dib.tostring) - self.assertRaises(Exception, dib.fromstring) - if __name__ == '__main__': unittest.main() diff --git a/docs/releasenotes/4.2.0.rst b/docs/releasenotes/4.2.0.rst new file mode 100644 index 000000000..2e1d5dd40 --- /dev/null +++ b/docs/releasenotes/4.2.0.rst @@ -0,0 +1,9 @@ +4.2.0 +----- + +Removed Deprecated Items +======================== + +Several deprecated items have been removed. + +* The methods :py:meth:`PIL.ImageWin.Dib.fromstring` and :py:meth:`PIL.ImageWin.Dib.tostring` have been removed. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 27851ec7a..624c727a9 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -6,6 +6,7 @@ Release Notes .. toctree:: :maxdepth: 2 + 4.2.0 4.1.1 4.1.0 4.0.0 From e002207c5bbf841906f53738de861a62b8346808 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 27 May 2017 21:55:42 +0300 Subject: [PATCH 477/632] Remove function deprecated and warning since 3.0 (1 Oct 2015) --- PIL/TiffImagePlugin.py | 9 --------- Tests/test_file_tiff.py | 18 ++++-------------- 2 files changed, 4 insertions(+), 23 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index f9709e83b..aafcb101d 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -462,15 +462,6 @@ class ImageFileDirectory_v2(collections.MutableMapping): def __str__(self): return str(dict(self)) - def as_dict(self): - """Return a dictionary of the image's tags. - - .. deprecated:: 3.0.0 - """ - warnings.warn("as_dict() is deprecated. " + - "Please use dict(ifd) instead.", DeprecationWarning) - return dict(self) - def named(self): """ :returns: dict of name|key: value diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 1e182fb1a..90976a272 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -274,16 +274,6 @@ class TestFileTiff(PillowTestCase): # Assert self.assertIsInstance(ret, str) - def test_as_dict_deprecation(self): - # Arrange - filename = "Tests/images/pil136.tiff" - im = Image.open(filename) - - self.assert_warning(DeprecationWarning, im.tag_v2.as_dict) - self.assert_warning(DeprecationWarning, im.tag.as_dict) - self.assertEqual(dict(im.tag_v2), im.tag_v2.as_dict()) - self.assertEqual(dict(im.tag), im.tag.as_dict()) - def test_dict(self): # Arrange filename = "Tests/images/pil136.tiff" @@ -484,7 +474,7 @@ class TestFileTiff(PillowTestCase): def test_close_on_load_nonexclusive(self): tmpfile = self.tempfile("temp.tif") - + with Image.open("Tests/images/uint16_1_4660.tif") as im: im.save(tmpfile) @@ -495,7 +485,7 @@ class TestFileTiff(PillowTestCase): im.load() self.assertFalse(fp.closed) - + @unittest.skipUnless(sys.platform.startswith('win32'), "Windows only") class TestFileTiffW32(PillowTestCase): @@ -503,7 +493,7 @@ class TestFileTiffW32(PillowTestCase): tmpfile = self.tempfile("temp.tif") import os - # this is an mmaped file. + # this is an mmaped file. with Image.open("Tests/images/uint16_1_4660.tif") as im: im.save(tmpfile) @@ -516,7 +506,7 @@ class TestFileTiffW32(PillowTestCase): # this closes the mmap im.close() - + # this should not fail, as load should have closed the file pointer, # and close should have closed the mmap os.remove(tmpfile) From 4c3107c94088fa99360f1b44fe0e0efb410af781 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 27 May 2017 22:16:40 +0300 Subject: [PATCH 478/632] Remove docs about deprecated and already removed code --- docs/reference/ImageDraw.rst | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 3f1bb7b8d..49cbc2177 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -270,24 +270,3 @@ Methods :param text: Text to be measured. :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. :param spacing: The number of pixels between lines. - -Legacy API ----------- - -The :py:class:`~PIL.ImageDraw.Draw` class contains a constructor and a number -of methods which are provided for backwards compatibility only. For this to -work properly, you should either use options on the drawing primitives, or -these methods. Do not mix the old and new calling conventions. - - -.. py:function:: PIL.ImageDraw.ImageDraw(image) - - :rtype: :py:class:`~PIL.ImageDraw.Draw` - -.. py:method:: PIL.ImageDraw.Draw.setfont(font) - - .. deprecated:: 1.1.5 - - Sets the default font to use for the text method. - - :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. From e4d6223c944cf44c468cc65a560b94dfcf351a62 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 27 May 2017 23:20:03 +0300 Subject: [PATCH 479/632] Remove deprecated code due for removal in Pillow 4.2 (per PR #2010) --- PIL/JpegImagePlugin.py | 9 --------- Tests/test_file_jpeg.py | 10 ++-------- docs/releasenotes/4.2.0.rst | 2 ++ 3 files changed, 4 insertions(+), 17 deletions(-) diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index bb2816c13..3964d87bf 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -554,7 +554,6 @@ RAWMODE = { "1": "L", "L": "L", "RGB": "RGB", - "RGBA": "RGB", "RGBX": "RGB", "CMYK": "CMYK;I", # assume adobe conventions "YCbCr": "YCbCr", @@ -603,14 +602,6 @@ def _save(im, fp, filename): except KeyError: raise IOError("cannot write mode %s as JPEG" % im.mode) - if im.mode == 'RGBA': - warnings.warn( - 'You are saving RGBA image as JPEG. The alpha channel will be ' - 'discarded. This conversion is deprecated and will be disabled ' - 'in Pillow 3.7. Please, convert the image to RGB explicitly.', - DeprecationWarning - ) - info = im.encoderinfo dpi = [int(round(x)) for x in info.get("dpi", (0, 0))] diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index f4cfe8d60..ab5875a7d 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -476,17 +476,11 @@ class TestFileJpeg(PillowTestCase): img.save(out, "JPEG") def test_save_wrong_modes(self): - out = BytesIO() - for mode in ['LA', 'La', 'RGBa', 'P']: - img = Image.new(mode, (20, 20)) - self.assertRaises(IOError, img.save, out, "JPEG") - - def test_save_modes_with_warnings(self): # ref https://github.com/python-pillow/Pillow/issues/2005 out = BytesIO() - for mode in ['RGBA']: + for mode in ['LA', 'La', 'RGBA', 'RGBa', 'P']: img = Image.new(mode, (20, 20)) - self.assert_warning(DeprecationWarning, img.save, out, "JPEG") + self.assertRaises(IOError, img.save, out, "JPEG") def test_save_tiff_with_dpi(self): # Arrange diff --git a/docs/releasenotes/4.2.0.rst b/docs/releasenotes/4.2.0.rst index 2e1d5dd40..7d881c3ec 100644 --- a/docs/releasenotes/4.2.0.rst +++ b/docs/releasenotes/4.2.0.rst @@ -7,3 +7,5 @@ Removed Deprecated Items Several deprecated items have been removed. * The methods :py:meth:`PIL.ImageWin.Dib.fromstring` and :py:meth:`PIL.ImageWin.Dib.tostring` have been removed. + +* Before Pillow 4.2.0, attempting to save an RGBA image as JPEG would discard the alpha channel. From Pillow 3.4.0, a deprecation warning was shown. From Pillow 4.2.0, the deprecation warning is removed and an :py:exc:`IOError` is raised. From c3ed7447ccd926ae6b34b27026fc19486392a598 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 27 May 2017 23:52:24 +0300 Subject: [PATCH 480/632] Document deprecation removal --- docs/releasenotes/4.2.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/4.2.0.rst b/docs/releasenotes/4.2.0.rst index 7d881c3ec..e405ab58b 100644 --- a/docs/releasenotes/4.2.0.rst +++ b/docs/releasenotes/4.2.0.rst @@ -6,6 +6,6 @@ Removed Deprecated Items Several deprecated items have been removed. -* The methods :py:meth:`PIL.ImageWin.Dib.fromstring` and :py:meth:`PIL.ImageWin.Dib.tostring` have been removed. +* The methods :py:meth:`PIL.ImageWin.Dib.fromstring`, :py:meth:`PIL.ImageWin.Dib.tostring` and :py:meth:`PIL.TiffImagePlugin.ImageFileDirectory_v2.as_dict` have been removed. * Before Pillow 4.2.0, attempting to save an RGBA image as JPEG would discard the alpha channel. From Pillow 3.4.0, a deprecation warning was shown. From Pillow 4.2.0, the deprecation warning is removed and an :py:exc:`IOError` is raised. From c70eb8a1286776ce266f0539d4a65cf552679f45 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sat, 27 May 2017 23:55:14 +0300 Subject: [PATCH 481/632] flake8 --- PIL/JpegImagePlugin.py | 9 +++++---- PIL/TiffImagePlugin.py | 38 ++++++++++++++++++++++++-------------- Tests/test_file_tiff.py | 11 ++++------- 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 3964d87bf..8890ed9ee 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -127,7 +127,7 @@ def APP(self, marker): dpi = x_resolution[0] / x_resolution[1] except TypeError: dpi = x_resolution - if resolution_unit == 3: # cm + if resolution_unit == 3: # cm # 1 dpcm = 2.54 dpi dpi *= 2.54 self.info["dpi"] = dpi, dpi @@ -423,7 +423,8 @@ def _fixup_dict(src_dict): try: if len(value) == 1 and not isinstance(value, dict): return value[0] - except: pass + except: + pass return value return {k: _fixup(v) for k, v in src_dict.items()} @@ -696,8 +697,8 @@ def _save(im, fp, filename): # "progressive" is the official name, but older documentation # says "progression" # FIXME: issue a warning if the wrong form is used (post-1.1.7) - progressive = info.get("progressive", False) or\ - info.get("progression", False) + progressive = (info.get("progressive", False) or + info.get("progression", False)) optimize = info.get("optimize", False) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index aafcb101d..ad1694d2f 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -242,6 +242,7 @@ def _limit_rational(val, max_val): n_d = IFDRational(1 / val if inv else val).limit_rational(max_val) return n_d[::-1] if inv else n_d + ## # Wrapper for TIFF IFDs. @@ -526,7 +527,8 @@ class ImageFileDirectory_v2(collections.MutableMapping): self.tagtype[tag] = 2 if self.tagtype[tag] == 7 and bytes is not str: - values = [value.encode("ascii", 'replace') if isinstance(value, str) else value] + values = [value.encode("ascii", 'replace') if isinstance( + value, str) else value] values = tuple(info.cvt_enum(value) for value in values) @@ -579,9 +581,13 @@ class ImageFileDirectory_v2(collections.MutableMapping): b"".join(self._pack(fmt, value) for value in values)) list(map(_register_basic, - [(3, "H", "short"), (4, "L", "long"), - (6, "b", "signed byte"), (8, "h", "signed short"), - (9, "l", "signed long"), (11, "f", "float"), (12, "d", "double")])) + [(3, "H", "short"), + (4, "L", "long"), + (6, "b", "signed byte"), + (8, "h", "signed short"), + (9, "l", "signed long"), + (11, "f", "float"), + (12, "d", "double")])) @_register_loader(1, 1) # Basic type, except for the legacy API. def load_byte(self, data, legacy_api=True): @@ -653,7 +659,8 @@ class ImageFileDirectory_v2(collections.MutableMapping): try: for i in range(self._unpack("H", self._ensure_read(fp, 2))[0]): - tag, typ, count, data = self._unpack("HHL4s", self._ensure_read(fp, 12)) + tag, typ, count, data = self._unpack("HHL4s", + self._ensure_read(fp, 12)) if DEBUG: tagname = TiffTags.lookup(tag).name typname = TYPES.get(typ, "unknown") @@ -681,8 +688,8 @@ class ImageFileDirectory_v2(collections.MutableMapping): if len(data) != size: warnings.warn("Possibly corrupt EXIF data. " - "Expecting to read %d bytes but only got %d. " - "Skipping tag %s" % (size, len(data), tag)) + "Expecting to read %d bytes but only got %d." + " Skipping tag %s" % (size, len(data), tag)) continue if not data: @@ -741,7 +748,8 @@ class ImageFileDirectory_v2(collections.MutableMapping): if len(data) <= 4: entries.append((tag, typ, count, data.ljust(4, b"\0"), b"")) else: - entries.append((tag, typ, count, self._pack("L", offset), data)) + entries.append((tag, typ, count, self._pack("L", offset), + data)) offset += (len(data) + 1) // 2 * 2 # pad to word # update strip offset data to point beyond auxiliary data @@ -770,6 +778,7 @@ class ImageFileDirectory_v2(collections.MutableMapping): return offset + ImageFileDirectory_v2._load_dispatch = _load_dispatch ImageFileDirectory_v2._write_dispatch = _write_dispatch for idx, name in TYPES.items(): @@ -1169,7 +1178,8 @@ class TiffImageFile(ImageFile.ImageFile): self.info["dpi"] = xres * 2.54, yres * 2.54 elif resunit is None: # used to default to 1, but now 2) self.info["dpi"] = xres, yres - # For backward compatibility, we also preserve the old behavior. + # For backward compatibility, + # we also preserve the old behavior self.info["resolution"] = xres, yres else: # No absolute unit of measurement self.info["resolution"] = xres, yres @@ -1285,6 +1295,8 @@ class TiffImageFile(ImageFile.ImageFile): if self.mode == "P": palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]] self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) + + # # -------------------------------------------------------------------- # Write TIFF files @@ -1673,13 +1685,10 @@ class AppendingTiffWriter: def fixIFD(self): numTags = self.readShort() - # trace("fixing IFD at %X; number of tags: %u (0x%X)", self.f.tell()-2, - # numTags, numTags) for i in range(numTags): - tag, fieldType, count = struct.unpack(self.tagFormat, self.f.read(8)) - # trace(" at %X: tag %u (0x%X), type %u, count %u", self.f.tell()-8, - # tag, tag, fieldType, count) + tag, fieldType, count = struct.unpack(self.tagFormat, + self.f.read(8)) fieldSize = self.fieldSizes[fieldType] totalSize = fieldSize * count @@ -1747,6 +1756,7 @@ def _save_all(im, fp, filename): finally: im.seek(cur_idx) + # # -------------------------------------------------------------------- # Register diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 90976a272..9e7f3735d 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -6,6 +6,7 @@ import sys from helper import unittest, PillowTestCase, hopper, py3 from PIL import Image, TiffImagePlugin +from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION, RESOLUTION_UNIT logger = logging.getLogger(__name__) @@ -77,7 +78,6 @@ class TestFileTiff(PillowTestCase): self.assertEqual(im.mode, 'RGB') def test_xyres_tiff(self): - from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION filename = "Tests/images/pil168.tif" im = Image.open(filename) @@ -94,7 +94,6 @@ class TestFileTiff(PillowTestCase): self.assertEqual(im.info['dpi'], (72., 72.)) def test_xyres_fallback_tiff(self): - from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION, RESOLUTION_UNIT filename = "Tests/images/compression.tif" im = Image.open(filename) @@ -112,7 +111,6 @@ class TestFileTiff(PillowTestCase): self.assertEqual(im.info['dpi'], (100., 100.)) def test_int_resolution(self): - from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION filename = "Tests/images/pil168.tif" im = Image.open(filename) @@ -123,7 +121,6 @@ class TestFileTiff(PillowTestCase): self.assertEqual(im.info['dpi'], (71., 71.)) def test_save_setting_missing_resolution(self): - from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION b = BytesIO() Image.open("Tests/images/10ct_32bit_128.tiff").save( b, format="tiff", resolution=123.45) @@ -447,8 +444,8 @@ class TestFileTiff(PillowTestCase): def test_saving_icc_profile(self): # Tests saving TIFF with icc_profile set. # At the time of writing this will only work for non-compressed tiffs - # as libtiff does not support embedded ICC profiles, ImageFile._save(..) - # however does. + # as libtiff does not support embedded ICC profiles, + # ImageFile._save(..) however does. im = Image.new('RGB', (1, 1)) im.info['icc_profile'] = 'Dummy value' @@ -486,7 +483,6 @@ class TestFileTiff(PillowTestCase): self.assertFalse(fp.closed) - @unittest.skipUnless(sys.platform.startswith('win32'), "Windows only") class TestFileTiffW32(PillowTestCase): def test_fd_leak(self): @@ -511,5 +507,6 @@ class TestFileTiffW32(PillowTestCase): # and close should have closed the mmap os.remove(tmpfile) + if __name__ == '__main__': unittest.main() From 3a67ef8bd916d8b7b671b05398199cfc2dfeb164 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 28 May 2017 12:30:18 +1000 Subject: [PATCH 482/632] Rearranged operating systems in Platform Support [ci skip] --- docs/installation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index be1b18988..277239a8f 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -402,11 +402,11 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Gentoo Linux | 2.7,3.2 | 2.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| FreeBSD 10.2 | 2.7,3.4 | 3.1.0 |x86-64 | +| FreeBSD 11.0 | 2.7,3.4,3.5,3.6 | 4.1.1 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | FreeBSD 10.3 | 2.7,3.4,3.5 | 4.1.1 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| FreeBSD 11.0 | 2.7,3.4,3.5,3.6 | 4.1.1 |x86-64 | +| FreeBSD 10.2 | 2.7,3.4 | 3.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Windows 8.1 Pro | 2.6,2.7,3.2,3.3,3.4 | 2.4.0 |x86,x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ From 9626e49c0bf571d83a99b08709ef4e0c8dc01e03 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 28 May 2017 16:11:16 +0300 Subject: [PATCH 483/632] Test a McIDAS area file --- PIL/McIdasImagePlugin.py | 1 + .../images/cmx3g8_wv_1998.260_0745_mcidas.ara | Bin 0 -> 1443296 bytes .../images/cmx3g8_wv_1998.260_0745_mcidas.png | Bin 0 -> 305116 bytes Tests/test_file_mcidas.py | 20 +++++++++++++++++- 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 Tests/images/cmx3g8_wv_1998.260_0745_mcidas.ara create mode 100644 Tests/images/cmx3g8_wv_1998.260_0745_mcidas.png diff --git a/PIL/McIdasImagePlugin.py b/PIL/McIdasImagePlugin.py index 08eeec39f..06da33f77 100644 --- a/PIL/McIdasImagePlugin.py +++ b/PIL/McIdasImagePlugin.py @@ -66,6 +66,7 @@ class McIdasImageFile(ImageFile.ImageFile): self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))] + # -------------------------------------------------------------------- # registry diff --git a/Tests/images/cmx3g8_wv_1998.260_0745_mcidas.ara b/Tests/images/cmx3g8_wv_1998.260_0745_mcidas.ara new file mode 100644 index 0000000000000000000000000000000000000000..4cdc741d7e7799210b17184e06cabfbac6848d67 GIT binary patch literal 1443296 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%0DbsFB+=?fQ) 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≻!Puy$hcsj8GwlMt3#JvBee8Dul?AC|%| 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 z%0A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 byiP;w4Cg=tA+C1~y9t9|*uEHi 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

A3`u0rWNb|oNL-%A=YHp( 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 cG}%7+Ur$5&AvhR~cK`qY07*qoM6N<$f`!ap!T Date: Sun, 28 May 2017 09:34:41 -0700 Subject: [PATCH 484/632] Remove unnecessary calls to dict.keys() iter(dict) is equivalent to iter(dict.keys()), so simply act on the dict instead of adding the extra call. Inspired by Lennart Regebro's PyCon 2017 presentation "Prehistoric Patterns in Python". Available at: https://www.youtube.com/watch?v=V5-JH23Vk0I --- PIL/IcoImagePlugin.py | 4 ++-- PIL/Image.py | 2 +- PIL/IptcImagePlugin.py | 2 +- Tests/test_file_jpeg.py | 2 +- Tests/test_file_libtiff.py | 2 +- Tests/test_imagecolor.py | 2 +- winbuild/build.py | 2 +- winbuild/config.py | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index e4db4e766..428fdd41a 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -176,8 +176,8 @@ class IcoFile(object): # figure out where AND mask image starts mode = a[0] bpp = 8 - for k in BmpImagePlugin.BIT2MODE.keys(): - if mode == BmpImagePlugin.BIT2MODE[k][1]: + for k, v in BmpImagePlugin.BIT2MODE.items(): + if mode == v[1]: bpp = k break diff --git a/PIL/Image.py b/PIL/Image.py index c8315ba76..1f968daf5 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -274,7 +274,7 @@ def _conv_type_shape(im): return shape+(extra,), typ -MODES = sorted(_MODEINFO.keys()) +MODES = sorted(_MODEINFO) # raw modes that may be memory mapped. NOTE: if you change this, you # may have to modify the stride calculation in map.c too! diff --git a/PIL/IptcImagePlugin.py b/PIL/IptcImagePlugin.py index 8941643bb..f5a8de17e 100644 --- a/PIL/IptcImagePlugin.py +++ b/PIL/IptcImagePlugin.py @@ -95,7 +95,7 @@ class IptcImageFile(ImageFile.ImageFile): tagdata = self.fp.read(size) else: tagdata = None - if tag in list(self.info.keys()): + if tag in self.info: if isinstance(self.info[tag], list): self.info[tag].append(tagdata) else: diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index f4cfe8d60..5f8f7e5d7 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -439,7 +439,7 @@ class TestFileJpeg(PillowTestCase): def test_no_duplicate_0x1001_tag(self): # Arrange from PIL import ExifTags - tag_ids = dict(zip(ExifTags.TAGS.values(), ExifTags.TAGS.keys())) + tag_ids = {v: k for k, v in ExifTags.TAGS.items()} # Assert self.assertEqual(tag_ids['RelatedImageWidth'], 0x1001) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 9c60aedf9..5b8a2314e 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -190,7 +190,7 @@ class TestFileLibTiff(LibTiffTestCase): # Exclude ones that have special meaning # that we're already testing them im = Image.open('Tests/images/hopper_g4.tif') - for tag in im.tag_v2.keys(): + for tag in im.tag_v2: try: del(core_items[tag]) except: diff --git a/Tests/test_imagecolor.py b/Tests/test_imagecolor.py index 996367b30..64e88cf9c 100644 --- a/Tests/test_imagecolor.py +++ b/Tests/test_imagecolor.py @@ -119,7 +119,7 @@ class TestImageColor(PillowTestCase): # look for rounding errors (based on code by Tim Hatch) def test_rounding_errors(self): - for color in list(ImageColor.colormap.keys()): + for color in ImageColor.colormap: expected = Image.new( "RGB", (1, 1), color).convert("L").getpixel((0, 0)) actual = ImageColor.getcolor(color, 'L') diff --git a/winbuild/build.py b/winbuild/build.py index 1fbfa14a6..99502938d 100755 --- a/winbuild/build.py +++ b/winbuild/build.py @@ -12,7 +12,7 @@ from config import (compilers, compiler_from_env, pythons, pyversion_from_env, def setup_vms(): ret = [] - for py in pythons.keys(): + for py in pythons: for arch in ('', X64_EXT): ret.append("virtualenv -p c:/Python%s%s/python.exe --clear %s%s%s" % (py, arch, VIRT_BASE, py, arch)) diff --git a/winbuild/config.py b/winbuild/config.py index 177bb66b5..50f2cb4dd 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -116,7 +116,7 @@ def pyversion_from_env(): py = os.environ['PYTHON'] py_version = '27' - for k in pythons.keys(): + for k in pythons: if k in py: py_version = k break From cafc3119435e1602fd5b8ead2536bece17f6001f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 29 May 2017 19:41:30 +1000 Subject: [PATCH 485/632] Added import statements to make examples self-contained [ci skip] --- docs/handbook/tutorial.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/handbook/tutorial.rst b/docs/handbook/tutorial.rst index 245d4fc2c..3319fa208 100644 --- a/docs/handbook/tutorial.rst +++ b/docs/handbook/tutorial.rst @@ -276,6 +276,7 @@ Converting between modes :: + from PIL import Image im = Image.open("hopper.ppm").convert("L") The library supports transformations between each supported mode and the “L” @@ -459,6 +460,7 @@ As described earlier, the :py:func:`~PIL.Image.open` function of the :py:mod:`~PIL.Image` module is used to open an image file. In most cases, you simply pass it the filename as an argument:: + from PIL import Image im = Image.open("hopper.ppm") If everything goes well, the result is an :py:class:`PIL.Image.Image` object. @@ -473,6 +475,7 @@ Reading from an open file :: + from PIL import Image fp = open("hopper.ppm", "rb") im = Image.open(fp) From 5eabd731f00e17ca8d257614057473f88e46158a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 29 May 2017 19:41:48 +1000 Subject: [PATCH 486/632] Changed tutorial code to use with for opening files [ci skip] --- docs/handbook/tutorial.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/handbook/tutorial.rst b/docs/handbook/tutorial.rst index 3319fa208..e822f5a08 100644 --- a/docs/handbook/tutorial.rst +++ b/docs/handbook/tutorial.rst @@ -476,8 +476,8 @@ Reading from an open file :: from PIL import Image - fp = open("hopper.ppm", "rb") - im = Image.open(fp) + with open("hopper.ppm", "rb") as fp: + im = Image.open(fp) To read an image from string data, use the :py:class:`~StringIO.StringIO` class: From 1df8ac22fd5ef252a70c87278885885e2f46c967 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 29 May 2017 19:42:06 +1000 Subject: [PATCH 487/632] Changed wording [ci skip] --- docs/handbook/concepts.rst | 6 +++--- docs/releasenotes/2.7.0.rst | 3 +-- docs/releasenotes/3.1.0.rst | 2 +- docs/releasenotes/3.3.0.rst | 9 ++++----- docs/releasenotes/3.4.0.rst | 6 +++--- 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/docs/handbook/concepts.rst b/docs/handbook/concepts.rst index 3023e1e67..fd410afe0 100644 --- a/docs/handbook/concepts.rst +++ b/docs/handbook/concepts.rst @@ -45,8 +45,8 @@ image. The current release supports the following standard modes: PIL also provides limited support for a few special modes, including ``LA`` (L with alpha), ``RGBX`` (true color with padding) and ``RGBa`` (true color with premultiplied alpha). However, PIL doesn’t support user-defined modes; if you -to handle band combinations that are not listed above, use a sequence of Image -objects. +need to handle band combinations that are not listed above, use a sequence of +Image objects. You can read the mode of an image through the :py:attr:`~PIL.Image.Image.mode` attribute. This is a string containing one of the above values. @@ -114,7 +114,7 @@ pixel, the Python Imaging Library provides different resampling *filters*. in the input image is used. ``HAMMING`` - Produces more sharp image than ``BILINEAR``, doesn't have dislocations + Produces a sharper image than ``BILINEAR``, doesn't have dislocations on local level like with ``BOX``. This filter can only be used with the :py:meth:`~PIL.Image.Image.resize` and :py:meth:`~PIL.Image.Image.thumbnail` methods. diff --git a/docs/releasenotes/2.7.0.rst b/docs/releasenotes/2.7.0.rst index a51ca81b4..4bb25e371 100644 --- a/docs/releasenotes/2.7.0.rst +++ b/docs/releasenotes/2.7.0.rst @@ -148,7 +148,7 @@ Blur performance Box filter computation time is constant relative to the radius and depends 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 +is based on box filter, its computation time also doesn't depend on the blur radius. For example, previously, if the execution time for a given test image was 1 @@ -172,4 +172,3 @@ 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') - diff --git a/docs/releasenotes/3.1.0.rst b/docs/releasenotes/3.1.0.rst index 7f0a7f052..388af03ac 100644 --- a/docs/releasenotes/3.1.0.rst +++ b/docs/releasenotes/3.1.0.rst @@ -68,7 +68,7 @@ Out of Spec Metadata ++++++++++++++++++++ In Pillow 3.0 and 3.1, images that contain metadata that is internally -consistent but not in agreement with the TIFF spec may cause an +consistent, but not in agreement with the TIFF spec, may cause an exception when reading the metadata. This can happen when a tag that is specified to have a single value is stored with an array of values. diff --git a/docs/releasenotes/3.3.0.rst b/docs/releasenotes/3.3.0.rst index 544c7162e..39ffdbb2e 100644 --- a/docs/releasenotes/3.3.0.rst +++ b/docs/releasenotes/3.3.0.rst @@ -29,9 +29,9 @@ Resizing ======== Image resampling for 8-bit per channel images was rewritten using only integer -computings. This is faster on most of the platforms and doesn't introduce -precision errors on the wide range of scales. With other performance -improvements, this makes resampling 60% faster on average. +computings. This is faster on most platforms and doesn't introduce precision +errors on the wide range of scales. With other performance improvements, this +makes resampling 60% faster on average. Color calculation for images in the ``LA`` mode on semitransparent pixels was fixed. @@ -41,7 +41,7 @@ Rotation ======== Rotation for angles divisible by 90 degrees now always uses transposition. -This greatly improve both quality and performance in this cases. +This greatly improves both quality and performance in this case. Also, the bug with wrong image size calculation when rotating by 90 degrees was fixed. @@ -52,4 +52,3 @@ Image Metadata The return type for binary data in version 2 Exif and Tiff metadata has been changed from a tuple of integers to bytes. This is a change from the behavior since ``3.0.0``. - diff --git a/docs/releasenotes/3.4.0.rst b/docs/releasenotes/3.4.0.rst index 65b52e958..dc5e2e295 100644 --- a/docs/releasenotes/3.4.0.rst +++ b/docs/releasenotes/3.4.0.rst @@ -8,7 +8,7 @@ New resizing filters Two new filters available for ``Image.resize()`` and ``Image.thumbnail()`` functions: ``BOX`` and ``HAMMING``. ``BOX`` is the high-performance filter with two times shorter window than ``BILINEAR``. It can be used for image reduction -3 and more times and produces a more sharp result than ``BILINEAR``. +3 and more times and produces a sharper result than ``BILINEAR``. ``HAMMING`` filter has the same performance as ``BILINEAR`` filter while providing the image downscaling quality comparable to ``BICUBIC``. @@ -25,7 +25,7 @@ image as a JPEG. This will become an error in Pillow 4.2. New DDS Decoders ================ -Pillow can now decode DXT3 images, as well as the previously support +Pillow can now decode DXT3 images, as well as the previously supported DXT1 and DXT5 formats. All three formats are now decoded in C code for better performance. @@ -44,7 +44,7 @@ in effect, e.g.:: Save multiple frame TIFF ======================== -Multiple frames can now be saved in a TIFF file by using the ``save_all`` option. +Multiple frames can now be saved in a TIFF file by using the ``save_all`` option. e.g.:: im.save("filename.tiff", format="TIFF", save_all=True) From ad883961ac309e4a5d190c39e07a46b7dbba24ad Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 29 May 2017 14:28:55 +0300 Subject: [PATCH 488/632] fix hamming filter --- Tests/test_image_resample.py | 12 +++++------- libImaging/Resample.c | 2 ++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index 98fe3b0f7..dcd33b5e1 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -158,14 +158,12 @@ class TestImagingCoreResampleAccuracy(PillowTestCase): def test_enlarge_hamming(self): for mode in ['RGBX', 'RGB', 'La', 'L']: - case = self.make_case(mode, (4, 4), 0xe1) - case = case.resize((8, 8), Image.HAMMING) - data = ('e1 e1 ea d1' - 'e1 e1 ea d1' - 'ea ea f4 d9' - 'd1 d1 d9 c4') + case = self.make_case(mode, (2, 2), 0xe1) + case = case.resize((4, 4), Image.HAMMING) + data = ('e1 d2' + 'd2 c5') for channel in case.split(): - self.check_case(channel, self.make_sample(data, (8, 8))) + self.check_case(channel, self.make_sample(data, (4, 4))) def test_enlarge_bicubic(self): for mode in ['RGBX', 'RGB', 'La', 'L']: diff --git a/libImaging/Resample.c b/libImaging/Resample.c index 770f5f611..d2847989a 100644 --- a/libImaging/Resample.c +++ b/libImaging/Resample.c @@ -32,6 +32,8 @@ static inline double hamming_filter(double x) x = -x; if (x == 0.0) return 1.0; + if (x >= 1.0) + return 0.0; x = x * M_PI; return sin(x) / x * (0.54f + 0.46f * cos(x)); } From afc592ad7b844fea06d9267c1f9ec69baf252403 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 29 May 2017 13:46:32 +0300 Subject: [PATCH 489/632] replace the excluding of zero coefficients with math power --- libImaging/Resample.c | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/libImaging/Resample.c b/libImaging/Resample.c index d2847989a..0f6a9e9dd 100644 --- a/libImaging/Resample.c +++ b/libImaging/Resample.c @@ -168,10 +168,12 @@ precompute_coeffs(int inSize, int outSize, struct filter *filterp, center = (xx + 0.5) * scale; ww = 0.0; ss = 1.0 / filterscale; - xmin = (int) floor(center - support); + // Round the value + xmin = (int) (center - support + 0.5); if (xmin < 0) xmin = 0; - xmax = (int) ceil(center + support); + // Round the value + xmax = (int) (center + support + 0.5); if (xmax > inSize) xmax = inSize; xmax -= xmin; @@ -180,21 +182,6 @@ precompute_coeffs(int inSize, int outSize, struct filter *filterp, double w = filterp->filter((x + xmin - center + 0.5) * ss); k[x] = w; ww += w; - - // We can skip extreme coefficients if they are zeroes. - if (w == 0) { - // Skip from the start. - if (x == 0) { - // At next loop `x` will be 0. - x -= 1; - // But `w` will not be 0, because it based on `xmin`. - xmin += 1; - xmax -= 1; - } else if (x == xmax - 1) { - // Truncate the last coefficient for current `xx`. - xmax -= 1; - } - } } for (x = 0; x < xmax; x++) { if (ww != 0.0) From 4b1784c9ade5a87981a5e22ff229ba33f26a06d1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 29 May 2017 19:24:00 +1000 Subject: [PATCH 490/632] Changed file opening to use with --- Tests/test_file_cur.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_cur.py b/Tests/test_file_cur.py index 5ae0e7eff..e6d13ef30 100644 --- a/Tests/test_file_cur.py +++ b/Tests/test_file_cur.py @@ -26,8 +26,8 @@ class TestFileCur(PillowTestCase): no_cursors_file = "Tests/images/no_cursors.cur" cur = CurImagePlugin.CurImageFile(TEST_FILE) - cur.fp = open(no_cursors_file, "rb") - self.assertRaises(TypeError, cur._open) + with open(no_cursors_file, "rb") as cur.fp: + self.assertRaises(TypeError, cur._open) if __name__ == '__main__': From 2a5447691af2acf905e6d56a3ebdb670b0e8e7b3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 30 May 2017 19:55:35 +1000 Subject: [PATCH 491/632] Replaced deprecated assert_ --- Tests/test_image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 27f5ad885..156396451 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -390,7 +390,7 @@ class TestRegistry(PillowTestCase): def test_encode_registry(self): Image.register_encoder('MOCK', mock_encode) - self.assert_('MOCK' in Image.ENCODERS) + self.assertIn('MOCK', Image.ENCODERS) enc = Image._getencoder('RGB', 'MOCK', ('args',), extra=('extra',)) From 4d75070223febe8a2d75a050625d5a6f3042c9f6 Mon Sep 17 00:00:00 2001 From: Dov Grobgeld Date: Tue, 30 May 2017 16:34:41 +0300 Subject: [PATCH 492/632] Fixed wrong expected size of luts read from disk. --- PIL/ImageMorph.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/ImageMorph.py b/PIL/ImageMorph.py index 8382f7ce0..dcce63fa4 100644 --- a/PIL/ImageMorph.py +++ b/PIL/ImageMorph.py @@ -234,7 +234,7 @@ class MorphOp(object): with open(filename, 'rb') as f: self.lut = bytearray(f.read()) - if len(self.lut) != 8192: + if len(self.lut) != LUT_SIZE: self.lut = None raise Exception('Wrong size operator file!') From 01b2d5b0ab6d7aaf614f191e7141e6761f706c74 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 30 May 2017 17:55:13 +0300 Subject: [PATCH 493/632] [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 52f8cea43..e8201fdcc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- ImageMorph: Fix wrong expected size of MRLs read from disk #2561 + [dov] + - Docs: Update install docs for FreeBSD #2546 [wiredfool] From 761081b1e32d995cdab6667c1dc1ba99b526948d Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 28 May 2017 22:56:25 +0300 Subject: [PATCH 494/632] Test mirroring --- Tests/test_imagemorph.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Tests/test_imagemorph.py b/Tests/test_imagemorph.py index f2247bdca..c0f6448e6 100644 --- a/Tests/test_imagemorph.py +++ b/Tests/test_imagemorph.py @@ -176,6 +176,24 @@ class MorphTests(PillowTestCase): self.assertEqual(len(coords), 4) self.assertEqual(tuple(coords), ((2, 2), (4, 2), (2, 4), (4, 4))) + def test_mirroring(self): + # Test 'M' for mirroring + mop = ImageMorph.MorphOp(patterns=['1:(... ... ...)->0', + 'M:(00. 01. ...)->1']) + count, Aout = mop.apply(self.A) + self.assertEqual(count, 7) + self.assert_img_equal_img_string(Aout, + """ + + ....... + ....... + ..1.1.. + ....... + ....... + ....... + ....... + """) + def test_non_binary_images(self): im = hopper('RGB') mop = ImageMorph.MorphOp(op_name="erosion8") From 04f28b691e961bff44b269652421f447add04c5c Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 28 May 2017 23:02:06 +0300 Subject: [PATCH 495/632] Test negate and fix a TypeError: list indices must be integers, not str --- PIL/ImageMorph.py | 6 +++--- Tests/test_imagemorph.py | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/PIL/ImageMorph.py b/PIL/ImageMorph.py index dcce63fa4..d2367737f 100644 --- a/PIL/ImageMorph.py +++ b/PIL/ImageMorph.py @@ -123,7 +123,7 @@ class LutBuilder(object): .replace('0', 'Z') .replace('1', '0') .replace('Z', '1')) - res = '%d' % (1-int(res)) + res = 1-int(res) patterns.append((pattern, res)) return patterns @@ -152,8 +152,8 @@ class LutBuilder(object): patterns += self._pattern_permute(pattern, options, result) # # Debugging -# for p,r in patterns: -# print(p,r) +# for p, r in patterns: +# print(p, r) # print('--') # compile the patterns into regular expressions for speed diff --git a/Tests/test_imagemorph.py b/Tests/test_imagemorph.py index c0f6448e6..dac1ae150 100644 --- a/Tests/test_imagemorph.py +++ b/Tests/test_imagemorph.py @@ -184,7 +184,6 @@ class MorphTests(PillowTestCase): self.assertEqual(count, 7) self.assert_img_equal_img_string(Aout, """ - ....... ....... ..1.1.. @@ -194,6 +193,23 @@ class MorphTests(PillowTestCase): ....... """) + def test_negate(self): + # Test 'N' for negate + mop = ImageMorph.MorphOp(patterns=['1:(... ... ...)->0', + 'N:(00. 01. ...)->1']) + count, Aout = mop.apply(self.A) + self.assertEqual(count, 8) + self.assert_img_equal_img_string(Aout, + """ + ....... + ....... + ..1.... + ....... + ....... + ....... + ....... + """) + def test_non_binary_images(self): im = hopper('RGB') mop = ImageMorph.MorphOp(op_name="erosion8") From 4c86ef0b521a9d8555de8e11445bf31cf038537f Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 29 May 2017 08:29:12 +0300 Subject: [PATCH 496/632] More morph tests --- Tests/test_imagemorph.py | 55 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/Tests/test_imagemorph.py b/Tests/test_imagemorph.py index dac1ae150..ef9d38fd4 100644 --- a/Tests/test_imagemorph.py +++ b/Tests/test_imagemorph.py @@ -218,6 +218,61 @@ class MorphTests(PillowTestCase): self.assertRaises(Exception, lambda: mop.match(im)) self.assertRaises(Exception, lambda: mop.get_on_pixels(im)) + def test_add_patterns(self): + # Arrange + lb = ImageMorph.LutBuilder(op_name='corner') + self.assertEqual(lb.patterns, ['1:(... ... ...)->0', + '4:(00. 01. ...)->1']) + new_patterns = ['M:(00. 01. ...)->1', + 'N:(00. 01. ...)->1'] + + # Act + lb.add_patterns(new_patterns) + + # Assert + self.assertEqual( + lb.patterns, + ['1:(... ... ...)->0', + '4:(00. 01. ...)->1', + 'M:(00. 01. ...)->1', + 'N:(00. 01. ...)->1']) + + def test_unknown_pattern(self): + self.assertRaises( + Exception, + lambda: ImageMorph.LutBuilder(op_name='unknown')) + + def test_pattern_syntax_error(self): + # Arrange + lb = ImageMorph.LutBuilder(op_name='corner') + new_patterns = ['a pattern with a syntax error'] + lb.add_patterns(new_patterns) + + # Act / Assert + self.assertRaises( + Exception, + lambda: lb.build_lut()) + + def test_load_invalid_mrl(self): + # Arrange + invalid_mrl = 'Tests/images/hopper.png' + mop = ImageMorph.MorphOp() + + # Act / Assert + self.assertRaises(Exception, lambda: mop.load_lut(invalid_mrl)) + + def test_set_lut(self): + # Arrange + lb = ImageMorph.LutBuilder(op_name='corner') + lut = lb.build_lut() + mop = ImageMorph.MorphOp() + + # Act + mop.set_lut(lut) + + # Assert + self.assertEqual(mop.lut, lut) + if __name__ == '__main__': unittest.main() From ffcd945ae7f96452787057f6869a2b20640f275d Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 29 May 2017 09:52:31 +0300 Subject: [PATCH 497/632] Test MRL save/load roundtrip --- Tests/test_imagemorph.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Tests/test_imagemorph.py b/Tests/test_imagemorph.py index ef9d38fd4..0ce8ac6da 100644 --- a/Tests/test_imagemorph.py +++ b/Tests/test_imagemorph.py @@ -261,6 +261,19 @@ class MorphTests(PillowTestCase): # Act / Assert self.assertRaises(Exception, lambda: mop.load_lut(invalid_mrl)) + def test_roundtrip_mrl(self): + # Arrange + tempfile = self.tempfile('temp.mrl') + mop = ImageMorph.MorphOp(op_name='corner') + initial_lut = mop.lut + + # Act + mop.save_lut(tempfile) + mop.load_lut(tempfile) + + # Act / Assert + self.assertEqual(mop.lut, initial_lut) + def test_set_lut(self): # Arrange lb = ImageMorph.LutBuilder(op_name='corner') From 803cdf068f77e40f5244b39a4dd5b6355c206f2f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Jun 2017 13:34:52 +1000 Subject: [PATCH 498/632] Removed unnecessary parameter --- Tests/test_imagegrab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imagegrab.py b/Tests/test_imagegrab.py index 840df31c2..b2edffa57 100644 --- a/Tests/test_imagegrab.py +++ b/Tests/test_imagegrab.py @@ -38,7 +38,7 @@ class TestImageGrabImport(PillowTestCase): # Assert if sys.platform in ["win32", "darwin"]: - self.assertIsNone(exception, None) + self.assertIsNone(exception) else: self.assertIsInstance(exception, ImportError) self.assertEqual(str(exception), From cf575ff93ef2de287c30aba62833ad51637011f4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Jun 2017 14:02:23 +1000 Subject: [PATCH 499/632] Replaced false assert with fail --- Tests/test_bmp_reference.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Tests/test_bmp_reference.py b/Tests/test_bmp_reference.py index fa4571e60..8e84cc8f1 100644 --- a/Tests/test_bmp_reference.py +++ b/Tests/test_bmp_reference.py @@ -99,8 +99,7 @@ class TestBmpReference(PillowTestCase): os.path.join(base, 'g', 'pal8rle.bmp'), os.path.join(base, 'g', 'pal4rle.bmp')) if f not in unsupported: - self.assertTrue( - False, "Unsupported Image %s: %s" % (f, msg)) + self.fail("Unsupported Image %s: %s" % (f, msg)) if __name__ == '__main__': From e8cba27bb1bce7b4ff8a703e77e50da233773289 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Jun 2017 14:04:54 +1000 Subject: [PATCH 500/632] Changed assert checks to more specific versions --- Tests/test_decompression_bomb.py | 2 +- Tests/test_features.py | 6 +++--- Tests/test_file_dcx.py | 2 +- Tests/test_file_fli.py | 2 +- Tests/test_file_gif.py | 2 +- Tests/test_file_im.py | 2 +- Tests/test_file_jpeg.py | 2 +- Tests/test_file_libtiff.py | 3 +-- Tests/test_file_mpo.py | 2 +- Tests/test_file_png.py | 8 ++++---- Tests/test_file_psd.py | 2 +- Tests/test_file_spider.py | 2 +- Tests/test_file_tiff.py | 10 +++++----- Tests/test_file_webp_metadata.py | 2 +- Tests/test_image.py | 2 +- Tests/test_image_getbbox.py | 4 ++-- Tests/test_image_getcolors.py | 14 +++++++------- Tests/test_image_getpalette.py | 16 ++++++++-------- Tests/test_imagecms.py | 24 ++++++++++++------------ Tests/test_imagetk.py | 2 +- Tests/test_tiff_ifdrational.py | 8 ++++---- 21 files changed, 58 insertions(+), 59 deletions(-) diff --git a/Tests/test_decompression_bomb.py b/Tests/test_decompression_bomb.py index e952f6586..675005d3f 100644 --- a/Tests/test_decompression_bomb.py +++ b/Tests/test_decompression_bomb.py @@ -21,7 +21,7 @@ class TestDecompressionBomb(PillowTestCase): # Arrange # Turn limit off Image.MAX_IMAGE_PIXELS = None - self.assertEqual(Image.MAX_IMAGE_PIXELS, None) + self.assertIsNone(Image.MAX_IMAGE_PIXELS) # Act / Assert # Implicit assert: no warning. diff --git a/Tests/test_features.py b/Tests/test_features.py index b9afe9b1d..eacf807db 100644 --- a/Tests/test_features.py +++ b/Tests/test_features.py @@ -7,10 +7,10 @@ class TestFeatures(PillowTestCase): def test_check_features(self): for feature in features.modules: - self.assertTrue( - features.check_module(feature) in [True, False, None]) + self.assertIn( + features.check_module(feature), [True, False, None]) for feature in features.codecs: - self.assertTrue(features.check_codec(feature) in [True, False]) + self.assertIn(features.check_codec(feature), [True, False]) def test_supported_features(self): self.assertIsInstance(features.get_supported_modules(), list) diff --git a/Tests/test_file_dcx.py b/Tests/test_file_dcx.py index 09da3c439..3da146d01 100644 --- a/Tests/test_file_dcx.py +++ b/Tests/test_file_dcx.py @@ -50,7 +50,7 @@ class TestFileDcx(PillowTestCase): im.seek(n_frames) break except EOFError: - self.assertTrue(im.tell() < n_frames) + self.assertLess(im.tell(), n_frames) def test_seek_too_far(self): # Arrange diff --git a/Tests/test_file_fli.py b/Tests/test_file_fli.py index a49301de1..ad4e8bc3f 100644 --- a/Tests/test_file_fli.py +++ b/Tests/test_file_fli.py @@ -38,7 +38,7 @@ class TestFileFli(PillowTestCase): im.seek(n_frames) break except EOFError: - self.assertTrue(im.tell() < n_frames) + self.assertLess(im.tell(), n_frames) if __name__ == '__main__': diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 1a67b7db5..bb2aa8a0d 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -226,7 +226,7 @@ class TestFileGif(PillowTestCase): im.seek(n_frames) break except EOFError: - self.assertTrue(im.tell() < n_frames) + self.assertLess(im.tell(), n_frames) def test_dispose_none(self): img = Image.open("Tests/images/dispose_none.gif") diff --git a/Tests/test_file_im.py b/Tests/test_file_im.py index 94d8bcce6..fcf4f52f4 100644 --- a/Tests/test_file_im.py +++ b/Tests/test_file_im.py @@ -30,7 +30,7 @@ class TestFileIm(PillowTestCase): im.seek(n_frames) break except EOFError: - self.assertTrue(im.tell() < n_frames) + self.assertLess(im.tell(), n_frames) def test_roundtrip(self): out = self.tempfile('temp.im') diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index f4cfe8d60..b33644bd7 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -93,7 +93,7 @@ class TestFileJpeg(PillowTestCase): self.assertEqual(test(72), (72, 72)) self.assertEqual(test(300), (300, 300)) self.assertEqual(test(100, 200), (100, 200)) - self.assertEqual(test(0), None) # square pixels + self.assertIsNone(test(0)) # square pixels def test_icc(self): # Test ICC support diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 9c60aedf9..4b67ba676 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -173,8 +173,7 @@ class TestFileLibTiff(LibTiffTestCase): 'RowsPerStrip', 'StripOffsets'] for field in requested_fields: - self.assertTrue(field in reloaded, - "%s not in metadata" % field) + self.assertIn(field, reloaded, "%s not in metadata" % field) def test_additional_metadata(self): # these should not crash. Seriously dummy data, most of it doesn't make diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index 4c9f31abd..b4d0c696e 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -110,7 +110,7 @@ class TestFileMpo(PillowTestCase): im.seek(n_frames) break except EOFError: - self.assertTrue(im.tell() < n_frames) + self.assertLess(im.tell(), n_frames) def test_image_grab(self): for test_file in test_files: diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 32d6a3acd..f9b9a1eb4 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -316,7 +316,7 @@ class TestFilePng(PillowTestCase): test_file = f.read()[:offset] im = Image.open(BytesIO(test_file)) - self.assertTrue(im.fp is not None) + self.assertIsNotNone(im.fp) self.assertRaises((IOError, SyntaxError), im.verify) def test_verify_ignores_crc_error(self): @@ -331,7 +331,7 @@ class TestFilePng(PillowTestCase): ImageFile.LOAD_TRUNCATED_IMAGES = True try: im = load(image_data) - self.assertTrue(im is not None) + self.assertIsNotNone(im) finally: ImageFile.LOAD_TRUNCATED_IMAGES = False @@ -462,7 +462,7 @@ class TestFilePng(PillowTestCase): def test_save_icc_profile(self): im = Image.open("Tests/images/icc_profile_none.png") - self.assertEqual(im.info['icc_profile'], None) + self.assertIsNone(im.info['icc_profile']) with_icc = Image.open("Tests/images/icc_profile.png") expected_icc = with_icc.info['icc_profile'] @@ -485,7 +485,7 @@ class TestFilePng(PillowTestCase): def test_roundtrip_no_icc_profile(self): im = Image.open("Tests/images/icc_profile_none.png") - self.assertEqual(im.info['icc_profile'], None) + self.assertIsNone(im.info['icc_profile']) im = roundtrip(im) self.assertNotIn('icc_profile', im.info) diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index 04a171cbb..ddd2507bc 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -44,7 +44,7 @@ class TestImagePsd(PillowTestCase): im.seek(n_frames+1) break except EOFError: - self.assertTrue(im.tell() < n_frames) + self.assertLess(im.tell(), n_frames) def test_seek_tell(self): im = Image.open(test_file) diff --git a/Tests/test_file_spider.py b/Tests/test_file_spider.py index 96f82054e..32f1f55e5 100644 --- a/Tests/test_file_spider.py +++ b/Tests/test_file_spider.py @@ -69,7 +69,7 @@ class TestImageSpider(PillowTestCase): img_list = SpiderImagePlugin.loadImageSeries(file_list) # Assert - self.assertEqual(img_list, None) + self.assertIsNone(img_list) def test_isInt_not_a_number(self): # Arrange diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 1e182fb1a..ebcc6dd35 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -237,7 +237,7 @@ class TestFileTiff(PillowTestCase): im.seek(n_frames) break except EOFError: - self.assertTrue(im.tell() < n_frames) + self.assertLess(im.tell(), n_frames) def test_multipage(self): # issue #862 @@ -484,7 +484,7 @@ class TestFileTiff(PillowTestCase): def test_close_on_load_nonexclusive(self): tmpfile = self.tempfile("temp.tif") - + with Image.open("Tests/images/uint16_1_4660.tif") as im: im.save(tmpfile) @@ -495,7 +495,7 @@ class TestFileTiff(PillowTestCase): im.load() self.assertFalse(fp.closed) - + @unittest.skipUnless(sys.platform.startswith('win32'), "Windows only") class TestFileTiffW32(PillowTestCase): @@ -503,7 +503,7 @@ class TestFileTiffW32(PillowTestCase): tmpfile = self.tempfile("temp.tif") import os - # this is an mmaped file. + # this is an mmaped file. with Image.open("Tests/images/uint16_1_4660.tif") as im: im.save(tmpfile) @@ -516,7 +516,7 @@ class TestFileTiffW32(PillowTestCase): # this closes the mmap im.close() - + # this should not fail, as load should have closed the file pointer, # and close should have closed the mmap os.remove(tmpfile) diff --git a/Tests/test_file_webp_metadata.py b/Tests/test_file_webp_metadata.py index 947f8464a..88e2b3b88 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) - self.assertTrue('exif' in image.info) + self.assertIn('exif', image.info) test_buffer = BytesIO() diff --git a/Tests/test_image.py b/Tests/test_image.py index 156396451..ea813cd84 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -170,7 +170,7 @@ class TestImage(PillowTestCase): im2 = Image.new('RGB', (25, 25), 'white') # Act / Assert - self.assertTrue(im1 != im2) + self.assertNotEqual(im1, im2) def test_alpha_composite(self): # https://stackoverflow.com/questions/3374878 diff --git a/Tests/test_image_getbbox.py b/Tests/test_image_getbbox.py index 116f26497..f29032143 100644 --- a/Tests/test_image_getbbox.py +++ b/Tests/test_image_getbbox.py @@ -14,7 +14,7 @@ class TestImageGetBbox(PillowTestCase): # 8-bit mode im = Image.new("L", (100, 100), 0) - self.assertEqual(im.getbbox(), None) + self.assertIsNone(im.getbbox()) im.paste(255, (10, 25, 90, 75)) self.assertEqual(im.getbbox(), (10, 25, 90, 75)) @@ -27,7 +27,7 @@ class TestImageGetBbox(PillowTestCase): # 32-bit mode im = Image.new("RGB", (100, 100), 0) - self.assertEqual(im.getbbox(), None) + self.assertIsNone(im.getbbox()) im.paste(255, (10, 25, 90, 75)) self.assertEqual(im.getbbox(), (10, 25, 90, 75)) diff --git a/Tests/test_image_getcolors.py b/Tests/test_image_getcolors.py index a6a20b288..ca7a9d93d 100644 --- a/Tests/test_image_getcolors.py +++ b/Tests/test_image_getcolors.py @@ -20,15 +20,15 @@ class TestImageGetColors(PillowTestCase): self.assertEqual(getcolors("I"), 255) self.assertEqual(getcolors("F"), 255) self.assertEqual(getcolors("P"), 90) # fixed palette - self.assertEqual(getcolors("RGB"), None) - self.assertEqual(getcolors("RGBA"), None) - self.assertEqual(getcolors("CMYK"), None) - self.assertEqual(getcolors("YCbCr"), None) + self.assertIsNone(getcolors("RGB")) + self.assertIsNone(getcolors("RGBA")) + self.assertIsNone(getcolors("CMYK")) + self.assertIsNone(getcolors("YCbCr")) - self.assertEqual(getcolors("L", 128), None) + self.assertIsNone(getcolors("L", 128)) self.assertEqual(getcolors("L", 1024), 255) - self.assertEqual(getcolors("RGB", 8192), None) + self.assertIsNone(getcolors("RGB", 8192)) self.assertEqual(getcolors("RGB", 16384), 10100) self.assertEqual(getcolors("RGB", 100000), 10100) @@ -48,7 +48,7 @@ class TestImageGetColors(PillowTestCase): (7960, (31, 20, 33))] A = im.getcolors(maxcolors=2) - self.assertEqual(A, None) + self.assertIsNone(A) A = im.getcolors(maxcolors=3) A.sort() diff --git a/Tests/test_image_getpalette.py b/Tests/test_image_getpalette.py index 14ecddbbf..01a6ac7ad 100644 --- a/Tests/test_image_getpalette.py +++ b/Tests/test_image_getpalette.py @@ -9,15 +9,15 @@ class TestImageGetPalette(PillowTestCase): if p: return p[:10] return None - self.assertEqual(palette("1"), None) - self.assertEqual(palette("L"), None) - self.assertEqual(palette("I"), None) - self.assertEqual(palette("F"), None) + self.assertIsNone(palette("1")) + self.assertIsNone(palette("L")) + self.assertIsNone(palette("I")) + self.assertIsNone(palette("F")) self.assertEqual(palette("P"), [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) - self.assertEqual(palette("RGB"), None) - self.assertEqual(palette("RGBA"), None) - self.assertEqual(palette("CMYK"), None) - self.assertEqual(palette("YCbCr"), None) + self.assertIsNone(palette("RGB")) + self.assertIsNone(palette("RGBA")) + self.assertIsNone(palette("CMYK")) + self.assertIsNone(palette("YCbCr")) if __name__ == '__main__': diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index 21493e8d5..ef30f3e00 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -222,7 +222,7 @@ class TestImageCms(PillowTestCase): self.assertTrue(img_srgb.info['icc_profile']) profile = ImageCmsProfile(BytesIO(img_srgb.info['icc_profile'])) - self.assertTrue('sRGB' in ImageCms.getProfileDescription(profile)) + self.assertIn('sRGB', ImageCms.getProfileDescription(profile)) def test_lab_roundtrip(self): # check to see if we're at least internally consistent. @@ -275,12 +275,12 @@ class TestImageCms(PillowTestCase): assert_truncated_tuple_equal(p.blue_colorant, ((0.14306640625, 0.06060791015625, 0.7140960693359375), (0.1558847490315394, 0.06603820639433387, 0.06060791015625))) assert_truncated_tuple_equal(p.blue_primary, ((0.14306641366715667, 0.06060790921083026, 0.7140960805782015), (0.15588475410450106, 0.06603820408959558, 0.06060790921083026))) assert_truncated_tuple_equal(p.chromatic_adaptation, (((1.04791259765625, 0.0229339599609375, -0.050201416015625), (0.02960205078125, 0.9904632568359375, -0.0170745849609375), (-0.009246826171875, 0.0150604248046875, 0.7517852783203125)), ((1.0267159024652783, 0.022470062342089134, 0.0229339599609375), (0.02951378324103937, 0.9875098886387147, 0.9904632568359375), (-0.012205438066465256, 0.01987915407854985, 0.0150604248046875)))) - self.assertEqual(p.chromaticity, None) + self.assertIsNone(p.chromaticity) self.assertEqual(p.clut, {0: (False, False, True), 1: (False, False, True), 2: (False, False, True), 3: (False, False, True)}) self.assertEqual(p.color_space, 'RGB') - self.assertEqual(p.colorant_table, None) - self.assertEqual(p.colorant_table_out, None) - self.assertEqual(p.colorimetric_intent, None) + self.assertIsNone(p.colorant_table) + self.assertIsNone(p.colorant_table_out) + self.assertIsNone(p.colorimetric_intent) self.assertEqual(p.connection_space, 'XYZ ') self.assertEqual(p.copyright, 'Copyright International Color Consortium, 2009') self.assertEqual(p.creation_date, datetime.datetime(2009, 2, 27, 21, 36, 31)) @@ -292,17 +292,17 @@ class TestImageCms(PillowTestCase): self.assertEqual(p.header_model, '\x00\x00\x00\x00') self.assertEqual(p.icc_measurement_condition, {'backing': (0.0, 0.0, 0.0), 'flare': 0.0, 'geo': 'unknown', 'observer': 1, 'illuminant_type': 'D65'}) self.assertEqual(p.icc_version, 33554432) - self.assertEqual(p.icc_viewing_condition, None) + self.assertIsNone(p.icc_viewing_condition) self.assertEqual(p.intent_supported, {0: (True, True, True), 1: (True, True, True), 2: (True, True, True), 3: (True, True, True)}) - self.assertEqual(p.is_matrix_shaper, True) + self.assertTrue(p.is_matrix_shaper) self.assertEqual(p.luminance, ((0.0, 80.0, 0.0), (0.0, 1.0, 80.0))) - self.assertEqual(p.manufacturer, None) + self.assertIsNone(p.manufacturer) assert_truncated_tuple_equal(p.media_black_point, ((0.012054443359375, 0.0124969482421875, 0.01031494140625), (0.34573304157549234, 0.35842450765864337, 0.0124969482421875))) assert_truncated_tuple_equal(p.media_white_point, ((0.964202880859375, 1.0, 0.8249053955078125), (0.3457029219802284, 0.3585375327567059, 1.0))) assert_truncated_tuple_equal((p.media_white_point_temperature,), (5000.722328847392,)) self.assertEqual(p.model, 'IEC 61966-2-1 Default RGB Colour Space - sRGB') self.assertEqual(p.pcs, 'XYZ') - self.assertEqual(p.perceptual_rendering_intent_gamut, None) + self.assertIsNone(p.perceptual_rendering_intent_gamut) self.assertEqual(p.product_copyright, 'Copyright International Color Consortium, 2009') self.assertEqual(p.product_desc, 'sRGB IEC61966-2-1 black scaled') self.assertEqual(p.product_description, 'sRGB IEC61966-2-1 black scaled') @@ -313,9 +313,9 @@ class TestImageCms(PillowTestCase): assert_truncated_tuple_equal(p.red_colorant, ((0.436065673828125, 0.2224884033203125, 0.013916015625), (0.6484536316398539, 0.3308524880306778, 0.2224884033203125))) assert_truncated_tuple_equal(p.red_primary, ((0.43606566581047446, 0.22248840582960838, 0.013916015621759925), (0.6484536250319214, 0.3308524944738204, 0.22248840582960838))) self.assertEqual(p.rendering_intent, 0) - self.assertEqual(p.saturation_rendering_intent_gamut, None) - self.assertEqual(p.screening_description, None) - self.assertEqual(p.target, None) + self.assertIsNone(p.saturation_rendering_intent_gamut) + self.assertIsNone(p.screening_description) + self.assertIsNone(p.target) self.assertEqual(p.technology, 'CRT ') self.assertEqual(p.version, 2.0) self.assertEqual(p.viewing_condition, 'Reference Viewing Condition in IEC 61966-2-1') diff --git a/Tests/test_imagetk.py b/Tests/test_imagetk.py index 8c8723927..fbf48a1b6 100644 --- a/Tests/test_imagetk.py +++ b/Tests/test_imagetk.py @@ -45,7 +45,7 @@ class TestImageTk(PillowTestCase): # Test no relevant entry im = ImageTk._get_image_from_kw(kw) - self.assertEqual(im, None) + self.assertIsNone(im) def test_photoimage(self): for mode in TK_MODES: diff --git a/Tests/test_tiff_ifdrational.py b/Tests/test_tiff_ifdrational.py index 54f330ec3..0bf4503c4 100644 --- a/Tests/test_tiff_ifdrational.py +++ b/Tests/test_tiff_ifdrational.py @@ -34,10 +34,10 @@ class Test_IFDRational(PillowTestCase): xres = IFDRational(72) yres = IFDRational(72) - self.assertTrue(xres._val is not None) - self.assertTrue(xres.numerator is not None) - self.assertTrue(xres.denominator is not None) - self.assertTrue(yres._val is not None) + self.assertIsNotNone(xres._val) + self.assertIsNotNone(xres.numerator) + self.assertIsNotNone(xres.denominator) + self.assertIsNotNone(yres._val) self.assertTrue(xres and 1) self.assertTrue(xres and yres) From b8e0daaf70849d380bd2900b2a43bab69fe22281 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Jun 2017 14:05:24 +1000 Subject: [PATCH 501/632] Replaced true assert with comment --- Tests/test_image_resample.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index 98fe3b0f7..96ad93578 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -16,8 +16,8 @@ class TestImagingResampleVulnerability(PillowTestCase): def test_invalid_size(self): im = hopper() + # Should not crash im.resize((100, 100)) - self.assertTrue(True, "Should not Crash") with self.assertRaises(ValueError): im.resize((-100, 100)) From dcd964fb22f2b838cf04000da91e0f36d6668a63 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 8 Jun 2017 20:21:00 +1000 Subject: [PATCH 502/632] Updated limits documentation [ci skip] --- docs/reference/limits.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/limits.rst b/docs/reference/limits.rst index 6f81c9e65..79dc66e67 100644 --- a/docs/reference/limits.rst +++ b/docs/reference/limits.rst @@ -10,7 +10,7 @@ Internal Limits * Image sizes cannot be negative. These are checked both in ``Storage.c`` and ``Image.py`` -* Image sizes may be 0. (At least, prior to 3.4) +* Image sizes may be 0. (Although not in 3.4) * Maximum pixel dimensions are limited to INT32, or 2^31 by the sizes in the image header. From 80e75876e9f55bf041f67d028696c37aa4f24cfa Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 8 Jun 2017 23:25:01 +0300 Subject: [PATCH 503/632] Update pypy --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8fc19a876..6349db0fe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,8 +10,8 @@ notifications: matrix: fast_finish: true include: - - python: "pypy" - - python: "pypy3" + - python: "pypy-5.7.1" + - python: "pypy3.3-5.2-alpha1" - python: '3.6' - python: '2.7' - python: "2.7_with_system_site_packages" # For PyQt4 From 4f12862d6c4df15acca6909e1aba15af6b3e3e17 Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 8 Jun 2017 23:55:40 +0300 Subject: [PATCH 504/632] Disable single-threaded build for pypy3.3 --- mp_compile.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mp_compile.py b/mp_compile.py index 31833dee3..59f14a651 100644 --- a/mp_compile.py +++ b/mp_compile.py @@ -54,7 +54,8 @@ def _mp_compile(self, sources, output_dir=None, macros=None, def install(): - fl_pypy3 = hasattr(sys, 'pypy_version_info') and sys.version_info > (3, 0) + fl_pypy3 = (hasattr(sys, 'pypy_version_info') and + (3, 0) < sys.version_info < (3, 3)) fl_win = sys.platform.startswith('win') fl_cygwin = sys.platform.startswith('cygwin') @@ -82,4 +83,5 @@ def install(): print("Single threaded build, not installing mp_compile:" "%s processes" % MAX_PROCS) + install() From 7fc4cfafa253dd5c7eda4bfead1bece7c87fc041 Mon Sep 17 00:00:00 2001 From: hugovk Date: Fri, 9 Jun 2017 00:00:34 +0300 Subject: [PATCH 505/632] Install pyroma for all --- .travis/install.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.travis/install.sh b/.travis/install.sh index 4b7503bed..259d33e55 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -9,12 +9,10 @@ pip install cffi pip install nose pip install check-manifest pip install olefile -# Pyroma tests sometimes hang on PyPy; skip -if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then pip install pyroma; fi - +pip install pyroma pip install coverage -# docs only on python 2.7 +# docs only on Python 2.7 if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then pip install -r requirements.txt ; fi # clean checkout for manifest From fe183f744800fc683854d0995699ebd2d45844a6 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 12 Jun 2017 14:23:46 +0100 Subject: [PATCH 506/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e8201fdcc..37e92512d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- CI: Update pypy on TravisCI + [hugovk] + - ImageMorph: Fix wrong expected size of MRLs read from disk #2561 [dov] From d012f50975c9c1edfbc8a757368ff6e043be069a Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 11 May 2017 21:01:58 +0000 Subject: [PATCH 507/632] Simplify feature checking, fix transparent webp detection, add webpmux detection --- PIL/features.py | 68 ++++++++++++++++++++++++++++--------------------- _webp.c | 13 +++++++++- selftest.py | 17 +++---------- 3 files changed, 54 insertions(+), 44 deletions(-) diff --git a/PIL/features.py b/PIL/features.py index fb8e4371b..15aeb2ad9 100644 --- a/PIL/features.py +++ b/PIL/features.py @@ -6,41 +6,22 @@ modules = { "freetype2": "PIL._imagingft", "littlecms2": "PIL._imagingcms", "webp": "PIL._webp", - "transp_webp": ("WEBP", "WebPDecoderBuggyAlpha") } - def check_module(feature): - if feature not in modules: + if not (feature in modules): raise ValueError("Unknown module %s" % feature) module = modules[feature] - method_to_call = None - if isinstance(module, 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 - + except ImportError: + return False def get_supported_modules(): - supported_modules = [] - for feature in modules: - if check_module(feature): - supported_modules.append(feature) - return supported_modules + return [f for f in modules if check_module(f)] codecs = { "jpg": "jpeg", @@ -49,7 +30,6 @@ codecs = { "libtiff": "libtiff" } - def check_codec(feature): if feature not in codecs: raise ValueError("Unknown codec %s" % feature) @@ -60,8 +40,38 @@ def check_codec(feature): def get_supported_codecs(): - supported_codecs = [] - for feature in codecs: - if check_codec(feature): - supported_codecs.append(feature) - return supported_codecs + return [f for f in codecs if check_codec(f)] + +features = { + "webp_mux": ("PIL._webp", 'HAVE_WEBPMUX'), + "transp_webp": ("PIL._webp", "HAVE_TRANSPARENCY"), +} + +def check_feature(feature): + if feature not in features: + raise ValueError("Unknown feature %s" % feature) + + module, flag = features[feature] + + try: + imported_module = __import__(module, fromlist=['PIL']) + return getattr(imported_module, flag) + except ImportError: + return None + + +def get_supported_features(): + return [f for f in features if check_feature(f)] + + +def check(feature): + return (feature in modules and check_module(feature) or \ + feature in codecs and check_codec(feature) or \ + feature in features and check_feature(feature)) + +def get_supported(): + ret = get_supported_modules() + ret.extend(get_supported_features()) + ret.extend(get_supported_codecs()) + return ret + diff --git a/_webp.c b/_webp.c index 70830ec8b..421f49957 100644 --- a/_webp.c +++ b/_webp.c @@ -247,8 +247,12 @@ PyObject* WebPDecoderVersion_wrapper(PyObject* self, PyObject* args){ * The version of webp that ships with (0.1.3) Ubuntu 12.04 doesn't handle alpha well. * Files that are valid with 0.3 are reported as being invalid. */ +int WebPDecoderBuggyAlpha() { + return WebPGetDecoderVersion()==0x0103; +} + PyObject* WebPDecoderBuggyAlpha_wrapper(PyObject* self, PyObject* args){ - return Py_BuildValue("i", WebPGetDecoderVersion()==0x0103); + return Py_BuildValue("i", WebPDecoderBuggyAlpha()); } static PyMethodDef webpMethods[] = @@ -268,6 +272,11 @@ void addMuxFlagToModule(PyObject* m) { #endif } +void addTransparencyFlagToModule(PyObject* m) { + PyModule_AddObject(m, "HAVE_TRANSPARENCY", + PyBool_FromLong(!WebPDecoderBuggyAlpha())); +} + #if PY_VERSION_HEX >= 0x03000000 PyMODINIT_FUNC @@ -284,6 +293,7 @@ PyInit__webp(void) { m = PyModule_Create(&module_def); addMuxFlagToModule(m); + addTransparencyFlagToModule(m); return m; } #else @@ -292,5 +302,6 @@ init_webp(void) { PyObject* m = Py_InitModule("_webp", webpMethods); addMuxFlagToModule(m); + addTransparencyFlagToModule(m); } #endif diff --git a/selftest.py b/selftest.py index 067db4d79..f6e8e5ed8 100755 --- a/selftest.py +++ b/selftest.py @@ -178,25 +178,14 @@ if __name__ == "__main__": ("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 - # for the method could not be correctly imported - pass - elif supported: - print("---", feature, "support ok") - else: - print("***", feature, "support not installed") - for name, feature in [ + ("transp_webp", "Transparent WEBP"), + ("webp_mux", "WEBPMUX"), ("jpg", "JPEG"), ("jpg_2000", "OPENJPEG (JPEG2000)"), ("zlib", "ZLIB (PNG/ZIP)"), ("libtiff", "LIBTIFF") ]: - if features.check_codec(name): + if features.check(name): print("---", feature, "support ok") else: print("***", feature, "support not installed") From 3293d6a1c5ddb347504deec3d07eaedc26d58643 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 11 May 2017 21:34:21 +0000 Subject: [PATCH 508/632] tests for features --- Tests/test_features.py | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/Tests/test_features.py b/Tests/test_features.py index eacf807db..d14aaca69 100644 --- a/Tests/test_features.py +++ b/Tests/test_features.py @@ -2,19 +2,50 @@ from helper import unittest, PillowTestCase from PIL import features +try: + from PIL import _webp + HAVE_WEBP = True +except: + HAVE_WEBP = False + class TestFeatures(PillowTestCase): - def test_check_features(self): + def test_check(self): + # Check the correctness of the convenience function + for module in features.modules: + self.assertEqual(features.check_module(module), + features.check(module)) + for codec in features.codecs: + self.assertEqual(features.check_codec(codec), + features.check(codec)) + for feature in features.features: + self.assertEqual(features.check_feature(feature), + features.check(feature)) + + @unittest.skipUnless(HAVE_WEBP, True) + def check_webp_transparency(self): + self.assertEqual(features.check('transp_webp'), + not _webp.WebPDecoderBuggyAlpha()) + self.assertEqual(features.check('transp_webp'), + _webp.HAVE_TRANSPARENCY) + + @unittest.skipUnless(HAVE_WEBP, True) + def check_webp_mux(self): + self.assertEqual(features.check('webp_mux'), + _webp.HAVE_WEBPMUX) + + def test_check_modules(self): for feature in features.modules: - self.assertIn( - features.check_module(feature), [True, False, None]) + self.assertIn(features.check_module(feature), [True, False]) for feature in features.codecs: self.assertIn(features.check_codec(feature), [True, False]) - def test_supported_features(self): + def test_supported_modules(self): self.assertIsInstance(features.get_supported_modules(), list) self.assertIsInstance(features.get_supported_codecs(), list) + self.assertIsInstance(features.get_supported_features(), list) + self.assertIsInstance(features.get_supported(), list) def test_unsupported_codec(self): # Arrange From bd18a10c874dfb3c17bc74780788c3d42b1eca3e Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 May 2017 15:21:35 +0000 Subject: [PATCH 509/632] Check the tk feature based on tkinter_finder --- PIL/features.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/features.py b/PIL/features.py index 15aeb2ad9..e01a32193 100644 --- a/PIL/features.py +++ b/PIL/features.py @@ -2,7 +2,7 @@ from . import Image modules = { "pil": "PIL._imaging", - "tkinter": "PIL._imagingtk", + "tkinter": "PIL._tkinter_finder", "freetype2": "PIL._imagingft", "littlecms2": "PIL._imagingcms", "webp": "PIL._webp", From 66dc99347c60ec58ba2b9b420fd35e754e7a69be Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 May 2017 15:31:07 +0000 Subject: [PATCH 510/632] install tk on travis --- .travis/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/install.sh b/.travis/install.sh index 259d33e55..d5f190619 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -3,7 +3,7 @@ set -e sudo apt-get update -sudo apt-get -qq install libfreetype6-dev liblcms2-dev\ +sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-tk \ python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake imagemagick pip install cffi pip install nose From b544f2ea0107699a7f02bccb3a7b2966f1a1e802 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Jun 2017 13:03:14 +0100 Subject: [PATCH 511/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 37e92512d..18e6cd440 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Update Feature Detection + [wiredfool] + - CI: Update pypy on TravisCI [hugovk] From af790df295447d4dba27a74bc780ef18c126131d Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Jun 2017 13:34:03 +0100 Subject: [PATCH 512/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 18e6cd440..b5921e154 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,10 +4,31 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ -- Update Feature Detection +- Remove deprecated code #2549 + [hugovk] + +- Added append_images to PDF saving #2526 + [radarhere] + +- Remove unused function core image function new_array #2548 + [hugovk] + +- Remove unnecessary calls to dict.keys() #2551 + [jdufresne] + +- Add more ImageDraw.py tests and remove unused Draw.c code #2533 + [hugovk] + +- Test: More tests for ImageMorph #2554 + [hugovk] + +- Test: McIDAS area file #2552 + [radarhere] + +- Update Feature Detection #2520 [wiredfool] -- CI: Update pypy on TravisCI +- CI: Update pypy on TravisCI #2573 [hugovk] - ImageMorph: Fix wrong expected size of MRLs read from disk #2561 From 2d02f4ea9b0f74026854a38b963daf768dc33612 Mon Sep 17 00:00:00 2001 From: hugovk Date: Tue, 13 Jun 2017 23:07:46 +0300 Subject: [PATCH 513/632] Adjust test for the gamma of 2.2 encoded into the file --- Tests/test_file_mic.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_mic.py b/Tests/test_file_mic.py index a2be6c126..8724a2983 100644 --- a/Tests/test_file_mic.py +++ b/Tests/test_file_mic.py @@ -1,6 +1,6 @@ from helper import unittest, PillowTestCase, hopper -from PIL import Image, MicImagePlugin +from PIL import Image, ImagePalette, MicImagePlugin TEST_FILE = "Tests/images/hopper.mic" @@ -14,8 +14,12 @@ class TestFileMic(PillowTestCase): self.assertEqual(im.size, (128, 128)) self.assertEqual(im.format, "MIC") + # Adjust for the gamma of 2.2 encoded into the file + lut = ImagePalette.make_gamma_lut(1/2.2) + im = Image.merge('RGBA', [chan.point(lut) for chan in im.split()]) + im2 = hopper("RGBA") - self.assert_image_similar(im, im2, 123.5) + self.assert_image_similar(im, im2, 10) def test_n_frames(self): im = Image.open(TEST_FILE) From 5d00979dd4b18d09a4f4ca848b202c4c7b010e73 Mon Sep 17 00:00:00 2001 From: hugovk Date: Tue, 13 Jun 2017 23:08:46 +0300 Subject: [PATCH 514/632] Note that there may be an embedded gamma of 2.2 in MIC files --- docs/handbook/image-file-formats.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 760c6019d..a0f638e84 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -124,7 +124,7 @@ are available:: eliminating unused colors. This is only useful if the palette can be compressed to the next smaller power of 2 elements. -**palette** +**palette** Use the specified palette for the saved image. The palette should be a bytes or bytearray object containing the palette entries in RGBRGB... form. It should be no more than 768 bytes. Alternately, @@ -789,6 +789,8 @@ PIL identifies and reads Microsoft Image Composer (MIC) files. When opened, the first sprite in the file is loaded. You can use :py:meth:`~file.seek` and :py:meth:`~file.tell` to read other sprites from the file. +Note that there may be an embedded gamma of 2.2 in MIC files. + MPO ^^^ From 0f49b8ee7d7015fa954041e4813e570f326f848c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Jun 2017 21:09:25 +0100 Subject: [PATCH 515/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index b5921e154..186208716 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Use round() instead of floor() to eliminate zero coefficients in resample #2558 + [homm] + - Remove deprecated code #2549 [hugovk] From 078d4901068bb43f238704e8baa16aeebdffdd29 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Jun 2017 22:20:29 +0100 Subject: [PATCH 516/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 186208716..8ec85f440 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Test: MicImagePlugin #2447 + [hugovk] + - Use round() instead of floor() to eliminate zero coefficients in resample #2558 [homm] From 7622885f3c1cde56184a355c386399f96cbfe86c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Jun 2017 14:23:18 -0700 Subject: [PATCH 517/632] s/warning/note/ --- PIL/Image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/Image.py b/PIL/Image.py index 1a94fec3a..cd1558ae1 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1051,7 +1051,7 @@ class Image(object): in place. If the image has already been loaded, this method has no effect. - Warning: This method is not implemented for most images. It is + Note: This method is not implemented for most images. It is currently implemented only for JPEG and PCD images. :param mode: The requested mode. From d2ce692f67ce00352b3e5cd0d1a886066cc9f55d Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Jun 2017 22:35:12 +0100 Subject: [PATCH 518/632] Use code for unknown error when initializing. Any case where we hit the cleanup without otherwise setting err_code is some sort of caught error that we're not considering. May not be possible anymore --- PIL/ImageFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 0c7a19194..9ada2f6db 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -178,7 +178,7 @@ class ImageFile(Image.Image): self.map = None self.load_prepare() - err_code = 0 + err_code = -3 # initialize to unknown error if not self.map: # sort tiles in file order self.tile.sort(key=_tilesort) From 95eee4315d710b564560cbfd32ec78ed31801825 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Jun 2017 22:49:09 +0100 Subject: [PATCH 519/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 8ec85f440..fb9402a0b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Tiff: Support append_images for saving multipage TIFFs #2406 + [blochl] + +- Doc: Clarify that draft is only implemented for JPEG and PCD #2409 + [wiredfool] + - Test: MicImagePlugin #2447 [hugovk] From 130c9c52a4cd821ef099bfe30d46a9dd24a11aee Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 14 Jun 2017 09:21:21 +0100 Subject: [PATCH 520/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index fb9402a0b..5e7a3fdb0 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- ImageFile: Ensure that the `err_code` variable is initialized in case of exception. #2363 + [alexkiro] + - Tiff: Support append_images for saving multipage TIFFs #2406 [blochl] From 7b77ee53790e783fc21347a1b409295e5e85d401 Mon Sep 17 00:00:00 2001 From: Garland Trice Date: Tue, 20 Jun 2017 21:44:06 -0700 Subject: [PATCH 521/632] Fixing small typo Working on a small project, reading thru the docs and noticed this. --- docs/reference/ImageDraw.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 49cbc2177..b59a21b9b 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -64,7 +64,7 @@ Fonts PIL can use bitmap fonts or OpenType/TrueType fonts. Bitmap fonts are stored in PIL’s own format, where each font typically consists -of a two files, one named .pil and the other usually named .pbm. The former +of two files, one named .pil and the other usually named .pbm. The former contains font metrics, the latter raster data. To load a bitmap font, use the load functions in the :py:mod:`~PIL.ImageFont` From c70977aad7196104c975fd89fe0e3f621fa1a84b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 17 Feb 2017 07:07:14 -0800 Subject: [PATCH 522/632] added decompression bomb check to crop --- PIL/Image.py | 18 +++++++++++++++++- Tests/test_decompression_bomb.py | 23 +++++++++++++++++++---- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index c22ab3955..9910d2162 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1042,6 +1042,20 @@ class Image(object): if box is None: return self.copy() + return self._new(self._crop(self.im, box)) + + def _crop(self, im, box): + """ + Returns a rectangular region from the core image object im. + + This is equivalent to calling im.crop((x0, y0, x1, y1)), but + includes additional sanity checks. + + :param im: a core image object + :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. + :returns: A core image object. + """ + x0, y0, x1, y1 = map(int, map(round, box)) if x0 == 0 and y0 == 0 and (x1, y1) == self.size: @@ -1052,8 +1066,10 @@ class Image(object): if y1 < y0: y1 = y0 - return self._new(self.im.crop((x0, y0, x1, y1))) + _decompression_bomb_check((x1, y1)) + return im.crop((x0, y0, x1, y1)) + def draft(self, mode, size): """ Configures the image file loader so it returns a version of the diff --git a/Tests/test_decompression_bomb.py b/Tests/test_decompression_bomb.py index 675005d3f..5598fd9c8 100644 --- a/Tests/test_decompression_bomb.py +++ b/Tests/test_decompression_bomb.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -35,9 +35,24 @@ class TestDecompressionBomb(PillowTestCase): self.assertEqual(Image.MAX_IMAGE_PIXELS, 10) # Act / Assert - self.assert_warning( - Image.DecompressionBombWarning, - lambda: Image.open(TEST_FILE)) + self.assert_warning(Image.DecompressionBombWarning, + lambda: Image.open(TEST_FILE)) + +class TestDecompressionCrop(PillowTestCase): + + def setUp(self): + self.src = hopper() + Image.MAX_IMAGE_PIXELS = self.src.height * self.src.width + + def tearDown(self): + Image.MAX_IMAGE_PIXELS = ORIGINAL_LIMIT + + def testEnlargeCrop(self): + # Crops can extend the extents, therefore we should have the + # same decompression bomb warnings on them. + box = (0, 0, self.src.width * 2, self.src.height * 2) + self.assert_warning(Image.DecompressionBombWarning, + lambda: self.src.crop(box)) if __name__ == '__main__': unittest.main() From 228c5bb292bb72b87bc4d5fc6826a94b47f2edbd Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 17 Feb 2017 07:18:18 -0800 Subject: [PATCH 523/632] using the decompression bomb _crop filter --- PIL/GifImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index b20fdd452..75158809d 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -257,7 +257,7 @@ class GifImageFile(ImageFile.ImageFile): # only dispose the extent in this frame if self.dispose: - self.dispose = self.dispose.crop(self.dispose_extent) + self.dispose = self._crop(self.dispose, self.dispose_extent) except (AttributeError, KeyError): pass @@ -280,7 +280,7 @@ class GifImageFile(ImageFile.ImageFile): if self._prev_im and self.disposal_method == 1: # we do this by pasting the updated area onto the previous # frame which we then use as the current image content - updated = self.im.crop(self.dispose_extent) + updated = self._crop(self.im, self.dispose_extent) self._prev_im.paste(updated, self.dispose_extent, updated.convert('RGBA')) self.im = self._prev_im From fdc6e149fb706ea835c2cc4611f2262a73b91d0c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 13 May 2017 16:30:27 +0100 Subject: [PATCH 524/632] Fix bad merge -- undoes minor speedup of copy instead of crop --- PIL/Image.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 9910d2162..9936aad46 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1058,9 +1058,6 @@ class Image(object): x0, y0, x1, y1 = map(int, map(round, box)) - if x0 == 0 and y0 == 0 and (x1, y1) == self.size: - return self.copy() - if x1 < x0: x1 = x0 if y1 < y0: From 865bc45d722d8ea8cd41c48bd8ca379933fc040f Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 21 Jun 2017 11:00:55 +0100 Subject: [PATCH 525/632] Updated Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 5e7a3fdb0..971cad9a6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Add decompression bomb check to Image.crop #2410 + [wiredfool] + - ImageFile: Ensure that the `err_code` variable is initialized in case of exception. #2363 [alexkiro] From 8eb1dcb7c5b125cee27ae5ba2e1ea7359d18ee6f Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 21 Jun 2017 03:31:32 -0700 Subject: [PATCH 526/632] test for truncated png memory leak #2541 --- Tests/test_file_png.py | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 32d6a3acd..a4f3f5855 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -1,14 +1,16 @@ from helper import unittest, PillowTestCase, hopper +from PIL import Image, ImageFile, PngImagePlugin from io import BytesIO - -from PIL import Image -from PIL import ImageFile -from PIL import PngImagePlugin import zlib +import sys codecs = dir(Image.core) +# For Truncated phng memory leak +MEM_LIMIT = 1 # max increase in MB +ITERATIONS = 100 + # sample png stream TEST_PNG_FILE = "Tests/images/hopper.png" @@ -530,5 +532,33 @@ class TestFilePng(PillowTestCase): self.assertLess(chunks.index(b"pHYs"), chunks.index(b"IDAT")) +@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") +class TestTruncatedPngPLeaks(PillowTestCase): + + def setUp(self): + if "zip_encoder" not in codecs or "zip_decoder" not in codecs: + self.skipTest("zip/deflate support not available") + + 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('Tests/images/hopper.png', 'rb') as f: + DATA = BytesIO(f.read(16 * 1024)) + + ImageFile.LOAD_TRUNCATED_IMAGES = True + start_mem = self._get_mem_usage() + try: + for _ in range(ITERATIONS): + with Image.open(DATA) as im: + im.load() + mem = (self._get_mem_usage() - start_mem) + self.assertLess(mem, MEM_LIMIT, msg='memory usage limit exceeded') + finally: + ImageFile.LOAD_TRUNCATED_IMAGES = False + + if __name__ == '__main__': unittest.main() From 014be86cf4da975d1fcb6d828a31875c25eea911 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 21 Jun 2017 12:24:27 +0100 Subject: [PATCH 527/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 971cad9a6..b1879cfcf 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Fix truncated PNG loading for some images, Fix memory leak on truncated PNG images. #2541 + [homm] + - Add decompression bomb check to Image.crop #2410 [wiredfool] From edc8d8627c2dac3bf8667fdecd598cd7867d60f8 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 21 Jun 2017 05:36:56 -0700 Subject: [PATCH 528/632] Fix to ensure that define is interpreted as a string on windows --- PIL/Image.py | 5 ++++- _imaging.c | 3 ++- setup.py | 5 ++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index ec995c8f4..f0437ab2a 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -56,7 +56,10 @@ try: from . import _imaging as core if PILLOW_VERSION != getattr(core, 'PILLOW_VERSION', None): raise ImportError("The _imaging extension was built for another " - "version of Pillow or PIL") + "version of Pillow or PIL: Core Version: %s" + "Pillow Version: %s" % + (getattr(core, 'PILLOW_VERSION', None), + PILLOW_VERSION)) except ImportError as v: core = _imaging_not_installed() diff --git a/_imaging.c b/_imaging.c index 9ff706ced..85c32ce40 100644 --- a/_imaging.c +++ b/_imaging.c @@ -3435,6 +3435,7 @@ static PyMethodDef functions[] = { static int setup_module(PyObject* m) { PyObject* d = PyModule_GetDict(m); + const char* version = (char*)PILLOW_VERSION; /* Ready object types */ if (PyType_Ready(&Imaging_Type) < 0) @@ -3479,7 +3480,7 @@ setup_module(PyObject* m) { } #endif - PyDict_SetItemString(d, "PILLOW_VERSION", PyUnicode_FromString(PILLOW_VERSION)); + PyDict_SetItemString(d, "PILLOW_VERSION", PyUnicode_FromString(version)); return 0; } diff --git a/setup.py b/setup.py index 9aa6fbf26..3a8a5987f 100755 --- a/setup.py +++ b/setup.py @@ -584,7 +584,10 @@ class pil_build_ext(build_ext): if struct.unpack("h", "\0\1".encode('ascii'))[0] == 1: defs.append(("WORDS_BIGENDIAN", None)) - defs.append(("PILLOW_VERSION", '"%s"'%PILLOW_VERSION)) + if sys.platform == "win32": + defs.append(("PILLOW_VERSION", '"\\"%s\\""'%PILLOW_VERSION)) + else: + defs.append(("PILLOW_VERSION", '"%s"'%PILLOW_VERSION)) exts = [(Extension("PIL._imaging", files, From 45ed1a8bec72db6c2fe1af9419725c5f371e5a9b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 21 Jun 2017 06:20:03 -0700 Subject: [PATCH 529/632] appveyor version -> simple build number --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 24d971919..80176ce46 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 4.2.pre.{build} +version: '{build}' clone_folder: c:\pillow init: - ECHO %PYTHON% From a2f873c66149e6aa0fa034903265a3ca1a720d89 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 21 Jun 2017 17:34:00 +0300 Subject: [PATCH 530/632] Remove Landscape/health badge Because the last run was four months ago -- see https://github.com/python-pillow/Pillow/issues/2532. [CI skip] --- README.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.rst b/README.rst index d89ee79ef..14092ef7c 100644 --- a/README.rst +++ b/README.rst @@ -38,10 +38,6 @@ Pillow is the friendly PIL fork by `Alex Clark and Contributors Date: Wed, 21 Jun 2017 12:42:19 -0700 Subject: [PATCH 531/632] Change the owner of the TRAVIS_BUILD_DIR to match the UID in the container. Fixes #2586 --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 6349db0fe..0eb575b1a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,6 +48,8 @@ script: if [ "$DOCKER" == "" ]; then .travis/script.sh else + # the Pillow user in the docker container is UID 1000 + sudo chown -R 1000 $TRAVIS_BUILD_DIR docker run -v $TRAVIS_BUILD_DIR:/Pillow pythonpillow/$DOCKER fi From 80ac338bf8e1c9f752e3fe13bb40ccfde9542716 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 21 Jun 2017 21:31:37 +0100 Subject: [PATCH 532/632] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index b1879cfcf..ca4d4ef4a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- CI: Change the owner of the TRAVIS_BUILD_DIR, fixing broken docker runs #2587 + [wiredfool] + - Fix truncated PNG loading for some images, Fix memory leak on truncated PNG images. #2541 [homm] From 0b178edbc89ecfcf944da2523b31df3e48e449ed Mon Sep 17 00:00:00 2001 From: shamsa Date: Wed, 13 Jan 2016 10:31:49 +0400 Subject: [PATCH 533/632] Add complex text support. This pull request adds support for languages that require complex text layout. We are using the Raqm library, that wraps FriBidi (for bidirectional text support) and HarfBuzz (for text shaping), and does proper BiDi and script itemization: https://github.com/HOST-Oman/libraqm This should fix #1089. --- .travis/install.sh | 7 +- PIL/ImageDraw.py | 12 ++-- PIL/ImageFont.py | 8 +-- _imagingft.c | 161 ++++++++++++++++++++++++++++++++++++++------- setup.py | 12 +++- 5 files changed, 163 insertions(+), 37 deletions(-) diff --git a/.travis/install.sh b/.travis/install.sh index d5f190619..9408d1127 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -2,9 +2,12 @@ set -e +sudo add-apt-repository -y ppa:as-bahanta/raqm sudo apt-get update -sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-tk \ - python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake imagemagick +sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-tk\ + python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake imagemagick\ + libharfbuzz-dev libfribidi-dev libraqm-dev + pip install cffi pip install nose pip install check-manifest diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 71e29ee48..3512a3826 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -203,10 +203,10 @@ class ImageDraw(object): return text.split(split_character) def text(self, xy, text, fill=None, font=None, anchor=None, - *args, **kwargs): + *args, **kwargs, direction=None, features=[]): if self._multiline_check(text): return self.multiline_text(xy, text, fill, font, anchor, - *args, **kwargs) + *args, **kwargs, direction=direction, features=features) ink, fill = self._getink(fill) if font is None: @@ -215,17 +215,17 @@ class ImageDraw(object): ink = fill if ink is not None: try: - mask, offset = font.getmask2(text, self.fontmode) + mask, offset = font.getmask2(text, self.fontmode, direction=direction, features=features) xy = xy[0] + offset[0], xy[1] + offset[1] except AttributeError: try: - mask = font.getmask(text, self.fontmode) + mask = font.getmask(text, self.fontmode, direction, features) except TypeError: mask = font.getmask(text) self.draw.draw_bitmap(xy, mask, ink) def multiline_text(self, xy, text, fill=None, font=None, anchor=None, - spacing=4, align="left"): + spacing=4, align="left", direction=None, features=[]): widths = [] max_width = 0 lines = self._multiline_split(text) @@ -244,7 +244,7 @@ class ImageDraw(object): left += (max_width - widths[idx]) else: assert False, 'align must be "left", "center" or "right"' - self.text((left, top), line, fill, font, anchor) + self.text((left, top), line, fill, font, anchor, direction=direction, features=features) top += line_spacing left = xy[0] diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index c74d00138..04e3148a5 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -143,13 +143,13 @@ class FreeTypeFont(object): def getoffset(self, text): return self.font.getsize(text)[1] - def getmask(self, text, mode=""): - return self.getmask2(text, mode)[0] + def getmask(self, text, mode="", direction=None, features=[]): + return self.getmask2(text, mode, direction, features)[0] - def getmask2(self, text, mode="", fill=Image.core.fill): + def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, features=[]): size, offset = self.font.getsize(text) im = fill("L", size, 0) - self.font.render(text, im.id, mode == "1") + self.font.render(text, im.id, mode == "1", direction, features) return im, offset def font_variant(self, font=None, size=None, index=None, encoding=None): diff --git a/_imagingft.c b/_imagingft.c index ae62fc74e..93ef44c5d 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -48,6 +48,7 @@ struct { } ft_errors[] = #include FT_ERRORS_H +#include "raqm.h" /* -------------------------------------------------------------------- */ /* font objects */ @@ -329,11 +330,7 @@ font_render(FontObject* self, PyObject* args) int index, error, ascender; int load_flags; unsigned char *source; - FT_ULong ch; FT_GlyphSlot glyph; - FT_Bool kerning = FT_HAS_KERNING(self->face); - FT_UInt last_index = 0; - /* render string into given buffer (the buffer *must* have the right size, or this will crash) */ PyObject* string; @@ -341,16 +338,127 @@ font_render(FontObject* self, PyObject* args) int mask = 0; int temp; int xx, x0, x1; - if (!PyArg_ParseTuple(args, "On|i:render", &string, &id, &mask)) + const char *dir = NULL; + raqm_direction_t direction; + raqm_t *rq; + size_t count; + raqm_glyph_t *glyph_info; + PyObject *features = NULL; + + if (!PyArg_ParseTuple(args, "On|izO:render", &string, &id, &mask, &dir, &features)) return NULL; + rq = raqm_create(); + if (rq == NULL) { + PyErr_SetString(PyExc_ValueError, "raqm_create() failed."); + goto failed; + } + #if PY_VERSION_HEX >= 0x03000000 - if (!PyUnicode_Check(string)) { + if (PyUnicode_Check(string)) { + Py_ssize_t size = PyUnicode_GET_LENGTH(string); + Py_UCS4 text[size]; + PyUnicode_READY(string); + if (!PyUnicode_AsUCS4(string, text, size, 0)) + goto failed; + if (!raqm_set_text(rq, text, size)) { + PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed"); + goto failed; + } + } #else - if (!PyUnicode_Check(string) && !PyString_Check(string)) { + if (PyUnicode_Check(string)) { + Py_UNICODE *text = PyUnicode_AS_UNICODE(string); + Py_ssize_t size = PyUnicode_GET_SIZE(string); + if (!raqm_set_text(rq, text, size)) { + PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed"); + goto failed; + } + } + else if (PyString_Check(string)) { + char *text = PyString_AS_STRING(string); + int size = PyString_GET_SIZE(string); + if (!raqm_set_text_utf8(rq, text, size)) { + PyErr_SetString(PyExc_ValueError, "raqm_set_text_utf8() failed"); + goto failed; + } + } #endif + else { PyErr_SetString(PyExc_TypeError, "expected string"); - return NULL; + goto failed; + } + + direction = RAQM_DIRECTION_DEFAULT; + if (dir) { + if (strcmp(dir, "rtl") == 0) + direction = RAQM_DIRECTION_RTL; + else if (strcmp(dir, "ltr") == 0) + direction = RAQM_DIRECTION_LTR; + else if (strcmp(dir, "ttb") == 0) + direction = RAQM_DIRECTION_TTB; + else { + PyErr_SetString(PyExc_ValueError, "direction must be either 'rtl', 'ltr' or 'ttb'"); + goto failed; + } + } + + if (!raqm_set_par_direction(rq, direction)) { + PyErr_SetString(PyExc_ValueError, "raqm_set_par_direction() failed"); + goto failed; + } + + if (features) { + int len; + PyObject *seq = PySequence_Fast(features, "expected a sequence"); + if (!seq) { + goto failed; + } + + len = PySequence_Size(seq); + for (i = 0; i < len; i++) { + PyObject *item = PySequence_Fast_GET_ITEM(seq, i); + char *feature = NULL; + Py_ssize_t size = 0; +#if PY_VERSION_HEX >= 0x03000000 + if (!PyUnicode_Check(item) || + PyUnicode_READY(string) != 0 || + PyUnicode_KIND(item) != PyUnicode_1BYTE_KIND) { + PyErr_SetString(PyExc_TypeError, "expected an ASCII string"); + goto failed; + } + + feature = PyUnicode_1BYTE_DATA(item); + size = PyUnicode_GET_LENGTH(item); +#else + if (!PyString_Check(item)) { + PyErr_SetString(PyExc_TypeError, "expected a string"); + goto failed; + } + feature = PyString_AsString(item); + size = PyString_GET_SIZE(item); +#endif + if (!raqm_add_font_feature(rq, feature, size)) { + PyErr_SetString(PyExc_ValueError, "raqm_add_font_feature() failed"); + goto failed; + } + } + } + + if (!raqm_set_freetype_face(rq, self->face)) { + PyErr_SetString(PyExc_RuntimeError, "raqm_set_freetype_face() failed."); + goto failed; + } + + if (!raqm_layout (rq)) { + PyErr_SetString(PyExc_RuntimeError, "raqm_layout() failed."); + goto failed; + } + + glyph_info = raqm_get_glyphs(rq, &count); + if (glyph_info == NULL) { + PyErr_SetString(PyExc_ValueError, "raqm_get_glyphs() failed."); + goto failed; } im = (Imaging) id; @@ -360,36 +468,36 @@ font_render(FontObject* self, PyObject* args) load_flags |= FT_LOAD_TARGET_MONO; ascender = 0; - for (i = 0; font_getchar(string, i, &ch); i++) { - index = FT_Get_Char_Index(self->face, ch); + for (i = 0; i < count; i++) { + index = glyph_info[i].index; error = FT_Load_Glyph(self->face, index, load_flags); - if (error) - return geterror(error); + if (error) { + geterror(error); + goto failed; + } glyph = self->face->glyph; temp = (glyph->bitmap.rows - glyph->bitmap_top); + temp -= PIXEL(glyph_info[i].y_offset); if (temp > ascender) ascender = temp; } - for (x = i = 0; font_getchar(string, i, &ch); i++) { + for (x = i = 0; i < count; i++) { if (i == 0 && self->face->glyph->metrics.horiBearingX < 0) x = -PIXEL(self->face->glyph->metrics.horiBearingX); - index = FT_Get_Char_Index(self->face, ch); - if (kerning && last_index && index) { - FT_Vector delta; - FT_Get_Kerning(self->face, last_index, index, ft_kerning_default, - &delta); - x += delta.x >> 6; - } + index = glyph_info[i].index; error = FT_Load_Glyph(self->face, index, load_flags); - if (error) - return geterror(error); + if (error){ + geterror(error); + goto failed; + } glyph = self->face->glyph; source = (unsigned char*) glyph->bitmap.buffer; xx = x + glyph->bitmap_left; + xx += PIXEL(glyph_info[i].x_offset); x0 = 0; x1 = glyph->bitmap.width; if (xx < 0) @@ -401,6 +509,7 @@ font_render(FontObject* self, PyObject* args) /* use monochrome mask (on palette images, etc) */ for (y = 0; y < glyph->bitmap.rows; y++) { int yy = y + im->ysize - (PIXEL(glyph->metrics.horiBearingY) + ascender); + yy -= PIXEL(glyph_info[i].y_offset); if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ unsigned char *target = im->image8[yy] + xx; @@ -420,6 +529,7 @@ font_render(FontObject* self, PyObject* args) /* use antialiased rendering */ for (y = 0; y < glyph->bitmap.rows; y++) { int yy = y + im->ysize - (PIXEL(glyph->metrics.horiBearingY) + ascender); + yy -= PIXEL(glyph_info[i].y_offset); if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ int i; @@ -432,11 +542,14 @@ font_render(FontObject* self, PyObject* args) source += glyph->bitmap.pitch; } } - x += PIXEL(glyph->metrics.horiAdvance); - last_index = index; + x += PIXEL(glyph_info[i].x_advance); } Py_RETURN_NONE; + +failed: + raqm_destroy(rq); + return NULL; } static void diff --git a/setup.py b/setup.py index c24d7bbb8..1b302952d 100755 --- a/setup.py +++ b/setup.py @@ -114,6 +114,7 @@ TIFF_ROOT = None FREETYPE_ROOT = None LCMS_ROOT = None +RAQM_ROOT = None def _pkg_config(name): try: @@ -131,7 +132,7 @@ def _pkg_config(name): class pil_build_ext(build_ext): class feature: - features = ['zlib', 'jpeg', 'tiff', 'freetype', 'lcms', 'webp', + features = ['zlib', 'jpeg', 'tiff', 'freetype', 'raqm', 'lcms', 'webp', 'webpmux', 'jpeg2000', 'imagequant'] required = {'jpeg', 'zlib'} @@ -516,6 +517,11 @@ class pil_build_ext(build_ext): if subdir: _add_directory(self.compiler.include_dirs, subdir, 0) + if feature.want('raqm'): + if _find_include_file(self, "raqm.h"): + if _find_library_file(self, "raqm"): + feature.raqm = "raqm" + if feature.want('lcms'): _dbg('Looking for lcms') if _find_include_file(self, "lcms2.h"): @@ -597,6 +603,9 @@ class pil_build_ext(build_ext): exts.append(Extension("PIL._imagingft", ["_imagingft.c"], libraries=["freetype"])) + if feature.freetype and feature.raqm: + exts.append(Extension( + "PIL._imagingft", ["_imagingft.c"], libraries=["freetype", "fribidi" , "harfbuzz", "raqm"])) if feature.lcms: extra = [] @@ -658,6 +667,7 @@ class pil_build_ext(build_ext): (feature.imagequant, "LIBIMAGEQUANT"), (feature.tiff, "LIBTIFF"), (feature.freetype, "FREETYPE2"), + (feature.raqm, "RAQM"), (feature.lcms, "LITTLECMS2"), (feature.webp, "WEBP"), (feature.webpmux, "WEBPMUX"), From 3e5007c84df5212f6100c665917d2f972d20dd0a Mon Sep 17 00:00:00 2001 From: shamsa Date: Mon, 25 Jan 2016 14:51:27 +0400 Subject: [PATCH 534/632] Fix failure in test_imagefont.py --- PIL/ImageFont.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 04e3148a5..7e61e9c0d 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -144,7 +144,7 @@ class FreeTypeFont(object): return self.font.getsize(text)[1] def getmask(self, text, mode="", direction=None, features=[]): - return self.getmask2(text, mode, direction, features)[0] + return self.getmask2(text, mode, direction=direction, features=features)[0] def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, features=[]): size, offset = self.font.getsize(text) From 349ac49a4c02a5794fd8afcaa39eb58b6c4ac94e Mon Sep 17 00:00:00 2001 From: shamsa Date: Mon, 25 Jan 2016 15:16:35 +0400 Subject: [PATCH 535/632] Fix build with python 3.2 --- _imagingft.c | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index 93ef44c5d..55bfa860e 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -354,27 +354,16 @@ font_render(FontObject* self, PyObject* args) goto failed; } -#if PY_VERSION_HEX >= 0x03000000 - if (PyUnicode_Check(string)) { - Py_ssize_t size = PyUnicode_GET_LENGTH(string); - Py_UCS4 text[size]; - PyUnicode_READY(string); - if (!PyUnicode_AsUCS4(string, text, size, 0)) - goto failed; - if (!raqm_set_text(rq, text, size)) { - PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed"); - goto failed; - } - } -#else + if (PyUnicode_Check(string)) { Py_UNICODE *text = PyUnicode_AS_UNICODE(string); Py_ssize_t size = PyUnicode_GET_SIZE(string); - if (!raqm_set_text(rq, text, size)) { + if (!raqm_set_text(rq, (const uint32_t *)(text), size)) { PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed"); goto failed; } } +#if PY_VERSION_HEX < 0x03000000 else if (PyString_Check(string)) { char *text = PyString_AS_STRING(string); int size = PyString_GET_SIZE(string); @@ -420,23 +409,27 @@ font_render(FontObject* self, PyObject* args) PyObject *item = PySequence_Fast_GET_ITEM(seq, i); char *feature = NULL; Py_ssize_t size = 0; -#if PY_VERSION_HEX >= 0x03000000 - if (!PyUnicode_Check(item) || - PyUnicode_READY(string) != 0 || - PyUnicode_KIND(item) != PyUnicode_1BYTE_KIND) { - PyErr_SetString(PyExc_TypeError, "expected an ASCII string"); - goto failed; - } + PyObject *bytes; - feature = PyUnicode_1BYTE_DATA(item); - size = PyUnicode_GET_LENGTH(item); +#if PY_VERSION_HEX >= 0x03000000 + if (!PyUnicode_Check(item)) { #else - if (!PyString_Check(item)) { + if (!PyUnicode_Check(item) && !PyString_Check(item)) { +#endif PyErr_SetString(PyExc_TypeError, "expected a string"); goto failed; } - feature = PyString_AsString(item); - size = PyString_GET_SIZE(item); + + if (!PyUnicode_Check(item)) { + bytes = PyUnicode_AsUTF8String(item); + feature = PyBytes_AS_STRING(bytes); + size = PyBytes_GET_SIZE(bytes); + } +#if PY_VERSION_HEX < 0x03000000 + else { + feature = PyString_AsString(item); + size = PyString_GET_SIZE(item); + } #endif if (!raqm_add_font_feature(rq, feature, size)) { PyErr_SetString(PyExc_ValueError, "raqm_add_font_feature() failed"); From 326e23d3e6f333c00d2e8f1793f4f6aeca7b7ae9 Mon Sep 17 00:00:00 2001 From: shamsa Date: Wed, 27 Jan 2016 09:09:26 +0400 Subject: [PATCH 536/632] fallback code --- PIL/ImageDraw.py | 5 +- PIL/ImageFont.py | 4 +- _imagingft.c | 191 ++++++++++++++++++++++++++++++++++++----------- setup.py | 18 +++-- 4 files changed, 164 insertions(+), 54 deletions(-) diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 3512a3826..5902405a4 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -203,7 +203,8 @@ class ImageDraw(object): return text.split(split_character) def text(self, xy, text, fill=None, font=None, anchor=None, - *args, **kwargs, direction=None, features=[]): + *args, **kwargs, direction=None, features=None): + if self._multiline_check(text): return self.multiline_text(xy, text, fill, font, anchor, *args, **kwargs, direction=direction, features=features) @@ -225,7 +226,7 @@ class ImageDraw(object): self.draw.draw_bitmap(xy, mask, ink) def multiline_text(self, xy, text, fill=None, font=None, anchor=None, - spacing=4, align="left", direction=None, features=[]): + spacing=4, align="left", direction=None, features=None): widths = [] max_width = 0 lines = self._multiline_split(text) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 7e61e9c0d..3f25a92b6 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -143,10 +143,10 @@ class FreeTypeFont(object): def getoffset(self, text): return self.font.getsize(text)[1] - def getmask(self, text, mode="", direction=None, features=[]): + def getmask(self, text, mode="", direction=None, features=None): return self.getmask2(text, mode, direction=direction, features=features)[0] - def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, features=[]): + def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, features=None): size, offset = self.font.getsize(text) im = fill("L", size, 0) self.font.render(text, im.id, mode == "1", direction, features) diff --git a/_imagingft.c b/_imagingft.c index 55bfa860e..e1130b016 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -41,6 +41,23 @@ #define FT_ERRORDEF( e, v, s ) { e, s }, #define FT_ERROR_START_LIST { #define FT_ERROR_END_LIST { 0, 0 } }; +#ifdef HAVE_RAQM +#include +#else +typedef enum +{ + RAQM_DIRECTION_DEFAULT, + RAQM_DIRECTION_RTL, + RAQM_DIRECTION_LTR, + RAQM_DIRECTION_TTB +} raqm_direction_t; +#endif + +typedef struct +{ + int index, x_offset, x_advance, y_offset; + unsigned int cluster; +} GlyphInfo; struct { int code; @@ -48,7 +65,6 @@ struct { } ft_errors[] = #include FT_ERRORS_H -#include "raqm.h" /* -------------------------------------------------------------------- */ /* font objects */ @@ -322,31 +338,17 @@ font_getabc(FontObject* self, PyObject* args) return Py_BuildValue("ddd", a, b, c); } -static PyObject* -font_render(FontObject* self, PyObject* args) -{ - int i, x, y; - Imaging im; - int index, error, ascender; - int load_flags; - unsigned char *source; - FT_GlyphSlot glyph; - /* render string into given buffer (the buffer *must* have - the right size, or this will crash) */ - PyObject* string; - Py_ssize_t id; - int mask = 0; - int temp; - int xx, x0, x1; - const char *dir = NULL; - raqm_direction_t direction; - raqm_t *rq; - size_t count; - raqm_glyph_t *glyph_info; - PyObject *features = NULL; - if (!PyArg_ParseTuple(args, "On|izO:render", &string, &id, &mask, &dir, &features)) - return NULL; +static size_t +text_layout(PyObject* string, FontObject* self, const char* dir, + PyObject *features ,GlyphInfo **glyph_info, int mask) +{ +#ifdef HAVE_RAQM + int i = 0; + raqm_t *rq; + size_t count = 0; + raqm_glyph_t *glyphs; + raqm_direction_t direction; rq = raqm_create(); if (rq == NULL) { @@ -354,7 +356,6 @@ font_render(FontObject* self, PyObject* args) goto failed; } - if (PyUnicode_Check(string)) { Py_UNICODE *text = PyUnicode_AS_UNICODE(string); Py_ssize_t size = PyUnicode_GET_SIZE(string); @@ -397,7 +398,7 @@ font_render(FontObject* self, PyObject* args) goto failed; } - if (features) { + if (features != Py_None) { int len; PyObject *seq = PySequence_Fast(features, "expected a sequence"); if (!seq) { @@ -420,8 +421,10 @@ font_render(FontObject* self, PyObject* args) goto failed; } - if (!PyUnicode_Check(item)) { + if (PyUnicode_Check(item)) { bytes = PyUnicode_AsUTF8String(item); + if (bytes == NULL) + goto failed; feature = PyBytes_AS_STRING(bytes); size = PyBytes_GET_SIZE(bytes); } @@ -448,12 +451,121 @@ font_render(FontObject* self, PyObject* args) goto failed; } - glyph_info = raqm_get_glyphs(rq, &count); - if (glyph_info == NULL) { + glyphs = raqm_get_glyphs(rq, &count); + if (glyphs == NULL) { PyErr_SetString(PyExc_ValueError, "raqm_get_glyphs() failed."); + count = 0; goto failed; } + (*glyph_info) = PyMem_New(GlyphInfo, count); + if ((*glyph_info) == NULL) { + PyErr_SetString(PyExc_MemoryError, "PyMem_New() failed"); + count = 0; + goto failed; + } + + for (i = 0; i < count; i++) { + (*glyph_info)[i].index = glyphs[i].index; + (*glyph_info)[i].x_offset = glyphs[i].x_offset; + (*glyph_info)[i].x_advance = glyphs[i].x_advance; + (*glyph_info)[i].y_offset = glyphs[i].y_offset; + (*glyph_info)[i].cluster = glyphs[i].cluster; + } + +failed: + raqm_destroy (rq); + return count; + +#else + if (features != Py_None || dir != NULL) + PyErr_SetString(PyExc_KeyError, "Raqm is missing."); + + int error, load_flags; + FT_ULong ch; + Py_ssize_t count; + FT_GlyphSlot glyph; + FT_Bool kerning = FT_HAS_KERNING(self->face); + FT_UInt last_index = 0; +#if PY_VERSION_HEX >= 0x03000000 + if (!PyUnicode_Check(string)) { +#else + if (!PyUnicode_Check(string) && !PyString_Check(string)) { +#endif + PyErr_SetString(PyExc_TypeError, "expected string"); + return 0; + } + + count = 0; + while (font_getchar(string, count, &ch)) + count++; + if (count == 0) + return 0; + + (*glyph_info) = PyMem_New(GlyphInfo, count); + if ((*glyph_info) == NULL) { + PyErr_SetString(PyExc_MemoryError, "PyMem_New() failed"); + return 0; + } + + load_flags = FT_LOAD_RENDER|FT_LOAD_NO_BITMAP; + if (mask) + load_flags |= FT_LOAD_TARGET_MONO; + int i; + for (i = 0; font_getchar(string, i, &ch); i++) { + (*glyph_info)[i].index = FT_Get_Char_Index(self->face, ch); + error = FT_Load_Glyph(self->face, (*glyph_info)[i].index, load_flags); + if (error) { + geterror(error); + return 0; + } + glyph = self->face->glyph; + (*glyph_info)[i].x_offset=0; + (*glyph_info)[i].y_offset=0; + if (kerning && last_index && (*glyph_info)[i].index) { + FT_Vector delta; + if (FT_Get_Kerning(self->face, last_index, (*glyph_info)[i].index, + ft_kerning_default,&delta) == 0) + (*glyph_info)[i-1].x_advance += PIXEL(delta.x); + } + + (*glyph_info)[i].x_advance = glyph->metrics.horiAdvance; + last_index = (*glyph_info)[i].index; + (*glyph_info)[i].cluster = ch; + } + return count; +#endif +} + +static PyObject* +font_render(FontObject* self, PyObject* args) +{ + int i, x, y; + Imaging im; + int index, error, ascender; + int load_flags; + unsigned char *source; + FT_GlyphSlot glyph; + /* render string into given buffer (the buffer *must* have + the right size, or this will crash) */ + PyObject* string; + Py_ssize_t id; + int mask = 0; + int temp; + int xx, x0, x1; + const char *dir = NULL; + size_t count; + GlyphInfo *glyph_info; + PyObject *features = NULL; + + if (!PyArg_ParseTuple(args, "On|izO:render", &string, &id, &mask, &dir, &features)) + return NULL; + + glyph_info = NULL; + count = text_layout(string, self, dir, features, &glyph_info, mask); + if (count == 0) + return NULL; + 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; @@ -464,10 +576,9 @@ font_render(FontObject* self, PyObject* args) for (i = 0; i < count; i++) { index = glyph_info[i].index; error = FT_Load_Glyph(self->face, index, load_flags); - if (error) { - geterror(error); - goto failed; - } + if (error) + return geterror(error); + glyph = self->face->glyph; temp = (glyph->bitmap.rows - glyph->bitmap_top); temp -= PIXEL(glyph_info[i].y_offset); @@ -481,10 +592,8 @@ font_render(FontObject* self, PyObject* args) index = glyph_info[i].index; error = FT_Load_Glyph(self->face, index, load_flags); - if (error){ - geterror(error); - goto failed; - } + if (error) + return geterror(error); glyph = self->face->glyph; @@ -537,12 +646,8 @@ font_render(FontObject* self, PyObject* args) } x += PIXEL(glyph_info[i].x_advance); } - + PyMem_Del(glyph_info); Py_RETURN_NONE; - -failed: - raqm_destroy(rq); - return NULL; } static void diff --git a/setup.py b/setup.py index 1b302952d..86269f5ed 100755 --- a/setup.py +++ b/setup.py @@ -519,8 +519,10 @@ class pil_build_ext(build_ext): if feature.want('raqm'): if _find_include_file(self, "raqm.h"): - if _find_library_file(self, "raqm"): - feature.raqm = "raqm" + if _find_library_file(self, "raqm") and \ + _find_library_file(self, "harfbuzz") and \ + _find_library_file(self, "fribidi"): + feature.raqm = ["raqm", "harfbuzz", "fribidi"] if feature.want('lcms'): _dbg('Looking for lcms') @@ -600,12 +602,14 @@ class pil_build_ext(build_ext): # additional libraries if feature.freetype: - exts.append(Extension("PIL._imagingft", - ["_imagingft.c"], - libraries=["freetype"])) - if feature.freetype and feature.raqm: + libs = ["freetype"] + defs = [] + if feature.raqm: + libs.extend(feature.raqm) + defs.append(('HAVE_RAQM', None)) exts.append(Extension( - "PIL._imagingft", ["_imagingft.c"], libraries=["freetype", "fribidi" , "harfbuzz", "raqm"])) + "PIL._imagingft", ["_imagingft.c"], libraries=libs, + define_macros=defs)) if feature.lcms: extra = [] From fe871bb7365d9985b4a5ee22745eaeadb0e2715d Mon Sep 17 00:00:00 2001 From: shamsa Date: Wed, 3 Feb 2016 14:50:46 +0400 Subject: [PATCH 537/632] Document complex text layout features. --- docs/reference/ImageDraw.rst | 10 +++++++--- docs/reference/ImageFont.rst | 4 +++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index b59a21b9b..f474f244b 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -227,7 +227,7 @@ Methods Draw a shape. -.. py:method:: PIL.ImageDraw.Draw.text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left") +.. py:method:: PIL.ImageDraw.Draw.text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", direction=None, features=None) Draws the string at the given position. @@ -240,9 +240,11 @@ Methods the number of pixels between lines. :param align: If the text is passed on to multiline_text(), "left", "center" or "right". + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt. + :param features: A list of font features used for text layout. For example, 'ligature, kerning, Medial ...etc. - -.. py:method:: PIL.ImageDraw.Draw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left") +.. py:method:: PIL.ImageDraw.Draw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", + direction=None, features=[]) Draws the string at the given position. @@ -252,6 +254,8 @@ Methods :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. :param spacing: The number of pixels between lines. :param align: "left", "center" or "right". + :param direction: Direction of the text. + :param features: Font features used for text layout. .. py:method:: PIL.ImageDraw.Draw.textsize(text, font=None, spacing=0) diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index 696d57b39..60ea2ad5f 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -51,7 +51,7 @@ Methods :return: (width, height) -.. py:method:: PIL.ImageFont.ImageFont.getmask(text, mode='') +.. py:method:: PIL.ImageFont.ImageFont.getmask(text, mode='', direction=None, features=[]) Create a bitmap for the text. @@ -63,6 +63,8 @@ Methods driver prefers; if empty, the renderer may return either mode. Note that the mode is always a string, to simplify C-level implementations. + :param direction: Direction of the text. + :param features: A list of font features used for text layout. .. versionadded:: 1.1.5 :return: An internal PIL storage memory instance as defined by the From fcd20da3cb49a35e427e4aa43aca1d8b1290d0b6 Mon Sep 17 00:00:00 2001 From: shamsa Date: Wed, 3 Feb 2016 15:24:10 +0400 Subject: [PATCH 538/632] Testing complex text layout. --- PIL/ImageDraw.py | 6 +- PIL/features.py | 1 + Tests/fonts/NotoNastaliqUrdu-Regular.ttf | Bin 0 -> 497204 bytes Tests/images/test_Nastalifont_text.png | Bin 0 -> 1071 bytes Tests/images/test_arabictext_features.png | Bin 0 -> 1435 bytes Tests/images/test_complex_unicode_text.png | Bin 0 -> 1075 bytes Tests/images/test_direction_ltr.png | Bin 0 -> 1834 bytes Tests/images/test_direction_rtl.png | Bin 0 -> 1199 bytes Tests/images/test_kerning_features.png | Bin 0 -> 963 bytes Tests/images/test_ligature_features.png | Bin 0 -> 605 bytes Tests/images/test_text.png | Bin 0 -> 1088 bytes Tests/images/test_y_offset.png | Bin 0 -> 1066 bytes Tests/test_imagefontctl.py | 136 +++++++++++++++++++++ _imagingft.c | 10 +- selftest.py | 3 +- 15 files changed, 148 insertions(+), 8 deletions(-) create mode 100644 Tests/fonts/NotoNastaliqUrdu-Regular.ttf create mode 100644 Tests/images/test_Nastalifont_text.png create mode 100644 Tests/images/test_arabictext_features.png create mode 100644 Tests/images/test_complex_unicode_text.png create mode 100644 Tests/images/test_direction_ltr.png create mode 100644 Tests/images/test_direction_rtl.png create mode 100644 Tests/images/test_kerning_features.png create mode 100644 Tests/images/test_ligature_features.png create mode 100644 Tests/images/test_text.png create mode 100644 Tests/images/test_y_offset.png create mode 100644 Tests/test_imagefontctl.py diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 5902405a4..969537a4b 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -203,12 +203,10 @@ class ImageDraw(object): return text.split(split_character) def text(self, xy, text, fill=None, font=None, anchor=None, - *args, **kwargs, direction=None, features=None): - + direction=None, features=None, *args, **kwargs): if self._multiline_check(text): return self.multiline_text(xy, text, fill, font, anchor, - *args, **kwargs, direction=direction, features=features) - + direction=direction, features=features, *args, **kwargs) ink, fill = self._getink(fill) if font is None: font = self.getfont() diff --git a/PIL/features.py b/PIL/features.py index e01a32193..11b1fe058 100644 --- a/PIL/features.py +++ b/PIL/features.py @@ -5,6 +5,7 @@ modules = { "tkinter": "PIL._tkinter_finder", "freetype2": "PIL._imagingft", "littlecms2": "PIL._imagingcms", + "raqm": "PIL._imagingft", "webp": "PIL._webp", } diff --git a/Tests/fonts/NotoNastaliqUrdu-Regular.ttf b/Tests/fonts/NotoNastaliqUrdu-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..891f633d802bbece8eb3a701a62bdcb69c45b74c GIT binary patch literal 497204 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�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

W0|`S`BMU~ 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 literal 0 HcmV?d00001 diff --git a/Tests/images/test_arabictext_features.png b/Tests/images/test_arabictext_features.png new file mode 100644 index 0000000000000000000000000000000000000000..9bfa5a931cf0abab932dba401a7d5a7c5ed23aaa GIT binary patch literal 1435 zcmcIk=~L1P00mPN6BxxKL8(zm+b-NvF(KA#67s;jNIWo2#?@8wWYy6u)U7-wH#3jb zG1JCcfz~rkz#mbW3|4rqY5l5ITNPBijD)pNNS7Wj!EZyAlpG{XQW;X{Pz0Mh~Ua37cr|6%P8~Ie&QNvlMK^-nz zS%01bt#j(|`pITBDs>)g7WG@wCaNEj*+0N3&$SsaT! z*7KY+v>xt+IsLYZsc?Fe~ac z`Qp;N95GrMv+#*LF4o<$%ERIe8ut2(@X5zCKH+ik0$#gIuo-is^^u8!r<3327Rp?R zImJbY^u_nN$@@w(Rn?7NuWXLF*hlEu18*9u;EIpxRgQPl7F2UacGSWlR@$XbVMJeG z6<{|g*4gol>m9e`GiAvI7QmK};`><`zrpH(;R;I4roNjoq!^_vh`-zi%Y?n%z?@`7 zj#v)@Q#DE3rEAS;!$$ZD^Tw68o$Ayc3dw>tVH}$N`}by121A%y3#na+i!%jQEN#Kn zY}wopil!UOC97?h^RkF0D#O~CFro>K+uEHlf!!4KB@T~ZTW8c5e76T23t=GNpzyiv z@3C6C1K29mQxIq8Q67V@T_*>+J>h$kvgY}8z}qipOroM=%KO1JjvuP+#h#~>g*2Tumm7Im>51$8Y8v-I z-D}l6f)4okisB3?G+At3$GWSoomuZ^Z z#$aCXlD7Q1R4S8bSxBvQ&C_$hjjKp;BAt&(}a5U(_wc1iTq~}4_tb-m(0^YJ@ ze9qaPZpU!(?y!MoweN)fFc8Rq-vv(WVXx8tu}R`{)9d5z?jnp%)EOOQ1gJ@W{ zBn1G+*m;g5j0kgNsSDP3@P_;=lbxao>(xG2Dd<3P*<`-Cl>xqPs-wNitye(~O1bl= zH1TnrZo?%vV1M|`qGgpkd{bH~M2-zq3gI|I0na4Q_~!7o{5=O(B4uVP+MzT}hH_ud zA*)5_*^_X*mXwD04T8NDIq_&2ftW;oi!3w{c%Ronc1EG&aREiO31=&-1IoA8&+4EF z)-6nNZ%_VK#>jZ-Ks_Cx01Ba7`~Cg+T>CWTQ11vfK>|8e_+LIMA%pcCriM5@PN}UV zxNg716Oi2!5giEb>FSge(t!fb;lsA6mJxc<$q^2rl2A?1Eo8BDSvn1B^HSINYd)8a z1jf#3?wf>MzGzMx!tMOjns1kcT22mIR1(Z+MALeMK49j_U+=(J)!0qs2XV!2(*y#T zQ8%A+FA(UuItrqNT`jA<4Mn4B5-IQjddoR~Foa_rVXEL&a!jL&`pr-hF#C_sOT-d8 h>dycC&uH!6hPvF7xqAE}Uf(%g2-Vx)i|@g@^e?ZOrF{SZ literal 0 HcmV?d00001 diff --git a/Tests/images/test_complex_unicode_text.png b/Tests/images/test_complex_unicode_text.png new file mode 100644 index 0000000000000000000000000000000000000000..565a2f9328df4c5dab8218c59c88360dfc7f40a3 GIT binary patch literal 1075 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Q#hD_j{|3XDu79}@++fWy=SPhob%k_j@ zq+(l?j<^^vzL;4wL87GO*i9CvlBxo}c?T_xpUcShKl}c<;@hwP*R5v%wav8^%&1Nu%_g;-y!hMn@f+@aTJlOq;kH#VQuPq+`lh^jPo^3jQXt4on-{I<| z##S1h$~&0t`2H^Bs6MQ0t+4+SP%qdgW6ECEswBg) zdexRnRgvX?^kTU8F68)qcw#`y_q_|R?#!vyIP{i5r$MPE`01p*eFs$^P2-7t+1uW@ zq4WrMEtkl{$z5jZi^{?}qj=g6J5-qZteaORDe`dTLiv3mh3wY6yPWc0RZ6JNO>IB4 zuSj)^(GJ~b+a5-(<8`g9{o&^-tJkEo$NE;zWnsRym(GiS9pV+uWh#Dn_!G;Hge?c> zdu&oyFaNORa9==3$re+Q!)NaW3G=>_jb+L{O7`4jj6`Dt^$EAx9!t`=wh1-|jVM=wMX_JhpPlf^`S1QsyQtAE$fP|=qIwS;g%JR&Ea3)zB~J$_UF?9E&PWL z7EMx4^!}0e;`7y|z4O&G&&;_Y_{)ajZ2`Xxb9Z9WBFe@?KpiJMon zwD{bwfR^9q1GY^qIDNB=De6Jw3-05G_Ouy!oc(@HQumP38kyfK#CAx{YnksPSasO> zYq{23ZmF7;st#^nw?g-!S_boj_#Zsiru|quF>mR!Y}Q?g=3mUKHMUAO?7hHf qKkWw3-LrE2D!?p4W3=S+;d<*Y@4_dY7WM!Z1`M9AelF{r5}E)SMcv&1 literal 0 HcmV?d00001 diff --git a/Tests/images/test_direction_ltr.png b/Tests/images/test_direction_ltr.png new file mode 100644 index 0000000000000000000000000000000000000000..42239334d129e60638da294d201c97e440eed4a3 GIT binary patch literal 1834 zcmd6o`#al*0><^G4n;dk-Qtu@ogfiZTspQjnprJcmn7;kN`xkzphOy%S?W@)=Cs5$ zHMDBxo*>jc?U;O18C91^Nt-4{i3$s;;yC}sK0mzA`#kUOpZE496jEE$SW`_+P22lh zgrAz)0o(l^rEzdS*^y<%YHI3h-iWUQQkW~k*oF|C(a{g{FTbg3^HYAuL(Sx|E*Mz0 zUe3(Dnx|o{uI*M~$6o&%sMI>4Ms6c0HspB%6kN{9$c!1{@aK~eZtSjlW)ExIpgvdsjpoMn z^njuGBaSBiCgn~ZGo8$MW@ukKi+ZZQMs)Aqc=WMCwCitEbB|&enGV+}zrfM%tD8R9 zWo}jK&50Z)H;n(T+@>kmW&nme2q)p1doc-?dM-~QT?h=ckzn!Mr7&A^5pBSjIVfUP zih^~_gu=cMKM+ImVr8G>Pe%%}D70vB0LTke(Q?t=sjrAJPA2SfN<}6&C?3i|+pR!{k^IQqF1Lb8(W{j<&J|18@||=4{poNXkG~j zJZ`owayC`4}UX&uLoz;M%~!riGq zVV@fLZ#~kvf*_g}&}aE@Q^L0!CL?5pU1voToI;Adh~ICL(qQB9=i27m-9fU)oAX_D zrq2V;Tg|11rqxMS;rHk3&>itx*6`xh4dITJF6%(K&MZ$U!Yai_tQ22DmcV!2OXRQr z{+QPFROGRI>Rgs*VVX-jta0u5Y?74tvj2gv_>;nbZQ^Kxhoj<{69We<^LGlS%ktgE zlcNY$9dKk1Dee$*({oJRG<)G19)T}>`&lx9I8h=h5!xm`TJtc@DdoRw_b~Du?B<-0 z`>8!gmfG9!dlzxGWDNWKO=?WcXlee!7OtzFZ^tPT#J_KO=$_ZObwP49OaiiEUqo^b z4<+ees6FJ$>G@+fpWyb^QFDlluu|Sc(rBZ~l^5-HK}1o9Sr9$jYsWn!HWHTefe}Wf zM;XK=EIJtSC&m1sM?E^x5JJIPpK;FjdC9Fw!G=BKbE)?+D(tYxW#qv;3qlZ6Kv6xX zHxp9sxH|E}jf>e-NoNFfP+O}57uPp*jC8Gcds;=wYs^N=Djj+6O(#3e@8W-Gg4Sl9 z5iUIBriY`43(schY3YO`Nr&~^M*IHNt(f1nG^~&{sHcZQY^f|Ay&0MouUT`H$TycC zI>o>bjNsCqka9uqt6RY~%utkUV8|@A`;2|FPx#BB*%dJb=iCgV|4y8#IFkW1=6i=+ zy7;6FuhMdyZrE|*{1@o_b#2+&jq?SZaa~w0P`CxJ+v>s^Bij>U^fvtBiy4ic=X&}D zB|~oFcI5<|j+x0GSy3*mlaq-@f5C&}K4`eJb5+ay3@lwY5hWS6?9EzTf3_6A`q3E= zPj_~j2A7C>IAU+6W80F9^tjdOq|J-?Hr{er_q|sV!`hKg)#t{-vP`Tqz+`d*&>PSM zrWY9kc2b4{Tk78@YPvOMGF*{b6lx@JYJzI<{P%~iTr(4SmZ6?sak7;QV~Xws(*oB# zDo{NRUIzlD_VRrLjgEr_jQPSk=BqHYne`92xC$bNg0o9IIx9f!TNMf|++%D5DqL+? zDb22bN}Pgvx67*J+u>V=u;qD-Xf1=H3^L!9rX$N@Ro=ACxnUxxb*YGS2i16}IY(ox z+TmwdnC8E$a&bxEMn!@uv8ycvEsxz3Oq{SZH#-45Gwke@82nfn;{T<=Ig6{RD<5OS p&v%HggFwlPP>X*GXz1S2Xu`Xs$B^S|`yZ(0?S(=#eG~rk{{YR=ddUC) literal 0 HcmV?d00001 diff --git a/Tests/images/test_direction_rtl.png b/Tests/images/test_direction_rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..966b67d6b6436564ced292ce598f0561824d3b43 GIT binary patch literal 1199 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Q#hD_butYiCy+J51;or@55HiRg?6r-ni@MiSwpcTMnFSTONHW<^M(HezTlQ zTJ=+smYj>=seM>*Lm;og_3hfMsz=dte>*3#`n2!-P^NK6`s$Y33pn<-?M_rX)3WtL z^iQ=vh9VDN7KqJZS$?qeL)uB8{u_dQt=!)0w63;nzvd$5C|I{<*;_u>iUoC_zb0>u zNq(|Cpe1#2Tvl&n&lO4bL+MZb6IX6uy!@)mG6zAnSF_Xe{;sNgI{U-TSMwY0U67S) zyZN+x;<1C_53gQxe-*W3@55Wq9e(UeJUM4$+=>w4J|P>iu7aZ4Lt8%i-e7(G;PR}- zJJRbkfJU#={19Uy^{qYiYkyzs-nIQ#j2Ch|zs?@d=Nb|F_p8wj!F~Fb#*tcU%_=J9 zs6FhEEKuGf+_hnOZ_Vrg-MQ@RTSCvug;u@nE>QW>R=nz?rh$ZAM(vV!4N7-{<>zq! zb{4cd|3UVp!;Me=rio9pp8WgO!rs4_Q+t`SVBJQ}QX8{YrI;&kF19b^n0`1&f~WdW z2t$~I;I?gcK~r1i87x+_V4ug+ypW^zVXMLZ-cQF?bLOZ2So>JYg85v-?g!UDZC`vh zQS?lk-V9dhOHYm+RSU6P->Nj{-kXcMAF5yQawjHhIFWmxvX*W!;Ke&e;wNQK|rTL zNk-#x%k%@!KKQ=iXFt6A;W9DP?ZQ(S^x7IP$eXo!C(4~^Ke|C?-uVwIHtA<#v(~gJ z)%=OKD42SlGycE+lvV$CKK1yp5{>_O} zIt}Vh@fwHD&eii#-?ZQDfJp?KckN@x0jg|u2+KbiK?R&ggWLs*wmv=j@?nJ(uO-WD7juxda+1pMThpm-k=bd=nJj8 zR`19tN$h0o=62+bn##rNnOQXb=#CkEexIK0EfKox^WnE5%d>sO=kG+uoI6wby-~$; zlFG~a)hR#sYtLVGxijF<^t;dIajCvpJ#z=Y*N-&Ue63hR=GS{0QhN@}Wq8vzcj{_+ zT?UyIH`DrA9^5z-wbnOESbJS~_LNr!Qw-$2D)tqXvY%<4S&;kmQmKLTvqODX^&F$3 z|Hg4fhrZKgkXx7YaiQAJMD7g zR`ROFcR%fk<*c)v@*#>Lj#qV0V5el$O9T157ZNg!KMiEtX4$X3(k@kY&Nkps|HHZ) zY~hFVEF`@uR^FbnD}>*P)A*qR&*8EPsdMc@axXY;^XzXCDq}3*p7J64MvUi=JdKAp z`zAhL(DMCFcb0P2jh5q1oaMT5cQ{q&yh|0XySMiArzDMsoBMuLFKjv4HxU?)^Slm) zJ=rchakA;eOKcZ5a7LHDblM^C>`=_^%*aDOYF{qZmY}b5;A7v6#~;M+ z9KRG_CH^pZ!CkN1zyDeEzHQQ48E+DD$oQ_-4X&WlwJmGcZ{5H3vAgv7`ytiy*4n)~ zpXgmHANtDQHsnw+L(ke>w+p2jn7i5Kc@LDoonG3W@M@jkA^#1seJzPInmVuQ1xKm# zPW_Ol_m`u__)XJV0}k_p$tCtTBB#GvSXTbUQ=%=gf-BAW2hIV9*iDP=c~oUq_4I$pU;N_Jeq-<2^qa!Q+Yeel zY&VczcG#st_0FB-Rg4u(`}i&=TGfaiv)U)QeO~X4=*B>^`wod>hR{Ef|)Aut< YToHVAG5Nt%VCH1-boFyt=akR{08N#^oB#j- literal 0 HcmV?d00001 diff --git a/Tests/images/test_ligature_features.png b/Tests/images/test_ligature_features.png new file mode 100644 index 0000000000000000000000000000000000000000..664e9929d05990b58673d318b9518a63255675cd GIT binary patch literal 605 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Q#hD_YdcP9bG1rm>P6@98F04ATFVzmMF0Q@R9im6O#-*c$F6F{_>e- zY$ColuDa#hx|g4;o=&RXcmH|u_rE;f&wYL^1hge8&uC{ZUh{rg zVKjNqYMqd{P`|HrSw=f!DuZXPKNFTVsqo`6+gVYMw`RSsI=o+h$HnbOCgwS+e*gXL z-kaAf+jf4f`zS4XXy>WUl=32l%D7Ce{@tmUJ%fJ+S(@RBykC4Mdg`)G8eLlsyzqCoK3SrEee%vH z>7NvLUOV~KZ<0>WF7u4_PoKB&%W@`K%nR#N`#pK?$%9Y4QWstd@$1`Vn9*(ee}C2O zM1i(6t)0O$*PaQt3yljqm(#jB6c_`Pf&}HiOk0^Zya;`fB?~gk)78&qol`;+06Lfj APXGV_ literal 0 HcmV?d00001 diff --git a/Tests/images/test_text.png b/Tests/images/test_text.png new file mode 100644 index 0000000000000000000000000000000000000000..c156399cd1bf603438c1bc1ddcfd8d8872a48b77 GIT binary patch literal 1088 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Q#hD_3@4(|L(Vy zg6AX^UU^|fPBYicvit^>h)eVPrndJE!Rdj>l{o3r)TN)tq*`tMH~oJBRa_6St0Urk8PTmi3!9^(HTd zs<3xkFUY*%o!2JFEEc9Ez4?LT4!!&*@%umKbNjIu|C;|$(4*-n!PT!UMu>Q{_yx6c9s-d)q3uMOMylP*E$We^pO6EI;_QV*Os1XjM6i^^yjEJ z8{=2aQcVZm8j+rp8`gxVX*EPAWM2q)^X>fx_G1TI>SI#bayavv9~Y?FaA#LjC9^ANx;rHW9Ze>oq%vUdnzTwT{I{v=>@xji7sy0`*19v~DtZ9*C7SUP2wk-X3 z;a%Pf9Pe3u4<2FUQsABI=FxQ7(S3tm2Jb$;Nei?qc3io+2~XVd{;$-v<0>gTe~DWM4fE`{4r literal 0 HcmV?d00001 diff --git a/Tests/images/test_y_offset.png b/Tests/images/test_y_offset.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf07b51ccd6961281310399d732c5790b2ed5d1 GIT binary patch literal 1066 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Q#hD_*pBvs=0 z$M?o>SMAP|)|-~PXr`N>%8_-FTN+oomA@N2;&#!?^F?gA zXH&$+rGEvzCQSI0rhC!1L{xUg1gqFHe&=S+G(Pt(WVi9}zXs;dXMX=X_j}BqJJ=kc#Jk$XAKKlJzIuMTsFE*xF7LN^ zj_0ed{${)(c8B*cXF03(gU%&YkJn5HlKl|vtUNW!sr=Ul?oWYnIya=Abnn0T;Ohc) z<;^-vn7^?^H)(s_+H&|`!h(wry?yh{a{5A24WBeiO7`-zi8sAHxMMKK7jRw@G3iS`^jpz0+=}tX=BUT*j1hA;*gcFmdt=jt`HU8<@gmyA4|)^K zV_NEd=u}wG2>rif>9miIAH1qm-!#_FBKOytb>{9Im!z#usg7KkiKpSeuliT4SoW)+6-0 zda;4DYyEYvu}>y zeV56eP5*Dd^Q2|de;%!!=qqZzH1>l`4~so(xZk-KORkAqT8N!td|>mYeewlP?gxA` z7&+JY-mpITcuLf*?1@#L0pF^#Hnpp7-RJjX%dIccoN_bYZ1lW*RHs62AEzJtem3@| o>CHPQ+iDS)dvN5i;G_5V-8}oXx3+Z=unb`EboFyt=akR{04mknZU6uP literal 0 HcmV?d00001 diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py new file mode 100644 index 000000000..02c432527 --- /dev/null +++ b/Tests/test_imagefontctl.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +from helper import unittest, PillowTestCase +from PIL import Image +from PIL import ImageDraw + +FONT_SIZE = 20 +FONT_PATH = "Tests/fonts/DejaVuSans.ttf" + +try: + from PIL import ImageFont + + # check if raqm is available + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'TEST', font=ttf, fill=500, direction='ltr') + + class TestImagecomplextext(PillowTestCase): + + def test_complex_text(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'اهلا عمان', font=ttf, fill=500) + + target = 'Tests/images/test_text.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_y_offset(self): + ttf = ImageFont.truetype("Tests/fonts/NotoNastaliqUrdu-Regular.ttf", FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'هنا عمان', font=ttf, fill=500) + + target = 'Tests/images/test_y_offset.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_complex_unicode_text(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), u'مرحبا بكم', font=ttf, fill=500) + + target = 'Tests/images/test_complex_unicode_text.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_text_direction_rtl(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'English عربي', font=ttf, fill=500, direction='rtl') + + target = 'Tests/images/test_direction_rtl.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_text_direction_ltr(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'سلطنة عمان Oman', font=ttf, fill=500, direction='ltr') + + target = 'Tests/images/test_direction_ltr.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_text_direction_rtl2(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'Oman سلطنة عمان', font=ttf, fill=500, direction='rtl') + + target = 'Tests/images/test_direction_ltr.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_ligature_features(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'filling', font=ttf, fill=500, features=['-liga']) + + target = 'Tests/images/test_ligature_features.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_kerning_features(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'TeToAV', font=ttf, fill=500, features=['-kern']) + + target = 'Tests/images/test_kerning_features.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_arabictext_features(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'اللغة العربية', font=ttf, fill=500, features=['-fina','-init','-medi']) + + target = 'Tests/images/test_arabictext_features.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + +except (KeyError, ImportError): + class TestImagecomplextext(PillowTestCase): + def test_skip(self): + self.skipTest("KeyError") + +if __name__ == '__main__': + unittest.main() + +# End of file diff --git a/_imagingft.c b/_imagingft.c index e1130b016..201782143 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -588,17 +588,21 @@ font_render(FontObject* self, PyObject* args) for (x = i = 0; i < count; i++) { if (i == 0 && self->face->glyph->metrics.horiBearingX < 0) - x = -PIXEL(self->face->glyph->metrics.horiBearingX); + x = -self->face->glyph->metrics.horiBearingX; index = glyph_info[i].index; error = FT_Load_Glyph(self->face, index, load_flags); if (error) return geterror(error); + if (i == 0 && self->face->glyph->metrics.horiBearingX < 0) { + x = -self->face->glyph->metrics.horiBearingX; + } + glyph = self->face->glyph; source = (unsigned char*) glyph->bitmap.buffer; - xx = x + glyph->bitmap_left; + xx = PIXEL(x) + glyph->bitmap_left; xx += PIXEL(glyph_info[i].x_offset); x0 = 0; x1 = glyph->bitmap.width; @@ -644,7 +648,7 @@ font_render(FontObject* self, PyObject* args) source += glyph->bitmap.pitch; } } - x += PIXEL(glyph_info[i].x_advance); + x += glyph_info[i].x_advance; } PyMem_Del(glyph_info); Py_RETURN_NONE; diff --git a/selftest.py b/selftest.py index f6e8e5ed8..e28aaa305 100755 --- a/selftest.py +++ b/selftest.py @@ -183,7 +183,8 @@ if __name__ == "__main__": ("jpg", "JPEG"), ("jpg_2000", "OPENJPEG (JPEG2000)"), ("zlib", "ZLIB (PNG/ZIP)"), - ("libtiff", "LIBTIFF") + ("libtiff", "LIBTIFF"), + ("raqm", "RAQM") ]: if features.check(name): print("---", feature, "support ok") From 02d0bcbc6b97f39dde6ba7bc55f1d38be8422ecc Mon Sep 17 00:00:00 2001 From: shamsa Date: Thu, 4 Feb 2016 12:47:24 +0400 Subject: [PATCH 539/632] Solve merge conflict --- PIL/ImageDraw.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 969537a4b..9d003d587 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -202,11 +202,9 @@ class ImageDraw(object): return text.split(split_character) - def text(self, xy, text, fill=None, font=None, anchor=None, - direction=None, features=None, *args, **kwargs): + def text(self, xy, text, fill=None, font=None, anchor=None, *args, **kwargs): if self._multiline_check(text): - return self.multiline_text(xy, text, fill, font, anchor, - direction=direction, features=features, *args, **kwargs) + return self.multiline_text(xy, text, fill, font, anchor, *args, **kwargs) ink, fill = self._getink(fill) if font is None: font = self.getfont() @@ -214,11 +212,11 @@ class ImageDraw(object): ink = fill if ink is not None: try: - mask, offset = font.getmask2(text, self.fontmode, direction=direction, features=features) + mask, offset = font.getmask2(text, self.fontmode, *args, **kwargs) xy = xy[0] + offset[0], xy[1] + offset[1] except AttributeError: try: - mask = font.getmask(text, self.fontmode, direction, features) + mask = font.getmask(text, self.fontmode, *args, **kwargs) except TypeError: mask = font.getmask(text) self.draw.draw_bitmap(xy, mask, ink) From a77850564ae32c3b9ee289f1ebb9a5b8507025a0 Mon Sep 17 00:00:00 2001 From: shamsa Date: Tue, 16 Feb 2016 11:52:59 +0400 Subject: [PATCH 540/632] Fix gitsize function. --- PIL/ImageFont.py | 6 +- Tests/images/test_complex_unicode_text.png | Bin 1075 -> 1075 bytes _imagingft.c | 81 +++++++++++---------- 3 files changed, 46 insertions(+), 41 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 3f25a92b6..3aad8c076 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -136,8 +136,8 @@ class FreeTypeFont(object): def getmetrics(self): return self.font.ascent, self.font.descent - def getsize(self, text): - size, offset = self.font.getsize(text) + def getsize(self, text, direction=None, features=None): + size, offset = self.font.getsize(text, direction, features) return (size[0] + offset[0], size[1] + offset[1]) def getoffset(self, text): @@ -147,7 +147,7 @@ class FreeTypeFont(object): return self.getmask2(text, mode, direction=direction, features=features)[0] def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, features=None): - size, offset = self.font.getsize(text) + size, offset = self.font.getsize(text, direction, features) im = fill("L", size, 0) self.font.render(text, im.id, mode == "1", direction, features) return im, offset diff --git a/Tests/images/test_complex_unicode_text.png b/Tests/images/test_complex_unicode_text.png index 565a2f9328df4c5dab8218c59c88360dfc7f40a3..dd4f6bf223fef6f5de91e9929494c109e1e85edf 100644 GIT binary patch delta 945 zcmV;i15W(22(t)~Hh**!8$&9?TNqLF5=B~s4;h6*Nf*Mvq*9_Ry5K`-NDqOC(L+xa zkwq5@!Sbn#1d&D;p$IY2%xH8n2Z=#PXPiYKMAL(Fat7zj%sDz9t?%dY?DhYzbvFBd z*4q254U!~D()q8Ymd4F68?G3wu}J?X<6$v;8JB9!WMF?5IaaQ*4! zu?VGqHPzI*8OFe$@arfINBaM%tq40{JSh0MUuHT0m&4DY4gP|el`VCv z!xz1@z>UxYog+It(%CZ$dO}zDICS)T8o4iQ4DI1?SjEZDJHlsS768-W&G1_&p(pGP z%SX`TM0hRiuSES6mc!c6+OLak;ni^Gi2u#}Je2TWI9N$?By0}f41B)2r2g|HjhYiX zLVuqHpat%Nr(h9GXz;jdumnojI@mHeFc+4=qm?OFI_InlCER<4vaNud&Q=uA1W!X( zI2PvCl|gE}H_m7gmat;&ngRG5 zK7lp8{8CT1QiJssVLR-C?#7O#7Co>BS_$F%UN%8{qsJqY(F018&;uD5={)ccaRKgE T5`#lM00000NkvXXu0mjf$pOm0 delta 945 zcmV;i15W(22(t)~Hh-K^Yz(OkZ(&5yOB87lK4cUMC0z&ulS+xQ=z65r1k0x`5=0tZgd)U5Go#UIa*!BwbjH~PLUej?4xYg|Gv^!~kLLIDc=r1L*E*a1 zKWpuM)&@zEBBmt&N4vg2%$6 zFa?god!;ivC`lu@13nJ@p$L1!D!8o9496hxxEJ912C~tdjgrczC$w^{uci z6yacaGh8y#(4=O20E*BTI>NC~ghf?aKF8qygqNRksDD5FP=67Q95n}ag(4gXtE#kl zB^0OpE?f(}p$PlKkx+#9y`j~)YCE}J0S?P_3fv|PN3w;U{ z;ggCsC!%&%iCPSY!$5d7Os<}G85H5Ep&!0faR)mMxMs&)|lb&EZdYt;Di&X-$P0a10if*btV$!q5d5 z!8HJE7;P)*MpzEJ!hV=gj%tN(LkAp($uPD2a(~87c%($vXy0T809V4Vp%earS>-Kt zYrP_~tD%h`$oTHsme z3&+B|hB8Ra_tqIL!Xm63`=}PU8lHroLJ@kyL-ltmoeLU#sdogE8hXLEuBa{HCTIiT zU-%5xmiVoaZl&gH1-fB3^f!AbwHtuF&s4%^r`F;R8C8&;uzLr1QgnJM`{X TlFJiF00000NkvXXu0mjf(Y3al diff --git a/_imagingft.c b/_imagingft.c index 201782143..ae570af51 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -205,60 +205,69 @@ font_getchar(PyObject* string, int index, FT_ULong* char_out) return 0; } +static size_t +text_layout(PyObject* string, FontObject* self, const char* dir, + PyObject *features ,GlyphInfo **glyph_info, int mask); + static PyObject* font_getsize(FontObject* self, PyObject* args) { int i, x, y_max, y_min; - FT_ULong ch; FT_Face face; int xoffset, yoffset; - FT_Bool kerning = FT_HAS_KERNING(self->face); - FT_UInt last_index = 0; + const char *dir = NULL; + size_t count; + GlyphInfo *glyph_info = NULL;; + PyObject *features = Py_None; /* calculate size and bearing for a given string */ PyObject* string; - if (!PyArg_ParseTuple(args, "O:getsize", &string)) + if (!PyArg_ParseTuple(args, "O|zO:getsize", &string, &dir, &features)) return NULL; -#if PY_VERSION_HEX >= 0x03000000 - if (!PyUnicode_Check(string)) { -#else - if (!PyUnicode_Check(string) && !PyString_Check(string)) { -#endif - PyErr_SetString(PyExc_TypeError, "expected string"); - return NULL; - } - face = NULL; xoffset = yoffset = 0; y_max = y_min = 0; - for (x = i = 0; font_getchar(string, i, &ch); i++) { + count = text_layout(string, self, dir, features, &glyph_info, 0); + if (count == 0) + return NULL; + + for (x = i = 0; i < count; i++) { int index, error; FT_BBox bbox; FT_Glyph glyph; face = self->face; - index = FT_Get_Char_Index(face, ch); - if (kerning && last_index && index) { - FT_Vector delta; - FT_Get_Kerning(self->face, last_index, index, ft_kerning_default, - &delta); - x += delta.x; - } - - /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 - * Yifu Yu, 2014-10-15 - */ + index = glyph_info[i].index; + /* 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); - if (i == 0) + + if (i == 0 && face->glyph->metrics.horiBearingX < 0) { xoffset = face->glyph->metrics.horiBearingX; - x += face->glyph->metrics.horiAdvance; + x -= xoffset; + } + + x += glyph_info[i].x_advance; + + if (i == count - 1) + { + int offset; + offset = glyph_info[i].x_advance - + face->glyph->metrics.width - + face->glyph->metrics.horiBearingX; + if (offset < 0) + x -= offset; + } FT_Get_Glyph(face->glyph, &glyph); FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_SUBPIXELS, &bbox); + bbox.yMax -= glyph_info[i].y_offset; + bbox.yMin -= glyph_info[i].y_offset; if (bbox.yMax > y_max) y_max = bbox.yMax; if (bbox.yMin < y_min) @@ -268,23 +277,17 @@ font_getsize(FontObject* self, PyObject* args) if (face->glyph->metrics.horiBearingY > yoffset) yoffset = face->glyph->metrics.horiBearingY; - last_index = index; + //last_index = index; FT_Done_Glyph(glyph); } if (face) { - int offset; + /* left bearing */ if (xoffset < 0) x -= xoffset; else xoffset = 0; - /* right bearing */ - offset = face->glyph->metrics.horiAdvance - - face->glyph->metrics.width - - face->glyph->metrics.horiBearingX; - if (offset < 0) - x -= offset; /* difference between the font ascender and the distance of * the baseline from the top */ yoffset = PIXEL(self->face->size->metrics.ascender - yoffset); @@ -323,7 +326,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 */ + /* 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); @@ -589,15 +592,15 @@ font_render(FontObject* self, PyObject* args) for (x = i = 0; i < count; i++) { if (i == 0 && self->face->glyph->metrics.horiBearingX < 0) x = -self->face->glyph->metrics.horiBearingX; - index = glyph_info[i].index; + index = glyph_info[i].index; error = FT_Load_Glyph(self->face, index, load_flags); if (error) return geterror(error); if (i == 0 && self->face->glyph->metrics.horiBearingX < 0) { x = -self->face->glyph->metrics.horiBearingX; - } + } glyph = self->face->glyph; @@ -638,6 +641,7 @@ font_render(FontObject* self, PyObject* args) yy -= PIXEL(glyph_info[i].y_offset); if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ + int i; unsigned char *target = im->image8[yy] + xx; for (i = x0; i < x1; i++) { @@ -650,6 +654,7 @@ font_render(FontObject* self, PyObject* args) } x += glyph_info[i].x_advance; } + PyMem_Del(glyph_info); Py_RETURN_NONE; } From 312c87e2794bf9413fd1f5b14af1017bc879eca9 Mon Sep 17 00:00:00 2001 From: shamsa Date: Thu, 18 Feb 2016 12:53:19 +0400 Subject: [PATCH 541/632] fix testing --- Tests/images/test_complex_unicode_text.png | Bin 1075 -> 1442 bytes Tests/images/test_y_offset.png | Bin 1066 -> 1604 bytes Tests/test_imagefontctl.py | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/images/test_complex_unicode_text.png b/Tests/images/test_complex_unicode_text.png index dd4f6bf223fef6f5de91e9929494c109e1e85edf..f1a6f7ec61d7d9d096f2a39bf84364e7547b4438 100644 GIT binary patch delta 1334 zcmV-61HNkl*YlJm@&dovd#Nq>^0Nv>nmqn*$N$G=Uv z3^fC~;N(_>8ge01pbKWTBC^z^<6sf|DSR)Z4f|;*Lf6}s)ezT05f-%~)Q}6A2}Str zsMjuysjazbr^C(R*>HE5122}X&8kULVQu(t?9Qqk$rPH!OjDaAC>C zC2Qf$37u=(3%?H6v~KVE zSxE<6*|K=jk<~yE?t)b?6Ygk5!F&iF3@5{KSX^>b>wkXQ`7`vw*F!r1KAGwruCecg z-!9n%3*h<*pSU|51D`LsrDQEU-FSp9xCBlg>ClRjnXmwWcQuvX1u!3uYih34kP(V- z3cU9%MjwF1C9lE_;R_Qx@%gYBHZ?W39qtN`hTnvz!cVGA?~vcaE3hO0r#7_}E)A=~ zNlm3EHGgDi5nch?!O;6yf6|jl4A!p)VBS?phr#fFkS<=T$u? z!ZV==KO9^Jop5XD4@KA;exAbxFpAql5sJ_s9tbyvheHuo4!c>L1-+pN%fpjlUpTjx z(%(W6c4weUzrsM+)gka6*b|Cyf9(PF(0_#-DtO-=RVyum%~d^g!>8f<)pGx5=nYrF z`V4%Y3q|-xm{TqEm&1mzsVb@>>T-xgqp~`@-%}gcYF;E`=iO3hQerZ4E`(6P^hD;pOnxP=qJLmRj)b;eRi+ zSv|Fqvk28PbD=-%4-bZ2we`0(tO+~9?$FKQ{$1gr4E*468r&6LtahiT!V*{(p0AbJ zs_;d4JnRjRhyL(F=n0D&{D0GrLlM4KHK)Ve>M`<=<+XyZ|8rs~?5Gay3@gK_a8m|$ z`@P}I@DUE*9eTni;Gx=0WJg#TrhnIBT7+tuWuXY)1)u{ihHt=^hJCd=>h26hm_O>6 zz!@-m+`p{MfH}4QLr#P9VfI9_lp53y19$i50eBt$FoAI2f%R}ad;sp8cy^5|;e|%V z_d#E+c>p%HI3sBcZM5{ou3N%I@VU_KLz*-`?PCvV#0dvq0WG<%wQ;5YUk+`+4(Nr~ sj&>?znk;!rlhFf8lh6Yh7n+a delta 964 zcmV;#13Ubp3$qB2BYy+>NklnIIJ`v0k|2s>as%z$-HVp5|_ zfNw(y&z(k+k$)^lAA|OAAnXdCh8M#ExbQSOmCh&4Ftz&8%b+dvgnR1EKawJR6846+ zaJ2F$sDz_oL%5@^PRG?1B{jfO_#>3CJKSHT%^WxqI>NPs9sMzE9J0U$Ey8M1O)w4S z!J2R=l+acs`R(xFU@PpKVQVPiV0b-TG}O?fM!OG6=zj{W;aDhPVU?E8(Dy&#rKcR~ z4&T*YghNNohMl2=17T&AHZO&8%J0I}&>2eD7mkDy-t~r7=dx{~gj)fa4<&q6<&wRI zz9r)33|Q%ngPyQu$P0Zkl<-l%HYcKXREb&yheJ&6J zW&dzrW;y_u!_T1&{(_m6Ep@BI7rnH=jnD&~BRf0N*)t1zLRa`Wbo6@~xi4%C?cs1( z#mUb*!e?O?0Mp>j@LMRMC+rT(N6_O$crEO&MEw+&!`jf=uZwNr)o|yC|IPe7l<;0S zSbs@!By0}f41B)2r2g|HjhYiXLZ1bo1@3~UU=d7c@VIKQ1WMRC*fKaU7nZ@Jl_^&` z=d24Q+@(Rus?#PeWHY7UtHKL2A4=&S(*quwwM1n&3)!9DWETbcP3N?^J5I z`d{iD!o<2>@U1CobGQMT0r(p}fi=DSQXEgWQiJssVLR-C?#7O#7Co>BTH*U%HbHx% m$0L(L1xb@&1sWLXJn#>30q$24gF`(40000ngBx4s1fQHC?C4O zQHfEiZKo$79o2ea zMRa-+QV}L}dIF=g0KVz;9Hc@Vu8Z)OLDK0tNQLOkBK*^suOu(PMW`c02NvOpFn7#B zehB*un2XeT9aw~m;J}!J91DY`0wyDMTn856yx@y52kC}S3Yd%3c^z1U0}aZ#ALot` zFcID#?F8ypr1`T;#ed4R2rnx%Wj}nGY8-&8b4QpA!1h%8L^v;NY~6~qrR-9%vKQg` z@Xsj!yD!9)dNtvl!M5BH`e6s`OtsI4*;!-jR-`Rumx`6W2$uxY3*8L6VPEY%m4M&C zuG|skz^nDze-(V3H8x$5wwhfkR`w#i5`YtmOW6%OYFh@NAAk1cj&ObOLcLp~7r|#) zW78FBtJ$SuWiP^20DM$XzHXS1x~Fm$ko&pcG?)zM1h>JA+K*1n5hPuawv=5eT=pV- zxx@i@t)P5U;5&G;wsB~i&AAutgML^Fj|5wTld2;3!B;sZFrp@GDZ5m-uFM|2@H~7y zs_4D&6F3O}gMXpx$J1alBdfBh@Lld>Xp3M@<^6=J71a;G!K~rwinOKdQsJ_9!k-0C zkLqm7jqqNuHh48y9py~d2G6IW^#)00l{R-CJXH0R@2RS5%U%G!&5Dq&Nb_fxI%9Qk zOzWej!TKPny!Hpv;11Xp9GB|6EO;yHNOvDR8tku%`F~b0y{f~-kOa-cbVCySwDs&# z`wU->PDx#o&4eYeJ;(NvHVBuN_;;`nfH&anpbKs&)v3OEvr4jAuqw*W0C&SWSYP5_ z@Of3A5l=D$24E^|soE{;R-~EPrE&6PFtxVjzA=2~=t9_3wQKDRo((Q&(E0ITW#dHC zVM{O=JbxC{8YFT4XwN^EK{q%XBQRr_mj5PnhO-V*B@7jHv5;m~Y<#9(m|YqtPX!C=wOtD}&AOV5#O5+uwtK!0YXqTyKsq=}L#azRE-S^y}T=^nXgX zXDW@qs~USR{3qJ@3)>C^=d>-jbO^Z)4y0D#+Te_;K7Xz}_?}g1nGYNCon;xFE=Yn? z+ZJCsv|Isef<3|igBOAu>wVkz7C5c)ehzGi;UC*!=xawavO7vgpP$2vwfkf{^gt4M zPoGLhh`Zrrm<6u{*EjCA6pn5GWJY>mj|a+hRQY4&wAaSUcj4Q;*EQD-+gyY?3Y2ec z9uIc`FtzejU~9c!aXp^Cg~5(aKpJlYuqjvsli+@s*6H~GtK11Clko#0lkWo%7^Hf> Y2N~o?D2~tY5&!@I07*qoM6N<$f;jN&`v3p{ delta 973 zcmV;;12X)?45|o_BYy+&NkljpwZz= zO>Q=9j#Onam%@&Wmd^%5b?mid zg}e{LC5I2dcL1D&k6>xSo3OUNaH*x737$z;?uC4e-A|VKI>-k*>RYU`LjG|iI2>#W zhJyje{3auH7>14Rre=zFcZ$CI~TfKpDqp*KYzIyX4Wx+%8+h&6mEhA zupAD+V%P|C;ltoWa4y(g&&5g2pbhARc_nY*27`X+heNQlSo{kT7)f_7%&`YyOR=&N zwimZLJK&ExMo<=#gI&SObem6LW5RW?4CcWp*iqNjNll;)e^>)UB@cU*`;$Np0*{ zNxD+DKM7m|$165MZ{^Y(`NB*2-tnKkEaXUxeP3GRDN$-Q-^S%1-d4e`ioKA4LnZU) z$qAjkEM(P$e?p`t)&`?BHzy0;3m&RgzYV?&P6vY-A7|I&UkQ<#)zy#>`f9f6gJC~X zk^UovPd5j%U%TA`KL#)Tk3*8Cm-)qgkxdmhrCsnGj08UgS5D68q}CTXI2OzS;5_Vy zlh6qZ;0~Ap39L=nJIUjeTH0%odPz|Bdup|KH diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 02c432527..6c03fb168 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -34,7 +34,7 @@ try: im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) - draw.text((0, 0), 'هنا عمان', font=ttf, fill=500) + draw.text((0, 0), 'العالم العربي', font=ttf, fill=500) target = 'Tests/images/test_y_offset.png' target_img = Image.open(target) @@ -46,7 +46,7 @@ try: im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) - draw.text((0, 0), u'مرحبا بكم', font=ttf, fill=500) + draw.text((0, 0), u'السلام عليكم', font=ttf, fill=500) target = 'Tests/images/test_complex_unicode_text.png' target_img = Image.open(target) From 19929791ee99f63eea814bc0fa0d54f5d2c0f5de Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Tue, 13 Dec 2016 09:07:29 +0400 Subject: [PATCH 542/632] fix windows build --- _imagingft.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index ae570af51..948854b6d 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -217,7 +217,7 @@ font_getsize(FontObject* self, PyObject* args) int xoffset, yoffset; const char *dir = NULL; size_t count; - GlyphInfo *glyph_info = NULL;; + GlyphInfo *glyph_info = NULL; PyObject *features = Py_None; /* calculate size and bearing for a given string */ @@ -481,15 +481,16 @@ failed: return count; #else - if (features != Py_None || dir != NULL) - PyErr_SetString(PyExc_KeyError, "Raqm is missing."); - int error, load_flags; FT_ULong ch; Py_ssize_t count; FT_GlyphSlot glyph; FT_Bool kerning = FT_HAS_KERNING(self->face); FT_UInt last_index = 0; + + if (features != Py_None || dir != NULL) + PyErr_SetString(PyExc_KeyError, "setting text direction or font features is not supported without libraqm"); + #if PY_VERSION_HEX >= 0x03000000 if (!PyUnicode_Check(string)) { #else From de8ba933e54400155bd4bdfd4080db30577bfcc8 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Tue, 13 Dec 2016 12:37:27 +0400 Subject: [PATCH 543/632] fix windows build --- _imagingft.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_imagingft.c b/_imagingft.c index 948854b6d..e664ff6b0 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -487,6 +487,7 @@ failed: FT_GlyphSlot glyph; FT_Bool kerning = FT_HAS_KERNING(self->face); FT_UInt last_index = 0; + int i; if (features != Py_None || dir != NULL) PyErr_SetString(PyExc_KeyError, "setting text direction or font features is not supported without libraqm"); @@ -515,7 +516,6 @@ failed: load_flags = FT_LOAD_RENDER|FT_LOAD_NO_BITMAP; if (mask) load_flags |= FT_LOAD_TARGET_MONO; - int i; for (i = 0; font_getchar(string, i, &ch); i++) { (*glyph_info)[i].index = FT_Get_Char_Index(self->face, ch); error = FT_Load_Glyph(self->face, (*glyph_info)[i].index, load_flags); From 538cec323b15e32db6098b825cc25aa6ac924e31 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:05:14 +0400 Subject: [PATCH 544/632] fix setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 86269f5ed..21578ea2f 100755 --- a/setup.py +++ b/setup.py @@ -113,7 +113,6 @@ IMAGEQUANT_ROOT = None TIFF_ROOT = None FREETYPE_ROOT = None LCMS_ROOT = None - RAQM_ROOT = None def _pkg_config(name): @@ -518,6 +517,7 @@ class pil_build_ext(build_ext): _add_directory(self.compiler.include_dirs, subdir, 0) if feature.want('raqm'): + _dbg('Looking for raqm') if _find_include_file(self, "raqm.h"): if _find_library_file(self, "raqm") and \ _find_library_file(self, "harfbuzz") and \ From 6dc4c7ea065f1b1ce61203024edb79d83aea4fd7 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:05:32 +0400 Subject: [PATCH 545/632] improve docs for CTL --- docs/reference/ImageDraw.rst | 16 ++++++++++++---- docs/reference/ImageFont.rst | 8 ++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index f474f244b..cd1236563 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -240,8 +240,12 @@ Methods the number of pixels between lines. :param align: If the text is passed on to multiline_text(), "left", "center" or "right". - :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt. - :param features: A list of font features used for text layout. For example, 'ligature, kerning, Medial ...etc. + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. + :param features: A list of font feature to be used during text layout. + This is usually used to turn on optional font features that are not enabled by + default, for example 'dlig' or 'ss01', but can be also used to turn off default + font features for example '-liga' to disable ligatures or '-kern' to disable kerning. + To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm .. py:method:: PIL.ImageDraw.Draw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", direction=None, features=[]) @@ -254,8 +258,12 @@ Methods :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. :param spacing: The number of pixels between lines. :param align: "left", "center" or "right". - :param direction: Direction of the text. - :param features: Font features used for text layout. + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. + :param features: A list of font feature to be used during text layout. + This is usually used to turn on optional font features that are not enabled by + default, for example 'dlig' or 'ss01', but can be also used to turn off default + font features for example '-liga' to disable ligatures or '-kern' to disable kerning. + To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm .. py:method:: PIL.ImageDraw.Draw.textsize(text, font=None, spacing=0) diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index 60ea2ad5f..c01872a6b 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -63,8 +63,12 @@ Methods driver prefers; if empty, the renderer may return either mode. Note that the mode is always a string, to simplify C-level implementations. - :param direction: Direction of the text. - :param features: A list of font features used for text layout. + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. + :param features: A list of font feature to be used during text layout. This is + usually used to turn on optional font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also used to turn off default font + features for example '-liga' to disable ligatures or '-kern' to disable kerning. + To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm .. versionadded:: 1.1.5 :return: An internal PIL storage memory instance as defined by the From 629f83228ad3b75b341de7ec59c205db0eccbcb3 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:07:09 +0400 Subject: [PATCH 546/632] break up text_layout into two implementations --- _imagingft.c | 308 +++++++++++++++++++++++++++------------------------ 1 file changed, 161 insertions(+), 147 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index e664ff6b0..79d358dfe 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -206,147 +206,9 @@ font_getchar(PyObject* string, int index, FT_ULong* char_out) } static size_t -text_layout(PyObject* string, FontObject* self, const char* dir, - PyObject *features ,GlyphInfo **glyph_info, int mask); - -static PyObject* -font_getsize(FontObject* self, PyObject* args) -{ - int i, x, y_max, y_min; - FT_Face face; - int xoffset, yoffset; - const char *dir = NULL; - size_t count; - GlyphInfo *glyph_info = NULL; - PyObject *features = Py_None; - - /* calculate size and bearing for a given string */ - - PyObject* string; - if (!PyArg_ParseTuple(args, "O|zO:getsize", &string, &dir, &features)) - return NULL; - - face = NULL; - xoffset = yoffset = 0; - y_max = y_min = 0; - - count = text_layout(string, self, dir, features, &glyph_info, 0); - if (count == 0) - return NULL; - - for (x = i = 0; i < count; i++) { - int index, error; - FT_BBox bbox; - FT_Glyph glyph; - face = self->face; - index = glyph_info[i].index; - /* 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); - - if (i == 0 && face->glyph->metrics.horiBearingX < 0) { - xoffset = face->glyph->metrics.horiBearingX; - x -= xoffset; - } - - x += glyph_info[i].x_advance; - - if (i == count - 1) - { - int offset; - offset = glyph_info[i].x_advance - - face->glyph->metrics.width - - face->glyph->metrics.horiBearingX; - if (offset < 0) - x -= offset; - } - - FT_Get_Glyph(face->glyph, &glyph); - FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_SUBPIXELS, &bbox); - bbox.yMax -= glyph_info[i].y_offset; - bbox.yMin -= glyph_info[i].y_offset; - if (bbox.yMax > y_max) - y_max = bbox.yMax; - if (bbox.yMin < y_min) - y_min = bbox.yMin; - - /* find max distance of baseline from top */ - if (face->glyph->metrics.horiBearingY > yoffset) - yoffset = face->glyph->metrics.horiBearingY; - - //last_index = index; - FT_Done_Glyph(glyph); - } - - if (face) { - - /* left bearing */ - if (xoffset < 0) - x -= xoffset; - else - xoffset = 0; - /* difference between the font ascender and the distance of - * the baseline from the top */ - yoffset = PIXEL(self->face->size->metrics.ascender - yoffset); - } - - return Py_BuildValue( - "(ii)(ii)", - PIXEL(x), PIXEL(y_max - y_min), - PIXEL(xoffset), yoffset - ); -} - -static PyObject* -font_getabc(FontObject* self, PyObject* args) -{ - FT_ULong ch; - FT_Face face; - double a, b, c; - - /* calculate ABC values for a given string */ - - PyObject* string; - if (!PyArg_ParseTuple(args, "O:getabc", &string)) - return NULL; - -#if PY_VERSION_HEX >= 0x03000000 - if (!PyUnicode_Check(string)) { -#else - if (!PyUnicode_Check(string) && !PyString_Check(string)) { -#endif - PyErr_SetString(PyExc_TypeError, "expected string"); - return NULL; - } - - if (font_getchar(string, 0, &ch)) { - int index, error; - face = self->face; - index = FT_Get_Char_Index(face, ch); - /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */ - error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP); - if (error) - return geterror(error); - a = face->glyph->metrics.horiBearingX / 64.0; - b = face->glyph->metrics.width / 64.0; - c = (face->glyph->metrics.horiAdvance - - face->glyph->metrics.horiBearingX - - face->glyph->metrics.width) / 64.0; - } else - a = b = c = 0.0; - - return Py_BuildValue("ddd", a, b, c); -} - - -static size_t -text_layout(PyObject* string, FontObject* self, const char* dir, +text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject *features ,GlyphInfo **glyph_info, int mask) { -#ifdef HAVE_RAQM int i = 0; raqm_t *rq; size_t count = 0; @@ -479,8 +341,12 @@ text_layout(PyObject* string, FontObject* self, const char* dir, failed: raqm_destroy (rq); return count; +} -#else +static size_t +text_layout_fallback(PyObject* string, FontObject* self, const char* dir, + PyObject *features ,GlyphInfo **glyph_info, int mask) +{ int error, load_flags; FT_ULong ch; Py_ssize_t count; @@ -489,9 +355,9 @@ failed: FT_UInt last_index = 0; int i; - if (features != Py_None || dir != NULL) + if (features != Py_None || dir != NULL) { PyErr_SetString(PyExc_KeyError, "setting text direction or font features is not supported without libraqm"); - + } #if PY_VERSION_HEX >= 0x03000000 if (!PyUnicode_Check(string)) { #else @@ -502,10 +368,12 @@ failed: } count = 0; - while (font_getchar(string, count, &ch)) + while (font_getchar(string, count, &ch)) { count++; - if (count == 0) + } + if (count == 0) { return 0; + } (*glyph_info) = PyMem_New(GlyphInfo, count); if ((*glyph_info) == NULL) { @@ -514,8 +382,9 @@ failed: } load_flags = FT_LOAD_RENDER|FT_LOAD_NO_BITMAP; - if (mask) + if (mask) { load_flags |= FT_LOAD_TARGET_MONO; + } for (i = 0; font_getchar(string, i, &ch); i++) { (*glyph_info)[i].index = FT_Get_Char_Index(self->face, ch); error = FT_Load_Glyph(self->face, (*glyph_info)[i].index, load_flags); @@ -538,7 +407,150 @@ failed: (*glyph_info)[i].cluster = ch; } return count; +} + +static size_t +text_layout(PyObject* string, FontObject* self, const char* dir, + PyObject *features, GlyphInfo **glyph_info, int mask) +{ + size_t count; +#ifdef HAVE_RAQM + count = text_layout_raqm(string, self, dir, features, glyph_info, mask); +#else + count = text_layout_fallback(string, self, dir, features, glyph_info, mask); #endif + return count; +} + +static PyObject* +font_getsize(FontObject* self, PyObject* args) +{ + int i, x, y_max, y_min; + FT_Face face; + int xoffset, yoffset; + const char *dir = NULL; + size_t count; + GlyphInfo *glyph_info = NULL; + PyObject *features = Py_None; + + /* calculate size and bearing for a given string */ + + PyObject* string; + if (!PyArg_ParseTuple(args, "O|zO:getsize", &string, &dir, &features)) + return NULL; + + face = NULL; + xoffset = yoffset = 0; + y_max = y_min = 0; + + count = text_layout(string, self, dir, features, &glyph_info, 0); + if (count == 0) + return NULL; + + for (x = i = 0; i < count; i++) { + int index, error; + FT_BBox bbox; + FT_Glyph glyph; + face = self->face; + index = glyph_info[i].index; + /* 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); + + if (i == 0 && face->glyph->metrics.horiBearingX < 0) { + xoffset = face->glyph->metrics.horiBearingX; + x -= xoffset; + } + + x += glyph_info[i].x_advance; + + if (i == count - 1) + { + int offset; + offset = glyph_info[i].x_advance - + face->glyph->metrics.width - + face->glyph->metrics.horiBearingX; + if (offset < 0) + x -= offset; + } + + FT_Get_Glyph(face->glyph, &glyph); + FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_SUBPIXELS, &bbox); + bbox.yMax -= glyph_info[i].y_offset; + bbox.yMin -= glyph_info[i].y_offset; + if (bbox.yMax > y_max) + y_max = bbox.yMax; + if (bbox.yMin < y_min) + y_min = bbox.yMin; + + /* find max distance of baseline from top */ + if (face->glyph->metrics.horiBearingY > yoffset) + yoffset = face->glyph->metrics.horiBearingY; + + FT_Done_Glyph(glyph); + } + + if (face) { + + /* left bearing */ + if (xoffset < 0) + x -= xoffset; + else + xoffset = 0; + /* difference between the font ascender and the distance of + * the baseline from the top */ + yoffset = PIXEL(self->face->size->metrics.ascender - yoffset); + } + + return Py_BuildValue( + "(ii)(ii)", + PIXEL(x), PIXEL(y_max - y_min), + PIXEL(xoffset), yoffset + ); +} + +static PyObject* +font_getabc(FontObject* self, PyObject* args) +{ + FT_ULong ch; + FT_Face face; + double a, b, c; + + /* calculate ABC values for a given string */ + + PyObject* string; + if (!PyArg_ParseTuple(args, "O:getabc", &string)) + return NULL; + +#if PY_VERSION_HEX >= 0x03000000 + if (!PyUnicode_Check(string)) { +#else + if (!PyUnicode_Check(string) && !PyString_Check(string)) { +#endif + PyErr_SetString(PyExc_TypeError, "expected string"); + return NULL; + } + + if (font_getchar(string, 0, &ch)) { + int index, error; + face = self->face; + index = FT_Get_Char_Index(face, ch); + /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */ + error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP); + if (error) + return geterror(error); + a = face->glyph->metrics.horiBearingX / 64.0; + b = face->glyph->metrics.width / 64.0; + c = (face->glyph->metrics.horiAdvance - + face->glyph->metrics.horiBearingX - + face->glyph->metrics.width) / 64.0; + } else + a = b = c = 0.0; + + return Py_BuildValue("ddd", a, b, c); } static PyObject* @@ -562,13 +574,15 @@ font_render(FontObject* self, PyObject* args) GlyphInfo *glyph_info; PyObject *features = NULL; - if (!PyArg_ParseTuple(args, "On|izO:render", &string, &id, &mask, &dir, &features)) + if (!PyArg_ParseTuple(args, "On|izO:render", &string, &id, &mask, &dir, &features)) { return NULL; + } glyph_info = NULL; count = text_layout(string, self, dir, features, &glyph_info, mask); - if (count == 0) + if (count == 0) { return NULL; + } im = (Imaging) id; /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */ From 697db864bdb4d99f1d6c11e6a251921af446e95f Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:07:58 +0400 Subject: [PATCH 547/632] update depends/* to install raqm --- depends/debian_8.2.sh | 3 ++- depends/fedora_23.sh | 4 +++- depends/freebsd_10.sh | 4 +++- depends/install_raqm.sh | 19 +++++++++++++++++++ depends/ubuntu_14.04.sh | 6 ++++-- 5 files changed, 31 insertions(+), 5 deletions(-) create mode 100755 depends/install_raqm.sh diff --git a/depends/debian_8.2.sh b/depends/debian_8.2.sh index 96e6a8e2b..c4f72bf8e 100755 --- a/depends/debian_8.2.sh +++ b/depends/debian_8.2.sh @@ -11,7 +11,8 @@ sudo apt-get -y install python-dev python-setuptools \ python3-dev python-virtualenv cmake sudo apt-get -y install libtiff5-dev libjpeg62-turbo-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev \ - python-tk python3-tk + python-tk python3-tk libharfbuzz-dev libfribidi-dev ./install_openjpeg.sh ./install_imagequant.sh +./install_raqm.sh diff --git a/depends/fedora_23.sh b/depends/fedora_23.sh index bad03e764..f9ef9e814 100755 --- a/depends/fedora_23.sh +++ b/depends/fedora_23.sh @@ -15,4 +15,6 @@ sudo dnf install python-devel python3-devel python-virtualenv make gcc sudo dnf install libtiff-devel libjpeg-devel zlib-devel freetype-devel \ lcms2-devel libwebp-devel openjpeg2-devel tkinter python3-tkinter \ - tcl-devel tk-devel \ No newline at end of file + tcl-devel tk-devel harfbuzz-devel fribidi-devel + +./install_raqm.sh \ No newline at end of file diff --git a/depends/freebsd_10.sh b/depends/freebsd_10.sh index 99b4d6d0f..205b6660e 100755 --- a/depends/freebsd_10.sh +++ b/depends/freebsd_10.sh @@ -8,4 +8,6 @@ sudo pkg install python2 python3 py27-pip py27-virtualenv py27-setuptools27 # Openjpeg fails badly using the openjpeg package. # I can't find a python3.4 version of tkinter -sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 py27-tkinter +sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 harfbuzz fribidi py27-tkinter + +./install_raqm.sh \ No newline at end of file diff --git a/depends/install_raqm.sh b/depends/install_raqm.sh new file mode 100755 index 000000000..31950aa4a --- /dev/null +++ b/depends/install_raqm.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# install raqm + + +if [ ! -f raqm-0.2.0.tar.gz ]; then + wget -O 'raqm-0.2.0.tar.gz' 'https://github.com/HOST-Oman/libraqm/releases/download/v0.2.0/raqm-0.2.0.tar.gz?raw=true' + +fi + +rm -r raqm-0.2.0 +tar -xvzf raqm-0.2.0.tar.gz + + +pushd raqm-0.2.0 + +./configure --prefix=/usr && make -j4 && sudo make -j4 install + +popd + diff --git a/depends/ubuntu_14.04.sh b/depends/ubuntu_14.04.sh index a548f74fa..97d142165 100755 --- a/depends/ubuntu_14.04.sh +++ b/depends/ubuntu_14.04.sh @@ -4,12 +4,14 @@ # Installs all of the dependencies for Pillow for Ubuntu 14.04 # for both system Pythons 2.7 and 3.4 # - +sudo add-apt-repository -y ppa:as-bahanta/raqm +sudo apt-get update sudo apt-get -y install python-dev python-setuptools \ python3-dev python-virtualenv cmake sudo apt-get -y install libtiff5-dev libjpeg8-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev \ - python-tk python3-tk + python-tk python3-tk libharfbuzz-dev libfribidi-dev ./install_openjpeg.sh ./install_imagequant.sh +./install_raqm.sh From 4ed6962364275764381b47d8ac1b21f1562a456b Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:10:15 +0400 Subject: [PATCH 548/632] only catch ImportError same as test_imagefont.py --- Tests/test_imagefontctl.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 6c03fb168..31e9630b6 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -125,10 +125,10 @@ try: self.assert_image_similar(im, target_img, .5) -except (KeyError, ImportError): +except ImportError: class TestImagecomplextext(PillowTestCase): def test_skip(self): - self.skipTest("KeyError") + self.skipTest("ImportError") if __name__ == '__main__': unittest.main() From 74e4ccc0ecd43dd40dc113c6476b643309811dbf Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:29:09 +0400 Subject: [PATCH 549/632] declare text_layout_raqm only when we HAVE_RAQM --- _imagingft.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_imagingft.c b/_imagingft.c index 79d358dfe..d1bbe5822 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -205,6 +205,7 @@ font_getchar(PyObject* string, int index, FT_ULong* char_out) return 0; } +#ifdef HAVE_RAQM static size_t text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject *features ,GlyphInfo **glyph_info, int mask) @@ -342,6 +343,7 @@ failed: raqm_destroy (rq); return count; } +#endif static size_t text_layout_fallback(PyObject* string, FontObject* self, const char* dir, From fd7a675de680f0ae8d17cba2898632e17bbb7b3b Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:49:21 +0400 Subject: [PATCH 550/632] adding KeyError exception so the test not fail when there is no raqm lib. --- Tests/test_imagefontctl.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 31e9630b6..2a6463159 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -129,6 +129,10 @@ except ImportError: class TestImagecomplextext(PillowTestCase): def test_skip(self): self.skipTest("ImportError") +except KeyError: + class TestImagecomplextext(PillowTestCase): + def test_skip(self): + self.skipTest("KeyError") if __name__ == '__main__': unittest.main() From e07a254ed9cdd82ab5c1fc727592cb4bde1ba35f Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Thu, 15 Dec 2016 14:43:02 +0400 Subject: [PATCH 551/632] update --- PIL/ImageDraw.py | 6 ++++-- PIL/features.py | 1 - Tests/test_imagefontctl.py | 11 ++++++----- _imagingft.c | 16 ++++++++-------- docs/installation.rst | 29 +++++++++++++++++++++++++---- docs/reference/ImageDraw.rst | 6 ++++-- docs/reference/ImageFont.rst | 3 ++- 7 files changed, 49 insertions(+), 23 deletions(-) diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 9d003d587..d0e95df65 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -202,9 +202,11 @@ class ImageDraw(object): return text.split(split_character) - def text(self, xy, text, fill=None, font=None, anchor=None, *args, **kwargs): + def text(self, xy, text, fill=None, font=None, anchor=None, + *args, **kwargs): if self._multiline_check(text): - return self.multiline_text(xy, text, fill, font, anchor, *args, **kwargs) + return self.multiline_text(xy, text, fill, font, anchor, + *args, **kwargs) ink, fill = self._getink(fill) if font is None: font = self.getfont() diff --git a/PIL/features.py b/PIL/features.py index 11b1fe058..e01a32193 100644 --- a/PIL/features.py +++ b/PIL/features.py @@ -5,7 +5,6 @@ modules = { "tkinter": "PIL._tkinter_finder", "freetype2": "PIL._imagingft", "littlecms2": "PIL._imagingcms", - "raqm": "PIL._imagingft", "webp": "PIL._webp", } diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 2a6463159..32999b169 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -1,22 +1,23 @@ # -*- coding: utf-8 -*- from helper import unittest, PillowTestCase from PIL import Image -from PIL import ImageDraw +from PIL import ImageDraw, ImageFont + +#check if raqm installed +have_raqm = ImageFont.core.have_raqm FONT_SIZE = 20 FONT_PATH = "Tests/fonts/DejaVuSans.ttf" try: from PIL import ImageFont - - # check if raqm is available + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) draw.text((0, 0), 'TEST', font=ttf, fill=500, direction='ltr') - + @unittest.skipIf(not have_raqm, "Raqm Library is not installed !") class TestImagecomplextext(PillowTestCase): - def test_complex_text(self): ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) diff --git a/_imagingft.c b/_imagingft.c index d1bbe5822..2725f3022 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -43,14 +43,6 @@ #define FT_ERROR_END_LIST { 0, 0 } }; #ifdef HAVE_RAQM #include -#else -typedef enum -{ - RAQM_DIRECTION_DEFAULT, - RAQM_DIRECTION_RTL, - RAQM_DIRECTION_LTR, - RAQM_DIRECTION_TTB -} raqm_direction_t; #endif typedef struct @@ -830,6 +822,14 @@ setup_module(PyObject* m) { #endif PyDict_SetItemString(d, "freetype2_version", v); + +#ifdef HAVE_RAQM + v = PyBool_FromLong(1); +#else + v = PyBool_FromLong(0); +#endif + PyDict_SetItemString(d, "have_raqm", v); + return 0; } diff --git a/docs/installation.rst b/docs/installation.rst index 277239a8f..1bbb327b3 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -170,6 +170,16 @@ Many of Pillow's features require external libraries: * Windows support: Libimagequant requires VS2013/MSVC 18 to compile, so it is unlikely to work with any Python prior to 3.5 on Windows. +* **libraqm** provides complex text layout support. + + * libraqm provides bidirectional text support (using FriBiDi), + shaping (using HarfBuzz), and proper script itemization. As a + result, Raqm can support most writing systems covered by Unicode. + * libraqm depends on the following libraries: FreeType, HarfBuzz, + FriBiDi, make sure that install them before install libraqm if not + available as package in your system. + * setting text direction or font features is not supported without libraqm. + Once you have installed the prerequisites, run:: $ pip install Pillow @@ -201,14 +211,16 @@ Build Options * Build flags: ``--disable-zlib``, ``--disable-jpeg``, ``--disable-tiff``, ``--disable-freetype``, ``--disable-tcl``, ``--disable-tk``, ``--disable-lcms``, ``--disable-webp``, - ``--disable-webpmux``, ``--disable-jpeg2000``, ``--disable-imagequant``. + ``--disable-webpmux``, ``--disable-jpeg2000``, + ``--disable-imagequant``, ``--disable-raqm``. Disable building the corresponding feature even if the development libraries are present on the building machine. * Build flags: ``--enable-zlib``, ``--enable-jpeg``, ``--enable-tiff``, ``--enable-freetype``, ``--enable-tcl``, ``--enable-tk``, ``--enable-lcms``, ``--enable-webp``, - ``--enable-webpmux``, ``--enable-jpeg2000``, ``--enable-imagequant``. + ``--enable-webpmux``, ``--enable-jpeg2000``, + ``--enable-imagequant``, ``--enable-raqm``. 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. @@ -247,7 +259,16 @@ The easiest way to install external libraries is via `Homebrew $ brew install libtiff libjpeg webp little-cms2 -Install Pillow with:: +To install libraqm on MaxOS use Homebrew:: + $ brew install freetype harfbuzz fribidi +Once you have `libraqm source code `_ and the dependencies , run the customary sequence of commands in the source code +directory:: + + $ ./configure + $ make + $ make install + +Now install Pillow with:: $ pip install Pillow @@ -277,7 +298,7 @@ Or for Python 3:: Prerequisites are installed on **FreeBSD 10 or 11** with:: - $ sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 openjpeg + $ sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 openjpeg harfbuzz fribidi Building on Linux diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index cd1236563..e8f67f39b 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -240,12 +240,13 @@ Methods the number of pixels between lines. :param align: If the text is passed on to multiline_text(), "left", "center" or "right". - :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. Requires libraqm :param features: A list of font feature to be used during text layout. This is usually used to turn on optional font features that are not enabled by default, for example 'dlig' or 'ss01', but can be also used to turn off default font features for example '-liga' to disable ligatures or '-kern' to disable kerning. To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm + Requires libraqm. .. py:method:: PIL.ImageDraw.Draw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", direction=None, features=[]) @@ -258,12 +259,13 @@ Methods :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. :param spacing: The number of pixels between lines. :param align: "left", "center" or "right". - :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. Requires libraqm. :param features: A list of font feature to be used during text layout. This is usually used to turn on optional font features that are not enabled by default, for example 'dlig' or 'ss01', but can be also used to turn off default font features for example '-liga' to disable ligatures or '-kern' to disable kerning. To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm + Requires libraqm. .. py:method:: PIL.ImageDraw.Draw.textsize(text, font=None, spacing=0) diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index c01872a6b..d8790ca01 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -63,12 +63,13 @@ Methods driver prefers; if empty, the renderer may return either mode. Note that the mode is always a string, to simplify C-level implementations. - :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. Requires libraqm :param features: A list of font feature to be used during text layout. This is usually used to turn on optional font features that are not enabled by default, for example 'dlig' or 'ss01', but can be also used to turn off default font features for example '-liga' to disable ligatures or '-kern' to disable kerning. To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm + Requires libraqm .. versionadded:: 1.1.5 :return: An internal PIL storage memory instance as defined by the From eb75a942f2a05ad9ce24fc311360dced19c8d237 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Thu, 15 Dec 2016 14:55:45 +0400 Subject: [PATCH 552/632] fix build --- PIL/features.py | 1 + 1 file changed, 1 insertion(+) diff --git a/PIL/features.py b/PIL/features.py index e01a32193..6b5d7a578 100644 --- a/PIL/features.py +++ b/PIL/features.py @@ -4,6 +4,7 @@ modules = { "pil": "PIL._imaging", "tkinter": "PIL._tkinter_finder", "freetype2": "PIL._imagingft", + "raqm": "PIL._imagingft", "littlecms2": "PIL._imagingcms", "webp": "PIL._webp", } From e8584f3f89d47bc102e9d5d55606e9d1c2f2a9c1 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Sat, 17 Dec 2016 15:57:22 +0400 Subject: [PATCH 553/632] fix ubuntu build --- depends/ubuntu_14.04.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/depends/ubuntu_14.04.sh b/depends/ubuntu_14.04.sh index 97d142165..997bb09cf 100755 --- a/depends/ubuntu_14.04.sh +++ b/depends/ubuntu_14.04.sh @@ -10,8 +10,7 @@ sudo apt-get -y install python-dev python-setuptools \ python3-dev python-virtualenv cmake sudo apt-get -y install libtiff5-dev libjpeg8-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev \ - python-tk python3-tk libharfbuzz-dev libfribidi-dev + python-tk python3-tk libharfbuzz-dev libfribidi-dev libraqm-dev ./install_openjpeg.sh -./install_imagequant.sh -./install_raqm.sh +./install_imagequant.sh \ No newline at end of file From 2528743d8c0b01745dff12cec9845ff883b217a2 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Mon, 19 Dec 2016 08:40:03 +0400 Subject: [PATCH 554/632] fedora has raqm package --- depends/fedora_23.sh | 4 +--- docs/installation.rst | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/depends/fedora_23.sh b/depends/fedora_23.sh index f9ef9e814..5bdcf7f17 100755 --- a/depends/fedora_23.sh +++ b/depends/fedora_23.sh @@ -15,6 +15,4 @@ sudo dnf install python-devel python3-devel python-virtualenv make gcc sudo dnf install libtiff-devel libjpeg-devel zlib-devel freetype-devel \ lcms2-devel libwebp-devel openjpeg2-devel tkinter python3-tkinter \ - tcl-devel tk-devel harfbuzz-devel fribidi-devel - -./install_raqm.sh \ No newline at end of file + tcl-devel tk-devel harfbuzz-devel fribidi-devel libraqm-devel \ No newline at end of file diff --git a/docs/installation.rst b/docs/installation.rst index 1bbb327b3..c8a7113ac 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -339,7 +339,7 @@ Prerequisites are installed on **Ubuntu 14.04 LTS** with:: Prerequisites are installed on **Fedora 23** with:: $ sudo dnf install libtiff-devel libjpeg-devel zlib-devel freetype-devel \ - lcms2-devel libwebp-devel tcl-devel tk-devel + lcms2-devel libwebp-devel tcl-devel tk-devel libraqm-devel From 42831098ac298c5c56c189a5c34006dbec2d960e Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Jun 2017 07:57:40 -0700 Subject: [PATCH 555/632] Fix RAQM feature detection --- PIL/features.py | 2 +- _imagingft.c | 2 +- selftest.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PIL/features.py b/PIL/features.py index 6b5d7a578..60f4c10ca 100644 --- a/PIL/features.py +++ b/PIL/features.py @@ -4,7 +4,6 @@ modules = { "pil": "PIL._imaging", "tkinter": "PIL._tkinter_finder", "freetype2": "PIL._imagingft", - "raqm": "PIL._imagingft", "littlecms2": "PIL._imagingcms", "webp": "PIL._webp", } @@ -46,6 +45,7 @@ def get_supported_codecs(): features = { "webp_mux": ("PIL._webp", 'HAVE_WEBPMUX'), "transp_webp": ("PIL._webp", "HAVE_TRANSPARENCY"), + "raqm": ("PIL._imagingft", "HAVE_RAQM") } def check_feature(feature): diff --git a/_imagingft.c b/_imagingft.c index 2725f3022..48f8e8791 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -828,7 +828,7 @@ setup_module(PyObject* m) { #else v = PyBool_FromLong(0); #endif - PyDict_SetItemString(d, "have_raqm", v); + PyDict_SetItemString(d, "HAVE_RAQM", v); return 0; } diff --git a/selftest.py b/selftest.py index e28aaa305..108e57fd2 100755 --- a/selftest.py +++ b/selftest.py @@ -184,7 +184,7 @@ if __name__ == "__main__": ("jpg_2000", "OPENJPEG (JPEG2000)"), ("zlib", "ZLIB (PNG/ZIP)"), ("libtiff", "LIBTIFF"), - ("raqm", "RAQM") + ("raqm", "RAQM (Bidirectional Text)") ]: if features.check(name): print("---", feature, "support ok") From f371ca07f478277f7833ffed1710f1cc2f418810 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Jun 2017 09:02:43 -0700 Subject: [PATCH 556/632] hoist tests out of try/except, use feature detection --- Tests/test_imagefontctl.py | 176 +++++++++++++++++-------------------- 1 file changed, 83 insertions(+), 93 deletions(-) diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 32999b169..d8c4df888 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -1,139 +1,129 @@ # -*- coding: utf-8 -*- from helper import unittest, PillowTestCase -from PIL import Image -from PIL import ImageDraw, ImageFont +from PIL import Image, ImageDraw, ImageFont, features -#check if raqm installed -have_raqm = ImageFont.core.have_raqm FONT_SIZE = 20 FONT_PATH = "Tests/fonts/DejaVuSans.ttf" -try: - from PIL import ImageFont +@unittest.skipUnless(features.check('raqm'), "Raqm Library is not installed.") +class TestImagecomplextext(PillowTestCase): + + def test_english(self): + #smoke test, this should not fail + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'TEST', font=ttf, fill=500, direction='ltr') + - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - draw.text((0, 0), 'TEST', font=ttf, fill=500, direction='ltr') - @unittest.skipIf(not have_raqm, "Raqm Library is not installed !") - class TestImagecomplextext(PillowTestCase): - def test_complex_text(self): - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + def test_complex_text(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - draw.text((0, 0), 'اهلا عمان', font=ttf, fill=500) + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'اهلا عمان', font=ttf, fill=500) - target = 'Tests/images/test_text.png' - target_img = Image.open(target) + target = 'Tests/images/test_text.png' + target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) + self.assert_image_similar(im, target_img, .5) - def test_y_offset(self): - ttf = ImageFont.truetype("Tests/fonts/NotoNastaliqUrdu-Regular.ttf", FONT_SIZE) + def test_y_offset(self): + ttf = ImageFont.truetype("Tests/fonts/NotoNastaliqUrdu-Regular.ttf", FONT_SIZE) - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - draw.text((0, 0), 'العالم العربي', font=ttf, fill=500) + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'العالم العربي', font=ttf, fill=500) - target = 'Tests/images/test_y_offset.png' - target_img = Image.open(target) + target = 'Tests/images/test_y_offset.png' + target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) + self.assert_image_similar(im, target_img, .5) - def test_complex_unicode_text(self): - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + def test_complex_unicode_text(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - draw.text((0, 0), u'السلام عليكم', font=ttf, fill=500) + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), u'السلام عليكم', font=ttf, fill=500) - target = 'Tests/images/test_complex_unicode_text.png' - target_img = Image.open(target) + target = 'Tests/images/test_complex_unicode_text.png' + target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) + self.assert_image_similar(im, target_img, .5) - def test_text_direction_rtl(self): - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + def test_text_direction_rtl(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - draw.text((0, 0), 'English عربي', font=ttf, fill=500, direction='rtl') + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'English عربي', font=ttf, fill=500, direction='rtl') - target = 'Tests/images/test_direction_rtl.png' - target_img = Image.open(target) + target = 'Tests/images/test_direction_rtl.png' + target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) + self.assert_image_similar(im, target_img, .5) - def test_text_direction_ltr(self): - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + def test_text_direction_ltr(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - draw.text((0, 0), 'سلطنة عمان Oman', font=ttf, fill=500, direction='ltr') + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'سلطنة عمان Oman', font=ttf, fill=500, direction='ltr') - target = 'Tests/images/test_direction_ltr.png' - target_img = Image.open(target) + target = 'Tests/images/test_direction_ltr.png' + target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) + self.assert_image_similar(im, target_img, .5) - def test_text_direction_rtl2(self): - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + def test_text_direction_rtl2(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - draw.text((0, 0), 'Oman سلطنة عمان', font=ttf, fill=500, direction='rtl') + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'Oman سلطنة عمان', font=ttf, fill=500, direction='rtl') - target = 'Tests/images/test_direction_ltr.png' - target_img = Image.open(target) + target = 'Tests/images/test_direction_ltr.png' + target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) + self.assert_image_similar(im, target_img, .5) - def test_ligature_features(self): - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + def test_ligature_features(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - draw.text((0, 0), 'filling', font=ttf, fill=500, features=['-liga']) + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'filling', font=ttf, fill=500, features=['-liga']) - target = 'Tests/images/test_ligature_features.png' - target_img = Image.open(target) + target = 'Tests/images/test_ligature_features.png' + target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) + self.assert_image_similar(im, target_img, .5) - def test_kerning_features(self): - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + def test_kerning_features(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - draw.text((0, 0), 'TeToAV', font=ttf, fill=500, features=['-kern']) + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'TeToAV', font=ttf, fill=500, features=['-kern']) - target = 'Tests/images/test_kerning_features.png' - target_img = Image.open(target) + target = 'Tests/images/test_kerning_features.png' + target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) + self.assert_image_similar(im, target_img, .5) - def test_arabictext_features(self): - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + def test_arabictext_features(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - draw.text((0, 0), 'اللغة العربية', font=ttf, fill=500, features=['-fina','-init','-medi']) + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'اللغة العربية', font=ttf, fill=500, features=['-fina','-init','-medi']) - target = 'Tests/images/test_arabictext_features.png' - target_img = Image.open(target) + target = 'Tests/images/test_arabictext_features.png' + target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) - -except ImportError: - class TestImagecomplextext(PillowTestCase): - def test_skip(self): - self.skipTest("ImportError") -except KeyError: - class TestImagecomplextext(PillowTestCase): - def test_skip(self): - self.skipTest("KeyError") + self.assert_image_similar(im, target_img, .5) if __name__ == '__main__': unittest.main() From b8c04de043ce71fa8859c83b31b9fdda02fe4bc8 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Jun 2017 09:03:23 -0700 Subject: [PATCH 557/632] added layout engine switch --- PIL/ImageFont.py | 40 +++++++++++++++++++++++++++++----------- Tests/test_imagefont.py | 6 +++--- _imagingft.c | 19 +++++++++++++++---- 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 3aad8c076..6b90182ef 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -41,6 +41,9 @@ try: except ImportError: core = _imagingft_not_installed() +LAYOUT_BASIC = 0 +LAYOUT_RAQM = 1 + # FIXME: add support for pilfont2 format (see FontFile.py) # -------------------------------------------------------------------- @@ -115,7 +118,8 @@ class ImageFont(object): class FreeTypeFont(object): "FreeType font wrapper (requires _imagingft service)" - def __init__(self, font=None, size=10, index=0, encoding=""): + def __init__(self, font=None, size=10, index=0, encoding="", + layout_engine=None): # FIXME: use service provider instead self.path = font @@ -123,12 +127,21 @@ class FreeTypeFont(object): self.index = index self.encoding = encoding + if layout_engine not in (LAYOUT_BASIC, LAYOUT_RAQM): + layout_engine = LAYOUT_BASIC + if core.HAVE_RAQM: + layout_engine = LAYOUT_RAQM + if layout_engine == LAYOUT_RAQM and not core.HAVE_RAQM: + layout_engine = LAYOUT_BASIC + + self.layout_engine = layout_engine + if isPath(font): - self.font = core.getfont(font, size, index, encoding) + self.font = core.getfont(font, size, index, encoding, layout_engine=layout_engine) else: self.font_bytes = font.read() self.font = core.getfont( - "", size, index, encoding, self.font_bytes) + "", size, index, encoding, self.font_bytes, layout_engine) def getname(self): return self.font.family, self.font.style @@ -152,7 +165,8 @@ class FreeTypeFont(object): self.font.render(text, im.id, mode == "1", direction, features) return im, offset - def font_variant(self, font=None, size=None, index=None, encoding=None): + def font_variant(self, font=None, size=None, index=None, encoding=None, + layout_engine=None): """ Create a copy of this FreeTypeFont object, using any specified arguments to override the settings. @@ -165,8 +179,9 @@ class 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) + encoding=self.encoding if encoding is None else encoding, + layout_engine=self.layout_engine if layout_engine is None else layout_engine + ) class TransposedFont(object): @@ -212,7 +227,8 @@ def load(filename): return f -def truetype(font=None, size=10, index=0, encoding=""): +def truetype(font=None, size=10, index=0, encoding="", + layout_engine=None): """ Load a TrueType or OpenType font file, and create a font object. This function loads a font object from the given file, and creates @@ -230,12 +246,14 @@ def truetype(font=None, size=10, index=0, encoding=""): Symbol), "ADOB" (Adobe Standard), "ADBE" (Adobe Expert), and "armn" (Apple Roman). See the FreeType documentation for more information. + :param layout_engine: Which layout engine to use, if available: + `ImageFont.LAYOUT_BASIC` or `ImageFont.LAYOUT_RAQM`. :return: A font object. :exception IOError: If the file could not be read. """ try: - return FreeTypeFont(font, size, index, encoding) + return FreeTypeFont(font, size, index, encoding, layout_engine) except IOError: ttf_filename = os.path.basename(font) @@ -266,16 +284,16 @@ def truetype(font=None, size=10, index=0, encoding=""): for walkfilename in walkfilenames: if ext and walkfilename == ttf_filename: fontpath = os.path.join(walkroot, walkfilename) - return FreeTypeFont(fontpath, size, index, encoding) + return FreeTypeFont(fontpath, size, index, encoding, layout_engine) elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename: fontpath = os.path.join(walkroot, walkfilename) if os.path.splitext(fontpath)[1] == '.ttf': - return FreeTypeFont(fontpath, size, index, encoding) + return FreeTypeFont(fontpath, size, index, encoding, layout_engine) if not ext and first_font_with_a_different_extension is None: first_font_with_a_different_extension = fontpath if first_font_with_a_different_extension: return FreeTypeFont(first_font_with_a_different_extension, size, - index, encoding) + index, encoding, layout_engine) raise diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 5207dce38..350b0ad13 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -379,12 +379,12 @@ try: # 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): + def loadable_font(filepath, size, index, encoding, *args, **kwargs): if filepath == path_to_fake: return ImageFont._FreeTypeFont(FONT_PATH, size, index, - encoding) + encoding, *args, **kwargs) return ImageFont._FreeTypeFont(filepath, size, index, - encoding) + encoding, *args, **kwargs) with SimplePatcher(ImageFont, 'FreeTypeFont', loadable_font): font = ImageFont.truetype(fontname) # Make sure it's loaded diff --git a/_imagingft.c b/_imagingft.c index 48f8e8791..cd17758e4 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -45,6 +45,9 @@ #include #endif +#define LAYOUT_FALLBACK 0 +#define LAYOUT_RAQM 1 + typedef struct { int index, x_offset, x_advance, y_offset; @@ -67,6 +70,7 @@ typedef struct { PyObject_HEAD FT_Face face; unsigned char *font_bytes; + int layout_engine; } FontObject; static PyTypeObject Font_Type; @@ -100,11 +104,13 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) char* filename = NULL; int size; int index = 0; + int layout_engine = 0; unsigned char* encoding; unsigned char* font_bytes; int font_bytes_size = 0; static char* kwlist[] = { - "filename", "size", "index", "encoding", "font_bytes", NULL + "filename", "size", "index", "encoding", "font_bytes", + "layout_engine", NULL }; if (!library) { @@ -115,10 +121,10 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) return NULL; } - if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|iss#", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|iss#i", kwlist, Py_FileSystemDefaultEncoding, &filename, &size, &index, &encoding, &font_bytes, - &font_bytes_size)) { + &font_bytes_size, &layout_engine)) { return NULL; } @@ -130,6 +136,7 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) } self->face = NULL; + self->layout_engine = layout_engine; if (filename && font_bytes_size <= 0) { self->font_bytes = NULL; @@ -409,7 +416,11 @@ text_layout(PyObject* string, FontObject* self, const char* dir, { size_t count; #ifdef HAVE_RAQM - count = text_layout_raqm(string, self, dir, features, glyph_info, mask); + if (self->layout_engine == LAYOUT_RAQM) { + count = text_layout_raqm(string, self, dir, features, glyph_info, mask); + } else { + count = text_layout_fallback(string, self, dir, features, glyph_info, mask); + } #else count = text_layout_fallback(string, self, dir, features, glyph_info, mask); #endif From 39327332df7e81fca7c76856a9a6894c50e95143 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Jun 2017 09:31:29 -0700 Subject: [PATCH 558/632] test both layout engines, if available --- Tests/test_imagefont.py | 740 ++++++++++++++++++++-------------------- 1 file changed, 372 insertions(+), 368 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 350b0ad13..d87362318 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -1,7 +1,6 @@ from helper import unittest, PillowTestCase -from PIL import Image -from PIL import ImageDraw +from PIL import Image, ImageDraw, ImageFont, features from io import BytesIO import os import sys @@ -12,466 +11,471 @@ FONT_SIZE = 20 TEST_TEXT = "hey you\nyou are awesome\nthis looks awkward" +HAS_FREETYPE = features.check('freetype2') +HAS_RAQM = features.check('raqm') -try: - from PIL import ImageFont - ImageFont.core.getfont # check if freetype is available - class SimplePatcher(object): - def __init__(self, parent_obj, attr_name, value): - self._parent_obj = parent_obj - self._attr_name = attr_name - self._saved = None +class SimplePatcher(object): + 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 - 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) - 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) +@unittest.skipUnless(HAS_FREETYPE, "ImageFont not Available") +class TestImageFont(PillowTestCase): + LAYOUT_ENGINE = ImageFont.LAYOUT_BASIC - class TestImageFont(PillowTestCase): + def get_font(self): + return ImageFont.truetype(FONT_PATH, FONT_SIZE, + layout_engine=self.LAYOUT_ENGINE) + + def test_sanity(self): + self.assertRegexpMatches( + ImageFont.core.freetype2_version, r"\d+\.\d+\.\d+$") - def test_sanity(self): - self.assertRegexpMatches( - ImageFont.core.freetype2_version, r"\d+\.\d+\.\d+$") + def test_font_properties(self): + ttf = self.get_font() + self.assertEqual(ttf.path, FONT_PATH) + self.assertEqual(ttf.size, FONT_SIZE) - 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() - 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) - 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) - 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): + self.get_font() + self._render(FONT_PATH) + self._clean() - def test_font_with_name(self): - ImageFont.truetype(FONT_PATH, FONT_SIZE) - self._render(FONT_PATH) - self._clean() + def _font_as_bytes(self): + with open(FONT_PATH, 'rb') as f: + font_bytes = BytesIO(f.read()) + return font_bytes - def _font_as_bytes(self): - with open(FONT_PATH, 'rb') as f: - font_bytes = BytesIO(f.read()) - return font_bytes + def test_font_with_filelike(self): + ImageFont.truetype(self._font_as_bytes(), FONT_SIZE, + layout_engine=self.LAYOUT_ENGINE) + self._render(self._font_as_bytes()) + # Usage note: making two fonts from the same buffer fails. + # shared_bytes = self._font_as_bytes() + # self._render(shared_bytes) + # self.assertRaises(Exception, lambda: _render(shared_bytes)) + self._clean() - def test_font_with_filelike(self): - ImageFont.truetype(self._font_as_bytes(), FONT_SIZE) - self._render(self._font_as_bytes()) - # Usage note: making two fonts from the same buffer fails. - # shared_bytes = self._font_as_bytes() - # self._render(shared_bytes) - # self.assertRaises(Exception, lambda: _render(shared_bytes)) - self._clean() + def test_font_with_open_file(self): + with open(FONT_PATH, 'rb') as f: + self._render(f) + self._clean() - def test_font_with_open_file(self): - with open(FONT_PATH, 'rb') as f: - self._render(f) - self._clean() + def _render(self, font): + txt = "Hello World!" + ttf = ImageFont.truetype(font, FONT_SIZE, + layout_engine=self.LAYOUT_ENGINE) + ttf.getsize(txt) - def _render(self, font): - txt = "Hello World!" - ttf = ImageFont.truetype(font, FONT_SIZE) - ttf.getsize(txt) + img = Image.new("RGB", (256, 64), "white") + d = ImageDraw.Draw(img) + d.text((10, 10), txt, font=ttf, fill='black') - img = Image.new("RGB", (256, 64), "white") - d = ImageDraw.Draw(img) - d.text((10, 10), txt, font=ttf, fill='black') + img.save('font.png') + return img - img.save('font.png') - return img + def _clean(self): + os.unlink('font.png') - def _clean(self): - os.unlink('font.png') + def test_render_equal(self): + img_path = self._render(FONT_PATH) + with open(FONT_PATH, 'rb') as f: + font_filelike = BytesIO(f.read()) + img_filelike = self._render(font_filelike) - def test_render_equal(self): - img_path = self._render(FONT_PATH) - with open(FONT_PATH, 'rb') as f: - font_filelike = BytesIO(f.read()) - img_filelike = self._render(font_filelike) + self.assert_image_equal(img_path, img_filelike) + self._clean() - self.assert_image_equal(img_path, img_filelike) - self._clean() + def test_textsize_equal(self): + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + ttf = self.get_font() - def test_textsize_equal(self): + txt = "Hello World!" + size = draw.textsize(txt, ttf) + draw.text((10, 10), txt, font=ttf) + draw.rectangle((10, 10, 10 + size[0], 10 + size[1])) + del draw + + target = 'Tests/images/rectangle_surrounding_text.png' + target_img = Image.open(target) + + # Epsilon ~.5 fails with FreeType 2.7 + self.assert_image_similar(im, target_img, 2.5) + + def test_render_multiline(self): + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + ttf = self.get_font() + line_spacing = draw.textsize('A', font=ttf)[1] + 4 + lines = TEST_TEXT.split("\n") + y = 0 + for line in lines: + draw.text((0, y), line, font=ttf) + y += line_spacing + + target = 'Tests/images/multiline_text.png' + target_img = Image.open(target) + + # some versions of freetype have different horizontal spacing. + # setting a tight epsilon, I'm showing the original test failure + # at epsilon = ~38. + self.assert_image_similar(im, target_img, 6.2) + + def test_render_multiline_text(self): + ttf = self.get_font() + + # Test that text() correctly connects to multiline_text() + # and that align defaults to left + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), TEST_TEXT, font=ttf) + + target = 'Tests/images/multiline_text.png' + target_img = Image.open(target) + + # Epsilon ~.5 fails with FreeType 2.7 + self.assert_image_similar(im, target_img, 6.2) + + # Test that text() can pass on additional arguments + # to multiline_text() + draw.text((0, 0), TEST_TEXT, fill=None, font=ttf, anchor=None, + spacing=4, align="left") + draw.text((0, 0), TEST_TEXT, None, ttf, None, 4, "left") + del draw + + # Test align center and right + for align, ext in {"center": "_center", + "right": "_right"}.items(): im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - - txt = "Hello World!" - size = draw.textsize(txt, ttf) - draw.text((10, 10), txt, font=ttf) - draw.rectangle((10, 10, 10 + size[0], 10 + size[1])) + draw.multiline_text((0, 0), TEST_TEXT, font=ttf, align=align) del draw - target = 'Tests/images/rectangle_surrounding_text.png' - target_img = Image.open(target) - - # Epsilon ~.5 fails with FreeType 2.7 - self.assert_image_similar(im, target_img, 2.5) - - def test_render_multiline(self): - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - line_spacing = draw.textsize('A', font=ttf)[1] + 4 - lines = TEST_TEXT.split("\n") - y = 0 - for line in lines: - draw.text((0, y), line, font=ttf) - y += line_spacing - - target = 'Tests/images/multiline_text.png' - target_img = Image.open(target) - - # some versions of freetype have different horizontal spacing. - # setting a tight epsilon, I'm showing the original test failure - # at epsilon = ~38. - self.assert_image_similar(im, target_img, 6.2) - - def test_render_multiline_text(self): - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - - # Test that text() correctly connects to multiline_text() - # and that align defaults to left - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - draw.text((0, 0), TEST_TEXT, font=ttf) - - target = 'Tests/images/multiline_text.png' + target = 'Tests/images/multiline_text'+ext+'.png' target_img = Image.open(target) # Epsilon ~.5 fails with FreeType 2.7 self.assert_image_similar(im, target_img, 6.2) - # Test that text() can pass on additional arguments - # to multiline_text() - draw.text((0, 0), TEST_TEXT, fill=None, font=ttf, anchor=None, - spacing=4, align="left") - draw.text((0, 0), TEST_TEXT, None, ttf, None, 4, "left") - del draw + def test_unknown_align(self): + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + ttf = self.get_font() - # Test align center and right - for align, ext in {"center": "_center", - "right": "_right"}.items(): - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - draw.multiline_text((0, 0), TEST_TEXT, font=ttf, align=align) - del draw + # Act/Assert + self.assertRaises(AssertionError, + lambda: draw.multiline_text((0, 0), TEST_TEXT, + font=ttf, + align="unknown")) - target = 'Tests/images/multiline_text'+ext+'.png' - target_img = Image.open(target) + def test_multiline_size(self): + ttf = self.get_font() + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) - # Epsilon ~.5 fails with FreeType 2.7 - self.assert_image_similar(im, target_img, 6.2) + # Test that textsize() correctly connects to multiline_textsize() + self.assertEqual(draw.textsize(TEST_TEXT, font=ttf), + draw.multiline_textsize(TEST_TEXT, font=ttf)) - def test_unknown_align(self): - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + # Test that textsize() can pass on additional arguments + # to multiline_textsize() + draw.textsize(TEST_TEXT, font=ttf, spacing=4) + draw.textsize(TEST_TEXT, ttf, 4) + del draw - # Act/Assert - self.assertRaises(AssertionError, - lambda: draw.multiline_text((0, 0), TEST_TEXT, - font=ttf, - align="unknown")) + def test_multiline_width(self): + ttf = self.get_font() + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) - def test_multiline_size(self): - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) + self.assertEqual(draw.textsize("longest line", font=ttf)[0], + draw.multiline_textsize("longest line\nline", + font=ttf)[0]) + del draw - # Test that textsize() correctly connects to multiline_textsize() - self.assertEqual(draw.textsize(TEST_TEXT, font=ttf), - draw.multiline_textsize(TEST_TEXT, font=ttf)) + def test_multiline_spacing(self): + ttf = self.get_font() - # Test that textsize() can pass on additional arguments - # to multiline_textsize() - draw.textsize(TEST_TEXT, font=ttf, spacing=4) - draw.textsize(TEST_TEXT, ttf, 4) - del draw + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.multiline_text((0, 0), TEST_TEXT, font=ttf, spacing=10) + del draw - def test_multiline_width(self): - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) + target = 'Tests/images/multiline_text_spacing.png' + target_img = Image.open(target) - self.assertEqual(draw.textsize("longest line", font=ttf)[0], - draw.multiline_textsize("longest line\nline", - font=ttf)[0]) - del draw + # Epsilon ~.5 fails with FreeType 2.7 + self.assert_image_similar(im, target_img, 6.2) - def test_multiline_spacing(self): - ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + def test_rotated_transposed_font(self): + img_grey = Image.new("L", (100, 100)) + draw = ImageDraw.Draw(img_grey) + word = "testing" + font = self.get_font() - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - draw.multiline_text((0, 0), TEST_TEXT, font=ttf, spacing=10) - del draw + orientation = Image.ROTATE_90 + transposed_font = ImageFont.TransposedFont( + font, orientation=orientation) - target = 'Tests/images/multiline_text_spacing.png' - target_img = Image.open(target) + # Original font + draw.font = font + box_size_a = draw.textsize(word) - # Epsilon ~.5 fails with FreeType 2.7 - self.assert_image_similar(im, target_img, 6.2) + # Rotated font + draw.font = transposed_font + box_size_b = draw.textsize(word) + del draw - def test_rotated_transposed_font(self): - img_grey = Image.new("L", (100, 100)) - draw = ImageDraw.Draw(img_grey) - word = "testing" - font = ImageFont.truetype(FONT_PATH, FONT_SIZE) + # Check (w,h) of box a is (h,w) of box b + self.assertEqual(box_size_a[0], box_size_b[1]) + self.assertEqual(box_size_a[1], box_size_b[0]) - orientation = Image.ROTATE_90 - transposed_font = ImageFont.TransposedFont( - font, orientation=orientation) + def test_unrotated_transposed_font(self): + img_grey = Image.new("L", (100, 100)) + draw = ImageDraw.Draw(img_grey) + word = "testing" + font = self.get_font() - # Original font - draw.font = font - box_size_a = draw.textsize(word) + orientation = None + transposed_font = ImageFont.TransposedFont( + font, orientation=orientation) - # Rotated font - draw.font = transposed_font - box_size_b = draw.textsize(word) - del draw + # Original font + draw.font = font + box_size_a = draw.textsize(word) - # Check (w,h) of box a is (h,w) of box b - self.assertEqual(box_size_a[0], box_size_b[1]) - self.assertEqual(box_size_a[1], box_size_b[0]) + # Rotated font + draw.font = transposed_font + box_size_b = draw.textsize(word) + del draw - def test_unrotated_transposed_font(self): - img_grey = Image.new("L", (100, 100)) - draw = ImageDraw.Draw(img_grey) - word = "testing" - font = ImageFont.truetype(FONT_PATH, FONT_SIZE) + # Check boxes a and b are same size + self.assertEqual(box_size_a, box_size_b) - orientation = None - transposed_font = ImageFont.TransposedFont( - font, orientation=orientation) + def test_rotated_transposed_font_get_mask(self): + # Arrange + text = "mask this" + font = self.get_font() + orientation = Image.ROTATE_90 + transposed_font = ImageFont.TransposedFont( + font, orientation=orientation) - # Original font - draw.font = font - box_size_a = draw.textsize(word) + # Act + mask = transposed_font.getmask(text) - # Rotated font - draw.font = transposed_font - box_size_b = draw.textsize(word) - del draw + # Assert + self.assertEqual(mask.size, (13, 108)) - # Check boxes a and b are same size - self.assertEqual(box_size_a, box_size_b) + def test_unrotated_transposed_font_get_mask(self): + # Arrange + text = "mask this" + font = self.get_font() + orientation = None + transposed_font = ImageFont.TransposedFont( + font, orientation=orientation) - def test_rotated_transposed_font_get_mask(self): - # Arrange - text = "mask this" - font = ImageFont.truetype(FONT_PATH, FONT_SIZE) - orientation = Image.ROTATE_90 - transposed_font = ImageFont.TransposedFont( - font, orientation=orientation) + # Act + mask = transposed_font.getmask(text) - # Act - mask = transposed_font.getmask(text) + # Assert + self.assertEqual(mask.size, (108, 13)) - # Assert - self.assertEqual(mask.size, (13, 108)) + def test_free_type_font_get_name(self): + # Arrange + font = self.get_font() - def test_unrotated_transposed_font_get_mask(self): - # Arrange - text = "mask this" - font = ImageFont.truetype(FONT_PATH, FONT_SIZE) - orientation = None - transposed_font = ImageFont.TransposedFont( - font, orientation=orientation) + # Act + name = font.getname() - # Act - mask = transposed_font.getmask(text) + # Assert + self.assertEqual(('FreeMono', 'Regular'), name) - # Assert - self.assertEqual(mask.size, (108, 13)) + def test_free_type_font_get_metrics(self): + # Arrange + font = self.get_font() - def test_free_type_font_get_name(self): - # Arrange - font = ImageFont.truetype(FONT_PATH, FONT_SIZE) + # Act + ascent, descent = font.getmetrics() - # Act - name = font.getname() + # Assert + self.assertIsInstance(ascent, int) + self.assertIsInstance(descent, int) + self.assertEqual((ascent, descent), (16, 4)) # too exact check? - # Assert - self.assertEqual(('FreeMono', 'Regular'), name) + def test_free_type_font_get_offset(self): + # Arrange + font = self.get_font() + text = "offset this" - def test_free_type_font_get_metrics(self): - # Arrange - font = ImageFont.truetype(FONT_PATH, FONT_SIZE) + # Act + offset = font.getoffset(text) - # Act - ascent, descent = font.getmetrics() + # Assert + self.assertEqual(offset, (0, 3)) - # Assert - self.assertIsInstance(ascent, int) - self.assertIsInstance(descent, int) - self.assertEqual((ascent, descent), (16, 4)) # too exact check? + def test_free_type_font_get_mask(self): + # Arrange + font = self.get_font() + text = "mask this" - def test_free_type_font_get_offset(self): - # Arrange - font = ImageFont.truetype(FONT_PATH, FONT_SIZE) - text = "offset this" + # Act + mask = font.getmask(text) - # Act - offset = font.getoffset(text) + # Assert + self.assertEqual(mask.size, (108, 13)) - # Assert - self.assertEqual(offset, (0, 3)) + def test_load_path_not_found(self): + # Arrange + filename = "somefilenamethatdoesntexist.ttf" - def test_free_type_font_get_mask(self): - # Arrange - font = ImageFont.truetype(FONT_PATH, FONT_SIZE) - text = "mask this" + # Act/Assert + self.assertRaises(IOError, lambda: ImageFont.load_path(filename)) - # Act - mask = font.getmask(text) + def test_default_font(self): + # Arrange + txt = 'This is a "better than nothing" default font.' + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) - # Assert - self.assertEqual(mask.size, (108, 13)) + target = 'Tests/images/default_font.png' + target_img = Image.open(target) - def test_load_path_not_found(self): - # Arrange - filename = "somefilenamethatdoesntexist.ttf" + # Act + default_font = ImageFont.load_default() + draw.text((10, 10), txt, font=default_font) + del draw - # Act/Assert - self.assertRaises(IOError, lambda: ImageFont.load_path(filename)) + # Assert + self.assert_image_equal(im, target_img) - def test_default_font(self): - # Arrange - txt = 'This is a "better than nothing" default font.' - im = Image.new(mode='RGB', size=(300, 100)) - draw = ImageDraw.Draw(im) - - target = 'Tests/images/default_font.png' - target_img = Image.open(target) - - # Act - default_font = ImageFont.load_default() - draw.text((10, 10), txt, font=default_font) - del draw - - # Assert - 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 - free_type_font = copy.deepcopy(ImageFont.FreeTypeFont) - with SimplePatcher(ImageFont, '_FreeTypeFont', free_type_font): - def loadable_font(filepath, size, index, encoding, *args, **kwargs): - if filepath == path_to_fake: - return ImageFont._FreeTypeFont(FONT_PATH, size, index, - encoding, *args, **kwargs) - return ImageFont._FreeTypeFont(filepath, size, index, + def _test_fake_loading_font(self, path_to_fake, fontname): + # Make a copy of FreeTypeFont so we can patch the original + free_type_font = copy.deepcopy(ImageFont.FreeTypeFont) + with SimplePatcher(ImageFont, '_FreeTypeFont', free_type_font): + def loadable_font(filepath, size, index, encoding, *args, **kwargs): + if filepath == path_to_fake: + return ImageFont._FreeTypeFont(FONT_PATH, size, index, encoding, *args, **kwargs) - with SimplePatcher(ImageFont, 'FreeTypeFont', loadable_font): - font = ImageFont.truetype(fontname) - # Make sure it's loaded - name = font.getname() - self.assertEqual(('FreeMono', 'Regular'), name) + return ImageFont._FreeTypeFont(filepath, size, index, + encoding, *args, **kwargs) + with SimplePatcher(ImageFont, 'FreeTypeFont', loadable_font): + font = ImageFont.truetype(fontname) + # Make sure it's loaded + 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 - 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 == 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( - font_directory+'/Arial.ttf', 'Arial.ttf') - self._test_fake_loading_font( - font_directory+'/Arial.ttf', 'Arial') - - # 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_macos_font(self): - # Like the linux test, more cover hitting code rather than testing - # correctness. - font_directory = '/System/Library/Fonts' - with SimplePatcher(sys, 'platform', 'darwin'): + @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 + 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 == font_directory: - return [(path, [], - ['Arial.ttf', 'Single.otf', - 'Duplicate.otf', 'Duplicate.ttf'], )] + 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( font_directory+'/Arial.ttf', 'Arial.ttf') self._test_fake_loading_font( font_directory+'/Arial.ttf', 'Arial') + + # 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') - def test_imagefont_getters(self): - # Arrange - t = ImageFont.truetype(FONT_PATH, FONT_SIZE) + @unittest.skipIf(sys.platform.startswith('win32'), + "requires Unix or MacOS") + def test_find_macos_font(self): + # 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 == 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( + 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') - # Act / Assert - self.assertEqual(t.getmetrics(), (16, 4)) - self.assertEqual(t.font.ascent, 16) - self.assertEqual(t.font.descent, 4) - self.assertEqual(t.font.height, 20) - self.assertEqual(t.font.x_ppem, 20) - self.assertEqual(t.font.y_ppem, 20) - self.assertEqual(t.font.glyphs, 4177) - self.assertEqual(t.getsize('A'), (12, 16)) - self.assertEqual(t.getsize('AB'), (24, 16)) - self.assertEqual(t.getsize('M'), (12, 16)) - self.assertEqual(t.getsize('y'), (12, 20)) - self.assertEqual(t.getsize('a'), (12, 16)) + def test_imagefont_getters(self): + # Arrange + t = self.get_font() + + # Act / Assert + self.assertEqual(t.getmetrics(), (16, 4)) + self.assertEqual(t.font.ascent, 16) + self.assertEqual(t.font.descent, 4) + self.assertEqual(t.font.height, 20) + self.assertEqual(t.font.x_ppem, 20) + self.assertEqual(t.font.y_ppem, 20) + self.assertEqual(t.font.glyphs, 4177) + self.assertEqual(t.getsize('A'), (12, 16)) + self.assertEqual(t.getsize('AB'), (24, 16)) + self.assertEqual(t.getsize('M'), (12, 16)) + self.assertEqual(t.getsize('y'), (12, 20)) + self.assertEqual(t.getsize('a'), (12, 16)) -except ImportError: - class TestImageFont(PillowTestCase): - def test_skip(self): - self.skipTest("ImportError") - +@unittest.skipUnless(HAS_RAQM, "Raqm not Available") +class TestImageFont_RaqmLayout(TestImageFont): + LAYOUT_ENGINE = ImageFont.LAYOUT_RAQM if __name__ == '__main__': unittest.main() From 9bdda3d5526fbda334a9828b32bde455a56388cf Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Jun 2017 13:22:53 -0700 Subject: [PATCH 559/632] update install script --- depends/install_raqm.sh | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/depends/install_raqm.sh b/depends/install_raqm.sh index 31950aa4a..c5b47dfc2 100755 --- a/depends/install_raqm.sh +++ b/depends/install_raqm.sh @@ -2,16 +2,11 @@ # install raqm -if [ ! -f raqm-0.2.0.tar.gz ]; then - wget -O 'raqm-0.2.0.tar.gz' 'https://github.com/HOST-Oman/libraqm/releases/download/v0.2.0/raqm-0.2.0.tar.gz?raw=true' +archive=raqm-0.2.0 -fi +./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz -rm -r raqm-0.2.0 -tar -xvzf raqm-0.2.0.tar.gz - - -pushd raqm-0.2.0 +pushd $archive ./configure --prefix=/usr && make -j4 && sudo make -j4 install From 53e247cfc4303e1f77fb5ab861cc9fd68234420b Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Tue, 13 Jun 2017 20:40:16 +0000 Subject: [PATCH 560/632] test tweak for ubuntu 16.04 --- Tests/test_imagefontctl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index d8c4df888..c3b60fcd6 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -39,7 +39,7 @@ class TestImagecomplextext(PillowTestCase): target = 'Tests/images/test_y_offset.png' target_img = Image.open(target) - self.assert_image_similar(im, target_img, .5) + self.assert_image_similar(im, target_img, 1.5) def test_complex_unicode_text(self): ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) From 183e0ec21d30e72b46ce88705efeff2fe78e41e5 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Jun 2017 14:43:13 -0700 Subject: [PATCH 561/632] Added Noto font license [ci skip] --- Tests/fonts/LICENSE.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 Tests/fonts/LICENSE.txt diff --git a/Tests/fonts/LICENSE.txt b/Tests/fonts/LICENSE.txt new file mode 100644 index 000000000..223c2aecf --- /dev/null +++ b/Tests/fonts/LICENSE.txt @@ -0,0 +1,6 @@ + +NotoNastaliqUrdu-Regular.ttf: + +(from https://github.com/googlei18n/noto-fonts) + +All Noto fonts are published under the SIL Open Font License (OFL) v1.1 (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL), which allows you to copy, modify, and redistribute them if you need to. From 8d9f6029e15349f754a28e75c522d15b2f6ba669 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 21 Jun 2017 11:23:41 -0700 Subject: [PATCH 562/632] remove non-tempfile usage from tests --- Tests/test_imagefont.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index d87362318..3475df0f4 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -71,7 +71,6 @@ class TestImageFont(PillowTestCase): def test_font_with_name(self): self.get_font() self._render(FONT_PATH) - self._clean() def _font_as_bytes(self): with open(FONT_PATH, 'rb') as f: @@ -86,12 +85,10 @@ class TestImageFont(PillowTestCase): # shared_bytes = self._font_as_bytes() # self._render(shared_bytes) # self.assertRaises(Exception, lambda: _render(shared_bytes)) - self._clean() def test_font_with_open_file(self): with open(FONT_PATH, 'rb') as f: self._render(f) - self._clean() def _render(self, font): txt = "Hello World!" @@ -103,12 +100,8 @@ class TestImageFont(PillowTestCase): d = ImageDraw.Draw(img) d.text((10, 10), txt, font=ttf, fill='black') - img.save('font.png') return img - def _clean(self): - os.unlink('font.png') - def test_render_equal(self): img_path = self._render(FONT_PATH) with open(FONT_PATH, 'rb') as f: @@ -116,7 +109,6 @@ class TestImageFont(PillowTestCase): img_filelike = self._render(font_filelike) self.assert_image_equal(img_path, img_filelike) - self._clean() def test_textsize_equal(self): im = Image.new(mode='RGB', size=(300, 100)) From db2359a30ffd2e3a2dda7a15d0e957258bca19e1 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 21 Jun 2017 11:27:30 -0700 Subject: [PATCH 563/632] y offset on trusty/x86 is 1.63 --- Tests/test_imagefontctl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index c3b60fcd6..b31e3e4a0 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -39,7 +39,7 @@ class TestImagecomplextext(PillowTestCase): target = 'Tests/images/test_y_offset.png' target_img = Image.open(target) - self.assert_image_similar(im, target_img, 1.5) + self.assert_image_similar(im, target_img, 1.7) def test_complex_unicode_text(self): ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) From bcd1fb7908f5c254abd7f0059fe67607fc359b5f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 22 Jun 2017 20:31:14 +1000 Subject: [PATCH 564/632] Added dBATCH parameter to ghostscript command --- PIL/EpsImagePlugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/PIL/EpsImagePlugin.py b/PIL/EpsImagePlugin.py index cce70880a..6f22308de 100644 --- a/PIL/EpsImagePlugin.py +++ b/PIL/EpsImagePlugin.py @@ -121,6 +121,7 @@ def Ghostscript(tile, size, fp, scale=1): "-q", # quiet mode "-g%dx%d" % size, # set output geometry (pixels) "-r%fx%f" % res, # set input DPI (dots per inch) + "-dBATCH", # exit after processing "-dNOPAUSE", # don't pause between pages, "-dSAFER", # safe mode "-sDEVICE=ppmraw", # ppm driver From f737f00637e77b11901d309a921c07b7b541064d Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 22 Jun 2017 13:30:26 +0000 Subject: [PATCH 565/632] Freebsd's bash is elsewhere, wget necessary, setuptools not found --- depends/download-and-extract.sh | 2 +- depends/freebsd_10.sh | 4 ++-- depends/install_raqm.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/depends/download-and-extract.sh b/depends/download-and-extract.sh index 9f82877db..7cc905e85 100755 --- a/depends/download-and-extract.sh +++ b/depends/download-and-extract.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # Usage: ./download-and-extract.sh something.tar.gz https://example.com/something.tar.gz archive=$1 diff --git a/depends/freebsd_10.sh b/depends/freebsd_10.sh index 205b6660e..b9b5a81e2 100755 --- a/depends/freebsd_10.sh +++ b/depends/freebsd_10.sh @@ -4,10 +4,10 @@ # Installs all of the dependencies for Pillow for Freebsd 10.x # for both system Pythons 2.7 and 3.4 # -sudo pkg install python2 python3 py27-pip py27-virtualenv py27-setuptools27 +sudo pkg install python2 python3 py27-pip py27-virtualenv wget # Openjpeg fails badly using the openjpeg package. # I can't find a python3.4 version of tkinter sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 harfbuzz fribidi py27-tkinter -./install_raqm.sh \ No newline at end of file +./install_raqm.sh diff --git a/depends/install_raqm.sh b/depends/install_raqm.sh index c5b47dfc2..e1df5f616 100755 --- a/depends/install_raqm.sh +++ b/depends/install_raqm.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # install raqm From d417ba5ca73062ace0185bf7f7e20e57e86ac292 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 22 Jun 2017 08:00:09 -0700 Subject: [PATCH 566/632] remove ppa --- .travis/install.sh | 3 +-- depends/ubuntu_14.04.sh | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.travis/install.sh b/.travis/install.sh index 9408d1127..694a460e9 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -2,11 +2,10 @@ set -e -sudo add-apt-repository -y ppa:as-bahanta/raqm sudo apt-get update sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-tk\ python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake imagemagick\ - libharfbuzz-dev libfribidi-dev libraqm-dev + libharfbuzz-dev libfribidi-dev pip install cffi pip install nose diff --git a/depends/ubuntu_14.04.sh b/depends/ubuntu_14.04.sh index 997bb09cf..f7d28fba7 100755 --- a/depends/ubuntu_14.04.sh +++ b/depends/ubuntu_14.04.sh @@ -4,13 +4,13 @@ # Installs all of the dependencies for Pillow for Ubuntu 14.04 # for both system Pythons 2.7 and 3.4 # -sudo add-apt-repository -y ppa:as-bahanta/raqm sudo apt-get update sudo apt-get -y install python-dev python-setuptools \ python3-dev python-virtualenv cmake sudo apt-get -y install libtiff5-dev libjpeg8-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev \ - python-tk python3-tk libharfbuzz-dev libfribidi-dev libraqm-dev + python-tk python3-tk libharfbuzz-dev libfribidi-dev ./install_openjpeg.sh -./install_imagequant.sh \ No newline at end of file +./install_imagequant.sh +./install_raqm.sh From 91215c384d8e179052554b837a7c66bce1209cc5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 24 Jun 2017 15:04:37 +1000 Subject: [PATCH 567/632] Fixed typo [ci skip] --- docs/reference/ImageDraw.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index b59a21b9b..68c450e34 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -4,7 +4,7 @@ :py:mod:`ImageDraw` Module ========================== -The :py:mod:`ImageDraw` module provide simple 2D graphics for +The :py:mod:`ImageDraw` module provides simple 2D graphics for :py:class:`~PIL.Image.Image` objects. You can use this module to create new images, annotate or retouch existing images, and to generate graphics on the fly for web use. From 3bfa35b3774bf28e8350f8695c8669f8d0465a20 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 25 Jun 2017 13:16:42 +1000 Subject: [PATCH 568/632] Removed reference to Landscape badge [ci skip] --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 14092ef7c..62cb4bb3f 100644 --- a/README.rst +++ b/README.rst @@ -14,7 +14,7 @@ Pillow is the friendly PIL fork by `Alex Clark and Contributors Date: Tue, 27 Jun 2017 21:20:46 +0100 Subject: [PATCH 569/632] fixing the png leak test memory calculations --- Tests/test_file_png.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 8e9bdae3b..7dab44333 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -8,8 +8,8 @@ import sys codecs = dir(Image.core) # For Truncated phng memory leak -MEM_LIMIT = 1 # max increase in MB -ITERATIONS = 100 +MEM_LIMIT = 2 # max increase in MB +ITERATIONS = 100 # Leak is 56k/iteration, this will leak 5.6megs # sample png stream @@ -542,13 +542,24 @@ class TestTruncatedPngPLeaks(PillowTestCase): def _get_mem_usage(self): from resource import getpagesize, getrusage, RUSAGE_SELF mem = getrusage(RUSAGE_SELF).ru_maxrss - return mem * getpagesize() / 1024 / 1024 + if sys.platform == 'darwin': + # man 2 getrusage: + # ru_maxrss the maximum resident set size utilized (in bytes). + return mem / 1024 / 1024 # megs + else: + # linux + # man 2 getrusage + # ru_maxrss (since Linux 2.6.32) + # This is the maximum resident set size used (in kilobytes). + return mem / 1024 # megs def test_leak_load(self): with open('Tests/images/hopper.png', 'rb') as f: DATA = BytesIO(f.read(16 * 1024)) ImageFile.LOAD_TRUNCATED_IMAGES = True + with Image.open(DATA) as im: + im.load() start_mem = self._get_mem_usage() try: for _ in range(ITERATIONS): From 633d751bdc5e3389fdcb152b0cb83e9a65b28ef3 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 27 Jun 2017 22:00:56 +0100 Subject: [PATCH 570/632] Update Changes.rst [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index ca4d4ef4a..5f2b31a32 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -7,7 +7,7 @@ Changelog (Pillow) - CI: Change the owner of the TRAVIS_BUILD_DIR, fixing broken docker runs #2587 [wiredfool] -- Fix truncated PNG loading for some images, Fix memory leak on truncated PNG images. #2541 +- Fix truncated PNG loading for some images, Fix memory leak on truncated PNG images. #2541, #2598 [homm] - Add decompression bomb check to Image.crop #2410 From 69768c514b1a404e62c3eabd90dc5c56b7fa538d Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 20 Jun 2017 09:54:59 -0700 Subject: [PATCH 571/632] Added inplace alpha composite --- PIL/Image.py | 28 ++++++++++++++++++++++++++++ Tests/test_image.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/PIL/Image.py b/PIL/Image.py index 9936aad46..27953252a 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1373,6 +1373,34 @@ class Image(object): else: self.im.paste(im, box) + def alpha_composite(self, im, box=None): + """ 'In-place' analog of Image.alpha_composite + + :param im: image to composite over this one + :param box: Optional 2 or 4 tuple. If a 2 tuple, the upper + left corner. If 4 tuple, (x0,y0,x1,y1) + + Note: Not currently implemented in-place. + """ + if box is None: + box = (0, 0, im.width, im.height) + overlay = im + if self.size == im.size: + src = self + else: + src = self.crop(box) + else: + if len(box) == 2: + # upper left corner given; get size from overlay image + size = im.size + box += (box[0]+size[0], box[1]+size[1]) + + src = self.crop(box) + overlay = im.crop((0, 0, box[2]-box[0], box[3]-box[1])) + + result = alpha_composite(src, overlay) + self.paste(result, box) + def point(self, lut, mode=None): """ Maps this image through a lookup table or function. diff --git a/Tests/test_image.py b/Tests/test_image.py index ea813cd84..05fb4dfe9 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -202,6 +202,37 @@ class TestImage(PillowTestCase): img_colors = sorted(img.getcolors()) self.assertEqual(img_colors, expected_colors) + def test_alpha_inplace(self): + src = Image.new('RGBA', (128,128), 'blue') + + over = Image.new('RGBA', (128,128), 'red') + mask = hopper('L') + over.putalpha(mask) + + target = Image.alpha_composite(src, over) + + # basic + full = src.copy() + full.alpha_composite(over) + self.assert_image_equal(full, target) + + # with offset down to right + offset = src.copy() + offset.alpha_composite(over, (64, 64)) + self.assert_image_equal(offset.crop((64, 64, 127, 127)), + target.crop((0, 0, 63, 63))) + self.assertEqual(offset.size, (128, 128)) + + # offset and crop + box = src.copy() + box.alpha_composite(over, (64, 64, 96, 96)) + self.assert_image_equal(box.crop((64, 64, 96, 96)), + target.crop((0, 0, 32, 32))) + self.assert_image_equal(box.crop((96, 96, 128, 128)), + src.crop((0, 0, 32, 32))) + self.assertEqual(box.size, (128, 128)) + + def test_registered_extensions_uninitialized(self): # Arrange Image._initialized = 0 From 1d33dfbced183a658caf3857c4b395a07d9b876a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 26 Jun 2017 20:04:44 +0100 Subject: [PATCH 572/632] Added source point parameter for Image.Image.alpha_composite --- PIL/Image.py | 25 +++++++++++++++++++------ Tests/test_image.py | 9 ++++++++- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 27953252a..4f297db8a 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1373,16 +1373,27 @@ class Image(object): else: self.im.paste(im, box) - def alpha_composite(self, im, box=None): + def alpha_composite(self, im, box=None, source=(0,0)): """ 'In-place' analog of Image.alpha_composite :param im: image to composite over this one - :param box: Optional 2 or 4 tuple. If a 2 tuple, the upper - left corner. If 4 tuple, (x0,y0,x1,y1) - + :param box: Optional 2 or 4 tuple specificing the bounds in + the destination image. If a 2 tuple, the upper left + corner. If 4 tuple, (x0,y0,x1,y1) + :param source: Optional 2 tuple, (x0, y0) for the upper left + corner in the source image. + Note: Not currently implemented in-place. """ - if box is None: + + if not isinstance(source, tuple): + raise ValueError("Source must be a tuple") + if not len(source) == 2: + raise ValueError("Source must be a 2-tuple") + if min(source) < 0: + raise ValueError("Source must be non-negative") + + if box is None and source == (0, 0): box = (0, 0, im.width, im.height) overlay = im if self.size == im.size: @@ -1396,7 +1407,9 @@ class Image(object): box += (box[0]+size[0], box[1]+size[1]) src = self.crop(box) - overlay = im.crop((0, 0, box[2]-box[0], box[3]-box[1])) + overlay = im.crop((source[0], source[1], + source[0] + box[2] - box[0], + source[1] + box[3] - box[1])) result = alpha_composite(src, overlay) self.paste(result, box) diff --git a/Tests/test_image.py b/Tests/test_image.py index 05fb4dfe9..4361557f0 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -231,7 +231,14 @@ class TestImage(PillowTestCase): self.assert_image_equal(box.crop((96, 96, 128, 128)), src.crop((0, 0, 32, 32))) self.assertEqual(box.size, (128, 128)) - + + # source point + source = src.copy() + source.alpha_composite(over, (32, 32, 96, 96), (32, 32)) + + self.assert_image_equal(source.crop((32, 32, 96, 96)), + target.crop((32, 32, 96, 96))) + self.assertEqual(source.size, (128, 128)) def test_registered_extensions_uninitialized(self): # Arrange From c7efd0bf6d736844396ea519bbe31533b708286c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 27 Jun 2017 22:03:38 +0100 Subject: [PATCH 573/632] re-organized the parameters, moved size specification to overlay tuple --- PIL/Image.py | 56 +++++++++++++++++++++++++-------------------- Tests/test_image.py | 4 ++-- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 4f297db8a..b4b4a0a11 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1373,45 +1373,51 @@ class Image(object): else: self.im.paste(im, box) - def alpha_composite(self, im, box=None, source=(0,0)): + def alpha_composite(self, im, dest=(0,0), source=(0,0)): """ 'In-place' analog of Image.alpha_composite :param im: image to composite over this one - :param box: Optional 2 or 4 tuple specificing the bounds in - the destination image. If a 2 tuple, the upper left - corner. If 4 tuple, (x0,y0,x1,y1) - :param source: Optional 2 tuple, (x0, y0) for the upper left - corner in the source image. + :param dest: Optional 2 tuple specificing the upper left corner + in the this image. + :param source: Optional 2 or 4 tuple, (x0, y0) for the upper + left corner in the source image. If a 4 tuple, the bounds of + the source rectangle. Note: Not currently implemented in-place. """ if not isinstance(source, tuple): raise ValueError("Source must be a tuple") - if not len(source) == 2: - raise ValueError("Source must be a 2-tuple") + if not isinstance(dest, tuple): + raise ValueError("Destination must be a tuple") + if not len(source) in (2, 4): + raise ValueError("Source must be a 2 or 4-tuple") + if not len(dest) == 2: + raise ValueError("Destination must be a 2-tuple") if min(source) < 0: raise ValueError("Source must be non-negative") - - if box is None and source == (0, 0): - box = (0, 0, im.width, im.height) + if min(dest) < 0: + raise ValueError("Destination must be non-negative") + + if len(source) == 2: + source = source + im.size + + # over image, crop if it's not the whole thing. + if source == (0,0) + im.size: overlay = im - if self.size == im.size: - src = self - else: - src = self.crop(box) else: - if len(box) == 2: - # upper left corner given; get size from overlay image - size = im.size - box += (box[0]+size[0], box[1]+size[1]) - - src = self.crop(box) - overlay = im.crop((source[0], source[1], - source[0] + box[2] - box[0], - source[1] + box[3] - box[1])) + overlay = im.crop(source) + + # target for the paste + box = dest + (dest[0] + overlay.width, dest[1] + overlay.height) - result = alpha_composite(src, overlay) + # destination image. don't copy if we're using the whole image. + if dest == (0,0) + self.size: + background = self + else: + background = self.crop(box) + + result = alpha_composite(background, overlay) self.paste(result, box) def point(self, lut, mode=None): diff --git a/Tests/test_image.py b/Tests/test_image.py index 4361557f0..1f9c4d798 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -225,7 +225,7 @@ class TestImage(PillowTestCase): # offset and crop box = src.copy() - box.alpha_composite(over, (64, 64, 96, 96)) + box.alpha_composite(over, (64, 64), (0, 0, 32, 32)) self.assert_image_equal(box.crop((64, 64, 96, 96)), target.crop((0, 0, 32, 32))) self.assert_image_equal(box.crop((96, 96, 128, 128)), @@ -234,7 +234,7 @@ class TestImage(PillowTestCase): # source point source = src.copy() - source.alpha_composite(over, (32, 32, 96, 96), (32, 32)) + source.alpha_composite(over, (32, 32), (32, 32, 96, 96)) self.assert_image_equal(source.crop((32, 32, 96, 96)), target.crop((32, 32, 96, 96))) From ebaa509d66049b5c21e6f786ad08a317abf9a14a Mon Sep 17 00:00:00 2001 From: Fran Barba Date: Tue, 27 Jun 2017 15:31:52 +0200 Subject: [PATCH 574/632] Adjust buffer size when icc_profile > MAXBLOCK (issue #148) We were encountering some errors when saving specific JPEG images. The error was shown in stderr as: IOError: encoder error -2 when writing image file And on stdout it printed: Suspension not allowed here The problem was the bufsize not contemplating the icc_profile block. --- PIL/JpegImagePlugin.py | 5 +++-- Tests/images/icc_profile_big.jpg | Bin 0 -> 511999 bytes Tests/test_file_jpeg.py | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 Tests/images/icc_profile_big.jpg diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 8890ed9ee..ee29a8add 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -732,8 +732,9 @@ def _save(im, fp, filename): bufsize = im.size[0] * im.size[1] # The exif info needs to be written as one block, + APP1, + one spare byte. - # Ensure that our buffer is big enough - bufsize = max(ImageFile.MAXBLOCK, bufsize, len(info.get("exif", b"")) + 5) + # Ensure that our buffer is big enough. Same with the icc_profile block. + bufsize = max(ImageFile.MAXBLOCK, bufsize, len(info.get("exif", b"")) + 5, + len(extra) + 1) ImageFile._save(im, fp, [("jpeg", (0, 0)+im.size, 0, rawmode)], bufsize) diff --git a/Tests/images/icc_profile_big.jpg b/Tests/images/icc_profile_big.jpg new file mode 100644 index 0000000000000000000000000000000000000000..adf98beaadc505ee1bae2e9cfac07a2a4fce74c6 GIT binary patch literal 511999 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 RyFMY>>v~#qCck(^AF6OYqYEP-#M=d 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

47RQY?SU2>Pm7^t3Oyx`6#`V+bwp(=$e>dk*l~ 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%0DWBd{c%p@ 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 V+%7F!ft$6@4!cAB_s_r2{|6%wFw+14 literal 0 HcmV?d00001 diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 6858e52f5..7b7c2873b 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -133,6 +133,21 @@ class TestFileJpeg(PillowTestCase): test(ImageFile.MAXBLOCK+1) # full buffer block plus one byte test(ImageFile.MAXBLOCK*4+3) # large block + def test_large_icc_meta(self): + # https://github.com/python-pillow/Pillow/issues/148 + # Sometimes the meta data on the icc_profile block is biger than + # Image.MAXBLOCK or the image size. + im = Image.open('Tests/images/icc_profile_big.jpg') + f = self.tempfile("temp.jpg") + icc_profile = im.info["icc_profile"] + try: + im.save(f, format='JPEG', progressive=True,quality=95, + icc_profile=icc_profile, optimize=True) + assert True + except IOError: + assert False, "Failed saving image with icc larger than image size" + + def test_optimize(self): im1 = self.roundtrip(hopper()) im2 = self.roundtrip(hopper(), optimize=0) From a7d75c4b21c85f396281645d01b65ed047864446 Mon Sep 17 00:00:00 2001 From: Fran Barba Date: Wed, 28 Jun 2017 12:12:44 +0200 Subject: [PATCH 575/632] Applied Hugovk recommendations --- Tests/test_file_jpeg.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 7b7c2873b..cc7180093 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -143,10 +143,8 @@ class TestFileJpeg(PillowTestCase): try: im.save(f, format='JPEG', progressive=True,quality=95, icc_profile=icc_profile, optimize=True) - assert True except IOError: - assert False, "Failed saving image with icc larger than image size" - + self.fail("Failed saving image with icc larger than image size") def test_optimize(self): im1 = self.roundtrip(hopper()) From 57632d56d7cf35ed69f046ac223dda5c78eca2e3 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 28 Jun 2017 21:03:51 +0000 Subject: [PATCH 576/632] Use the cmake version of raqm --- depends/freebsd_10.sh | 2 +- depends/install_raqm_cmake.sh | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100755 depends/install_raqm_cmake.sh diff --git a/depends/freebsd_10.sh b/depends/freebsd_10.sh index b9b5a81e2..1e9269266 100755 --- a/depends/freebsd_10.sh +++ b/depends/freebsd_10.sh @@ -10,4 +10,4 @@ sudo pkg install python2 python3 py27-pip py27-virtualenv wget # I can't find a python3.4 version of tkinter sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 harfbuzz fribidi py27-tkinter -./install_raqm.sh +./install_raqm_cmake.sh diff --git a/depends/install_raqm_cmake.sh b/depends/install_raqm_cmake.sh new file mode 100755 index 000000000..0c5ed8b69 --- /dev/null +++ b/depends/install_raqm_cmake.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# install raqm + + +archive=raqm-cmake-b517ba80 + +./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz + +pushd $archive + +mkdir build +cd build +cmake .. +make && sudo make install +cd .. + +popd + From 109e10d6b79271fa8d9ef241574884a4896bf3b4 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 28 Jun 2017 21:29:57 +0000 Subject: [PATCH 577/632] cmake dependency --- depends/freebsd_10.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/freebsd_10.sh b/depends/freebsd_10.sh index 1e9269266..36d9c1069 100755 --- a/depends/freebsd_10.sh +++ b/depends/freebsd_10.sh @@ -4,7 +4,7 @@ # Installs all of the dependencies for Pillow for Freebsd 10.x # for both system Pythons 2.7 and 3.4 # -sudo pkg install python2 python3 py27-pip py27-virtualenv wget +sudo pkg install python2 python3 py27-pip py27-virtualenv wget cmake # Openjpeg fails badly using the openjpeg package. # I can't find a python3.4 version of tkinter From 14293ea4b10c3d47bdf6eb8f2a053c2f48a09a6a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 29 Jun 2017 01:50:29 -0700 Subject: [PATCH 578/632] Tests pass on osx --- Tests/test_imagefontctl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index b31e3e4a0..0dd1b3141 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -46,7 +46,7 @@ class TestImagecomplextext(PillowTestCase): im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) - draw.text((0, 0), u'السلام عليكم', font=ttf, fill=500) + draw.text((0, 0), 'السلام عليكم', font=ttf, fill=500) target = 'Tests/images/test_complex_unicode_text.png' target_img = Image.open(target) From 29c622dd3d238bfa2304d932e02ddd4441d7fa16 Mon Sep 17 00:00:00 2001 From: Fran Barba Date: Thu, 29 Jun 2017 11:21:19 +0200 Subject: [PATCH 579/632] Fixed typo biger > bigger --- Tests/test_file_jpeg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index cc7180093..1d189e680 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -135,7 +135,7 @@ class TestFileJpeg(PillowTestCase): def test_large_icc_meta(self): # https://github.com/python-pillow/Pillow/issues/148 - # Sometimes the meta data on the icc_profile block is biger than + # Sometimes the meta data on the icc_profile block is bigger than # Image.MAXBLOCK or the image size. im = Image.open('Tests/images/icc_profile_big.jpg') f = self.tempfile("temp.jpg") From 92b8db193519767923171a15e2edc97c29afb052 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 29 Jun 2017 05:14:43 -0700 Subject: [PATCH 580/632] Docs, wording --- 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 b4b4a0a11..95fda90d2 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1374,16 +1374,17 @@ class Image(object): self.im.paste(im, box) def alpha_composite(self, im, dest=(0,0), source=(0,0)): - """ 'In-place' analog of Image.alpha_composite + """ 'In-place' analog of Image.alpha_composite. Composites an image + onto this image. :param im: image to composite over this one - :param dest: Optional 2 tuple specificing the upper left corner - in the this image. - :param source: Optional 2 or 4 tuple, (x0, y0) for the upper - left corner in the source image. If a 4 tuple, the bounds of - the source rectangle. + :param dest: Optional 2 tuple (top, left) specifying the upper + left corner in this (destination) image. + :param source: Optional 2 (top, left) tuple for the upper left + corner in the overlay source image, or 4 tuple (top, left, bottom, + right) for the bounds of the source rectangle - Note: Not currently implemented in-place. + Performance Note: Not currently implemented in-place in the core layer. """ if not isinstance(source, tuple): diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index 6dcc816e5..3335cb3da 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -104,6 +104,8 @@ An instance of the :py:class:`~PIL.Image.Image` class has the following methods. Unless otherwise stated, all methods return a new instance of the :py:class:`~PIL.Image.Image` class, holding the resulting image. + +.. automethod:: PIL.Image.Image.alpha_composite .. automethod:: PIL.Image.Image.convert The following example converts an RGB image (linearly calibrated according to From 246837477ebb3ac6a34cb979e13f91bbbe531446 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 29 Jun 2017 13:26:30 +0100 Subject: [PATCH 581/632] Update Changes.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 5f2b31a32..52611a7a9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- JPEG: Adjust buffer size when icc_profile > MAXBLOCK #2596 + [Darou] + +- Specify Pillow Version in one place #2517 + [wiredfool] + - CI: Change the owner of the TRAVIS_BUILD_DIR, fixing broken docker runs #2587 [wiredfool] From 919150277e0567a3fcd1470888d8c297d94dfb79 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 29 Jun 2017 13:59:50 +0100 Subject: [PATCH 582/632] Update Changes.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 52611a7a9..92cf5a421 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (unreleased) ------------------ +- Added dBATCH parameter to ghostscript command #2588 + [radarhere] + - JPEG: Adjust buffer size when icc_profile > MAXBLOCK #2596 [Darou] From 90a99137056162a9907fa910f77fcf844182caba Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 29 Jun 2017 07:01:38 -0700 Subject: [PATCH 583/632] Font.getsize needs direction and features --- PIL/ImageDraw.py | 17 +++++++++++------ PIL/ImageFont.py | 15 +++++++++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index d0e95df65..b2568a771 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -243,25 +243,30 @@ class ImageDraw(object): left += (max_width - widths[idx]) else: assert False, 'align must be "left", "center" or "right"' - self.text((left, top), line, fill, font, anchor, direction=direction, features=features) + self.text((left, top), line, fill, font, anchor, + direction=direction, features=features) top += line_spacing left = xy[0] - def textsize(self, text, font=None, *args, **kwargs): + def textsize(self, text, font=None, spacing=4, direction=None, + features=None): """Get the size of a given string, in pixels.""" if self._multiline_check(text): - return self.multiline_textsize(text, font, *args, **kwargs) + return self.multiline_textsize(text, font, spacing, + direction, features) if font is None: font = self.getfont() - return font.getsize(text) + return font.getsize(text, direction, features) - def multiline_textsize(self, text, font=None, spacing=4): + def multiline_textsize(self, text, font=None, spacing=4, direction=None, + features=None): max_width = 0 lines = self._multiline_split(text) line_spacing = self.textsize('A', font=font)[1] + spacing for line in lines: - line_width, line_height = self.textsize(line, font) + line_width, line_height = self.textsize(line, font, spacing, + direction, features) max_width = max(max_width, line_width) return max_width, len(lines)*line_spacing diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 6b90182ef..5b2611717 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -106,9 +106,12 @@ class ImageFont(object): self.font = Image.core.font(image.im, data) - # delegate critical operations to internal type - self.getsize = self.font.getsize - self.getmask = self.font.getmask + def getsize(self, text, *args, **kwargs): + return self.font.getsize(text) + + def getmask(self, text, mode="", *args, **kwargs): + return self.font.getmask(text, mode) + ## @@ -200,14 +203,14 @@ class TransposedFont(object): self.font = font self.orientation = orientation # any 'transpose' argument, or None - def getsize(self, text): + def getsize(self, text, *args, **kwargs): w, h = self.font.getsize(text) if self.orientation in (Image.ROTATE_90, Image.ROTATE_270): return h, w return w, h - def getmask(self, text, mode=""): - im = self.font.getmask(text, mode) + def getmask(self, text, mode="", *args, **kwargs): + im = self.font.getmask(text, mode, *args, **kwargs) if self.orientation is not None: return im.transpose(self.orientation) return im From 9f7aae3505e813e4fc983139f082ace258c73497 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 29 Jun 2017 07:02:02 -0700 Subject: [PATCH 584/632] Doc changes/additions --- docs/reference/ImageDraw.rst | 99 +++++++++++++++++++++++++++++------- docs/reference/ImageFont.rst | 28 +++++++--- 2 files changed, 103 insertions(+), 24 deletions(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index e8f67f39b..7a2666b10 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -240,16 +240,28 @@ Methods the number of pixels between lines. :param align: If the text is passed on to multiline_text(), "left", "center" or "right". - :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. Requires libraqm - :param features: A list of font feature to be used during text layout. - This is usually used to turn on optional font features that are not enabled by - default, for example 'dlig' or 'ss01', but can be also used to turn off default - font features for example '-liga' to disable ligatures or '-kern' to disable kerning. - To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm - Requires libraqm. + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right), 'ttb' (top to + bottom) or 'btt' (bottom to top). Requires + libraqm. + + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://www.microsoft.com/typography/otspec/featurelist.htm + Requires libraqm. + + .. versionadded:: 4.2.0 .. py:method:: PIL.ImageDraw.Draw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", - direction=None, features=[]) + direction=None, features=None) Draws the string at the given position. @@ -259,15 +271,28 @@ Methods :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. :param spacing: The number of pixels between lines. :param align: "left", "center" or "right". - :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. Requires libraqm. - :param features: A list of font feature to be used during text layout. - This is usually used to turn on optional font features that are not enabled by - default, for example 'dlig' or 'ss01', but can be also used to turn off default - font features for example '-liga' to disable ligatures or '-kern' to disable kerning. - To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm - Requires libraqm. + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right), 'ttb' (top to + bottom) or 'btt' (bottom to top). Requires + libraqm. -.. py:method:: PIL.ImageDraw.Draw.textsize(text, font=None, spacing=0) + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://www.microsoft.com/typography/otspec/featurelist.htm + Requires libraqm. + + .. versionadded:: 4.2.0 + +.. py:method:: PIL.ImageDraw.Draw.textsize(text, font=None, spacing=4, direction=None, + features=None) Return the size of the given string, in pixels. @@ -276,11 +301,51 @@ Methods :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. :param spacing: If the text is passed on to multiline_textsize(), the number of pixels between lines. + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right), 'ttb' (top to + bottom) or 'btt' (bottom to top). Requires + libraqm. -.. py:method:: PIL.ImageDraw.Draw.multiline_textsize(text, font=None, spacing=0) + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://www.microsoft.com/typography/otspec/featurelist.htm + Requires libraqm. + + .. versionadded:: 4.2.0 + + +.. py:method:: PIL.ImageDraw.Draw.multiline_textsize(text, font=None, spacing=4, direction=None, + features=None) Return the size of the given string, in pixels. :param text: Text to be measured. :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. :param spacing: The number of pixels between lines. + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right), 'ttb' (top to + bottom) or 'btt' (bottom to top). Requires + libraqm. + + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://www.microsoft.com/typography/otspec/featurelist.htm + Requires libraqm. + + .. versionadded:: 4.2.0 diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index d8790ca01..76fde44ff 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -63,14 +63,28 @@ Methods driver prefers; if empty, the renderer may return either mode. Note that the mode is always a string, to simplify C-level implementations. - :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. Requires libraqm - :param features: A list of font feature to be used during text layout. This is - usually used to turn on optional font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also used to turn off default font - features for example '-liga' to disable ligatures or '-kern' to disable kerning. - To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm - Requires libraqm .. versionadded:: 1.1.5 + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right), 'ttb' (top to + bottom) or 'btt' (bottom to top). Requires + libraqm. + + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://www.microsoft.com/typography/otspec/featurelist.htm + Requires libraqm. + + .. versionadded:: 4.2.0 + :return: An internal PIL storage memory instance as defined by the :py:mod:`PIL.Image.core` interface module. From 2c6cf03de1a23078641b9f4bef65fdca3a8ddd32 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 30 Jun 2017 22:57:57 +0100 Subject: [PATCH 585/632] test features in get size --- Tests/test_imagefontctl.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 0dd1b3141..79122f6c1 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -95,12 +95,14 @@ class TestImagecomplextext(PillowTestCase): im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) draw.text((0, 0), 'filling', font=ttf, fill=500, features=['-liga']) - target = 'Tests/images/test_ligature_features.png' target_img = Image.open(target) self.assert_image_similar(im, target_img, .5) + liga_size = ttf.getsize('fi', features=['-liga']) + self.assertEqual(liga_size,(13,19)) + def test_kerning_features(self): ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) From d2e8da1c30d17068b0becf72a5f277c28a3bd4ae Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 30 Jun 2017 22:58:14 +0100 Subject: [PATCH 586/632] release notes --- docs/releasenotes/4.2.0.rst | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/releasenotes/4.2.0.rst b/docs/releasenotes/4.2.0.rst index e405ab58b..2bd2cbe5b 100644 --- a/docs/releasenotes/4.2.0.rst +++ b/docs/releasenotes/4.2.0.rst @@ -1,11 +1,26 @@ 4.2.0 ----- +Added Complex Text Rendering +============================ + +Pillow now supports complex text rendering for scripts requiring glyph +composition and bidirectional flow. This optional feature adds three +dependencies: harfbuzz, fribidi, and raqm. See the install +documentation for further details. This feature is tested and works on +Un*x and Mac, but has not yet been built on Windows platforms. + Removed Deprecated Items ======================== Several deprecated items have been removed. -* The methods :py:meth:`PIL.ImageWin.Dib.fromstring`, :py:meth:`PIL.ImageWin.Dib.tostring` and :py:meth:`PIL.TiffImagePlugin.ImageFileDirectory_v2.as_dict` have been removed. +* The methods :py:meth:`PIL.ImageWin.Dib.fromstring`, + :py:meth:`PIL.ImageWin.Dib.tostring` and + :py:meth:`PIL.TiffImagePlugin.ImageFileDirectory_v2.as_dict` have + been removed. -* Before Pillow 4.2.0, attempting to save an RGBA image as JPEG would discard the alpha channel. From Pillow 3.4.0, a deprecation warning was shown. From Pillow 4.2.0, the deprecation warning is removed and an :py:exc:`IOError` is raised. +* Before Pillow 4.2.0, attempting to save an RGBA image as JPEG would + discard the alpha channel. From Pillow 3.4.0, a deprecation warning + was shown. From Pillow 4.2.0, the deprecation warning is removed and + an :py:exc:`IOError` is raised. From 1eedfe55db404e97979f1d856bb454fbb7fbcc90 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 1 Jul 2017 02:34:08 -0700 Subject: [PATCH 587/632] Install updates for raqm --- docs/installation.rst | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index c8a7113ac..f335080b8 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -28,12 +28,6 @@ Basic Installation most common image formats. See :ref:`external-libraries` for a full list of external libraries supported. -.. note:: - - The basic installation works on Windows and macOS using the binaries - from PyPI. Other installations require building from source as - detailed below. - Install Pillow with :command:`pip`:: $ pip install Pillow @@ -72,11 +66,15 @@ except OpenJPEG:: Linux Installation ^^^^^^^^^^^^^^^^^^ -We do not provide binaries for Linux. 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 provide binaries for Linux for each of the supported Python +versions in the manylinux wheel format. These include support for all +optional libraries except Raqm:: + + $ pip install Pillow + +Most major Linux distributions, including Fedora, Debian/Ubuntu and +ArchLinux also include Pillow in packages that previously contained +PIL e.g. ``python-imaging``. FreeBSD Installation ^^^^^^^^^^^^^^^^^^^^ @@ -120,7 +118,9 @@ External Libraries .. note:: There are scripts to install the dependencies for some operating - systems included in the ``depends`` directory. + systems included in the ``depends`` directory. Also see the + Dockerfiles in our `docker images repo + `_. Many of Pillow's features require external libraries: @@ -178,7 +178,9 @@ Many of Pillow's features require external libraries: * libraqm depends on the following libraries: FreeType, HarfBuzz, FriBiDi, make sure that install them before install libraqm if not available as package in your system. - * setting text direction or font features is not supported without libraqm. + * setting text direction or font features is not supported without + libraqm. + * Windows support: Raqm support is currently unsupported on Windows. Once you have installed the prerequisites, run:: @@ -259,14 +261,10 @@ The easiest way to install external libraries is via `Homebrew $ brew install libtiff libjpeg webp little-cms2 -To install libraqm on MaxOS use Homebrew:: +To install libraqm on MaxOS use Homebrew to install its dependencies:: $ brew install freetype harfbuzz fribidi -Once you have `libraqm source code `_ and the dependencies , run the customary sequence of commands in the source code -directory:: - $ ./configure - $ make - $ make install +Then see ``depends/install_raqm_cmake.sh`` to install libraqm. Now install Pillow with:: @@ -300,6 +298,8 @@ Prerequisites are installed on **FreeBSD 10 or 11** with:: $ sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 openjpeg harfbuzz fribidi +Then see ``depends/install_raqm_cmake.sh`` to install libraqm. + Building on Linux ^^^^^^^^^^^^^^^^^ @@ -334,7 +334,10 @@ Prerequisites are installed on **Ubuntu 12.04 LTS** or **Raspian Wheezy 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 + libfreetype6-dev liblcms2-dev libwebp-dev libharfbuzz-dev libfribidi-dev \ + tcl8.6-dev tk8.6-dev python-tk + +Then see ``depends/install_raqm.sh`` to install libraqm. Prerequisites are installed on **Fedora 23** with:: From d1b66e9dfd4add8a77909ad287d1a9d277fcdd2c Mon Sep 17 00:00:00 2001 From: nediamond Date: Sat, 1 Jul 2017 05:37:02 -0400 Subject: [PATCH 588/632] Added threshold parameter to ImageDraw.floodfill (#2599) * added thresh option and test * fixed up, test works and passes * Update test_imagedraw.py * Update test_imagedraw.py * Update ImageDraw.py * removed pypy skip decorator from thresh test * Update ImageDraw.py --- PIL/ImageDraw.py | 17 ++++++++++++++--- Tests/test_imagedraw.py | 20 ++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 71e29ee48..ee0405fab 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -315,7 +315,7 @@ def getdraw(im=None, hints=None): return im, handler -def floodfill(image, xy, value, border=None): +def floodfill(image, xy, value, border=None, thresh=0): """ (experimental) Fills a bounded region with a given color. @@ -326,13 +326,17 @@ def floodfill(image, xy, value, border=None): pixels with a color different from the border color. If not given, the region consists of pixels having the same color as the seed pixel. + :param thresh: Optional threshold value which specifies a maximum + tolerable difference of a pixel value from the 'background' in + order for it to be replaced. Useful for filling regions of non- + homogeneous, but similar, colors. """ # based on an implementation by Eric S. Raymond pixel = image.load() x, y = xy try: background = pixel[x, y] - if background == value: + if _color_diff(value, background) <= thresh: return # seed point already has fill color pixel[x, y] = value except (ValueError, IndexError): @@ -348,7 +352,7 @@ def floodfill(image, xy, value, border=None): except IndexError: pass else: - if p == background: + if _color_diff(p, background) <= thresh: pixel[s, t] = value newedge.append((s, t)) edge = newedge @@ -366,3 +370,10 @@ def floodfill(image, xy, value, border=None): pixel[s, t] = value newedge.append((s, t)) edge = newedge + + +def _color_diff(rgb1, rgb2): + """ + Uses 1-norm distance to calculate difference between two rgb values. + """ + return abs(rgb1[0]-rgb2[0]) + abs(rgb1[1]-rgb2[1]) + abs(rgb1[2]-rgb2[2]) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 2ca5d0882..9c989d2e5 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -400,6 +400,26 @@ class TestImageDraw(PillowTestCase): self.assert_image_equal( im, Image.open("Tests/images/imagedraw_floodfill2.png")) + + def test_floodfill_thresh(self): + # floodfill() is experimental + + # Arrange + im = Image.new("RGB", (W, H)) + draw = ImageDraw.Draw(im) + draw.rectangle(BBOX2, outline="darkgreen", fill="green") + centre_point = (int(W/2), int(H/2)) + + # Act + ImageDraw.floodfill( + im, centre_point, ImageColor.getrgb("red"), + thresh=30) + del draw + + # Assert + self.assert_image_equal( + im, Image.open("Tests/images/imagedraw_floodfill2.png")) + def create_base_image_draw(self, size, mode=DEFAULT_MODE, background1=WHITE, From 6e2a9783192573160abdded9a74bf3c06f36fcb7 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 1 Jul 2017 10:56:38 +0100 Subject: [PATCH 589/632] Update CHANGE.rst [ci skip] --- CHANGES.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 92cf5a421..3eb61a46d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,9 +1,15 @@ Changelog (Pillow) ================== -4.2.0 (unreleased) +4.2.0 (2017-07-01) ------------------ +- Complex Text Support #2576 + [ShamsaHamed, Fahad-Alsaidi, wiredfool] + +- Added threshold parameter to ImageDraw.floodfill #2599 + [nediamond] + - Added dBATCH parameter to ghostscript command #2588 [radarhere] From 0779b49c0ff91e984d493eac5ddc86817578eeda Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 1 Jul 2017 03:30:48 -0700 Subject: [PATCH 590/632] Release notes 4.2.0 [ci skip] --- docs/releasenotes/4.2.0.rst | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/releasenotes/4.2.0.rst b/docs/releasenotes/4.2.0.rst index 2bd2cbe5b..26f91c1a2 100644 --- a/docs/releasenotes/4.2.0.rst +++ b/docs/releasenotes/4.2.0.rst @@ -10,6 +10,24 @@ dependencies: harfbuzz, fribidi, and raqm. See the install documentation for further details. This feature is tested and works on Un*x and Mac, but has not yet been built on Windows platforms. +New Optional Parameters +======================= + +* :py:meth:`PIL.ImageDraw.floodfill` has a new optional parameter: + threshold. This specifies a tolerance for the color to replace with + the flood fill. + +* The TIFF and PDF image writers now support the ``append_images`` + optional parameter for specifying additional images to create + multipage outputs. + +New DecompressionBomb Warning +============================= + +:py:meth:`PIL.Image.Image.crop` now may raise a DecompressionBomb +warning if the crop region enlarges the image over the threshold +specified by :py:attr:`PIL.Image.MAX_PIXELS`. + Removed Deprecated Items ======================== @@ -24,3 +42,10 @@ Several deprecated items have been removed. discard the alpha channel. From Pillow 3.4.0, a deprecation warning was shown. From Pillow 4.2.0, the deprecation warning is removed and an :py:exc:`IOError` is raised. + +Removed Core Image Function +=========================== + +The unused function ``Image.core.new_array`` was removed. This is an +internal function that should not have been used by user code, but it +was accessible from the python layer. From 12316a70cb6061adf7680205daf17bf2b2cb8f42 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 1 Jul 2017 11:44:44 +0100 Subject: [PATCH 591/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3eb61a46d..82fa9d523 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (2017-07-01) ------------------ +- Image.alpha_composite added #2595 + [wiredfool] + - Complex Text Support #2576 [ShamsaHamed, Fahad-Alsaidi, wiredfool] From 20da797fcee7cfa22ee9637cb8b3b041e1fa8ecb Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 21 Jun 2017 12:10:03 -0700 Subject: [PATCH 592/632] updates for centos/amazonlinux --- Tests/test_imagefont.py | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 3475df0f4..4b477796b 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -44,6 +44,26 @@ class SimplePatcher(object): class TestImageFont(PillowTestCase): LAYOUT_ENGINE = ImageFont.LAYOUT_BASIC + # Freetype has different metrics depending on the version. + # (and, other things, but first things first) + METRICS = { ('2', '3'): {'multiline': 30, + 'textsize': 12, + 'getters': (13, 16)}, + ('2', '7'): {'multiline': 6.2, + 'textsize': 2.5, + 'getters': (12, 16)}, + ('2', '8'): {'multiline': 6.2, + 'textsize': 2.5, + 'getters': (12, 16)}, + 'Default': {'multiline': 0.5, + 'textsize': 0.5, + 'getters': (12, 16)}, + } + + def setUp(self): + freetype_version = tuple(ImageFont.core.freetype2_version.split('.'))[:2] + self.metrics = self.METRICS.get(freetype_version, self.METRICS['Default']) + def get_font(self): return ImageFont.truetype(FONT_PATH, FONT_SIZE, layout_engine=self.LAYOUT_ENGINE) @@ -125,7 +145,7 @@ class TestImageFont(PillowTestCase): target_img = Image.open(target) # Epsilon ~.5 fails with FreeType 2.7 - self.assert_image_similar(im, target_img, 2.5) + self.assert_image_similar(im, target_img, self.metrics['textsize']) def test_render_multiline(self): im = Image.new(mode='RGB', size=(300, 100)) @@ -144,7 +164,7 @@ class TestImageFont(PillowTestCase): # some versions of freetype have different horizontal spacing. # setting a tight epsilon, I'm showing the original test failure # at epsilon = ~38. - self.assert_image_similar(im, target_img, 6.2) + self.assert_image_similar(im, target_img, self.metrics['multiline']) def test_render_multiline_text(self): ttf = self.get_font() @@ -159,7 +179,7 @@ class TestImageFont(PillowTestCase): target_img = Image.open(target) # Epsilon ~.5 fails with FreeType 2.7 - self.assert_image_similar(im, target_img, 6.2) + self.assert_image_similar(im, target_img, self.metrics['multiline']) # Test that text() can pass on additional arguments # to multiline_text() @@ -180,7 +200,7 @@ class TestImageFont(PillowTestCase): target_img = Image.open(target) # Epsilon ~.5 fails with FreeType 2.7 - self.assert_image_similar(im, target_img, 6.2) + self.assert_image_similar(im, target_img, self.metrics['multiline']) def test_unknown_align(self): im = Image.new(mode='RGB', size=(300, 100)) @@ -228,9 +248,11 @@ class TestImageFont(PillowTestCase): target = 'Tests/images/multiline_text_spacing.png' target_img = Image.open(target) - + from PIL import ImageChops + + ImageChops.difference(im, target_img).save('multiline.png') # Epsilon ~.5 fails with FreeType 2.7 - self.assert_image_similar(im, target_img, 6.2) + self.assert_image_similar(im, target_img, self.metrics['multiline']) def test_rotated_transposed_font(self): img_grey = Image.new("L", (100, 100)) @@ -460,7 +482,7 @@ class TestImageFont(PillowTestCase): self.assertEqual(t.font.glyphs, 4177) self.assertEqual(t.getsize('A'), (12, 16)) self.assertEqual(t.getsize('AB'), (24, 16)) - self.assertEqual(t.getsize('M'), (12, 16)) + self.assertEqual(t.getsize('M'), self.metrics['getters']) self.assertEqual(t.getsize('y'), (12, 20)) self.assertEqual(t.getsize('a'), (12, 16)) From 65c60517929b32fc82bbd70cb9e8f30a5f8509f0 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 21 Jun 2017 12:32:04 -0700 Subject: [PATCH 593/632] turn on centos, amazon linux --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 0eb575b1a..1f34cd7e8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,6 +24,8 @@ matrix: - env: DOCKER="ubuntu-xenial-amd64" - env: DOCKER="ubuntu-precise-amd64" - env: DOCKER="debian-stretch-x86" + - env: DOCKER="centos-6-amd64" + - env: DOCKER="amazon-amd64" dist: trusty From b713330b00a170f37585e26a6733804ae895fccd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 Jul 2017 21:14:41 +1000 Subject: [PATCH 594/632] Fixed 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 f335080b8..56520add1 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -176,8 +176,8 @@ Many of Pillow's features require external libraries: shaping (using HarfBuzz), and proper script itemization. As a result, Raqm can support most writing systems covered by Unicode. * libraqm depends on the following libraries: FreeType, HarfBuzz, - FriBiDi, make sure that install them before install libraqm if not - available as package in your system. + FriBiDi, make sure that you install them before install libraqm + if not available as package in your system. * setting text direction or font features is not supported without libraqm. * Windows support: Raqm support is currently unsupported on Windows. @@ -213,7 +213,7 @@ Build Options * Build flags: ``--disable-zlib``, ``--disable-jpeg``, ``--disable-tiff``, ``--disable-freetype``, ``--disable-tcl``, ``--disable-tk``, ``--disable-lcms``, ``--disable-webp``, - ``--disable-webpmux``, ``--disable-jpeg2000``, + ``--disable-webpmux``, ``--disable-jpeg2000``, ``--disable-imagequant``, ``--disable-raqm``. Disable building the corresponding feature even if the development libraries are present on the building machine. From 892075a77e9cc2b063f301306bad78547bbef73a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 Jul 2017 21:16:49 +1000 Subject: [PATCH 595/632] Fixed typos [ci skip] --- docs/installation.rst | 2 +- docs/releasenotes/4.2.0.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 56520add1..ad83faa85 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -261,7 +261,7 @@ The easiest way to install external libraries is via `Homebrew $ brew install libtiff libjpeg webp little-cms2 -To install libraqm on MaxOS use Homebrew to install its dependencies:: +To install libraqm on macOS use Homebrew to install its dependencies:: $ brew install freetype harfbuzz fribidi Then see ``depends/install_raqm_cmake.sh`` to install libraqm. diff --git a/docs/releasenotes/4.2.0.rst b/docs/releasenotes/4.2.0.rst index 2bd2cbe5b..8c005084b 100644 --- a/docs/releasenotes/4.2.0.rst +++ b/docs/releasenotes/4.2.0.rst @@ -8,7 +8,7 @@ Pillow now supports complex text rendering for scripts requiring glyph composition and bidirectional flow. This optional feature adds three dependencies: harfbuzz, fribidi, and raqm. See the install documentation for further details. This feature is tested and works on -Un*x and Mac, but has not yet been built on Windows platforms. +Unix and Mac, but has not yet been built on Windows platforms. Removed Deprecated Items ======================== From e2af48ba169e0da5f71494e1b81f1c9489e7ae5a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 1 Jul 2017 12:19:34 +0100 Subject: [PATCH 596/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 82fa9d523..8d63c52bc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (2017-07-01) ------------------ +- CI: Amazon Linux and Centos6 docker images added to TravisCI #2585 + [wiredfool] + - Image.alpha_composite added #2595 [wiredfool] From e24aaa60a20446487ef5cdae720e6d2f218ad436 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 Jul 2017 21:34:41 +1000 Subject: [PATCH 597/632] Improved append_images documentation [ci skip] --- docs/handbook/image-file-formats.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index a0f638e84..6682d941f 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -110,6 +110,7 @@ are available:: **append_images** A list of images to append as additional frames. Each of the images in the list can be single or multiframe images. + This is currently only supported for GIF, PDF and TIFF. **duration** The display duration of each frame of the multiframe gif, in From b139b46046d5a1e6548119788d46359126c2ffd4 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 1 Jul 2017 04:34:46 -0700 Subject: [PATCH 598/632] Test matrix updates --- docs/installation.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index f335080b8..e1837eb59 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -368,6 +368,10 @@ These platforms are built and tested for every change. +----------------------------------+-------------------------------+-----------------------+ | Arch | 2.7 |x86-64 | +----------------------------------+-------------------------------+-----------------------+ +| Amazon | 2.7 |x86-64 | ++----------------------------------+-------------------------------+-----------------------+ +| Centos 6 | 2.7 |x86-64 | ++----------------------------------+-------------------------------+-----------------------+ | Debian Stretch | 2.7 |x86 | +----------------------------------+-------------------------------+-----------------------+ | Mac OS X 10.10 Yosemite* | 2.7, 3.3, 3.4, 3.5, 3.6 |x86-64 | @@ -426,9 +430,9 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Gentoo Linux | 2.7,3.2 | 2.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| FreeBSD 11.0 | 2.7,3.4,3.5,3.6 | 4.1.1 |x86-64 | +| FreeBSD 11.0 | 2.7,3.4,3.5,3.6 | 4.2.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| FreeBSD 10.3 | 2.7,3.4,3.5 | 4.1.1 |x86-64 | +| FreeBSD 10.3 | 2.7,3.4,3.5 | 4.2.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | FreeBSD 10.2 | 2.7,3.4 | 3.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ From d48d635c8173a0475657a0b3cc4c170f2b4355f6 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 1 Jul 2017 04:36:08 -0700 Subject: [PATCH 599/632] Remove callout for Ubuntu 12.04, EOL --- docs/installation.rst | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index e1837eb59..dd8e5a3c8 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -325,12 +325,6 @@ Or for Python 3:: .. Note:: ``redhat-rpm-config`` is required on Fedora 23, but not earlier versions. -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 \ From 27ecd0362f5cb3b6be0035732338e197234213f5 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 1 Jul 2017 12:44:12 +0100 Subject: [PATCH 600/632] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 8d63c52bc..ba5bd2cdb 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.2.0 (2017-07-01) ------------------ +- Doc: Clarified Image.save:append_images documentation #2604 + [radarhere] + - CI: Amazon Linux and Centos6 docker images added to TravisCI #2585 [wiredfool] From acb19d8e45699bf961604e48b28002b099250ddd Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 1 Jul 2017 05:46:24 -0700 Subject: [PATCH 601/632] 4.2.0 version bump --- PIL/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/version.py b/PIL/version.py index 2233af6a3..9424f1328 100644 --- a/PIL/version.py +++ b/PIL/version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = '4.2.0.dev0' +__version__ = '4.2.0' From f28b18892a8a7ccbe0082fc75ade81f8f9a9333b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 1 Jul 2017 13:51:03 +0100 Subject: [PATCH 602/632] Update Releasing.md - single version identifier. [ci skip] --- RELEASING.md | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index a56404d5a..6ec276879 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -8,10 +8,7 @@ Released quarterly on the first day of January, April, July, October. * [ ] Develop and prepare release in ``master`` branch. * [ ] Check [Travis CI](https://travis-ci.org/python-pillow/Pillow) and [AppVeyor CI](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in ``master`` branch. * [ ] Check that all of the wheel builds [Pillow Wheel Builder](https://github.com/python-pillow/pillow-wheels) pass the tests in TravisCI. -* [ ] In compliance with https://www.python.org/dev/peps/pep-0440/, update version identifier in: -``` - PIL/__init__.py setup.py _imaging.c appveyor.yml -``` +* [ ] In compliance with https://www.python.org/dev/peps/pep-0440/, update version identifier in `PIL/version.py` * [ ] Update `CHANGES.rst`. * [ ] Run pre-release check via `make release-test` in a freshly cloned repo. * [ ] Create branch and tag for release e.g.: @@ -41,13 +38,7 @@ Released as needed for security, installation or critical bug fixes. ``` git checkout -t remotes/origin/2.9.x ``` -* [ ] In compliance with https://www.python.org/dev/peps/pep-0440/, update version identifier in: -``` - PIL/__init__.py - setup.py - _imaging.c - appveyor.yml -``` +* [ ] In compliance with https://www.python.org/dev/peps/pep-0440/, update version identifier in `PIL/version.py` * [ ] Run pre-release check via `make release-test`. * [ ] Create tag for release e.g.: ``` From 5aa91c3e5eeac7a4e73fc438f0b2add2ae643b39 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 3 Jul 2017 20:37:48 +1000 Subject: [PATCH 603/632] Updated libimagequant to 2.10.0 --- depends/install_imagequant.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index 75e023551..a92b63f95 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.9.1 +archive=libimagequant-2.10.0 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz From 3f3eb99ff9ae5e3e2ad581a388e229f82c794183 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 3 Jul 2017 21:52:06 +0100 Subject: [PATCH 604/632] Fix version specification on pypy/windows --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index e014c4b1f..1cbfc259a 100755 --- a/setup.py +++ b/setup.py @@ -599,7 +599,7 @@ class pil_build_ext(build_ext): if struct.unpack("h", "\0\1".encode('ascii'))[0] == 1: defs.append(("WORDS_BIGENDIAN", None)) - if sys.platform == "win32": + if sys.platform == "win32" and not hasattr(sys, 'pypy_version_info'): defs.append(("PILLOW_VERSION", '"\\"%s\\""'%PILLOW_VERSION)) else: defs.append(("PILLOW_VERSION", '"%s"'%PILLOW_VERSION)) From bc5f9a3e8bfa5acb301f9a7cdabeb4acac040c9c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 3 Jul 2017 21:51:39 +0100 Subject: [PATCH 605/632] add pypy to appveyor --- appveyor.yml | 25 +++++++++++++++++++------ winbuild/appveyor_install_pypy.cmd | 3 +++ winbuild/build.py | 7 ++++++- winbuild/config.py | 1 + 4 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 winbuild/appveyor_install_pypy.cmd diff --git a/appveyor.yml b/appveyor.yml index 31ef3b048..18c179983 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,7 +7,14 @@ init: environment: X64_EXT: -x64 + EXECUTABLE: python.exe + PIP_DIR: Scripts + VENV: NO matrix: + - PYTHON: C:/vp/pypy2 + EXECUTABLE: bin/pypy.exe + PIP_DIR: bin + VENV: YES - PYTHON: C:/Python27-x64 - PYTHON: C:/Python34 - PYTHON: C:/Python27 @@ -15,6 +22,7 @@ environment: - PYTHON: C:/Python33 - PYTHON: C:/Python33-x64 + install: - curl -fsSL -o pillow-depends.zip https://github.com/python-pillow/pillow-depends/archive/master.zip - 7z x pillow-depends.zip -oc:\ @@ -23,19 +31,24 @@ install: - xcopy c:\pillow-depends\*.tar.gz c:\pillow\winbuild\ - xcopy /s c:\pillow-depends\test_images\* c:\pillow\tests\images - cd c:\pillow\winbuild\ +- ps: | + if ($env:PYTHON -eq "c:/vp/pypy2") + { + c:\pillow\winbuild\appveyor_install_pypy.cmd + } - c:\python34\python.exe c:\pillow\winbuild\build_dep.py - c:\pillow\winbuild\build_deps.cmd build_script: -- '%PYTHON%\python.exe c:\pillow\winbuild\build.py' +- '%PYTHON%\%EXECUTABLE% c:\pillow\winbuild\build.py' - cd c:\pillow - dir dist\*.egg -- '%PYTHON%\python.exe selftest.py --installed' +- '%PYTHON%\%EXECUTABLE% selftest.py --installed' test_script: - cd c:\pillow -- '%PYTHON%\Scripts\pip.exe install nose' -- '%PYTHON%\python.exe test-installed.py -v -s' +- '%PYTHON%\%PIP_DIR%\pip.exe install nose' +- '%PYTHON%\%EXECUTABLE% test-installed.py -v -s' matrix: fast_finish: true @@ -47,9 +60,9 @@ artifacts: name: wheel after_test: - - '%PYTHON%\Scripts\pip.exe install wheel' + - '%PYTHON%\%PIP_DIR%\pip.exe install wheel' - cd c:\pillow\winbuild\ - - '%PYTHON%\python.exe c:\pillow\winbuild\build.py --wheel' + - '%PYTHON%\%EXECUTABLE% c:\pillow\winbuild\build.py --wheel' - cd c:\pillow - ps: Get-ChildItem .\dist\*.* | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name } diff --git a/winbuild/appveyor_install_pypy.cmd b/winbuild/appveyor_install_pypy.cmd new file mode 100644 index 000000000..39bf66782 --- /dev/null +++ b/winbuild/appveyor_install_pypy.cmd @@ -0,0 +1,3 @@ +curl -fsSL -o pypy2.zip https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.8.0-win32.zip +7z x pypy2.zip -oc:\ +c:\Python34\Scripts\virtualenv.exe -p c:\pypy2-v5.8.0-win32\pypy.exe c:\vp\pypy2 \ No newline at end of file diff --git a/winbuild/build.py b/winbuild/build.py index 99502938d..3d6c6e57f 100755 --- a/winbuild/build.py +++ b/winbuild/build.py @@ -72,6 +72,11 @@ def build_one(py_ver, compiler): args['python_path'] = "%PYTHON%" else: args['python_path'] = "%s%s\\Scripts" % (VIRT_BASE, py_ver) + + args['executable'] = "python.exe" + if 'EXECUTABLE' in os.environ: + args['executable'] = "%EXECUTABLE%" + args['py_ver'] = py_ver if '34' in py_ver: args['tcl_ver'] = '86' @@ -87,7 +92,7 @@ set INCLUDE=%%INCLUDE%%;%%INCLIB%%\%(inc_dir)s;%%INCLIB%%\tcl%(tcl_ver)s\include setlocal set LIB=%%LIB%%;C:\Python%(py_ver)s\tcl -call %(python_path)s\python.exe setup.py %%BLDOPT%% +call %(python_path)s\%(executable)s setup.py %%BLDOPT%% endlocal endlocal diff --git a/winbuild/config.py b/winbuild/config.py index 50f2cb4dd..c7a6fe675 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -5,6 +5,7 @@ PILLOW_DEPENDS_DIR = 'C:\\pillow-depends\\' pythons = { # '26': 7, '27': 7, + 'pypy2': 7, # '32': 7, '33': 7.1, '34': 7.1} From 683b32d48b766394a8c19eab8a14d45752633c42 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 4 Jul 2017 09:06:18 +0300 Subject: [PATCH 606/632] Update CHANGES.rst [CI skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index ba5bd2cdb..a2dc17eb3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,12 @@ Changelog (Pillow) ================== +4.3.0 (unreleased) +------------------ + +- CI: Fix version specification and test on CI for PyPy/Windows #2608 + [wiredfool] + 4.2.0 (2017-07-01) ------------------ From 27122e90081185e681f5d09902040432c7c91d8d Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 4 Jul 2017 09:10:13 +0100 Subject: [PATCH 607/632] Update Changes.rst [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index a2dc17eb3..98fc8484e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,7 +1,7 @@ Changelog (Pillow) ================== -4.3.0 (unreleased) +4.2.1 (unreleased) ------------------ - CI: Fix version specification and test on CI for PyPy/Windows #2608 From afce29ea74cd6e576cf1cb2a4105af5418471eb7 Mon Sep 17 00:00:00 2001 From: kijeong kim Date: Thu, 6 Jul 2017 10:31:02 +0900 Subject: [PATCH 608/632] [etc] Fix built-in name. --- PIL/PdfImagePlugin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PIL/PdfImagePlugin.py b/PIL/PdfImagePlugin.py index a6ca0320a..a8d7ae1fd 100644 --- a/PIL/PdfImagePlugin.py +++ b/PIL/PdfImagePlugin.py @@ -37,11 +37,11 @@ __version__ = "0.4" # 4. page # 5. page contents -def _obj(fp, obj, **dict): +def _obj(fp, obj, **dict_): fp.write("%d 0 obj\n" % obj) - if dict: + if dict_: fp.write("<<\n") - for k, v in dict.items(): + for k, v in dict_.items(): if v is not None: fp.write("/%s %s\n" % (k, v)) fp.write(">>\n") From 580b6fbc06602857703bb6588935b153d1da4e6e Mon Sep 17 00:00:00 2001 From: kijeong kim Date: Thu, 6 Jul 2017 17:31:55 +0900 Subject: [PATCH 609/632] [etc] Changed parameter name from dict_ to dictionary. --- PIL/PdfImagePlugin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PIL/PdfImagePlugin.py b/PIL/PdfImagePlugin.py index a8d7ae1fd..e41a59411 100644 --- a/PIL/PdfImagePlugin.py +++ b/PIL/PdfImagePlugin.py @@ -37,11 +37,11 @@ __version__ = "0.4" # 4. page # 5. page contents -def _obj(fp, obj, **dict_): +def _obj(fp, obj, **dictionary): fp.write("%d 0 obj\n" % obj) - if dict_: + if dictionary: fp.write("<<\n") - for k, v in dict_.items(): + for k, v in dictionary.items(): if v is not None: fp.write("/%s %s\n" % (k, v)) fp.write(">>\n") From 0d3712afe4a8d18754f89148d33c5043d1f5b1cb Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 6 Jul 2017 02:57:44 -0700 Subject: [PATCH 610/632] 4.3.0.dev0 version bump --- PIL/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/version.py b/PIL/version.py index 9424f1328..4d21d062b 100644 --- a/PIL/version.py +++ b/PIL/version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = '4.2.0' +__version__ = '4.3.0.dev0' From 6389a2aec6c0bfb1d2b7d6ab8201ca2c8e16e994 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 6 Jul 2017 11:01:31 +0100 Subject: [PATCH 611/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 98fc8484e..a9248052b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,12 @@ Changelog (Pillow) ================== +4.3.0 (unreleased) +------------------ + +- PDF: Renamed parameter to not shadow built-in dict #2612 + [kijeong] + 4.2.1 (unreleased) ------------------ From f76aa0b9990a929c27a5056cdc4427cd9fda2d6c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 6 Jul 2017 11:03:39 +0100 Subject: [PATCH 612/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index a9248052b..7f3cb0f7f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.3.0 (unreleased) ------------------ +- Dependencies: Updated libimagequant to 2.10.0 #2605 + [radarhere] + - PDF: Renamed parameter to not shadow built-in dict #2612 [kijeong] From b1d0965c757117f13036c2e62435965ad3b2e41b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 6 Jul 2017 03:21:56 -0700 Subject: [PATCH 613/632] Release notes for 4.2.1 --- CHANGES.rst | 2 +- docs/installation.rst | 2 +- docs/releasenotes/4.2.1.rst | 11 +++++++++++ docs/releasenotes/index.rst | 1 + 4 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 docs/releasenotes/4.2.1.rst diff --git a/CHANGES.rst b/CHANGES.rst index 7f3cb0f7f..9daff9d56 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -10,7 +10,7 @@ Changelog (Pillow) - PDF: Renamed parameter to not shadow built-in dict #2612 [kijeong] -4.2.1 (unreleased) +4.2.1 (2017-07-06) ------------------ - CI: Fix version specification and test on CI for PyPy/Windows #2608 diff --git a/docs/installation.rst b/docs/installation.rst index 3f634632a..f7834c495 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -379,7 +379,7 @@ These platforms are built and tested for every change. +----------------------------------+-------------------------------+-----------------------+ | Ubuntu Linux 12.04 LTS | 2.7 |x86-64 | +----------------------------------+-------------------------------+-----------------------+ -| Windows Server 2012 R2 | 2.7,3.3,3.4 |x86, x86-64 | +| Windows Server 2012 R2 | 2.7,3.3,3.4,pypy |x86, x86-64 | +----------------------------------+-------------------------------+-----------------------+ \* Mac OS X CI is not run for every commit, but is run for every release. diff --git a/docs/releasenotes/4.2.1.rst b/docs/releasenotes/4.2.1.rst new file mode 100644 index 000000000..c9e953da4 --- /dev/null +++ b/docs/releasenotes/4.2.1.rst @@ -0,0 +1,11 @@ +4.2.1 +----- + +There are no functional changes in this release. + +Fixed Windows PyPy Build +======================== + +A change in the 4.2.0 cycle broke the Windows PyPy build. This has +been fixed, and PyPy is now part of the Windows CI matrix. + diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 624c727a9..27b12face 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -6,6 +6,7 @@ Release Notes .. toctree:: :maxdepth: 2 + 4.2.1 4.2.0 4.1.1 4.1.0 From 79f25384e1ba5ccf9135238ac58f44a016847f83 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 9 Jul 2017 21:18:31 +1000 Subject: [PATCH 614/632] Updated libimagequant to 2.10.1 --- depends/install_imagequant.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index a92b63f95..0b19525d2 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.10.0 +archive=libimagequant-2.10.1 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz From f8fb58f925e2d165bafe3cbd08ad772dd1af65ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jani=20=C5=A0umak?= Date: Thu, 13 Jul 2017 22:35:40 +0200 Subject: [PATCH 615/632] Added the description of the filename attribute to images.rst Images created with `open` have a filename attribute, but the documentation does not mention it. This lead to a short, but interesting discussion on [Stackoverflow](https://stackoverflow.com/questions/45087638/get-image-filename-from-image-pil/). --- docs/reference/Image.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index 3335cb3da..e867494b2 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -165,6 +165,14 @@ Attributes Instances of the :py:class:`Image` class have the following attributes: +.. py:attribute:: filename + + The filename or path of the source file. Only images created with the + factory function `open` have a filename attribute. If the input is a + file like object, the filename attribute is set to an empty string. + + :type: :py:class: `string` + .. py:attribute:: format The file format of the source file. For images created by the library From 353e26432fd690465961802d48ca5e6529aa5c2b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 14 Jul 2017 23:02:53 +0100 Subject: [PATCH 616/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 9daff9d56..0a10cde96 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.3.0 (unreleased) ------------------ +- Docs: added the description of the filename attribute to images.rst #2621 + [dasdachs] + - Dependencies: Updated libimagequant to 2.10.0 #2605 [radarhere] From a99ce5a2a386a56abbc7241f6fd2b648fe3795d0 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 14 Jul 2017 23:04:51 +0100 Subject: [PATCH 617/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 0a10cde96..f3912c354 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -7,7 +7,7 @@ Changelog (Pillow) - Docs: added the description of the filename attribute to images.rst #2621 [dasdachs] -- Dependencies: Updated libimagequant to 2.10.0 #2605 +- Dependencies: Updated libimagequant to 2.10.1 #2616 [radarhere] - PDF: Renamed parameter to not shadow built-in dict #2612 From 844b812ebd939a58e0dbfc2d09d54413c260810d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 15 Jul 2017 17:12:33 +1000 Subject: [PATCH 618/632] Removed debugging code --- Tests/test_imagefont.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 4b477796b..12b687c3b 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -63,11 +63,11 @@ class TestImageFont(PillowTestCase): def setUp(self): freetype_version = tuple(ImageFont.core.freetype2_version.split('.'))[:2] self.metrics = self.METRICS.get(freetype_version, self.METRICS['Default']) - + def get_font(self): return ImageFont.truetype(FONT_PATH, FONT_SIZE, layout_engine=self.LAYOUT_ENGINE) - + def test_sanity(self): self.assertRegexpMatches( ImageFont.core.freetype2_version, r"\d+\.\d+\.\d+$") @@ -248,9 +248,7 @@ class TestImageFont(PillowTestCase): target = 'Tests/images/multiline_text_spacing.png' target_img = Image.open(target) - from PIL import ImageChops - - ImageChops.difference(im, target_img).save('multiline.png') + # Epsilon ~.5 fails with FreeType 2.7 self.assert_image_similar(im, target_img, self.metrics['multiline']) From f33976f81da6f8979c3489a8f16d9b6ebf9832c2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 16 Jul 2017 15:21:26 +1000 Subject: [PATCH 619/632] Corrected class name in ImageDraw docs --- docs/reference/ImageDraw.rst | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index af9845098..4eee0fd20 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -121,7 +121,7 @@ Functions Methods ------- -.. py:method:: PIL.ImageDraw.Draw.arc(xy, start, end, fill=None) +.. py:method:: PIL.ImageDraw.ImageDraw.arc(xy, start, end, fill=None) Draws an arc (a portion of a circle outline) between the start and end angles, inside the given bounding box. @@ -133,7 +133,7 @@ Methods :param end: Ending angle, in degrees. :param fill: Color to use for the arc. -.. py:method:: PIL.ImageDraw.Draw.bitmap(xy, bitmap, fill=None) +.. py:method:: PIL.ImageDraw.ImageDraw.bitmap(xy, bitmap, fill=None) Draws a bitmap (mask) at the given position, using the current fill color for the non-zero portions. The bitmap should be a valid transparency mask @@ -144,9 +144,9 @@ Methods To paste pixel data into an image, use the :py:meth:`~PIL.Image.Image.paste` method on the image itself. -.. py:method:: PIL.ImageDraw.Draw.chord(xy, start, end, fill=None, outline=None) +.. py:method:: PIL.ImageDraw.ImageDraw.chord(xy, start, end, fill=None, outline=None) - Same as :py:meth:`~PIL.ImageDraw.Draw.arc`, but connects the end points + Same as :py:meth:`~PIL.ImageDraw.ImageDraw.arc`, but connects the end points with a straight line. :param xy: Four points to define the bounding box. Sequence of @@ -154,7 +154,7 @@ Methods :param outline: Color to use for the outline. :param fill: Color to use for the fill. -.. py:method:: PIL.ImageDraw.Draw.ellipse(xy, fill=None, outline=None) +.. py:method:: PIL.ImageDraw.ImageDraw.ellipse(xy, fill=None, outline=None) Draws an ellipse inside the given bounding box. @@ -163,7 +163,7 @@ Methods :param outline: Color to use for the outline. :param fill: Color to use for the fill. -.. py:method:: PIL.ImageDraw.Draw.line(xy, fill=None, width=0) +.. py:method:: PIL.ImageDraw.ImageDraw.line(xy, fill=None, width=0) Draws a line between the coordinates in the **xy** list. @@ -177,7 +177,7 @@ Methods .. note:: This option was broken until version 1.1.6. -.. py:method:: PIL.ImageDraw.Draw.pieslice(xy, start, end, fill=None, outline=None) +.. py:method:: PIL.ImageDraw.ImageDraw.pieslice(xy, start, end, fill=None, outline=None) Same as arc, but also draws straight lines between the end points and the center of the bounding box. @@ -190,7 +190,7 @@ Methods :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) +.. py:method:: PIL.ImageDraw.ImageDraw.point(xy, fill=None) Draws points (individual pixels) at the given coordinates. @@ -198,7 +198,7 @@ Methods numeric values like ``[x, y, x, y, ...]``. :param fill: Color to use for the point. -.. py:method:: PIL.ImageDraw.Draw.polygon(xy, fill=None, outline=None) +.. py:method:: PIL.ImageDraw.ImageDraw.polygon(xy, fill=None, outline=None) Draws a polygon. @@ -211,7 +211,7 @@ Methods :param outline: Color to use for the outline. :param fill: Color to use for the fill. -.. py:method:: PIL.ImageDraw.Draw.rectangle(xy, fill=None, outline=None) +.. py:method:: PIL.ImageDraw.ImageDraw.rectangle(xy, fill=None, outline=None) Draws a rectangle. @@ -221,13 +221,13 @@ Methods :param outline: Color to use for the outline. :param fill: Color to use for the fill. -.. py:method:: PIL.ImageDraw.Draw.shape(shape, fill=None, outline=None) +.. py:method:: PIL.ImageDraw.ImageDraw.shape(shape, fill=None, outline=None) .. warning:: This method is experimental. Draw a shape. -.. py:method:: PIL.ImageDraw.Draw.text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", direction=None, features=None) +.. py:method:: PIL.ImageDraw.ImageDraw.text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", direction=None, features=None) Draws the string at the given position. @@ -260,7 +260,7 @@ Methods .. versionadded:: 4.2.0 -.. py:method:: PIL.ImageDraw.Draw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", +.. py:method:: PIL.ImageDraw.ImageDraw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", direction=None, features=None) Draws the string at the given position. @@ -291,7 +291,7 @@ Methods .. versionadded:: 4.2.0 -.. py:method:: PIL.ImageDraw.Draw.textsize(text, font=None, spacing=4, direction=None, +.. py:method:: PIL.ImageDraw.ImageDraw.textsize(text, font=None, spacing=4, direction=None, features=None) Return the size of the given string, in pixels. @@ -321,8 +321,7 @@ Methods .. versionadded:: 4.2.0 - -.. py:method:: PIL.ImageDraw.Draw.multiline_textsize(text, font=None, spacing=4, direction=None, +.. py:method:: PIL.ImageDraw.ImageDraw.multiline_textsize(text, font=None, spacing=4, direction=None, features=None) Return the size of the given string, in pixels. From a05c2cf7ff99b41574d2266e2ec50eaa471618ae Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 16 Jul 2017 15:22:46 +1000 Subject: [PATCH 620/632] Improved ImageDraw documentation --- PIL/ImageDraw.py | 11 +++++++---- docs/reference/ImageDraw.rst | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 7b8fa6cf5..89df27338 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -87,7 +87,10 @@ class ImageDraw(object): self.font = None def getfont(self): - """Get the current default font.""" + """ + Get the current default font. + + :returns: An image font.""" if not self.font: # FIXME: should add a font repository from . import ImageFont @@ -330,8 +333,8 @@ def floodfill(image, xy, value, border=None, thresh=0): pixels with a color different from the border color. If not given, the region consists of pixels having the same color as the seed pixel. - :param thresh: Optional threshold value which specifies a maximum - tolerable difference of a pixel value from the 'background' in + :param thresh: Optional threshold value which specifies a maximum + tolerable difference of a pixel value from the 'background' in order for it to be replaced. Useful for filling regions of non- homogeneous, but similar, colors. """ @@ -375,7 +378,7 @@ def floodfill(image, xy, value, border=None, thresh=0): newedge.append((s, t)) edge = newedge - + def _color_diff(rgb1, rgb2): """ Uses 1-norm distance to calculate difference between two rgb values. diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 4eee0fd20..ea55dd75f 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -121,6 +121,12 @@ Functions Methods ------- +.. py:method:: PIL.ImageDraw.ImageDraw.getfont() + + Get the current default font. + + :returns: An image font. + .. py:method:: PIL.ImageDraw.ImageDraw.arc(xy, start, end, fill=None) Draws an arc (a portion of a circle outline) between the start and end @@ -348,3 +354,32 @@ Methods Requires libraqm. .. versionadded:: 4.2.0 + +.. py:method:: PIL.ImageDraw.getdraw(im=None, hints=None) + + .. warning:: This method is experimental. + + A more advanced 2D drawing interface for PIL images, + based on the WCK interface. + + :param im: The image to draw in. + :param hints: An optional list of hints. + :returns: A (drawing context, drawing resource factory) tuple. + +.. py:method:: PIL.ImageDraw.floodfill(image, xy, value, border=None, thresh=0) + + .. warning:: This method is experimental. + + Fills a bounded region with a given color. + + :param image: Target image. + :param xy: Seed position (a 2-item coordinate tuple). + :param value: Fill color. + :param border: Optional border value. If given, the region consists of + pixels with a color different from the border color. If not given, + the region consists of pixels having the same color as the seed + pixel. + :param thresh: Optional threshold value which specifies a maximum + tolerable difference of a pixel value from the 'background' in + order for it to be replaced. Useful for filling regions of non- + homogeneous, but similar, colors. From 3dd3a906465dd7afc36c483b6dfd7554596618ea Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 15 Jul 2017 17:39:39 +1000 Subject: [PATCH 621/632] Added fix for font getsize on empty string --- _imagingft.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index cd17758e4..3eb8bc0b7 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -109,7 +109,7 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) unsigned char* font_bytes; int font_bytes_size = 0; static char* kwlist[] = { - "filename", "size", "index", "encoding", "font_bytes", + "filename", "size", "index", "encoding", "font_bytes", "layout_engine", NULL }; @@ -449,8 +449,6 @@ font_getsize(FontObject* self, PyObject* args) y_max = y_min = 0; count = text_layout(string, self, dir, features, &glyph_info, 0); - if (count == 0) - return NULL; for (x = i = 0; i < count; i++) { int index, error; From d2b3e60bbbb78f4ad1626b6aa8ffc15ca2bf3ed4 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 14 Jul 2017 03:57:07 -0700 Subject: [PATCH 622/632] test for issue #2614 --- Tests/test_imagefont.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 12b687c3b..fde312f44 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -393,6 +393,11 @@ class TestImageFont(PillowTestCase): # Assert self.assert_image_equal(im, target_img) + def test_getsize_empty(self): + font = self.get_font() + # should not crash. + self.assertEqual((0, 0), font.getsize('')) + 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) From 9406e8ea81b3563fb82a0170faca186ff30d08f0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 16 Jul 2017 17:37:51 +1000 Subject: [PATCH 623/632] Corrected alpha_composite args documentation --- PIL/Image.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index dd97c26bd..49c9f6ab2 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1069,7 +1069,7 @@ class Image(object): _decompression_bomb_check((x1, y1)) return im.crop((x0, y0, x1, y1)) - + def draft(self, mode, size): """ Configures the image file loader so it returns a version of the @@ -1381,12 +1381,12 @@ class Image(object): onto this image. :param im: image to composite over this one - :param dest: Optional 2 tuple (top, left) specifying the upper + :param dest: Optional 2 tuple (left, top) specifying the upper left corner in this (destination) image. - :param source: Optional 2 (top, left) tuple for the upper left - corner in the overlay source image, or 4 tuple (top, left, bottom, - right) for the bounds of the source rectangle - + :param source: Optional 2 (left, top) tuple for the upper left + corner in the overlay source image, or 4 tuple (left, top, right, + bottom) for the bounds of the source rectangle + Performance Note: Not currently implemented in-place in the core layer. """ @@ -1406,7 +1406,7 @@ class Image(object): if len(source) == 2: source = source + im.size - # over image, crop if it's not the whole thing. + # over image, crop if it's not the whole thing. if source == (0,0) + im.size: overlay = im else: @@ -1414,16 +1414,16 @@ class Image(object): # target for the paste box = dest + (dest[0] + overlay.width, dest[1] + overlay.height) - + # destination image. don't copy if we're using the whole image. if dest == (0,0) + self.size: background = self else: background = self.crop(box) - + result = alpha_composite(background, overlay) self.paste(result, box) - + def point(self, lut, mode=None): """ Maps this image through a lookup table or function. From 8bf9de331048d7a9c97720bb40e3706fb1cb93cc Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 16 Jul 2017 16:23:57 +0100 Subject: [PATCH 624/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f3912c354..a6408ef6a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.3.0 (unreleased) ------------------ +- Docs: Corrected alpha_composite args documentation #2627 + [radarhere] + - Docs: added the description of the filename attribute to images.rst #2621 [dasdachs] From a28e89be83ca702d2df64c88b81de532caff83ea Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 16 Jul 2017 16:28:29 +0100 Subject: [PATCH 625/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index a6408ef6a..c7ec9b1da 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.3.0 (unreleased) ------------------ +- Docs: Improved ImageDraw documentation #2626 + [radarhere] + - Docs: Corrected alpha_composite args documentation #2627 [radarhere] From 0cd84cf9b38c37fa27454cf262514308cc84ab2c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 16 Jul 2017 16:32:19 +0100 Subject: [PATCH 626/632] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index c7ec9b1da..f19ded408 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.3.0 (unreleased) ------------------ +- Bug: Fix for font getsize on empty string #2624 + [radarhere] + - Docs: Improved ImageDraw documentation #2626 [radarhere] From 7a8161162f599dea3205a90b55505a3d88610859 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 18 Jul 2017 00:54:11 -0700 Subject: [PATCH 627/632] fix for https://github.com/python-pillow/Pillow/issues/2628#issuecomment-315962612 --- PIL/JpegImagePlugin.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index ee29a8add..47fb0a6df 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -119,8 +119,8 @@ def APP(self, marker): # If DPI isn't in JPEG header, fetch from EXIF if "dpi" not in self.info and "exif" in self.info: - exif = self._getexif() try: + exif = self._getexif() resolution_unit = exif[0x0128] x_resolution = exif[0x011A] try: @@ -131,7 +131,9 @@ def APP(self, marker): # 1 dpcm = 2.54 dpi dpi *= 2.54 self.info["dpi"] = dpi, dpi - except KeyError: + except (KeyError, SyntaxError): + # SyntaxError for invalid/unreadable exif + # KeyError for dpi not included self.info["dpi"] = 72, 72 From 908fffdd2c5091b21924cf525cd750e7ce9119ae Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 18 Jul 2017 01:06:54 -0700 Subject: [PATCH 628/632] Test for https://github.com/python-pillow/Pillow/issues/2628#issuecomment-315962612 --- Tests/images/invalid-exif.jpg | Bin 0 -> 10897 bytes Tests/test_file_jpeg.py | 9 +++++++++ 2 files changed, 9 insertions(+) create mode 100644 Tests/images/invalid-exif.jpg diff --git a/Tests/images/invalid-exif.jpg b/Tests/images/invalid-exif.jpg new file mode 100644 index 0000000000000000000000000000000000000000..948b8e05515ab2d337fbe8ed84bf4a58999f1c5f GIT binary patch literal 10897 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 W#1a#0dx*8IMEgJlWE;fwvws7 Date: Tue, 25 Jul 2017 11:03:36 +0300 Subject: [PATCH 629/632] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f19ded408..05b07d53c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 4.3.0 (unreleased) ------------------ +- Bug: Fix JPEG DPI when EXIF is invalid #2632 + [wiredfool] + - Bug: Fix for font getsize on empty string #2624 [radarhere] From af4d830ce963241d7ff6ca7b5c3c1d0bba43278c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 6 Aug 2017 12:39:04 +1000 Subject: [PATCH 630/632] Remove Landscape/health badge [ci skip] --- docs/index.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 0a9a5722f..55ba13bb7 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -30,10 +30,6 @@ Pillow is the friendly PIL fork by `Alex Clark and Contributors Date: Mon, 7 Aug 2017 00:20:35 +0300 Subject: [PATCH 631/632] Fix Filter.c module indention --- libImaging/Filter.c | 98 ++++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/libImaging/Filter.c b/libImaging/Filter.c index 9079fbf88..4c8b81587 100644 --- a/libImaging/Filter.c +++ b/libImaging/Filter.c @@ -33,13 +33,13 @@ ImagingExpand(Imaging imIn, int xmargin, int ymargin, int mode) int x, y; if (xmargin < 0 && ymargin < 0) - return (Imaging) ImagingError_ValueError("bad kernel size"); + return (Imaging) ImagingError_ValueError("bad kernel size"); imOut = ImagingNew( imIn->mode, imIn->xsize+2*xmargin, imIn->ysize+2*ymargin ); if (!imOut) - return NULL; + return NULL; #define EXPAND_LINE(type, image, yin, yout) {\ for (x = 0; x < xmargin; x++)\ @@ -61,9 +61,9 @@ ImagingExpand(Imaging imIn, int xmargin, int ymargin, int mode) } if (imIn->image8) { - EXPAND(UINT8, image8); + EXPAND(UINT8, image8); } else { - EXPAND(INT32, image32); + EXPAND(INT32, image32); } ImagingCopyInfo(imOut, imIn); @@ -80,20 +80,20 @@ ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32* kernel, FLOAT32 sum; if (!im || strcmp(im->mode, "L") != 0) - return (Imaging) ImagingError_ModeError(); + return (Imaging) ImagingError_ModeError(); if (im->xsize < xsize || im->ysize < ysize) return ImagingCopy(im); if ((xsize != 3 && xsize != 5) || xsize != ysize) - return (Imaging) ImagingError_ValueError("bad kernel size"); + return (Imaging) ImagingError_ValueError("bad kernel size"); imOut = ImagingNew(im->mode, im->xsize, im->ysize); if (!imOut) - return NULL; + return NULL; /* brute force kernel implementations */ -#define KERNEL3x3(image, kernel, d) ( \ +#define KERNEL3x3(image, kernel, d) ( \ (int) image[y+1][x-d] * kernel[0] + \ (int) image[y+1][x] * kernel[1] + \ (int) image[y+1][x+d] * kernel[2] + \ @@ -104,7 +104,7 @@ ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32* kernel, (int) image[y-1][x] * kernel[7] + \ (int) image[y-1][x+d] * kernel[8]) -#define KERNEL5x5(image, kernel, d) ( \ +#define KERNEL5x5(image, kernel, d) ( \ (int) image[y+2][x-d-d] * kernel[0] + \ (int) image[y+2][x-d] * kernel[1] + \ (int) image[y+2][x] * kernel[2] + \ @@ -132,47 +132,47 @@ ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32* kernel, (int) image[y-2][x+d+d] * kernel[24]) if (xsize == 3) { - /* 3x3 kernel. */ - for (x = 0; x < im->xsize; x++) - imOut->image[0][x] = im->image8[0][x]; - for (y = 1; y < im->ysize-1; y++) { - imOut->image[y][0] = im->image8[y][0]; - for (x = 1; x < im->xsize-1; x++) { - sum = KERNEL3x3(im->image8, kernel, 1) / divisor + offset; - if (sum <= 0) - imOut->image8[y][x] = 0; - else if (sum >= 255) - imOut->image8[y][x] = 255; - else - imOut->image8[y][x] = (UINT8) sum; - } - imOut->image8[y][x] = im->image8[y][x]; - } - for (x = 0; x < im->xsize; x++) - imOut->image8[y][x] = im->image8[y][x]; + /* 3x3 kernel. */ + for (x = 0; x < im->xsize; x++) + imOut->image[0][x] = im->image8[0][x]; + for (y = 1; y < im->ysize-1; y++) { + imOut->image[y][0] = im->image8[y][0]; + for (x = 1; x < im->xsize-1; x++) { + sum = KERNEL3x3(im->image8, kernel, 1) / divisor + offset; + if (sum <= 0) + imOut->image8[y][x] = 0; + else if (sum >= 255) + imOut->image8[y][x] = 255; + else + imOut->image8[y][x] = (UINT8) sum; + } + imOut->image8[y][x] = im->image8[y][x]; + } + for (x = 0; x < im->xsize; x++) + imOut->image8[y][x] = im->image8[y][x]; } else { - /* 5x5 kernel. */ - for (y = 0; y < 2; y++) - for (x = 0; x < im->xsize; x++) - imOut->image8[y][x] = im->image8[y][x]; - for (; y < im->ysize-2; y++) { - for (x = 0; x < 2; x++) - imOut->image8[y][x] = im->image8[y][x]; - for (; x < im->xsize-2; x++) { - sum = KERNEL5x5(im->image8, kernel, 1) / divisor + offset; - if (sum <= 0) - imOut->image8[y][x] = 0; - else if (sum >= 255) - imOut->image8[y][x] = 255; - else - imOut->image8[y][x] = (UINT8) sum; - } - for (; x < im->xsize; x++) - imOut->image8[y][x] = im->image8[y][x]; - } - for (; y < im->ysize; y++) - for (x = 0; x < im->xsize; x++) - imOut->image8[y][x] = im->image8[y][x]; + /* 5x5 kernel. */ + for (y = 0; y < 2; y++) + for (x = 0; x < im->xsize; x++) + imOut->image8[y][x] = im->image8[y][x]; + for (; y < im->ysize-2; y++) { + for (x = 0; x < 2; x++) + imOut->image8[y][x] = im->image8[y][x]; + for (; x < im->xsize-2; x++) { + sum = KERNEL5x5(im->image8, kernel, 1) / divisor + offset; + if (sum <= 0) + imOut->image8[y][x] = 0; + else if (sum >= 255) + imOut->image8[y][x] = 255; + else + imOut->image8[y][x] = (UINT8) sum; + } + for (; x < im->xsize; x++) + imOut->image8[y][x] = im->image8[y][x]; + } + for (; y < im->ysize; y++) + for (x = 0; x < im->xsize; x++) + imOut->image8[y][x] = im->image8[y][x]; } return imOut; } From ffe0c3b0afa5bbd9b93c79a1b35787332d9a56b1 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 9 Aug 2017 03:48:24 +0300 Subject: [PATCH 632/632] Fix Bands.c module indention --- libImaging/Bands.c | 58 +++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/libImaging/Bands.c b/libImaging/Bands.c index cc8d634dd..d7424ab25 100644 --- a/libImaging/Bands.c +++ b/libImaging/Bands.c @@ -30,14 +30,14 @@ ImagingGetBand(Imaging imIn, int band) /* Check arguments */ if (!imIn || imIn->type != IMAGING_TYPE_UINT8) - return (Imaging) ImagingError_ModeError(); + return (Imaging) ImagingError_ModeError(); if (band < 0 || band >= imIn->bands) - return (Imaging) ImagingError_ValueError("band index out of range"); + return (Imaging) ImagingError_ValueError("band index out of range"); /* Shortcuts */ if (imIn->bands == 1) - return ImagingCopy(imIn); + return ImagingCopy(imIn); /* Special case for LXXA etc */ if (imIn->bands == 2 && band == 1) @@ -45,16 +45,16 @@ ImagingGetBand(Imaging imIn, int band) imOut = ImagingNew("L", imIn->xsize, imIn->ysize); if (!imOut) - return NULL; + return NULL; /* Extract band from image */ for (y = 0; y < imIn->ysize; y++) { - UINT8* in = (UINT8*) imIn->image[y] + band; - UINT8* out = imOut->image8[y]; - for (x = 0; x < imIn->xsize; x++) { - out[x] = *in; - in += 4; - } + UINT8* in = (UINT8*) imIn->image[y] + band; + UINT8* out = imOut->image8[y]; + for (x = 0; x < imIn->xsize; x++) { + out[x] = *in; + in += 4; + } } return imOut; @@ -67,19 +67,19 @@ ImagingPutBand(Imaging imOut, Imaging imIn, int band) /* Check arguments */ if (!imIn || imIn->bands != 1 || !imOut) - return (Imaging) ImagingError_ModeError(); + return (Imaging) ImagingError_ModeError(); if (band < 0 || band >= imOut->bands) - return (Imaging) ImagingError_ValueError("band index out of range"); + return (Imaging) ImagingError_ValueError("band index out of range"); if (imIn->type != imOut->type || - imIn->xsize != imOut->xsize || - imIn->ysize != imOut->ysize) - return (Imaging) ImagingError_Mismatch(); + imIn->xsize != imOut->xsize || + imIn->ysize != imOut->ysize) + return (Imaging) ImagingError_Mismatch(); /* Shortcuts */ if (imOut->bands == 1) - return ImagingCopy2(imOut, imIn); + return ImagingCopy2(imOut, imIn); /* Special case for LXXA etc */ if (imOut->bands == 2 && band == 1) @@ -87,12 +87,12 @@ ImagingPutBand(Imaging imOut, Imaging imIn, int band) /* Insert band into image */ for (y = 0; y < imIn->ysize; y++) { - UINT8* in = imIn->image8[y]; - UINT8* out = (UINT8*) imOut->image[y] + band; - for (x = 0; x < imIn->xsize; x++) { - *out = in[x]; - out += 4; - } + UINT8* in = imIn->image8[y]; + UINT8* out = (UINT8*) imOut->image[y] + band; + for (x = 0; x < imIn->xsize; x++) { + *out = in[x]; + out += 4; + } } return imOut; @@ -105,10 +105,10 @@ ImagingFillBand(Imaging imOut, int band, int color) /* Check arguments */ if (!imOut || imOut->type != IMAGING_TYPE_UINT8) - return (Imaging) ImagingError_ModeError(); + return (Imaging) ImagingError_ModeError(); if (band < 0 || band >= imOut->bands) - return (Imaging) ImagingError_ValueError("band index out of range"); + return (Imaging) ImagingError_ValueError("band index out of range"); /* Special case for LXXA etc */ if (imOut->bands == 2 && band == 1) @@ -118,11 +118,11 @@ ImagingFillBand(Imaging imOut, int band, int color) /* Insert color into image */ for (y = 0; y < imOut->ysize; y++) { - UINT8* out = (UINT8*) imOut->image[y] + band; - for (x = 0; x < imOut->xsize; x++) { - *out = (UINT8) color; - out += 4; - } + UINT8* out = (UINT8*) imOut->image[y] + band; + for (x = 0; x < imOut->xsize; x++) { + *out = (UINT8) color; + out += 4; + } } return imOut;

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