mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-24 17:06:16 +03:00
Merge remote-tracking branch 'upstream/master' into flake8_winbuild
Conflicts: winbuild/config.py
This commit is contained in:
commit
02caa81bfe
11
CHANGES.rst
11
CHANGES.rst
|
@ -4,8 +4,17 @@ Changelog (Pillow)
|
|||
2.9.0 (Unreleased)
|
||||
------------------
|
||||
|
||||
- Update tiff and tk tcl 8.5 versions #1303
|
||||
- Fixed ValueError in Python 2.6 #1315 #1316
|
||||
[cgohlke, radarhere]
|
||||
|
||||
- Fixed tox test script path #1308
|
||||
[radarhere]
|
||||
|
||||
- Added width and height properties #1304
|
||||
[radarhere]
|
||||
|
||||
- Update tiff and tk tcl 8.5 versions #1303
|
||||
[radarhere, wiredfool]
|
||||
|
||||
- Add functions to convert: Image <-> QImage; Image <-> QPixmap #1217
|
||||
[radarhere, rominf]
|
||||
|
|
21
MANIFEST.in
21
MANIFEST.in
|
@ -1,14 +1,16 @@
|
|||
|
||||
include *.c
|
||||
include *.h
|
||||
include *.in
|
||||
include *.md
|
||||
include *.py
|
||||
include *.sh
|
||||
include *.rst
|
||||
include *.sh
|
||||
include *.txt
|
||||
include *.yaml
|
||||
include *.yml
|
||||
include .coveragerc
|
||||
include .gitattributes
|
||||
include .travis.yml
|
||||
include LICENSE
|
||||
include Makefile
|
||||
include tox.ini
|
||||
|
@ -16,7 +18,6 @@ recursive-include PIL *.md
|
|||
recursive-include Scripts *.py
|
||||
recursive-include Scripts *.rst
|
||||
recursive-include Scripts *.sh
|
||||
recursive-include Scripts README.rst
|
||||
recursive-include Tests *.bdf
|
||||
recursive-include Tests *.bin
|
||||
recursive-include Tests *.bmp
|
||||
|
@ -33,11 +34,13 @@ recursive-include Tests *.html
|
|||
recursive-include Tests *.icc
|
||||
recursive-include Tests *.icns
|
||||
recursive-include Tests *.ico
|
||||
recursive-include Tests *.im
|
||||
recursive-include Tests *.j2k
|
||||
recursive-include Tests *.jp2
|
||||
recursive-include Tests *.jpg
|
||||
recursive-include Tests *.lut
|
||||
recursive-include Tests *.mpo
|
||||
recursive-include Tests *.msp
|
||||
recursive-include Tests *.pbm
|
||||
recursive-include Tests *.pcf
|
||||
recursive-include Tests *.pcx
|
||||
|
@ -59,8 +62,8 @@ recursive-include Tests *.tiff
|
|||
recursive-include Tests *.ttf
|
||||
recursive-include Tests *.txt
|
||||
recursive-include Tests *.webp
|
||||
recursive-include Tests *.xbm
|
||||
recursive-include Tests *.xpm
|
||||
recursive-include Tests *.msp
|
||||
recursive-include Tk *.c
|
||||
recursive-include Tk *.rst
|
||||
recursive-include depends *.rst
|
||||
|
@ -71,9 +74,13 @@ recursive-include docs *.html
|
|||
recursive-include docs *.py
|
||||
recursive-include docs *.rst
|
||||
recursive-include docs *.txt
|
||||
recursive-include docs BUILDME
|
||||
recursive-include docs COPYING
|
||||
recursive-include docs Guardfile
|
||||
recursive-include docs Makefile
|
||||
recursive-include docs Guardfile
|
||||
recursive-include docs COPYING
|
||||
recursive-include docs BUILDME
|
||||
recursive-include libImaging *.c
|
||||
recursive-include libImaging *.h
|
||||
recursive-include winbuild *.gitignore
|
||||
recursive-include winbuild *.md
|
||||
recursive-include winbuild *.opt
|
||||
recursive-include winbuild *.py
|
||||
|
|
1
Makefile
1
Makefile
|
@ -1,5 +1,6 @@
|
|||
# https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html
|
||||
.PHONY: clean coverage doc docserve help inplace install install-req release-test sdist test upload upload-test
|
||||
.DEFAULT_GOAL := release-test
|
||||
|
||||
clean:
|
||||
python setup.py clean
|
||||
|
|
|
@ -127,8 +127,14 @@ class FliImageFile(ImageFile.ImageFile):
|
|||
return
|
||||
if frame < self.__frame:
|
||||
self._seek(0)
|
||||
|
||||
last_frame = self.__frame
|
||||
for f in range(self.__frame + 1, frame + 1):
|
||||
self._seek(f)
|
||||
try:
|
||||
self._seek(f)
|
||||
except EOFError:
|
||||
self.seek(last_frame)
|
||||
raise EOFError("no more images in FLI file")
|
||||
|
||||
def _seek(self, frame):
|
||||
if frame == 0:
|
||||
|
|
|
@ -107,8 +107,14 @@ class GifImageFile(ImageFile.ImageFile):
|
|||
return
|
||||
if frame < self.__frame:
|
||||
self._seek(0)
|
||||
|
||||
last_frame = self.__frame
|
||||
for f in range(self.__frame + 1, frame + 1):
|
||||
self._seek(f)
|
||||
try:
|
||||
self._seek(f)
|
||||
except EOFError:
|
||||
self.seek(last_frame)
|
||||
raise EOFError("no more images in GIF file")
|
||||
|
||||
def _seek(self, frame):
|
||||
|
||||
|
@ -241,7 +247,7 @@ class GifImageFile(ImageFile.ImageFile):
|
|||
|
||||
if not self.tile:
|
||||
# self.__fp = None
|
||||
raise EOFError("no more images in GIF file")
|
||||
raise EOFError
|
||||
|
||||
self.mode = "L"
|
||||
if self.palette:
|
||||
|
|
|
@ -504,6 +504,14 @@ class Image(object):
|
|||
self.readonly = 0
|
||||
self.pyaccess = None
|
||||
|
||||
@property
|
||||
def width(self):
|
||||
return self.size[0]
|
||||
|
||||
@property
|
||||
def height(self):
|
||||
return self.size[1]
|
||||
|
||||
def _new(self, im):
|
||||
new = Image()
|
||||
new.im = im
|
||||
|
|
|
@ -548,7 +548,7 @@ class ImageFileDirectory(collections.MutableMapping):
|
|||
# and doesn't match the tiff spec: 8-bit byte that
|
||||
# contains a 7-bit ASCII code; the last byte must be
|
||||
# NUL (binary zero). Also, I don't think this was well
|
||||
# excersized before.
|
||||
# exercised before.
|
||||
data = value = b"" + value.encode('ascii', 'replace') + b"\0"
|
||||
else:
|
||||
# integer data
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
# ;-)
|
||||
|
||||
VERSION = '1.1.7' # PIL version
|
||||
PILLOW_VERSION = '2.9.0.dev0' # Pillow
|
||||
PILLOW_VERSION = '2.9.0.dev1' # Pillow
|
||||
|
||||
_plugins = ['BmpImagePlugin',
|
||||
'BufrStubImagePlugin',
|
||||
|
|
|
@ -34,6 +34,18 @@ class TestFileDcx(PillowTestCase):
|
|||
im = Image.open(TEST_FILE)
|
||||
self.assertEqual(im.n_frames, 1)
|
||||
|
||||
def test_eoferror(self):
|
||||
im = Image.open(TEST_FILE)
|
||||
|
||||
n_frames = im.n_frames
|
||||
while True:
|
||||
n_frames -= 1
|
||||
try:
|
||||
im.seek(n_frames)
|
||||
break
|
||||
except EOFError:
|
||||
self.assertTrue(im.tell() < n_frames)
|
||||
|
||||
def test_seek_too_far(self):
|
||||
# Arrange
|
||||
im = Image.open(TEST_FILE)
|
||||
|
|
|
@ -20,7 +20,19 @@ class TestFileFli(PillowTestCase):
|
|||
|
||||
def test_n_frames(self):
|
||||
im = Image.open(test_file)
|
||||
self.assertEqual(im.n_frames, 2)
|
||||
self.assertEqual(im.n_frames, 1)
|
||||
|
||||
def test_eoferror(self):
|
||||
im = Image.open(test_file)
|
||||
|
||||
n_frames = im.n_frames
|
||||
while True:
|
||||
n_frames -= 1
|
||||
try:
|
||||
im.seek(n_frames)
|
||||
break
|
||||
except EOFError:
|
||||
self.assertTrue(im.tell() < n_frames)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
|
|
@ -135,8 +135,23 @@ class TestFileGif(PillowTestCase):
|
|||
self.assertEqual(framecount, 5)
|
||||
|
||||
def test_n_frames(self):
|
||||
im = Image.open(TEST_GIF)
|
||||
self.assertEqual(im.n_frames, 1)
|
||||
|
||||
im = Image.open("Tests/images/iss634.gif")
|
||||
self.assertEqual(im.n_frames, 43)
|
||||
self.assertEqual(im.n_frames, 42)
|
||||
|
||||
def test_eoferror(self):
|
||||
im = Image.open(TEST_GIF)
|
||||
|
||||
n_frames = im.n_frames
|
||||
while True:
|
||||
n_frames -= 1
|
||||
try:
|
||||
im.seek(n_frames)
|
||||
break
|
||||
except EOFError:
|
||||
self.assertTrue(im.tell() < n_frames)
|
||||
|
||||
def test_dispose_none(self):
|
||||
img = Image.open("Tests/images/dispose_none.gif")
|
||||
|
|
|
@ -19,6 +19,18 @@ class TestFileIm(PillowTestCase):
|
|||
im = Image.open(TEST_IM)
|
||||
self.assertEqual(im.n_frames, 1)
|
||||
|
||||
def test_eoferror(self):
|
||||
im = Image.open(TEST_IM)
|
||||
|
||||
n_frames = im.n_frames
|
||||
while True:
|
||||
n_frames -= 1
|
||||
try:
|
||||
im.seek(n_frames)
|
||||
break
|
||||
except EOFError:
|
||||
self.assertTrue(im.tell() < n_frames)
|
||||
|
||||
def test_roundtrip(self):
|
||||
out = self.tempfile('temp.im')
|
||||
im = hopper()
|
||||
|
|
|
@ -99,6 +99,18 @@ class TestFileMpo(PillowTestCase):
|
|||
im = Image.open("Tests/images/sugarshack.mpo")
|
||||
self.assertEqual(im.n_frames, 2)
|
||||
|
||||
def test_eoferror(self):
|
||||
im = Image.open("Tests/images/sugarshack.mpo")
|
||||
|
||||
n_frames = im.n_frames
|
||||
while True:
|
||||
n_frames -= 1
|
||||
try:
|
||||
im.seek(n_frames)
|
||||
break
|
||||
except EOFError:
|
||||
self.assertTrue(im.tell() < n_frames)
|
||||
|
||||
def test_image_grab(self):
|
||||
for test_file in test_files:
|
||||
im = Image.open(test_file)
|
||||
|
|
|
@ -23,6 +23,19 @@ class TestImagePsd(PillowTestCase):
|
|||
im = Image.open(test_file)
|
||||
self.assertEqual(im.n_frames, 2)
|
||||
|
||||
def test_eoferror(self):
|
||||
im = Image.open(test_file)
|
||||
|
||||
n_frames = im.n_frames
|
||||
while True:
|
||||
n_frames -= 1
|
||||
try:
|
||||
# PSD seek index starts at 1 rather than 0
|
||||
im.seek(n_frames+1)
|
||||
break
|
||||
except EOFError:
|
||||
self.assertTrue(im.tell() < n_frames)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
|
@ -157,6 +157,18 @@ class TestFileTiff(PillowTestCase):
|
|||
im = Image.open('Tests/images/multipage.tiff')
|
||||
self.assertEqual(im.n_frames, 3)
|
||||
|
||||
def test_eoferror(self):
|
||||
im = Image.open('Tests/images/multipage-lastframe.tif')
|
||||
|
||||
n_frames = im.n_frames
|
||||
while True:
|
||||
n_frames -= 1
|
||||
try:
|
||||
im.seek(n_frames)
|
||||
break
|
||||
except EOFError:
|
||||
self.assertTrue(im.tell() < n_frames)
|
||||
|
||||
def test_multipage(self):
|
||||
# issue #862
|
||||
im = Image.open('Tests/images/multipage.tiff')
|
||||
|
|
|
@ -30,6 +30,15 @@ class TestImage(PillowTestCase):
|
|||
# self.assertRaises(
|
||||
# MemoryError, lambda: Image.new("L", (1000000, 1000000)))
|
||||
|
||||
def test_width_height(self):
|
||||
im = Image.new("RGB", (1, 2))
|
||||
self.assertEqual(im.width, 1)
|
||||
self.assertEqual(im.height, 2)
|
||||
|
||||
im.size = (3, 4)
|
||||
self.assertEqual(im.width, 3)
|
||||
self.assertEqual(im.height, 4)
|
||||
|
||||
def test_invalid_image(self):
|
||||
if str is bytes:
|
||||
import StringIO
|
||||
|
|
|
@ -19,7 +19,7 @@ class TestToQImage(PillowQtTestCase, PillowTestCase):
|
|||
self.assertFalse(data.isNull())
|
||||
|
||||
# Test saving the file
|
||||
tempfile = self.tempfile('temp_{}.png'.format(mode))
|
||||
tempfile = self.tempfile('temp_{0}.png'.format(mode))
|
||||
data.save(tempfile)
|
||||
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ class TestToQPixmap(PillowQPixmapTestCase, PillowTestCase):
|
|||
self.assertFalse(data.isNull())
|
||||
|
||||
# Test saving the file
|
||||
tempfile = self.tempfile('temp_{}.png'.format(mode))
|
||||
tempfile = self.tempfile('temp_{0}.png'.format(mode))
|
||||
data.save(tempfile)
|
||||
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@
|
|||
* See the README file for information on usage and redistribution.
|
||||
*/
|
||||
|
||||
#define PILLOW_VERSION "2.9.0.dev0"
|
||||
#define PILLOW_VERSION "2.9.0.dev1"
|
||||
|
||||
#include "Python.h"
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
version: 2.9.pre.{build}
|
||||
shallow_clone: true
|
||||
clone_folder: c:\pillow
|
||||
init:
|
||||
- ECHO %PYTHON%
|
||||
|
|
|
@ -181,6 +181,18 @@ Instances of the :py:class:`Image` class have the following attributes:
|
|||
|
||||
:type: ``(width, height)``
|
||||
|
||||
.. py:attribute:: width
|
||||
|
||||
Image width, in pixels.
|
||||
|
||||
:type: :py:class:`int`
|
||||
|
||||
.. py:attribute:: height
|
||||
|
||||
Image height, in pixels.
|
||||
|
||||
:type: :py:class:`int`
|
||||
|
||||
.. py:attribute:: palette
|
||||
|
||||
Colour palette table, if any. If mode is “P”, this should be an instance of
|
||||
|
|
2
setup.py
2
setup.py
|
@ -90,7 +90,7 @@ except (ImportError, OSError):
|
|||
|
||||
|
||||
NAME = 'Pillow'
|
||||
PILLOW_VERSION = '2.9.0.dev0'
|
||||
PILLOW_VERSION = '2.9.0.dev1'
|
||||
TCL_ROOT = None
|
||||
JPEG_ROOT = None
|
||||
JPEG2K_ROOT = None
|
||||
|
|
2
tox.ini
2
tox.ini
|
@ -11,4 +11,4 @@ commands =
|
|||
{envpython} setup.py clean
|
||||
{envpython} setup.py build_ext --inplace
|
||||
{envpython} selftest.py
|
||||
{envpython} Tests/run.py --installed
|
||||
{envpython} test-installed.py --installed
|
||||
|
|
|
@ -93,18 +93,19 @@ endlocal
|
|||
""" % compiler
|
||||
|
||||
|
||||
def cp_tk():
|
||||
def cp_tk(ver_85, ver_86):
|
||||
versions = {'ver_85':ver_85, 'ver_86':ver_86}
|
||||
return r"""
|
||||
mkdir %INCLIB%\tcl85\include\X11
|
||||
copy /Y /B %BUILD%\tcl8.5.13\generic\*.h %INCLIB%\tcl85\include\
|
||||
copy /Y /B %BUILD%\tk8.5.13\generic\*.h %INCLIB%\tcl85\include\
|
||||
copy /Y /B %BUILD%\tk8.5.13\xlib\X11\* %INCLIB%\tcl85\include\X11\
|
||||
mkdir %%INCLIB%%\tcl85\include\X11
|
||||
copy /Y /B %%BUILD%%\tcl%(ver_85)s\generic\*.h %%INCLIB%%\tcl85\include\
|
||||
copy /Y /B %%BUILD%%\tk%(ver_85)s\generic\*.h %%INCLIB%%\tcl85\include\
|
||||
copy /Y /B %%BUILD%%\tk%(ver_85)s\xlib\X11\* %%INCLIB%%\tcl85\include\X11\
|
||||
|
||||
mkdir %INCLIB%\tcl86\include\X11
|
||||
copy /Y /B %BUILD%\tcl8.6.4\generic\*.h %INCLIB%\tcl86\include\
|
||||
copy /Y /B %BUILD%\tk8.6.4\generic\*.h %INCLIB%\tcl86\include\
|
||||
copy /Y /B %BUILD%\tk8.6.4\xlib\X11\* %INCLIB%\tcl86\include\X11\
|
||||
"""
|
||||
mkdir %%INCLIB%%\tcl86\include\X11
|
||||
copy /Y /B %%BUILD%%\tcl%(ver_86)s\generic\*.h %%INCLIB%%\tcl86\include\
|
||||
copy /Y /B %%BUILD%%\tk%(ver_86)s\generic\*.h %%INCLIB%%\tcl86\include\
|
||||
copy /Y /B %%BUILD%%\tk%(ver_86)s\xlib\X11\* %%INCLIB%%\tcl86\include\X11\
|
||||
""" % versions
|
||||
|
||||
|
||||
def header():
|
||||
|
@ -307,7 +308,7 @@ def add_compiler(compiler):
|
|||
mkdirs()
|
||||
fetch_libs()
|
||||
# extract_binlib()
|
||||
script = [header(), cp_tk()]
|
||||
script = [header(), cp_tk(libs['tk-8.5']['version'],libs['tk-8.6']['version'] )]
|
||||
|
||||
|
||||
if 'PYTHON' in os.environ:
|
||||
|
|
|
@ -24,7 +24,7 @@ libs = {
|
|||
},
|
||||
'tiff': {
|
||||
'url': 'ftp://ftp.remotesensing.org/pub/libtiff/tiff-4.0.4.zip',
|
||||
'hash': 'md5:8f538a34156188f9a8dcddb679c65d1e', # not found - generated by wiredfool
|
||||
'hash': 'md5:8f538a34156188f9a8dcddb679c65d1e',
|
||||
'dir': 'tiff-4.0.4',
|
||||
},
|
||||
'freetype': {
|
||||
|
@ -46,6 +46,7 @@ libs = {
|
|||
'url': SF_MIRROR+'/project/tcl/Tcl/8.5.18/tk8518-src.zip',
|
||||
'hash': 'sha1:273f55148777413774aa722ecad25cabda1e31ae',
|
||||
'dir': '',
|
||||
'version':'8.5.18',
|
||||
},
|
||||
'tcl-8.6': {
|
||||
'url': SF_MIRROR+'/project/tcl/Tcl/8.6.4/tcl864-src.zip',
|
||||
|
@ -56,6 +57,7 @@ libs = {
|
|||
'url': SF_MIRROR+'/project/tcl/Tcl/8.6.4/tk864-src.zip',
|
||||
'hash': 'md5:111d45061a69e7f5250b6ec8ca7c4f35',
|
||||
'dir': '',
|
||||
'version':'8.6.4',
|
||||
},
|
||||
'webp': {
|
||||
'url': 'http://downloads.webmproject.org/releases/webp/libwebp-0.4.3.tar.gz',
|
||||
|
|
Loading…
Reference in New Issue
Block a user