Drop support for EOL Python 2.7

This commit is contained in:
Hugo 2019-09-26 15:12:28 +03:00
parent 127b322194
commit af770a6c55
61 changed files with 217 additions and 877 deletions

View File

@ -13,13 +13,7 @@ environment:
TEST_OPTIONS:
DEPLOY: YES
matrix:
- PYTHON: C:/vp/pypy2
EXECUTABLE: bin/pypy.exe
PIP_DIR: bin
VENV: YES
- PYTHON: C:/Python27-x64
- PYTHON: C:/Python37
- PYTHON: C:/Python27
- PYTHON: C:/Python37-x64
- PYTHON: C:/Python36
- PYTHON: C:/Python36-x64
@ -44,11 +38,6 @@ 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_pypy2.cmd
}
- ps: |
if ($env:PYTHON -eq "c:/vp/pypy3")
{

View File

@ -9,7 +9,7 @@ Please send a pull request to the master branch. Please include [documentation](
- Fork the Pillow repository.
- Create a branch from master.
- Develop bug fixes, features, tests, etc.
- Run the test suite on Python 2.7 and 3.x. You can enable [Travis CI](https://travis-ci.org/profile/) and [AppVeyor](https://ci.appveyor.com/projects/new) on your repo to catch test failures prior to the pull request, and [Codecov](https://codecov.io/gh) to see if the changed code is covered by tests.
- Run the test suite. You can enable [Travis CI](https://travis-ci.org/profile/) and [AppVeyor](https://ci.appveyor.com/projects/new) on your repo to catch test failures prior to the pull request, and [Codecov](https://codecov.io/gh) to see if the changed code is covered by tests.
- Create a pull request to pull the changes from your branch to the Pillow master.
### Guidelines

View File

@ -6,8 +6,8 @@ notifications:
irc: "chat.freenode.net#pil"
# Run fast lint first to get fast feedback.
# Run slow PyPy* next, to give them a headstart and reduce waiting time.
# Run latest 3.x and 2.x next, to get quick compatibility results.
# Run slow PyPy next, to give it a headstart and reduce waiting time.
# Run latest 3.x next, to get quick compatibility results.
# Then run the remainder, with fastest Docker jobs last.
matrix:
@ -16,15 +16,11 @@ matrix:
- python: "3.6"
name: "Lint"
env: LINT="true"
- python: "pypy"
name: "PyPy2 Xenial"
- python: "pypy3"
name: "PyPy3 Xenial"
- python: '3.7'
name: "3.7 Xenial"
services: xvfb
- python: '2.7'
name: "2.7 Xenial"
- python: '3.6'
name: "3.6 Xenial PYTHONOPTIMIZE=1"
env: PYTHONOPTIMIZE=1

View File

@ -11,16 +11,12 @@ coveralls-lcov -v -n coverage.filtered.info > coverage.c.json
coverage report
pip install codecov
if [[ $TRAVIS_PYTHON_VERSION != "2.7_with_system_site_packages" ]]; then
# Not working here. Just skip it, it's being removed soon.
pip install coveralls-merge
coveralls-merge coverage.c.json
fi
codecov
if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ] && [ "$DOCKER" == "" ]; then
if [ "$TRAVIS_PYTHON_VERSION" == "3.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
depends/diffcover-run.sh
fi

View File

@ -20,8 +20,8 @@ if [[ $TRAVIS_PYTHON_VERSION == 3.* ]]; then
pip install pyqt5
fi
# docs only on Python 2.7
if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then pip install -r requirements.txt ; fi
# docs only on Python 3.7
if [ "$TRAVIS_PYTHON_VERSION" == "3.7" ]; then pip install -r requirements.txt ; fi
# webp
pushd depends && ./install_webp.sh && popd

View File

@ -9,4 +9,4 @@ make install-coverage
python -m pytest -v -x --cov PIL --cov-report term Tests
# Docs
if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then make doccheck; fi
if [ "$TRAVIS_PYTHON_VERSION" == "3.7" ]; then make doccheck; fi

View File

@ -3,7 +3,7 @@
.DEFAULT_GOAL := release-test
clean:
python setup.py clean
python3 setup.py clean
rm src/PIL/*.so || true
rm -r build || true
find . -name __pycache__ | xargs rm -r || true
@ -15,8 +15,8 @@ co:
done
coverage:
python selftest.py
python setup.py test
python3 selftest.py
python3 setup.py test
rm -r htmlcov || true
coverage report
@ -30,7 +30,7 @@ doccheck:
$(MAKE) -C docs linkcheck || true
docserve:
cd docs/_build/html && python -mSimpleHTTPServer 2> /dev/null&
cd docs/_build/html && python3 -mSimpleHTTPServer 2> /dev/null&
help:
@echo "Welcome to Pillow development. Please use \`make <target>\` where <target> is one of"
@ -50,22 +50,22 @@ help:
@echo " upload-test build and upload sdists to test.pythonpackages.com"
inplace: clean
python setup.py develop build_ext --inplace
python3 setup.py develop build_ext --inplace
install:
python setup.py install
python selftest.py
python3 setup.py install
python3 selftest.py
install-coverage:
CFLAGS="-coverage" python setup.py build_ext install
python selftest.py
CFLAGS="-coverage" python3 setup.py build_ext install
python3 selftest.py
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
CFLAGS='-g -O0' python3 setup.py build_ext install > /dev/null
install-req:
pip install -r requirements.txt
@ -76,17 +76,17 @@ install-venv:
release-test:
$(MAKE) install-req
python setup.py develop
python selftest.py
python -m pytest Tests
python setup.py install
python -m pytest -qq
python3 setup.py develop
python3 selftest.py
python3 -m pytest Tests
python3 setup.py install
python3 -m pytest -qq
check-manifest
pyroma .
viewdoc
sdist:
python setup.py sdist --format=gztar
python3 setup.py sdist --format=gztar
test:
pytest -qq
@ -97,10 +97,10 @@ upload-test:
# username:
# password:
# repository = http://test.pythonpackages.com
python setup.py sdist --format=gztar upload -r test
python3 setup.py sdist --format=gztar upload -r test
upload:
python setup.py sdist --format=gztar upload
python3 setup.py sdist --format=gztar upload
readme:
viewdoc

View File

@ -10,7 +10,6 @@ import tempfile
import unittest
from PIL import Image, ImageMath
from PIL._util import py3
logger = logging.getLogger(__name__)
@ -277,11 +276,6 @@ class PillowLeakTestCase(PillowTestCase):
# helpers
if not py3:
# Remove DeprecationWarning in Python 3
PillowTestCase.assertRaisesRegex = PillowTestCase.assertRaisesRegexp
PillowTestCase.assertRegex = PillowTestCase.assertRegexpMatches
def fromstring(data):
from io import BytesIO

View File

@ -1,3 +1,6 @@
import sys
from io import StringIO
from PIL import Image, IptcImagePlugin
from .helper import PillowTestCase, hopper
@ -52,12 +55,6 @@ class TestFileIptc(PillowTestCase):
# Arrange
c = b"abc"
# Temporarily redirect stdout
try:
from cStringIO import StringIO
except ImportError:
from io import StringIO
import sys
old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()

View File

@ -9,7 +9,6 @@ from collections import namedtuple
from ctypes import c_float
from PIL import Image, TiffImagePlugin, TiffTags, features
from PIL._util import py3
from .helper import PillowTestCase, hopper
@ -361,12 +360,8 @@ class TestFileLibTiff(LibTiffTestCase):
b = im.tobytes()
# Bytes are in image native order (little endian)
if py3:
self.assertEqual(b[0], ord(b"\xe0"))
self.assertEqual(b[1], ord(b"\x01"))
else:
self.assertEqual(b[0], b"\xe0")
self.assertEqual(b[1], b"\x01")
out = self.tempfile("temp.tif")
# out = "temp.le.tif"
@ -387,12 +382,8 @@ class TestFileLibTiff(LibTiffTestCase):
b = im.tobytes()
# Bytes are in image native order (big endian)
if py3:
self.assertEqual(b[0], ord(b"\x01"))
self.assertEqual(b[1], ord(b"\xe0"))
else:
self.assertEqual(b[0], b"\x01")
self.assertEqual(b[1], b"\xe0")
out = self.tempfile("temp.tif")
im.save(out)

View File

@ -3,7 +3,6 @@ import zlib
from io import BytesIO
from PIL import Image, ImageFile, PngImagePlugin
from PIL._util import py3
from .helper import PillowLeakTestCase, PillowTestCase, hopper, unittest
@ -460,7 +459,6 @@ class TestFilePng(PillowTestCase):
im = roundtrip(im, pnginfo=info)
self.assertEqual(im.info, {"Text": value})
if py3:
rt_text(" Aa" + chr(0xA0) + chr(0xC4) + chr(0xFF)) # Latin1
rt_text(chr(0x400) + chr(0x472) + chr(0x4FF)) # Cyrillic
# CJK:

View File

@ -3,7 +3,6 @@ import sys
from io import BytesIO
from PIL import Image, TiffImagePlugin
from PIL._util import py3
from PIL.TiffImagePlugin import RESOLUTION_UNIT, X_RESOLUTION, Y_RESOLUTION
from .helper import PillowTestCase, hopper, unittest
@ -176,12 +175,8 @@ class TestFileTiff(PillowTestCase):
b = im.tobytes()
# Bytes are in image native order (little endian)
if py3:
self.assertEqual(b[0], ord(b"\xe0"))
self.assertEqual(b[1], ord(b"\x01"))
else:
self.assertEqual(b[0], b"\xe0")
self.assertEqual(b[1], b"\x01")
def test_big_endian(self):
im = Image.open("Tests/images/16bit.MM.cropped.tif")
@ -191,12 +186,8 @@ class TestFileTiff(PillowTestCase):
b = im.tobytes()
# Bytes are in image native order (big endian)
if py3:
self.assertEqual(b[0], ord(b"\x01"))
self.assertEqual(b[1], ord(b"\xe0"))
else:
self.assertEqual(b[0], b"\x01")
self.assertEqual(b[1], b"\xe0")
def test_16bit_s(self):
im = Image.open("Tests/images/16bit.s.tif")

View File

@ -1,5 +1,4 @@
from PIL import FontFile, Image, ImageDraw, ImageFont, PcfFontFile
from PIL._util import py3
from .helper import PillowTestCase
@ -74,6 +73,5 @@ class TestFontPcf(PillowTestCase):
def test_high_characters(self):
message = "".join(chr(i + 1) for i in range(140, 232))
self._test_high_characters(message)
# accept bytes instances in Py3.
if py3:
# accept bytes instances.
self._test_high_characters(message.encode("latin1"))

View File

@ -2,7 +2,6 @@ import colorsys
import itertools
from PIL import Image
from PIL._util import py3
from .helper import PillowTestCase, hopper
@ -49,27 +48,18 @@ class TestFormatHSV(PillowTestCase):
(r, g, b) = im.split()
if py3:
conv_func = self.int_to_float
else:
conv_func = self.str_to_float
if hasattr(itertools, "izip"):
iter_helper = itertools.izip
else:
iter_helper = itertools.zip_longest
converted = [
self.tuple_to_ints(func(conv_func(_r), conv_func(_g), conv_func(_b)))
for (_r, _g, _b) in iter_helper(r.tobytes(), g.tobytes(), b.tobytes())
for (_r, _g, _b) in itertools.zip_longest(
r.tobytes(), g.tobytes(), b.tobytes()
)
]
if py3:
new_bytes = b"".join(
bytes(chr(h) + chr(s) + chr(v), "latin-1") for (h, s, v) in converted
)
else:
new_bytes = b"".join(chr(h) + chr(s) + chr(v) for (h, s, v) in converted)
hsv = Image.frombytes(mode, r.size, new_bytes)

View File

@ -3,7 +3,6 @@ import shutil
import sys
from PIL import Image
from PIL._util import py3
from .helper import PillowTestCase, hopper, unittest
@ -80,20 +79,14 @@ class TestImage(PillowTestCase):
im.size = (3, 4)
def test_invalid_image(self):
if py3:
import io
im = io.BytesIO(b"")
else:
import StringIO
im = StringIO.StringIO("")
self.assertRaises(IOError, Image.open, im)
def test_bad_mode(self):
self.assertRaises(ValueError, Image.open, "filename", "bad mode")
@unittest.skipUnless(Image.HAS_PATHLIB, "requires pathlib/pathlib2")
def test_pathlib(self):
from PIL.Image import Path

View File

@ -349,12 +349,8 @@ class TestEmbeddable(unittest.TestCase):
int main(int argc, char* argv[])
{
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"));
@ -364,9 +360,7 @@ int main(int argc, char* argv[])
Py_DECREF(PyImport_ImportModule("PIL.Image"));
Py_Finalize();
#if PY_MAJOR_VERSION >= 3
PyMem_RawFree(whome);
#endif
return 0;
}

View File

@ -1,5 +1,3 @@
from PIL._util import py3
from .helper import PillowTestCase, hopper
@ -8,7 +6,5 @@ class TestImageGetIm(PillowTestCase):
im = hopper()
type_repr = repr(type(im.getim()))
if py3:
self.assertIn("PyCapsule", type_repr)
self.assertIsInstance(im.im.id, int)

View File

@ -2,7 +2,6 @@ import array
import struct
from PIL import Image, ImagePath
from PIL._util import py3
from .helper import PillowTestCase
@ -75,10 +74,7 @@ class TestImagePath(PillowTestCase):
# This fails due to the invalid malloc above,
# and segfaults
for i in range(200000):
if py3:
x[i] = b"0" * 16
else:
x[i] = "0" * 16
class evil:

View File

@ -1,15 +1,12 @@
from PIL import Image
from PIL._util import py3
from .helper import PillowTestCase, hopper, unittest
try:
from PIL import ImageTk
if py3:
import tkinter as tk
else:
import Tkinter as tk
dir(ImageTk)
HAS_TK = True
except (OSError, ImportError):

View File

@ -1,5 +1,6 @@
import os
import sys
from io import StringIO
from PIL import Image, PSDraw
@ -47,10 +48,6 @@ class TestPsDraw(PillowTestCase):
def test_stdout(self):
# Temporarily redirect stdout
try:
from cStringIO import StringIO
except ImportError:
from io import StringIO
old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()

View File

@ -1,93 +0,0 @@
# A monkey patch of the base distutils.ccompiler to use parallel builds
# Tested on 2.7, looks to be identical to 3.3.
# Only applied on Python 2.7 because otherwise, it conflicts with Python's
# own newly-added support for parallel builds.
from __future__ import print_function
import os
import sys
from distutils.ccompiler import CCompiler
from multiprocessing import Pool, cpu_count
try:
MAX_PROCS = int(os.environ.get("MAX_CONCURRENCY", min(4, cpu_count())))
except NotImplementedError:
MAX_PROCS = None
# hideous monkeypatching. but. but. but.
def _mp_compile_one(tp):
(self, obj, build, cc_args, extra_postargs, pp_opts) = tp
try:
src, ext = build[obj]
except KeyError:
return
self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
return
def _mp_compile(
self,
sources,
output_dir=None,
macros=None,
include_dirs=None,
debug=0,
extra_preargs=None,
extra_postargs=None,
depends=None,
):
"""Compile one or more source files.
see distutils.ccompiler.CCompiler.compile for comments.
"""
# A concrete compiler class can either override this method
# entirely or implement _compile().
macros, objects, extra_postargs, pp_opts, build = self._setup_compile(
output_dir, macros, include_dirs, sources, depends, extra_postargs
)
cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
pool = Pool(MAX_PROCS)
try:
print("Building using %d processes" % pool._processes)
except Exception:
pass
arr = [(self, obj, build, cc_args, extra_postargs, pp_opts) for obj in objects]
pool.map_async(_mp_compile_one, arr)
pool.close()
pool.join()
# Return *all* object filenames, not just the ones we just built.
return objects
def install():
fl_win = sys.platform.startswith("win")
fl_cygwin = sys.platform.startswith("cygwin")
if fl_win or fl_cygwin:
# Windows barfs on multiprocessing installs
print("Single threaded build for Windows")
return
if MAX_PROCS != 1:
# explicitly don't enable if environment says 1 processor
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(2)
CCompiler.compile = _mp_compile
except Exception as msg:
print("Exception installing mp_compile, proceeding without: %s" % msg)
else:
print(
"Single threaded build, not installing mp_compile: %s processes" % MAX_PROCS
)
# We monkeypatch Python 2.7
if sys.version_info.major < 3:
install()

View File

@ -20,10 +20,6 @@ from distutils.command.build_ext import build_ext
from setuptools import Extension, setup
# monkey patch import hook. Even though flake8 says it's not used, it is.
# comment this out to disable multi threaded builds.
import mp_compile
if sys.platform == "win32" and sys.version_info >= (3, 8):
warnings.warn(
"Pillow does not yet support Python {}.{} and does not yet provide "
@ -332,12 +328,6 @@ class pil_build_ext(build_ext):
if self.debug:
global DEBUG
DEBUG = True
if sys.version_info.major >= 3 and not self.parallel:
# For Python 2.7, we monkeypatch distutils to have parallel
# builds. If --parallel (or -j) wasn't specified, we want to
# reproduce the same behavior as before, that is, auto-detect the
# number of jobs.
self.parallel = mp_compile.MAX_PROCS
for x in self.feature:
if getattr(self, "disable_%s" % x):
setattr(self.feature, x, False)
@ -861,12 +851,11 @@ try:
classifiers=[
"Development Status :: 6 - Mature",
"License :: OSI Approved :: Historical Permission Notice and Disclaimer (HPND)", # noqa: E501
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Topic :: Multimedia :: Graphics",
@ -875,7 +864,7 @@ try:
"Topic :: Multimedia :: Graphics :: Graphics Conversion",
"Topic :: Multimedia :: Graphics :: Viewers",
],
python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
python_requires=">=3.5",
cmdclass={"build_ext": pil_build_ext},
ext_modules=[Extension("PIL._imaging", ["_imaging.c"])],
include_package_data=True,

View File

@ -42,15 +42,8 @@ gs_windows_binary = None
if sys.platform.startswith("win"):
import shutil
if hasattr(shutil, "which"):
which = shutil.which
else:
# Python 2
import distutils.spawn
which = distutils.spawn.find_executable
for binary in ("gswin32c", "gswin64c", "gs"):
if which(binary) is not None:
if shutil.which(binary) is not None:
gs_windows_binary = binary
break
else:
@ -378,7 +371,6 @@ def _save(im, fp, filename, eps=1):
base_fp = fp
wrapped_fp = False
if fp != sys.stdout:
if sys.version_info.major > 2:
fp = io.TextIOWrapper(fp, encoding="latin-1")
wrapped_fp = True

View File

@ -25,6 +25,7 @@
#
import atexit
import builtins
import io
import logging
import math
@ -33,29 +34,15 @@ import os
import struct
import sys
import warnings
from collections.abc import Callable, MutableMapping
from pathlib import Path
# VERSION was removed in Pillow 6.0.0.
# PILLOW_VERSION was removed in Pillow 7.0.0.
# Use __version__ instead.
from . import ImageMode, TiffTags, __version__, _plugins
from ._binary import i8, i32le
from ._util import deferred_error, isPath, isStringType, py3
try:
import builtins
except ImportError:
import __builtin__
builtins = __builtin__
try:
# Python 3
from collections.abc import Callable, MutableMapping
except ImportError:
# Python 2.7
from collections import Callable, MutableMapping
from ._util import deferred_error, isPath, isStringType
logger = logging.getLogger(__name__)
@ -134,18 +121,6 @@ try:
except ImportError:
cffi = None
try:
from pathlib import Path
HAS_PATHLIB = True
except ImportError:
try:
from pathlib2 import Path
HAS_PATHLIB = True
except ImportError:
HAS_PATHLIB = False
def isImageType(t):
"""
@ -621,8 +596,6 @@ class Image(object):
# object is gone.
self.im = deferred_error(ValueError("Operation on closed image"))
if sys.version_info.major >= 3:
def __del__(self):
self.__exit__()
@ -1347,10 +1320,7 @@ class Image(object):
self.load()
try:
if py3:
return list(self.im.getpalette())
else:
return [i8(c) for c in self.im.getpalette()]
except ValueError:
return None # no palette
@ -1701,10 +1671,7 @@ class Image(object):
palette = ImagePalette.raw(data.rawmode, data.palette)
else:
if not isinstance(data, bytes):
if py3:
data = bytes(data)
else:
data = "".join(chr(x) for x in data)
palette = ImagePalette.raw(rawmode, data)
self.mode = "PA" if "A" in self.mode else "P"
self.palette = palette
@ -2036,7 +2003,7 @@ class Image(object):
if isPath(fp):
filename = fp
open_fp = True
elif HAS_PATHLIB and isinstance(fp, Path):
elif isinstance(fp, Path):
filename = str(fp)
open_fp = True
if not filename and hasattr(fp, "name") and isPath(fp.name):
@ -2747,7 +2714,7 @@ def open(fp, mode="r"):
exclusive_fp = False
filename = ""
if HAS_PATHLIB and isinstance(fp, Path):
if isinstance(fp, Path):
filename = str(fp.resolve())
elif isPath(fp):
filename = fp
@ -3311,11 +3278,6 @@ class Exif(MutableMapping):
def __contains__(self, tag):
return tag in self._data or (self._info is not None and tag in self._info)
if not py3:
def has_key(self, tag):
return tag in self
def __setitem__(self, tag, value):
if self._info is not None and tag in self._info:
del self._info[tag]

View File

@ -29,7 +29,7 @@ import os
import sys
from . import Image
from ._util import isDirectory, isPath, py3
from ._util import isDirectory, isPath
LAYOUT_BASIC = 0
LAYOUT_RAQM = 1
@ -695,10 +695,7 @@ def load_path(filename):
for directory in sys.path:
if isDirectory(directory):
if not isinstance(filename, str):
if py3:
filename = filename.decode("utf-8")
else:
filename = filename.encode("utf-8")
try:
return load(os.path.join(directory, filename))
except IOError:

View File

@ -15,15 +15,9 @@
# See the README file for information on usage and redistribution.
#
from . import Image, _imagingmath
from ._util import py3
try:
import builtins
except ImportError:
import __builtin__
builtins = __builtin__
from . import Image, _imagingmath
VERBOSE = 0
@ -101,11 +95,6 @@ class _Operand(object):
# an image is "true" if it contains at least one non-zero pixel
return self.im.getbbox() is not None
if not py3:
# Provide __nonzero__ for pre-Py3k
__nonzero__ = __bool__
del __bool__
def __abs__(self):
return self.apply("abs", self)
@ -152,13 +141,6 @@ class _Operand(object):
def __rpow__(self, other):
return self.apply("pow", other, self)
if not py3:
# Provide __div__ and __rdiv__ for pre-Py3k
__div__ = __truediv__
__rdiv__ = __rtruediv__
del __truediv__
del __rtruediv__
# bitwise
def __invert__(self):
return self.apply("invert", self)

View File

@ -20,7 +20,7 @@ import sys
from io import BytesIO
from . import Image
from ._util import isPath, py3
from ._util import isPath
qt_versions = [["5", "PyQt5"], ["side2", "PySide2"]]
@ -125,10 +125,7 @@ def _toqclass_helper(im):
# handle filename, if given instead of image name
if hasattr(im, "toUtf8"):
# FIXME - is this really the best way to do this?
if py3:
im = str(im.toUtf8(), "utf-8")
else:
im = unicode(im.toUtf8(), "utf-8") # noqa: F821
if isPath(im):
im = Image.open(im)

View File

@ -18,14 +18,10 @@ import os
import subprocess
import sys
import tempfile
from shlex import quote
from PIL import Image
if sys.version_info.major >= 3:
from shlex import quote
else:
from pipes import quote
_viewers = []

View File

@ -25,17 +25,11 @@
# See the README file for information on usage and redistribution.
#
import sys
import tkinter
from io import BytesIO
from . import Image
if sys.version_info.major > 2:
import tkinter
else:
import Tkinter as tkinter
# --------------------------------------------------------------------
# Check for Tkinter interface hooks

View File

@ -18,7 +18,6 @@
import sys
from . import EpsImagePlugin
from ._util import py3
##
# Simple Postscript graphics interface.
@ -36,7 +35,7 @@ class PSDraw(object):
self.fp = fp
def _fp_write(self, to_write):
if not py3 or self.fp == sys.stdout:
if self.fp == sys.stdout:
self.fp.write(to_write)
else:
self.fp.write(bytes(to_write, "UTF-8"))

View File

@ -7,26 +7,16 @@ import re
import time
import zlib
from ._util import py3
try:
from UserDict import UserDict # Python 2.x
except ImportError:
UserDict = collections.UserDict # Python 3.x
if py3: # Python 3.x
def make_bytes(s):
return s.encode("us-ascii")
else: # Python 2.x
def make_bytes(s): # pragma: no cover
return s # pragma: no cover
# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set
# on page 656
def encode_text(s):
@ -81,10 +71,8 @@ PDFDocEncoding = {
def decode_text(b):
if b[: len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE:
return b[len(codecs.BOM_UTF16_BE) :].decode("utf_16_be")
elif py3: # Python 3.x
else:
return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b)
else: # Python 2.x
return u"".join(PDFDocEncoding.get(ord(byte), byte) for byte in b)
class PdfFormatError(RuntimeError):
@ -252,16 +240,10 @@ class PdfName:
def __bytes__(self):
result = bytearray(b"/")
for b in self.name:
if py3: # Python 3.x
if b in self.allowed_chars:
result.append(b)
else:
result.extend(make_bytes("#%02X" % b))
else: # Python 2.x
if ord(b) in self.allowed_chars:
result.append(b)
else:
result.extend(b"#%02X" % ord(b))
return bytes(result)
__str__ = __bytes__
@ -324,24 +306,14 @@ class PdfDict(UserDict):
out.extend(b"\n>>")
return bytes(out)
if not py3:
__str__ = __bytes__
class PdfBinary:
def __init__(self, data):
self.data = data
if py3: # Python 3.x
def __bytes__(self):
return make_bytes("<%s>" % "".join("%02X" % b for b in self.data))
else: # Python 2.x
def __str__(self):
return "<%s>" % "".join("%02X" % ord(b) for b in self.data)
class PdfStream:
def __init__(self, dictionary, buf):
@ -382,9 +354,7 @@ def pdf_repr(x):
return bytes(PdfDict(x))
elif isinstance(x, list):
return bytes(PdfArray(x))
elif (py3 and isinstance(x, str)) or (
not py3 and isinstance(x, unicode) # noqa: F821
):
elif isinstance(x, str):
return pdf_repr(encode_text(x))
elif isinstance(x, bytes):
# XXX escape more chars? handle binary garbage

View File

@ -38,7 +38,6 @@ import zlib
from . import Image, ImageFile, ImagePalette
from ._binary import i8, i16be as i16, i32be as i32, o16be as o16, o32be as o32
from ._util import py3
# __version__ is deprecated and will be removed in a future version. Use
# PIL.__version__ instead.
@ -450,7 +449,6 @@ class PngStream(ChunkStream):
k = s
v = b""
if k:
if py3:
k = k.decode("latin-1", "strict")
v = v.decode("latin-1", "replace")
@ -487,7 +485,6 @@ class PngStream(ChunkStream):
v = b""
if k:
if py3:
k = k.decode("latin-1", "strict")
v = v.decode("latin-1", "replace")
@ -524,7 +521,6 @@ class PngStream(ChunkStream):
return s
else:
return s
if py3:
try:
k = k.decode("latin-1", "strict")
lang = lang.decode("utf-8", "strict")

View File

@ -27,7 +27,6 @@ import struct
from . import Image, ImageFile
from ._binary import i8, i16be as i16, o8
from ._util import py3
# __version__ is deprecated and will be removed in a future version. Use
# PIL.__version__ instead.
@ -173,7 +172,6 @@ def _save(im, fp, filename):
pinmax = 255
# Image name (79 characters max, truncated below in write)
imgName = os.path.splitext(os.path.basename(filename))[0]
if py3:
imgName = imgName.encode("ascii", "ignore")
# Standard representation of pixel in the file
colormap = 0

View File

@ -15,7 +15,6 @@
#
import io
import sys
from . import ContainerIO
@ -64,8 +63,6 @@ class TarIO(ContainerIO.ContainerIO):
def __exit__(self, *args):
self.close()
if sys.version_info.major >= 3:
def __del__(self):
self.close()

View File

@ -46,24 +46,15 @@ import io
import itertools
import os
import struct
import sys
import warnings
from collections.abc import MutableMapping
from fractions import Fraction
from numbers import Number, Rational
from . import Image, ImageFile, ImagePalette, TiffTags
from ._binary import i8, o8
from ._util import py3
from .TiffTags import TYPES
try:
# Python 3
from collections.abc import MutableMapping
except ImportError:
# Python 2.7
from collections import MutableMapping
# __version__ is deprecated and will be removed in a future version. Use
# PIL.__version__ instead.
__version__ = "1.3.5"
@ -531,18 +522,11 @@ class ImageFileDirectory_v2(MutableMapping):
def __contains__(self, tag):
return tag in self._tags_v2 or tag in self._tagdata
if not py3:
def has_key(self, tag):
return tag in self
def __setitem__(self, tag, value):
self._setitem(tag, value, self.legacy_api)
def _setitem(self, tag, value, legacy_api):
basetypes = (Number, bytes, str)
if not py3:
basetypes += (unicode,) # noqa: F821
info = TiffTags.lookup(tag)
values = [value] if isinstance(value, basetypes) else value
@ -562,14 +546,10 @@ class ImageFileDirectory_v2(MutableMapping):
elif all(isinstance(v, float) for v in values):
self.tagtype[tag] = TiffTags.DOUBLE
else:
if py3:
if all(isinstance(v, str) for v in values):
self.tagtype[tag] = TiffTags.ASCII
else:
# Never treat data as binary by default on Python 2.
self.tagtype[tag] = TiffTags.ASCII
if self.tagtype[tag] == TiffTags.UNDEFINED and py3:
if self.tagtype[tag] == TiffTags.UNDEFINED:
values = [
value.encode("ascii", "replace") if isinstance(value, str) else value
]
@ -689,8 +669,6 @@ class ImageFileDirectory_v2(MutableMapping):
@_register_writer(2)
def write_string(self, value):
# remerge of https://github.com/python-pillow/Pillow/pull/1416
if sys.version_info.major == 2:
value = value.decode("ascii", "replace")
return b"" + value.encode("ascii", "replace") + b"\0"
@_register_loader(5, 8)
@ -1132,7 +1110,7 @@ class TiffImageFile(ImageFile.ImageFile):
try:
fp = hasattr(self.fp, "fileno") and os.dup(self.fp.fileno())
# flush the file descriptor, prevents error on pypy 2.4+
# should also eliminate the need for fp.tell for py3
# should also eliminate the need for fp.tell
# in _seek
if hasattr(self.fp, "flush"):
self.fp.flush()
@ -1602,13 +1580,10 @@ def _save(im, fp, filename):
if tag in ifd.tagtype:
types[tag] = ifd.tagtype[tag]
elif not (
isinstance(value, (int, float, str, bytes))
or (not py3 and isinstance(value, unicode)) # noqa: F821
):
elif not (isinstance(value, (int, float, str, bytes))):
continue
if tag not in atts and tag not in blocklist:
if isinstance(value, str if py3 else unicode): # noqa: F821
if isinstance(value, str):
atts[tag] = value.encode("ascii", "replace") + b"\0"
elif isinstance(value, IFDRational):
atts[tag] = float(value)

View File

@ -21,16 +21,11 @@
# https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml
# and has been tested with a few sample files found using google.
import builtins
from . import Image
from ._binary import i32le as i32
try:
import builtins
except ImportError:
import __builtin__
builtins = __builtin__
def open(filename):
"""

View File

@ -23,7 +23,6 @@ from __future__ import print_function
from . import Image, ImageFile
from ._binary import i16le as word, i32le as dword, si16le as short, si32le as _long
from ._util import py3
# __version__ is deprecated and will be removed in a future version. Use
# PIL.__version__ instead.
@ -31,9 +30,6 @@ __version__ = "0.2"
_handler = None
if py3:
long = int
def register_handler(handler):
"""

View File

@ -13,26 +13,15 @@
from struct import pack, unpack_from
from ._util import py3
if py3:
def i8(c):
return c if c.__class__ is int else c[0]
def o8(i):
return bytes((i & 255,))
else:
def i8(c):
return ord(c)
def o8(i):
return chr(i & 255)
# Input, le = little endian, be = big endian
def i16le(c, o=0):
"""

View File

@ -1,11 +1,7 @@
""" Find compiled module linking to Tcl / Tk libraries
"""
import sys
if sys.version_info.major > 2:
from tkinter import _tkinter as tk
else:
from Tkinter import tkinter as tk
if hasattr(sys, "pypy_find_executable"):
# Tested with packages at https://bitbucket.org/pypy/pypy/downloads.

View File

@ -1,35 +1,26 @@
import os
import sys
py3 = sys.version_info.major >= 3
py36 = sys.version_info[0:2] >= (3, 6)
if py3:
def isStringType(t):
return isinstance(t, str)
if py36:
from pathlib import Path
def isPath(f):
return isinstance(f, (bytes, str, Path))
else:
def isPath(f):
return isinstance(f, (bytes, str))
else:
def isStringType(t):
return isinstance(t, basestring) # noqa: F821
def isPath(f):
return isinstance(f, basestring) # noqa: F821
# Checks if an object is a string, and that it points to a directory.
def isDirectory(f):
return isPath(f) and os.path.isdir(f)

View File

@ -225,11 +225,7 @@ TkImaging_Init(Tcl_Interp* interp)
#include <psapi.h>
/* Must be linked with 'psapi' library */
#if PY_VERSION_HEX >= 0x03000000
#define TKINTER_PKG "tkinter"
#else
#define TKINTER_PKG "Tkinter"
#endif
FARPROC _dfunc(HMODULE lib_handle, const char *func_name)
{
@ -354,7 +350,6 @@ int load_tkinter_funcs(void)
*/
/* From module __file__ attribute to char *string for dlopen. */
#if PY_VERSION_HEX >= 0x03000000
char *fname2char(PyObject *fname)
{
PyObject* bytes;
@ -364,9 +359,6 @@ char *fname2char(PyObject *fname)
}
return PyBytes_AsString(bytes);
}
#else
#define fname2char(s) (PyString_AsString(s))
#endif
#include <dlfcn.h>

View File

@ -84,8 +84,6 @@
#include "Imaging.h"
#include "py3.h"
#define _USE_MATH_DEFINES
#include <math.h>
@ -237,45 +235,13 @@ void ImagingSectionLeave(ImagingSectionCookie* cookie)
int PyImaging_CheckBuffer(PyObject* buffer)
{
#if PY_VERSION_HEX >= 0x03000000
return PyObject_CheckBuffer(buffer);
#else
return PyObject_CheckBuffer(buffer) || PyObject_CheckReadBuffer(buffer);
#endif
}
int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view)
{
/* must call check_buffer first! */
#if PY_VERSION_HEX >= 0x03000000
return PyObject_GetBuffer(buffer, view, PyBUF_SIMPLE);
#else
/* Use new buffer protocol if available
(mmap doesn't support this in 2.7, go figure) */
if (PyObject_CheckBuffer(buffer)) {
int success = PyObject_GetBuffer(buffer, view, PyBUF_SIMPLE);
if (!success) { return success; }
PyErr_Clear();
}
/* Pretend we support the new protocol; PyBuffer_Release happily ignores
calling bf_releasebuffer on objects that don't support it */
view->buf = NULL;
view->len = 0;
view->readonly = 1;
view->format = NULL;
view->ndim = 0;
view->shape = NULL;
view->strides = NULL;
view->suboffsets = NULL;
view->itemsize = 0;
view->internal = NULL;
Py_INCREF(buffer);
view->obj = buffer;
return PyObject_AsReadBuffer(buffer, (void *) &view->buf, &view->len);
#endif
}
/* -------------------------------------------------------------------- */
@ -416,11 +382,11 @@ getlist(PyObject* arg, Py_ssize_t* length, const char* wrong_length, int type)
// on this switch. And 3 fewer loops to copy/paste.
switch (type) {
case TYPE_UINT8:
itemp = PyInt_AsLong(op);
itemp = PyLong_AsLong(op);
list[i] = CLIP8(itemp);
break;
case TYPE_INT32:
itemp = PyInt_AsLong(op);
itemp = PyLong_AsLong(op);
memcpy(list + i * sizeof(INT32), &itemp, sizeof(itemp));
break;
case TYPE_FLOAT32:
@ -499,7 +465,7 @@ getpixel(Imaging im, ImagingAccess access, int x, int y)
case IMAGING_TYPE_UINT8:
switch (im->bands) {
case 1:
return PyInt_FromLong(pixel.b[0]);
return PyLong_FromLong(pixel.b[0]);
case 2:
return Py_BuildValue("BB", pixel.b[0], pixel.b[1]);
case 3:
@ -509,12 +475,12 @@ getpixel(Imaging im, ImagingAccess access, int x, int y)
}
break;
case IMAGING_TYPE_INT32:
return PyInt_FromLong(pixel.i);
return PyLong_FromLong(pixel.i);
case IMAGING_TYPE_FLOAT32:
return PyFloat_FromDouble(pixel.f);
case IMAGING_TYPE_SPECIAL:
if (strncmp(im->mode, "I;16", 4) == 0)
return PyInt_FromLong(pixel.h);
return PyLong_FromLong(pixel.h);
break;
}
@ -543,16 +509,8 @@ getink(PyObject* color, Imaging im, char* ink)
if (im->type == IMAGING_TYPE_UINT8 ||
im->type == IMAGING_TYPE_INT32 ||
im->type == IMAGING_TYPE_SPECIAL) {
#if PY_VERSION_HEX >= 0x03000000
if (PyLong_Check(color)) {
r = PyLong_AsLongLong(color);
#else
if (PyInt_Check(color) || PyLong_Check(color)) {
if (PyInt_Check(color))
r = PyInt_AS_LONG(color);
else
r = PyLong_AsLongLong(color);
#endif
rIsInt = 1;
}
if (r == -1 && PyErr_Occurred()) {
@ -1129,16 +1087,16 @@ _getxy(PyObject* xy, int* x, int *y)
goto badarg;
value = PyTuple_GET_ITEM(xy, 0);
if (PyInt_Check(value))
*x = PyInt_AS_LONG(value);
if (PyLong_Check(value))
*x = PyLong_AS_LONG(value);
else if (PyFloat_Check(value))
*x = (int) PyFloat_AS_DOUBLE(value);
else
goto badval;
value = PyTuple_GET_ITEM(xy, 1);
if (PyInt_Check(value))
*y = PyInt_AS_LONG(value);
if (PyLong_Check(value))
*y = PyLong_AS_LONG(value);
else if (PyFloat_Check(value))
*y = (int) PyFloat_AS_DOUBLE(value);
else
@ -1255,7 +1213,7 @@ _histogram(ImagingObject* self, PyObject* args)
list = PyList_New(h->bands * 256);
for (i = 0; i < h->bands * 256; i++) {
PyObject* item;
item = PyInt_FromLong(h->histogram[i]);
item = PyLong_FromLong(h->histogram[i]);
if (item == NULL) {
Py_DECREF(list);
list = NULL;
@ -1524,7 +1482,7 @@ _putdata(ImagingObject* self, PyObject* args)
/* Clipped data */
for (i = x = y = 0; i < n; i++) {
op = PySequence_Fast_GET_ITEM(seq, i);
image->image8[y][x] = (UINT8) CLIP8(PyInt_AsLong(op));
image->image8[y][x] = (UINT8) CLIP8(PyLong_AsLong(op));
if (++x >= (int) image->xsize){
x = 0, y++;
}
@ -1635,7 +1593,7 @@ _putpalette(ImagingObject* self, PyObject* args)
char* rawmode;
UINT8* palette;
Py_ssize_t palettesize;
if (!PyArg_ParseTuple(args, "s"PY_ARG_BYTES_LENGTH, &rawmode, &palette, &palettesize))
if (!PyArg_ParseTuple(args, "sy#", &rawmode, &palette, &palettesize))
return NULL;
if (strcmp(self->image->mode, "L") && strcmp(self->image->mode, "LA") &&
@ -1698,7 +1656,7 @@ _putpalettealphas(ImagingObject* self, PyObject* args)
int i;
UINT8 *values;
Py_ssize_t length;
if (!PyArg_ParseTuple(args, PY_ARG_BYTES_LENGTH, &values, &length))
if (!PyArg_ParseTuple(args, "y#", &values, &length))
return NULL;
if (!self->image->palette) {
@ -2136,7 +2094,7 @@ _getprojection(ImagingObject* self, PyObject* args)
ImagingGetProjection(self->image, (unsigned char *)xprofile, (unsigned char *)yprofile);
result = Py_BuildValue(PY_ARG_BYTES_LENGTH PY_ARG_BYTES_LENGTH,
result = Py_BuildValue("y#y#",
xprofile, (Py_ssize_t)self->image->xsize,
yprofile, (Py_ssize_t)self->image->ysize);
@ -2414,7 +2372,7 @@ _font_new(PyObject* self_, PyObject* args)
ImagingObject* imagep;
unsigned char* glyphdata;
Py_ssize_t glyphdata_length;
if (!PyArg_ParseTuple(args, "O!"PY_ARG_BYTES_LENGTH,
if (!PyArg_ParseTuple(args, "O!y#",
&Imaging_Type, &imagep,
&glyphdata, &glyphdata_length))
return NULL;
@ -2648,7 +2606,7 @@ _draw_ink(ImagingDrawObject* self, PyObject* args)
if (!getink(color, self->image->image, (char*) &ink))
return NULL;
return PyInt_FromLong((int) ink);
return PyLong_FromLong((int) ink);
}
static PyObject*
@ -3356,13 +3314,13 @@ _getattr_size(ImagingObject* self, void* closure)
static PyObject*
_getattr_bands(ImagingObject* self, void* closure)
{
return PyInt_FromLong(self->image->bands);
return PyLong_FromLong(self->image->bands);
}
static PyObject*
_getattr_id(ImagingObject* self, void* closure)
{
return PyInt_FromSsize_t((Py_ssize_t) self->image);
return PyLong_FromSsize_t((Py_ssize_t) self->image);
}
static PyObject*
@ -3575,17 +3533,17 @@ _get_stats(PyObject* self, PyObject* args)
if ( ! d)
return NULL;
PyDict_SetItemString(d, "new_count",
PyInt_FromLong(arena->stats_new_count));
PyLong_FromLong(arena->stats_new_count));
PyDict_SetItemString(d, "allocated_blocks",
PyInt_FromLong(arena->stats_allocated_blocks));
PyLong_FromLong(arena->stats_allocated_blocks));
PyDict_SetItemString(d, "reused_blocks",
PyInt_FromLong(arena->stats_reused_blocks));
PyLong_FromLong(arena->stats_reused_blocks));
PyDict_SetItemString(d, "reallocated_blocks",
PyInt_FromLong(arena->stats_reallocated_blocks));
PyLong_FromLong(arena->stats_reallocated_blocks));
PyDict_SetItemString(d, "freed_blocks",
PyInt_FromLong(arena->stats_freed_blocks));
PyLong_FromLong(arena->stats_freed_blocks));
PyDict_SetItemString(d, "blocks_cached",
PyInt_FromLong(arena->blocks_cached));
PyLong_FromLong(arena->blocks_cached));
return d;
}
@ -3613,7 +3571,7 @@ _get_alignment(PyObject* self, PyObject* args)
if (!PyArg_ParseTuple(args, ":get_alignment"))
return NULL;
return PyInt_FromLong(ImagingDefaultArena.alignment);
return PyLong_FromLong(ImagingDefaultArena.alignment);
}
static PyObject*
@ -3622,7 +3580,7 @@ _get_block_size(PyObject* self, PyObject* args)
if (!PyArg_ParseTuple(args, ":get_block_size"))
return NULL;
return PyInt_FromLong(ImagingDefaultArena.block_size);
return PyLong_FromLong(ImagingDefaultArena.block_size);
}
static PyObject*
@ -3631,7 +3589,7 @@ _get_blocks_max(PyObject* self, PyObject* args)
if (!PyArg_ParseTuple(args, ":get_blocks_max"))
return NULL;
return PyInt_FromLong(ImagingDefaultArena.blocks_max);
return PyLong_FromLong(ImagingDefaultArena.blocks_max);
}
static PyObject*
@ -3959,7 +3917,6 @@ setup_module(PyObject* m) {
return 0;
}
#if PY_VERSION_HEX >= 0x03000000
PyMODINIT_FUNC
PyInit__imaging(void) {
PyObject* m;
@ -3979,11 +3936,3 @@ PyInit__imaging(void) {
return m;
}
#else
PyMODINIT_FUNC
init_imaging(void)
{
PyObject* m = Py_InitModule("_imaging", functions);
setup_module(m);
}
#endif

View File

@ -32,7 +32,6 @@ http://www.cazabon.com\n\
#include "lcms2.h"
#include "Imaging.h"
#include "py3.h"
#define PYCMSVERSION "1.0.0 pil"
@ -122,13 +121,8 @@ cms_profile_fromstring(PyObject* self, PyObject* args)
char* pProfile;
Py_ssize_t nProfile;
#if PY_VERSION_HEX >= 0x03000000
if (!PyArg_ParseTuple(args, "y#:profile_frombytes", &pProfile, &nProfile))
return NULL;
#else
if (!PyArg_ParseTuple(args, "s#:profile_fromstring", &pProfile, &nProfile))
return NULL;
#endif
hProfile = cmsOpenProfileFromMem(pProfile, nProfile);
if (!hProfile) {
@ -172,11 +166,7 @@ cms_profile_tobytes(PyObject* self, PyObject* args)
return NULL;
}
#if PY_VERSION_HEX >= 0x03000000
ret = PyBytes_FromStringAndSize(pProfile, (Py_ssize_t)nProfile);
#else
ret = PyString_FromStringAndSize(pProfile, (Py_ssize_t)nProfile);
#endif
free(pProfile);
return ret;
@ -592,7 +582,7 @@ cms_profile_is_intent_supported(CmsProfileObject *self, PyObject *args)
/* printf("cmsIsIntentSupported(%p, %d, %d) => %d\n", self->profile, intent, direction, result); */
return PyInt_FromLong(result != 0);
return PyLong_FromLong(result != 0);
}
#ifdef _WIN32
@ -691,11 +681,7 @@ _profile_read_int_as_string(cmsUInt32Number nr)
buf[3] = (char) (nr & 0xff);
buf[4] = 0;
#if PY_VERSION_HEX >= 0x03000000
ret = PyUnicode_DecodeASCII(buf, 4, NULL);
#else
ret = PyString_FromStringAndSize(buf, 4);
#endif
return ret;
}
@ -898,7 +884,7 @@ _is_intent_supported(CmsProfileObject* self, int clut)
|| intent == INTENT_SATURATION || intent == INTENT_ABSOLUTE_COLORIMETRIC))
continue;
id = PyInt_FromLong((long) intent);
id = PyLong_FromLong((long) intent);
entry = Py_BuildValue("(OOO)",
_check_intent(clut, self->profile, intent, LCMS_USED_AS_INPUT) ? Py_True : Py_False,
_check_intent(clut, self->profile, intent, LCMS_USED_AS_OUTPUT) ? Py_True : Py_False,
@ -1010,7 +996,7 @@ cms_profile_getattr_product_copyright(CmsProfileObject* self, void* closure)
static PyObject*
cms_profile_getattr_rendering_intent(CmsProfileObject* self, void* closure)
{
return PyInt_FromLong(cmsGetHeaderRenderingIntent(self->profile));
return PyLong_FromLong(cmsGetHeaderRenderingIntent(self->profile));
}
static PyObject*
@ -1098,7 +1084,7 @@ cms_profile_getattr_version(CmsProfileObject* self, void* closure)
static PyObject*
cms_profile_getattr_icc_version(CmsProfileObject* self, void* closure)
{
return PyInt_FromLong((long) cmsGetEncodedICCversion(self->profile));
return PyLong_FromLong((long) cmsGetEncodedICCversion(self->profile));
}
static PyObject*
@ -1115,7 +1101,7 @@ static PyObject*
cms_profile_getattr_header_flags(CmsProfileObject* self, void* closure)
{
cmsUInt32Number flags = cmsGetHeaderFlags(self->profile);
return PyInt_FromLong(flags);
return PyLong_FromLong(flags);
}
static PyObject*
@ -1611,7 +1597,6 @@ setup_module(PyObject* m) {
return 0;
}
#if PY_VERSION_HEX >= 0x03000000
PyMODINIT_FUNC
PyInit__imagingcms(void) {
PyObject* m;
@ -1633,12 +1618,3 @@ PyInit__imagingcms(void) {
return m;
}
#else
PyMODINIT_FUNC
init_imagingcms(void)
{
PyObject *m = Py_InitModule("_imagingcms", pyCMSdll_methods);
setup_module(m);
PyDateTime_IMPORT;
}
#endif

View File

@ -30,7 +30,6 @@
#include FT_SFNT_NAMES_H
#define KEEP_PY_UNICODE
#include "py3.h"
#if !defined(_MSC_VER)
#include <dlfcn.h>
@ -266,8 +265,7 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw)
return NULL;
}
if (!PyArg_ParseTupleAndKeywords(args, kw, "etn|ns"PY_ARG_BYTES_LENGTH"n",
kwlist,
if (!PyArg_ParseTupleAndKeywords(args, kw, "etn|nsy#n", kwlist,
Py_FileSystemDefaultEncoding, &filename,
&size, &index, &encoding, &font_bytes,
&font_bytes_size, &layout_engine)) {
@ -328,7 +326,7 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw)
static int
font_getchar(PyObject* string, int index, FT_ULong* char_out)
{
#if (PY_VERSION_HEX < 0x03030000) || (defined(PYPY_VERSION_NUM))
#if (defined(PYPY_VERSION_NUM))
if (PyUnicode_Check(string)) {
Py_UNICODE* p = PyUnicode_AS_UNICODE(string);
int size = PyUnicode_GET_SIZE(string);
@ -337,16 +335,6 @@ font_getchar(PyObject* string, int index, FT_ULong* char_out)
*char_out = p[index];
return 1;
}
#if PY_VERSION_HEX < 0x03000000
if (PyString_Check(string)) {
unsigned char* p = (unsigned char*) PyString_AS_STRING(string);
int size = PyString_GET_SIZE(string);
if (index >= size)
return 0;
*char_out = (unsigned char) p[index];
return 1;
}
#endif
#else
if (PyUnicode_Check(string)) {
if (index >= PyUnicode_GET_LENGTH(string))
@ -375,7 +363,7 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject *
goto failed;
}
#if (PY_VERSION_HEX < 0x03030000) || (defined(PYPY_VERSION_NUM))
#if (defined(PYPY_VERSION_NUM))
if (PyUnicode_Check(string)) {
Py_UNICODE *text = PyUnicode_AS_UNICODE(string);
Py_ssize_t size = PyUnicode_GET_SIZE(string);
@ -395,25 +383,6 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject *
}
}
}
#if PY_VERSION_HEX < 0x03000000
else if (PyString_Check(string)) {
char *text = PyString_AS_STRING(string);
int size = PyString_GET_SIZE(string);
if (! size) {
goto failed;
}
if (!(*p_raqm.set_text_utf8)(rq, text, size)) {
PyErr_SetString(PyExc_ValueError, "raqm_set_text_utf8() failed");
goto failed;
}
if (lang) {
if (!(*p_raqm.set_language)(rq, lang, start, size)) {
PyErr_SetString(PyExc_ValueError, "raqm_set_language() failed");
goto failed;
}
}
}
#endif
#else
if (PyUnicode_Check(string)) {
Py_UCS4 *text = PyUnicode_AsUCS4Copy(string);
@ -479,11 +448,7 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject *
Py_ssize_t size = 0;
PyObject *bytes;
#if PY_VERSION_HEX >= 0x03000000
if (!PyUnicode_Check(item)) {
#else
if (!PyUnicode_Check(item) && !PyString_Check(item)) {
#endif
PyErr_SetString(PyExc_TypeError, "expected a string");
goto failed;
}
@ -495,12 +460,6 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject *
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 (!(*p_raqm.add_font_feature)(rq, feature, size)) {
PyErr_SetString(PyExc_ValueError, "raqm_add_font_feature() failed");
goto failed;
@ -581,11 +540,7 @@ text_layout_fallback(PyObject* string, FontObject* self, const char* dir, PyObje
if (features != Py_None || dir != NULL || lang != NULL) {
PyErr_SetString(PyExc_KeyError, "setting text direction, language or font features is not supported without libraqm");
}
#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;
}
@ -990,8 +945,7 @@ font_render(FontObject* self, PyObject* args)
continue;
if (master->namedstyle[j].strid == name.name_id) {
list_name = Py_BuildValue(PY_ARG_BYTES_LENGTH,
name.string, name.string_len);
list_name = Py_BuildValue("y#", name.string, name.string_len);
PyList_SetItem(list_names, j, list_name);
break;
}
@ -1025,11 +979,11 @@ font_render(FontObject* self, PyObject* args)
list_axis = PyDict_New();
PyDict_SetItemString(list_axis, "minimum",
PyInt_FromLong(axis.minimum / 65536));
PyLong_FromLong(axis.minimum / 65536));
PyDict_SetItemString(list_axis, "default",
PyInt_FromLong(axis.def / 65536));
PyLong_FromLong(axis.def / 65536));
PyDict_SetItemString(list_axis, "maximum",
PyInt_FromLong(axis.maximum / 65536));
PyLong_FromLong(axis.maximum / 65536));
for (j = 0; j < name_count; j++) {
error = FT_Get_Sfnt_Name(self->face, j, &name);
@ -1037,8 +991,7 @@ font_render(FontObject* self, PyObject* args)
return geterror(error);
if (name.name_id == axis.strid) {
axis_name = Py_BuildValue(PY_ARG_BYTES_LENGTH,
name.string, name.string_len);
axis_name = Py_BuildValue("y#", name.string, name.string_len);
PyDict_SetItemString(list_axis, "name", axis_name);
break;
}
@ -1095,8 +1048,8 @@ font_render(FontObject* self, PyObject* args)
item = PyList_GET_ITEM(axes, i);
if (PyFloat_Check(item))
coord = PyFloat_AS_DOUBLE(item);
else if (PyInt_Check(item))
coord = (float) PyInt_AS_LONG(item);
else if (PyLong_Check(item))
coord = (float) PyLong_AS_LONG(item);
else if (PyNumber_Check(item))
coord = PyFloat_AsDouble(item);
else {
@ -1146,64 +1099,54 @@ static PyMethodDef font_methods[] = {
static PyObject*
font_getattr_family(FontObject* self, void* closure)
{
#if PY_VERSION_HEX >= 0x03000000
if (self->face->family_name)
return PyUnicode_FromString(self->face->family_name);
#else
if (self->face->family_name)
return PyString_FromString(self->face->family_name);
#endif
Py_RETURN_NONE;
}
static PyObject*
font_getattr_style(FontObject* self, void* closure)
{
#if PY_VERSION_HEX >= 0x03000000
if (self->face->style_name)
return PyUnicode_FromString(self->face->style_name);
#else
if (self->face->style_name)
return PyString_FromString(self->face->style_name);
#endif
Py_RETURN_NONE;
}
static PyObject*
font_getattr_ascent(FontObject* self, void* closure)
{
return PyInt_FromLong(PIXEL(self->face->size->metrics.ascender));
return PyLong_FromLong(PIXEL(self->face->size->metrics.ascender));
}
static PyObject*
font_getattr_descent(FontObject* self, void* closure)
{
return PyInt_FromLong(-PIXEL(self->face->size->metrics.descender));
return PyLong_FromLong(-PIXEL(self->face->size->metrics.descender));
}
static PyObject*
font_getattr_height(FontObject* self, void* closure)
{
return PyInt_FromLong(PIXEL(self->face->size->metrics.height));
return PyLong_FromLong(PIXEL(self->face->size->metrics.height));
}
static PyObject*
font_getattr_x_ppem(FontObject* self, void* closure)
{
return PyInt_FromLong(self->face->size->metrics.x_ppem);
return PyLong_FromLong(self->face->size->metrics.x_ppem);
}
static PyObject*
font_getattr_y_ppem(FontObject* self, void* closure)
{
return PyInt_FromLong(self->face->size->metrics.y_ppem);
return PyLong_FromLong(self->face->size->metrics.y_ppem);
}
static PyObject*
font_getattr_glyphs(FontObject* self, void* closure)
{
return PyInt_FromLong(self->face->num_glyphs);
return PyLong_FromLong(self->face->num_glyphs);
}
static struct PyGetSetDef font_getsetters[] = {
@ -1271,11 +1214,7 @@ setup_module(PyObject* m) {
FT_Library_Version(library, &major, &minor, &patch);
#if PY_VERSION_HEX >= 0x03000000
v = PyUnicode_FromFormat("%d.%d.%d", major, minor, patch);
#else
v = PyString_FromFormat("%d.%d.%d", major, minor, patch);
#endif
PyDict_SetItemString(d, "freetype2_version", v);
@ -1286,7 +1225,6 @@ setup_module(PyObject* m) {
return 0;
}
#if PY_VERSION_HEX >= 0x03000000
PyMODINIT_FUNC
PyInit__imagingft(void) {
PyObject* m;
@ -1306,12 +1244,3 @@ PyInit__imagingft(void) {
return m;
}
#else
PyMODINIT_FUNC
init_imagingft(void)
{
PyObject* m = Py_InitModule("_imagingft", _functions);
setup_module(m);
}
#endif

View File

@ -16,7 +16,6 @@
#include "Python.h"
#include "Imaging.h"
#include "py3.h"
#include "math.h"
#include "float.h"
@ -215,7 +214,7 @@ static PyMethodDef _functions[] = {
static void
install(PyObject *d, char* name, void* value)
{
PyObject *v = PyInt_FromSsize_t((Py_ssize_t) value);
PyObject *v = PyLong_FromSsize_t((Py_ssize_t) value);
if (!v || PyDict_SetItemString(d, name, v))
PyErr_Clear();
Py_XDECREF(v);
@ -273,7 +272,6 @@ setup_module(PyObject* m) {
return 0;
}
#if PY_VERSION_HEX >= 0x03000000
PyMODINIT_FUNC
PyInit__imagingmath(void) {
PyObject* m;
@ -293,12 +291,3 @@ PyInit__imagingmath(void) {
return m;
}
#else
PyMODINIT_FUNC
init_imagingmath(void)
{
PyObject* m = Py_InitModule("_imagingmath", _functions);
setup_module(m);
}
#endif

View File

@ -13,7 +13,6 @@
#include "Python.h"
#include "Imaging.h"
#include "py3.h"
#define LUT_SIZE (1<<9)
@ -273,7 +272,6 @@ static PyMethodDef functions[] = {
{NULL, NULL, 0, NULL}
};
#if PY_VERSION_HEX >= 0x03000000
PyMODINIT_FUNC
PyInit__imagingmorph(void) {
PyObject* m;
@ -293,12 +291,3 @@ PyInit__imagingmorph(void) {
return m;
}
#else
PyMODINIT_FUNC
init_imagingmorph(void)
{
PyObject* m = Py_InitModule("_imagingmorph", functions);
setup_module(m);
}
#endif

View File

@ -64,7 +64,6 @@ static PyMethodDef functions[] = {
{NULL, NULL} /* sentinel */
};
#if PY_VERSION_HEX >= 0x03000000
PyMODINIT_FUNC
PyInit__imagingtk(void) {
static PyModuleDef module_def = {
@ -78,12 +77,3 @@ PyInit__imagingtk(void) {
m = PyModule_Create(&module_def);
return (load_tkinter_funcs() == 0) ? m : NULL;
}
#else
PyMODINIT_FUNC
init_imagingtk(void)
{
Py_InitModule("_imagingtk", functions);
load_tkinter_funcs();
}
#endif

View File

@ -1,7 +1,6 @@
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include "Imaging.h"
#include "py3.h"
#include <webp/encode.h>
#include <webp/decode.h>
#include <webp/types.h>
@ -557,7 +556,7 @@ PyObject* WebPEncode_wrapper(PyObject* self, PyObject* args)
Py_ssize_t xmp_size;
size_t ret_size;
if (!PyArg_ParseTuple(args, PY_ARG_BYTES_LENGTH"iiifss#s#s#",
if (!PyArg_ParseTuple(args, "y#iiifss#s#s#",
(char**)&rgb, &size, &width, &height, &lossless, &quality_factor, &mode,
&icc_bytes, &icc_size, &exif_bytes, &exif_size, &xmp_bytes, &xmp_size)) {
return NULL;
@ -754,11 +753,7 @@ PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args)
config.output.u.YUVA.y_size);
}
#if PY_VERSION_HEX >= 0x03000000
pymode = PyUnicode_FromString(mode);
#else
pymode = PyString_FromString(mode);
#endif
ret = Py_BuildValue("SiiSSS", bytes, config.output.width,
config.output.height, pymode,
NULL == icc_profile ? Py_None : icc_profile,
@ -848,7 +843,6 @@ static int setup_module(PyObject* m) {
return 0;
}
#if PY_VERSION_HEX >= 0x03000000
PyMODINIT_FUNC
PyInit__webp(void) {
PyObject* m;
@ -867,11 +861,3 @@ PyInit__webp(void) {
return m;
}
#else
PyMODINIT_FUNC
init_webp(void)
{
PyObject* m = Py_InitModule("_webp", webpMethods);
setup_module(m);
}
#endif

View File

@ -33,7 +33,6 @@
#include "Python.h"
#include "Imaging.h"
#include "py3.h"
#include "Gif.h"
#include "Raw.h"
@ -122,7 +121,7 @@ _decode(ImagingDecoderObject* decoder, PyObject* args)
int status;
ImagingSectionCookie cookie;
if (!PyArg_ParseTuple(args, PY_ARG_BYTES_LENGTH, &buffer, &bufsize))
if (!PyArg_ParseTuple(args, "y#", &buffer, &bufsize))
return NULL;
if (!decoder->pulls_fd) {

View File

@ -26,7 +26,6 @@
#include "Python.h"
#include "Imaging.h"
#include "py3.h"
/* -------------------------------------------------------------------- */
/* Windows DIB support */
@ -187,13 +186,8 @@ _frombytes(ImagingDisplayObject* display, PyObject* args)
char* ptr;
int bytes;
#if PY_VERSION_HEX >= 0x03000000
if (!PyArg_ParseTuple(args, "y#:frombytes", &ptr, &bytes))
return NULL;
#else
if (!PyArg_ParseTuple(args, "s#:fromstring", &ptr, &bytes))
return NULL;
#endif
if (display->dib->ysize * display->dib->linesize != bytes) {
PyErr_SetString(PyExc_ValueError, "wrong size");
@ -209,13 +203,8 @@ _frombytes(ImagingDisplayObject* display, PyObject* args)
static PyObject*
_tobytes(ImagingDisplayObject* display, PyObject* args)
{
#if PY_VERSION_HEX >= 0x03000000
if (!PyArg_ParseTuple(args, ":tobytes"))
return NULL;
#else
if (!PyArg_ParseTuple(args, ":tostring"))
return NULL;
#endif
return PyBytes_FromStringAndSize(
display->dib->bits, display->dib->ysize * display->dib->linesize
@ -741,7 +730,7 @@ PyImaging_DrawWmf(PyObject* self, PyObject* args)
int datasize;
int width, height;
int x0, y0, x1, y1;
if (!PyArg_ParseTuple(args, PY_ARG_BYTES_LENGTH"(ii)(iiii):_load", &data, &datasize,
if (!PyArg_ParseTuple(args, "y#(ii)(iiii):_load", &data, &datasize,
&width, &height, &x0, &x1, &y0, &y1))
return NULL;

View File

@ -26,7 +26,6 @@
#include "Python.h"
#include "Imaging.h"
#include "py3.h"
#include "Gif.h"
#ifdef HAVE_UNISTD_H
@ -567,7 +566,7 @@ PyImaging_ZipEncoderNew(PyObject* self, PyObject* args)
Py_ssize_t compress_type = -1;
char* dictionary = NULL;
Py_ssize_t dictionary_size = 0;
if (!PyArg_ParseTuple(args, "ss|nnn"PY_ARG_BYTES_LENGTH, &mode, &rawmode,
if (!PyArg_ParseTuple(args, "ss|nnny#", &mode, &rawmode,
&optimize,
&compress_level, &compress_type,
&dictionary, &dictionary_size))
@ -693,7 +692,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
item = PyList_GetItem(tags, pos);
// We already checked that tags is a 2-tuple list.
key = PyTuple_GetItem(item, 0);
key_int = (int)PyInt_AsLong(key);
key_int = (int)PyLong_AsLong(key);
value = PyTuple_GetItem(item, 1);
status = 0;
is_core_tag = 0;
@ -710,7 +709,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
if (!is_core_tag) {
PyObject *tag_type = PyDict_GetItem(types, key);
if (tag_type) {
int type_int = PyInt_AsLong(tag_type);
int type_int = PyLong_AsLong(tag_type);
if (type_int >= TIFF_BYTE && type_int <= TIFF_DOUBLE) {
type = (TIFFDataType)type_int;
}
@ -721,7 +720,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
if (type == TIFF_NOTYPE) {
// Autodetect type. Types should not be changed for backwards
// compatibility.
if (PyInt_Check(value)) {
if (PyLong_Check(value)) {
type = TIFF_LONG;
} else if (PyFloat_Check(value)) {
type = TIFF_DOUBLE;
@ -749,7 +748,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
if (type == TIFF_NOTYPE) {
// Autodetect type based on first item. Types should not be
// changed for backwards compatibility.
if (PyInt_Check(PyTuple_GetItem(value,0))) {
if (PyLong_Check(PyTuple_GetItem(value,0))) {
type = TIFF_LONG;
} else if (PyFloat_Check(PyTuple_GetItem(value,0))) {
type = TIFF_FLOAT;
@ -775,7 +774,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
av = calloc(len, sizeof(UINT8));
if (av) {
for (i=0;i<len;i++) {
av[i] = (UINT8)PyInt_AsLong(PyTuple_GetItem(value,i));
av[i] = (UINT8)PyLong_AsLong(PyTuple_GetItem(value,i));
}
status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
free(av);
@ -786,7 +785,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
av = calloc(len, sizeof(UINT16));
if (av) {
for (i=0;i<len;i++) {
av[i] = (UINT16)PyInt_AsLong(PyTuple_GetItem(value,i));
av[i] = (UINT16)PyLong_AsLong(PyTuple_GetItem(value,i));
}
status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
free(av);
@ -797,7 +796,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
av = calloc(len, sizeof(UINT32));
if (av) {
for (i=0;i<len;i++) {
av[i] = (UINT32)PyInt_AsLong(PyTuple_GetItem(value,i));
av[i] = (UINT32)PyLong_AsLong(PyTuple_GetItem(value,i));
}
status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
free(av);
@ -808,7 +807,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
av = calloc(len, sizeof(INT8));
if (av) {
for (i=0;i<len;i++) {
av[i] = (INT8)PyInt_AsLong(PyTuple_GetItem(value,i));
av[i] = (INT8)PyLong_AsLong(PyTuple_GetItem(value,i));
}
status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
free(av);
@ -819,7 +818,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
av = calloc(len, sizeof(INT16));
if (av) {
for (i=0;i<len;i++) {
av[i] = (INT16)PyInt_AsLong(PyTuple_GetItem(value,i));
av[i] = (INT16)PyLong_AsLong(PyTuple_GetItem(value,i));
}
status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
free(av);
@ -830,7 +829,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
av = calloc(len, sizeof(INT32));
if (av) {
for (i=0;i<len;i++) {
av[i] = (INT32)PyInt_AsLong(PyTuple_GetItem(value,i));
av[i] = (INT32)PyLong_AsLong(PyTuple_GetItem(value,i));
}
status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
free(av);
@ -862,19 +861,19 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
if (type == TIFF_SHORT) {
status = ImagingLibTiffSetField(&encoder->state,
(ttag_t) key_int,
(UINT16)PyInt_AsLong(value));
(UINT16)PyLong_AsLong(value));
} else if (type == TIFF_LONG) {
status = ImagingLibTiffSetField(&encoder->state,
(ttag_t) key_int,
(UINT32)PyInt_AsLong(value));
(UINT32)PyLong_AsLong(value));
} else if (type == TIFF_SSHORT) {
status = ImagingLibTiffSetField(&encoder->state,
(ttag_t) key_int,
(INT16)PyInt_AsLong(value));
(INT16)PyLong_AsLong(value));
} else if (type == TIFF_SLONG) {
status = ImagingLibTiffSetField(&encoder->state,
(ttag_t) key_int,
(INT32)PyInt_AsLong(value));
(INT32)PyLong_AsLong(value));
} else if (type == TIFF_FLOAT) {
status = ImagingLibTiffSetField(&encoder->state,
(ttag_t) key_int,
@ -886,11 +885,11 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
} else if (type == TIFF_BYTE) {
status = ImagingLibTiffSetField(&encoder->state,
(ttag_t) key_int,
(UINT8)PyInt_AsLong(value));
(UINT8)PyLong_AsLong(value));
} else if (type == TIFF_SBYTE) {
status = ImagingLibTiffSetField(&encoder->state,
(ttag_t) key_int,
(INT8)PyInt_AsLong(value));
(INT8)PyLong_AsLong(value));
} else if (type == TIFF_ASCII) {
status = ImagingLibTiffSetField(&encoder->state,
(ttag_t) key_int,
@ -984,7 +983,7 @@ static unsigned int* get_qtables_arrays(PyObject* qtables, int* qtablesLen) {
}
table_data = PySequence_Fast(table, "expected a sequence");
for (j = 0; j < DCTSIZE2; j++) {
qarrays[i * DCTSIZE2 + j] = PyInt_AS_LONG(PySequence_Fast_GET_ITEM(table_data, j));
qarrays[i * DCTSIZE2 + j] = PyLong_AS_LONG(PySequence_Fast_GET_ITEM(table_data, j));
}
Py_DECREF(table_data);
}
@ -1024,7 +1023,7 @@ PyImaging_JpegEncoderNew(PyObject* self, PyObject* args)
char* rawExif = NULL;
Py_ssize_t rawExifLen = 0;
if (!PyArg_ParseTuple(args, "ss|nnnnnnnnO"PY_ARG_BYTES_LENGTH""PY_ARG_BYTES_LENGTH,
if (!PyArg_ParseTuple(args, "ss|nnnnnnnnOy#y#",
&mode, &rawmode, &quality,
&progressive, &smooth, &optimize, &streamtype,
&xdpi, &ydpi, &subsampling, &qtables, &extra, &extra_size,
@ -1109,8 +1108,8 @@ j2k_decode_coord_tuple(PyObject *tuple, int *x, int *y)
*x = *y = 0;
if (tuple && PyTuple_Check(tuple) && PyTuple_GET_SIZE(tuple) == 2) {
*x = (int)PyInt_AsLong(PyTuple_GET_ITEM(tuple, 0));
*y = (int)PyInt_AsLong(PyTuple_GET_ITEM(tuple, 1));
*x = (int)PyLong_AsLong(PyTuple_GET_ITEM(tuple, 0));
*y = (int)PyLong_AsLong(PyTuple_GET_ITEM(tuple, 1));
if (*x < 0)
*x = 0;

View File

@ -1,6 +1,5 @@
#include "Python.h"
#include "Imaging.h"
#include "../py3.h"
Py_ssize_t
@ -72,7 +71,7 @@ _imaging_tell_pyFd(PyObject *fd)
Py_ssize_t location;
result = PyObject_CallMethod(fd, "tell", NULL);
location = PyInt_AsSsize_t(result);
location = PyLong_AsSsize_t(result);
Py_DECREF(result);
return location;

View File

@ -22,8 +22,6 @@
#include "Imaging.h"
#include "py3.h"
/* compatibility wrappers (defined in _imaging.c) */
extern int PyImaging_CheckBuffer(PyObject* buffer);
extern int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view);

View File

@ -31,8 +31,6 @@
#include <math.h>
#include "py3.h"
/* compatibility wrappers (defined in _imaging.c) */
extern int PyImaging_CheckBuffer(PyObject* buffer);
extern int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view);
@ -170,8 +168,8 @@ PyPath_Flatten(PyObject* data, double **pxy)
PyObject *op = PyList_GET_ITEM(data, i);
if (PyFloat_Check(op))
xy[j++] = PyFloat_AS_DOUBLE(op);
else if (PyInt_Check(op))
xy[j++] = (float) PyInt_AS_LONG(op);
else if (PyLong_Check(op))
xy[j++] = (float) PyLong_AS_LONG(op);
else if (PyNumber_Check(op))
xy[j++] = PyFloat_AsDouble(op);
else if (PyArg_ParseTuple(op, "dd", &x, &y)) {
@ -188,8 +186,8 @@ PyPath_Flatten(PyObject* data, double **pxy)
PyObject *op = PyTuple_GET_ITEM(data, i);
if (PyFloat_Check(op))
xy[j++] = PyFloat_AS_DOUBLE(op);
else if (PyInt_Check(op))
xy[j++] = (float) PyInt_AS_LONG(op);
else if (PyLong_Check(op))
xy[j++] = (float) PyLong_AS_LONG(op);
else if (PyNumber_Check(op))
xy[j++] = PyFloat_AsDouble(op);
else if (PyArg_ParseTuple(op, "dd", &x, &y)) {
@ -217,8 +215,8 @@ PyPath_Flatten(PyObject* data, double **pxy)
}
if (PyFloat_Check(op))
xy[j++] = PyFloat_AS_DOUBLE(op);
else if (PyInt_Check(op))
xy[j++] = (float) PyInt_AS_LONG(op);
else if (PyLong_Check(op))
xy[j++] = (float) PyLong_AS_LONG(op);
else if (PyNumber_Check(op))
xy[j++] = PyFloat_AsDouble(op);
else if (PyArg_ParseTuple(op, "dd", &x, &y)) {
@ -552,13 +550,8 @@ path_subscript(PyPathObject* self, PyObject* item) {
int len = 4;
Py_ssize_t start, stop, step, slicelength;
#if PY_VERSION_HEX >= 0x03020000
if (PySlice_GetIndicesEx(item, len, &start, &stop, &step, &slicelength) < 0)
return NULL;
#else
if (PySlice_GetIndicesEx((PySliceObject*)item, len, &start, &stop, &step, &slicelength) < 0)
return NULL;
#endif
if (slicelength <= 0) {
double *xy = alloc_array(0);

View File

@ -1,56 +0,0 @@
/*
Python3 definition file to consistently map the code to Python 2 or
Python 3.
PyInt and PyLong were merged into PyLong in Python 3, so all PyInt functions
are mapped to PyLong.
PyString, on the other hand, was split into PyBytes and PyUnicode. We map
both back onto PyString, so use PyBytes or PyUnicode where appropriate. The
only exception to this is _imagingft.c, where PyUnicode is left alone.
*/
#if PY_VERSION_HEX >= 0x03000000
#define PY_ARG_BYTES_LENGTH "y#"
/* Map PyInt -> PyLong */
#define PyInt_AsLong PyLong_AsLong
#define PyInt_Check PyLong_Check
#define PyInt_FromLong PyLong_FromLong
#define PyInt_AS_LONG PyLong_AS_LONG
#define PyInt_FromSsize_t PyLong_FromSsize_t
#define PyInt_AsSsize_t PyLong_AsSsize_t
#else /* PY_VERSION_HEX < 0x03000000 */
#define PY_ARG_BYTES_LENGTH "s#"
#if !defined(KEEP_PY_UNICODE)
/* Map PyUnicode -> PyString */
#undef PyUnicode_AsString
#undef PyUnicode_AS_STRING
#undef PyUnicode_Check
#undef PyUnicode_FromStringAndSize
#undef PyUnicode_FromString
#undef PyUnicode_FromFormat
#undef PyUnicode_DecodeFSDefault
#define PyUnicode_AsString PyString_AsString
#define PyUnicode_AS_STRING PyString_AS_STRING
#define PyUnicode_Check PyString_Check
#define PyUnicode_FromStringAndSize PyString_FromStringAndSize
#define PyUnicode_FromString PyString_FromString
#define PyUnicode_FromFormat PyString_FromFormat
#define PyUnicode_DecodeFSDefault PyString_FromString
#endif
/* Map PyBytes -> PyString */
#define PyBytesObject PyStringObject
#define PyBytes_AsString PyString_AsString
#define PyBytes_AS_STRING PyString_AS_STRING
#define PyBytes_Check PyString_Check
#define PyBytes_AsStringAndSize PyString_AsStringAndSize
#define PyBytes_FromStringAndSize PyString_FromStringAndSize
#define PyBytes_FromString PyString_FromString
#define _PyBytes_Resize _PyString_Resize
#endif /* PY_VERSION_HEX < 0x03000000 */

View File

@ -6,7 +6,7 @@
[tox]
envlist =
lint
py{27,35,36,37}
py{35,36,37}
minversion = 1.9
[testenv]

View File

@ -5,10 +5,6 @@ pacman -S --noconfirm mingw32/mingw-w64-i686-python3-pip \
mingw32/mingw-w64-i686-python3-setuptools \
mingw32/mingw-w64-i686-python3-pytest \
mingw32/mingw-w64-i686-python3-pytest-cov \
mingw32/mingw-w64-i686-python2-pip \
mingw32/mingw-w64-i686-python2-setuptools \
mingw32/mingw-w64-i686-python2-pytest \
mingw32/mingw-w64-i686-python2-pytest-cov \
mingw-w64-i686-libjpeg-turbo \
mingw-w64-i686-libimagequant

View File

@ -1,3 +0,0 @@
curl -fsSL -o pypy2.zip https://bitbucket.org/pypy/pypy/downloads/pypy2.7-v7.1.1-win32.zip
7z x pypy2.zip -oc:\
c:\Python37\Scripts\virtualenv.exe -p c:\pypy2.7-v7.1.1-win32\pypy.exe c:\vp\pypy2

View File

@ -105,9 +105,6 @@ def build_one(py_ver, compiler, bit):
args["executable"] = "%EXECUTABLE%"
args["py_ver"] = py_ver
if "27" in py_ver:
args["tcl_ver"] = "85"
else:
args["tcl_ver"] = "86"
if compiler["vc_version"] == "2015":

View File

@ -4,8 +4,6 @@ SF_MIRROR = "http://iweb.dl.sourceforge.net"
PILLOW_DEPENDS_DIR = "C:\\pillow-depends\\"
pythons = {
"27": {"compiler": 7, "vc": 2010},
"pypy2": {"compiler": 7, "vc": 2010},
"35": {"compiler": 7.1, "vc": 2015},
"36": {"compiler": 7.1, "vc": 2015},
"pypy3": {"compiler": 7.1, "vc": 2015},
@ -131,7 +129,7 @@ compilers = {
def pyversion_from_env():
py = os.environ["PYTHON"]
py_version = "27"
py_version = "35"
for k in pythons:
if k in py:
py_version = k

View File

@ -3,7 +3,7 @@ import os
from fetch import fetch
if __name__ == "__main__":
for version in ["2.7.15", "3.4.4"]:
for version in ["3.4.4"]:
for platform in ["", ".amd64"]:
for extension in ["", ".asc"]:
fetch(