mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-08-09 14:54:46 +03:00
Merge remote-tracking branch 'upstream/master' into licence
This commit is contained in:
commit
b0b16e6c5f
15
CHANGES.rst
15
CHANGES.rst
|
@ -4,6 +4,15 @@ Changelog (Pillow)
|
||||||
2.8.0 (unreleased)
|
2.8.0 (unreleased)
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
- Added copy method font_variant() and accessible properties to truetype() #1123
|
||||||
|
[radarhere]
|
||||||
|
|
||||||
|
- Fix ImagingEffectNoise #1128
|
||||||
|
[hugovk]
|
||||||
|
|
||||||
|
- Remove unreachable code
|
||||||
|
[hugovk]
|
||||||
|
|
||||||
- Let Python do the endian stuff + tests #1121
|
- Let Python do the endian stuff + tests #1121
|
||||||
[amoibos, radarhere]
|
[amoibos, radarhere]
|
||||||
|
|
||||||
|
@ -52,7 +61,7 @@ Changelog (Pillow)
|
||||||
- Fix MSVC compiler error: Use Py_ssize_t instead of ssize_t #1051
|
- Fix MSVC compiler error: Use Py_ssize_t instead of ssize_t #1051
|
||||||
[cgohlke]
|
[cgohlke]
|
||||||
|
|
||||||
- Fix compiler error: MSVC needs varaibles defined at the start of the block #1048
|
- Fix compiler error: MSVC needs variables defined at the start of the block #1048
|
||||||
[cgohlke]
|
[cgohlke]
|
||||||
|
|
||||||
- The GIF Palette optimization algorithm is only applicable to mode='P' or 'L' #993
|
- The GIF Palette optimization algorithm is only applicable to mode='P' or 'L' #993
|
||||||
|
@ -1787,7 +1796,7 @@ Changelog (Pillow)
|
||||||
(1.1.2c1 and 1.1.2 final released)
|
(1.1.2c1 and 1.1.2 final released)
|
||||||
|
|
||||||
+ Adapted to Python 2.1. Among other things, all uses of the
|
+ Adapted to Python 2.1. Among other things, all uses of the
|
||||||
"regex" module has been repleased with "re".
|
"regex" module have been replaced with "re".
|
||||||
|
|
||||||
+ Fixed attribute error when reading large PNG files (this bug
|
+ Fixed attribute error when reading large PNG files (this bug
|
||||||
was introduced in maintenance code released after the 1.1.1
|
was introduced in maintenance code released after the 1.1.1
|
||||||
|
@ -2411,7 +2420,7 @@ Changelog (Pillow)
|
||||||
the default value is 75.
|
the default value is 75.
|
||||||
|
|
||||||
JPEG smooth smooth dithered images. value
|
JPEG smooth smooth dithered images. value
|
||||||
is strengh (1-100). default is
|
is strength (1-100). default is
|
||||||
off (0).
|
off (0).
|
||||||
|
|
||||||
PNG optimize minimize output file at the
|
PNG optimize minimize output file at the
|
||||||
|
|
|
@ -133,6 +133,11 @@ class FreeTypeFont:
|
||||||
DeprecationWarning)
|
DeprecationWarning)
|
||||||
font = file
|
font = file
|
||||||
|
|
||||||
|
self.path = font
|
||||||
|
self.size = size
|
||||||
|
self.index = index
|
||||||
|
self.encoding = encoding
|
||||||
|
|
||||||
if isPath(font):
|
if isPath(font):
|
||||||
self.font = core.getfont(font, size, index, encoding)
|
self.font = core.getfont(font, size, index, encoding)
|
||||||
else:
|
else:
|
||||||
|
@ -162,6 +167,22 @@ class FreeTypeFont:
|
||||||
self.font.render(text, im.id, mode == "1")
|
self.font.render(text, im.id, mode == "1")
|
||||||
return im, offset
|
return im, offset
|
||||||
|
|
||||||
|
def font_variant(self, font=None, size=None, index=None, encoding=None):
|
||||||
|
"""
|
||||||
|
Create a copy of this FreeTypeFont object,
|
||||||
|
using any specified arguments to override the settings.
|
||||||
|
|
||||||
|
Parameters are identical to the parameters used to initialize this
|
||||||
|
object, minus the deprecated 'file' argument.
|
||||||
|
|
||||||
|
:return: A FreeTypeFont object.
|
||||||
|
"""
|
||||||
|
return FreeTypeFont(font=self.path if font is None else font,
|
||||||
|
size=self.size if size is None else size,
|
||||||
|
index=self.index if index is None else index,
|
||||||
|
encoding=self.encoding if encoding is None else
|
||||||
|
encoding)
|
||||||
|
|
||||||
##
|
##
|
||||||
# Wrapper that creates a transposed font from any existing font
|
# Wrapper that creates a transposed font from any existing font
|
||||||
# object.
|
# object.
|
||||||
|
@ -255,8 +276,8 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None):
|
||||||
elif sys.platform in ('linux', 'linux2'):
|
elif sys.platform in ('linux', 'linux2'):
|
||||||
lindirs = os.environ.get("XDG_DATA_DIRS", "")
|
lindirs = os.environ.get("XDG_DATA_DIRS", "")
|
||||||
if not lindirs:
|
if not lindirs:
|
||||||
#According to the freedesktop spec, XDG_DATA_DIRS should
|
# According to the freedesktop spec, XDG_DATA_DIRS should
|
||||||
#default to /usr/share
|
# default to /usr/share
|
||||||
lindirs = '/usr/share'
|
lindirs = '/usr/share'
|
||||||
lindirs = lindirs.split(":")
|
lindirs = lindirs.split(":")
|
||||||
for lindir in lindirs:
|
for lindir in lindirs:
|
||||||
|
@ -266,7 +287,8 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None):
|
||||||
filepath = os.path.join(walkroot, ttf_filename)
|
filepath = os.path.join(walkroot, ttf_filename)
|
||||||
return FreeTypeFont(filepath, size, index, encoding)
|
return FreeTypeFont(filepath, size, index, encoding)
|
||||||
elif sys.platform == 'darwin':
|
elif sys.platform == 'darwin':
|
||||||
macdirs = ['/Library/Fonts/', '/System/Library/Fonts/', os.path.expanduser('~/Library/Fonts/')]
|
macdirs = ['/Library/Fonts/', '/System/Library/Fonts/',
|
||||||
|
os.path.expanduser('~/Library/Fonts/')]
|
||||||
for macdir in macdirs:
|
for macdir in macdirs:
|
||||||
filepath = os.path.join(macdir, ttf_filename)
|
filepath = os.path.join(macdir, ttf_filename)
|
||||||
if os.path.exists(filepath):
|
if os.path.exists(filepath):
|
||||||
|
|
|
@ -729,10 +729,6 @@ def _save(im, fp, filename, chunk=putchunk, check=0):
|
||||||
alpha_bytes = 2**bits
|
alpha_bytes = 2**bits
|
||||||
chunk(fp, b"tRNS", alpha[:alpha_bytes])
|
chunk(fp, b"tRNS", alpha[:alpha_bytes])
|
||||||
|
|
||||||
if 0:
|
|
||||||
# FIXME: to be supported some day
|
|
||||||
chunk(fp, b"gAMA", o32(int(gamma * 100000.0)))
|
|
||||||
|
|
||||||
dpi = im.encoderinfo.get("dpi")
|
dpi = im.encoderinfo.get("dpi")
|
||||||
if dpi:
|
if dpi:
|
||||||
chunk(fp, b"pHYs",
|
chunk(fp, b"pHYs",
|
||||||
|
|
|
@ -7,7 +7,11 @@ Pillow is the "friendly" PIL fork by `Alex Clark and Contributors <https://githu
|
||||||
|
|
||||||
.. image:: https://travis-ci.org/python-pillow/Pillow.svg?branch=master
|
.. image:: https://travis-ci.org/python-pillow/Pillow.svg?branch=master
|
||||||
:target: https://travis-ci.org/python-pillow/Pillow
|
:target: https://travis-ci.org/python-pillow/Pillow
|
||||||
:alt: Travis CI build status
|
:alt: Travis CI build status (Linux)
|
||||||
|
|
||||||
|
.. image:: https://travis-ci.org/python-pillow/pillow-wheels.svg?branch=latest
|
||||||
|
:target: https://travis-ci.org/python-pillow/pillow-wheels
|
||||||
|
:alt: Travis CI build status (OS X)
|
||||||
|
|
||||||
.. image:: https://pypip.in/v/Pillow/badge.png
|
.. image:: https://pypip.in/v/Pillow/badge.png
|
||||||
:target: https://pypi.python.org/pypi/Pillow/
|
:target: https://pypi.python.org/pypi/Pillow/
|
||||||
|
|
|
@ -78,7 +78,7 @@ def makedelta(fp, sequence):
|
||||||
if not previous:
|
if not previous:
|
||||||
|
|
||||||
# global header
|
# global header
|
||||||
for s in getheader(im) + getdata(im):
|
for s in getheader(im)[0] + getdata(im):
|
||||||
fp.write(s)
|
fp.write(s)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -168,8 +168,6 @@ class TestImage(PillowTestCase):
|
||||||
ValueError,
|
ValueError,
|
||||||
lambda: Image.effect_mandelbrot(size, extent, quality))
|
lambda: Image.effect_mandelbrot(size, extent, quality))
|
||||||
|
|
||||||
@unittest.skipUnless(sys.platform.startswith('win32'),
|
|
||||||
"Stalls on Travis CI, passes on Windows")
|
|
||||||
def test_effect_noise(self):
|
def test_effect_noise(self):
|
||||||
# Arrange
|
# Arrange
|
||||||
size = (100, 100)
|
size = (100, 100)
|
||||||
|
@ -180,8 +178,8 @@ class TestImage(PillowTestCase):
|
||||||
|
|
||||||
# Assert
|
# Assert
|
||||||
self.assertEqual(im.size, (100, 100))
|
self.assertEqual(im.size, (100, 100))
|
||||||
self.assertEqual(im.getpixel((0, 0)), 60)
|
self.assertEqual(im.mode, "L")
|
||||||
self.assertEqual(im.getpixel((0, 1)), 28)
|
self.assertNotEqual(im.getpixel((0, 0)), im.getpixel((0, 1)))
|
||||||
|
|
||||||
def test_effect_spread(self):
|
def test_effect_spread(self):
|
||||||
# Arrange
|
# Arrange
|
||||||
|
|
|
@ -44,6 +44,22 @@ try:
|
||||||
self.assertRegexpMatches(
|
self.assertRegexpMatches(
|
||||||
ImageFont.core.freetype2_version, "\d+\.\d+\.\d+$")
|
ImageFont.core.freetype2_version, "\d+\.\d+\.\d+$")
|
||||||
|
|
||||||
|
def test_font_properties(self):
|
||||||
|
ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE)
|
||||||
|
self.assertEqual(ttf.path, FONT_PATH)
|
||||||
|
self.assertEqual(ttf.size, FONT_SIZE)
|
||||||
|
|
||||||
|
ttf_copy = ttf.font_variant()
|
||||||
|
self.assertEqual(ttf_copy.path, FONT_PATH)
|
||||||
|
self.assertEqual(ttf_copy.size, FONT_SIZE)
|
||||||
|
|
||||||
|
ttf_copy = ttf.font_variant(size=FONT_SIZE+1)
|
||||||
|
self.assertEqual(ttf_copy.size, FONT_SIZE+1)
|
||||||
|
|
||||||
|
second_font_path = "Tests/fonts/DejaVuSans.ttf"
|
||||||
|
ttf_copy = ttf.font_variant(font=second_font_path)
|
||||||
|
self.assertEqual(ttf_copy.path, second_font_path)
|
||||||
|
|
||||||
def test_font_with_name(self):
|
def test_font_with_name(self):
|
||||||
ImageFont.truetype(FONT_PATH, FONT_SIZE)
|
ImageFont.truetype(FONT_PATH, FONT_SIZE)
|
||||||
self._render(FONT_PATH)
|
self._render(FONT_PATH)
|
||||||
|
|
|
@ -12,7 +12,7 @@ Installation
|
||||||
|
|
||||||
.. note:: Pillow < 2.0.0 supports Python versions 2.4, 2.5, 2.6, 2.7.
|
.. note:: Pillow < 2.0.0 supports Python versions 2.4, 2.5, 2.6, 2.7.
|
||||||
|
|
||||||
Simple installation
|
Simple Installation
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
@ -121,7 +121,7 @@ Sample Usage::
|
||||||
$ MAX_CONCURRENCY=1 python setup.py build-ext --enable-[feature] install
|
$ MAX_CONCURRENCY=1 python setup.py build-ext --enable-[feature] install
|
||||||
|
|
||||||
|
|
||||||
Linux installation
|
Linux Installation
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
@ -160,10 +160,10 @@ Prerequisites are installed on **Fedora 20** with::
|
||||||
lcms2-devel libwebp-devel tcl-devel tk-devel
|
lcms2-devel libwebp-devel tcl-devel tk-devel
|
||||||
|
|
||||||
|
|
||||||
Mac OS X installation
|
OS X Installation
|
||||||
---------------------
|
-----------------
|
||||||
|
|
||||||
We provide binaries for OS X in the form of `Python Wheels <http://wheel.readthedocs.org/en/latest/index.html>`_. Alternatively you can compile Pillow with with XCode.
|
We provide binaries for OS X in the form of `Python Wheels <http://wheel.readthedocs.org/en/latest/index.html>`_. Alternatively you can compile Pillow from soure with XCode.
|
||||||
|
|
||||||
The easiest way to install external libraries is via `Homebrew <http://mxcl.github.com/homebrew/>`_. After you install Homebrew, run::
|
The easiest way to install external libraries is via `Homebrew <http://mxcl.github.com/homebrew/>`_. After you install Homebrew, run::
|
||||||
|
|
||||||
|
@ -173,7 +173,7 @@ Install Pillow with::
|
||||||
|
|
||||||
$ pip install Pillow
|
$ pip install Pillow
|
||||||
|
|
||||||
Windows installation
|
Windows Installation
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
We provide binaries for Windows in the form of Python Eggs and `Python Wheels
|
We provide binaries for Windows in the form of Python Eggs and `Python Wheels
|
||||||
|
@ -194,11 +194,11 @@ Python Eggs
|
||||||
Python Wheels
|
Python Wheels
|
||||||
^^^^^^^^^^^^^
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
.. Note:: Experimental. Requires setuptools >=0.8 and pip >=1.4.1
|
.. Note:: Requires setuptools >=0.8 and pip >=1.4.1. Some older versions of pip required the ``--use-wheel`` flag.
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
$ pip install --use-wheel Pillow
|
$ pip install Pillow
|
||||||
|
|
||||||
If the above does not work, it's likely because we haven't uploaded a
|
If the above does not work, it's likely because we haven't uploaded a
|
||||||
wheel for the latest version of Pillow. In that case, try pinning it
|
wheel for the latest version of Pillow. In that case, try pinning it
|
||||||
|
@ -206,10 +206,10 @@ to a specific version:
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
$ pip install --use-wheel Pillow==2.6.1
|
$ pip install Pillow==2.6.1
|
||||||
|
|
||||||
FreeBSD installation
|
FreeBSD Installation
|
||||||
---------------------
|
--------------------
|
||||||
|
|
||||||
.. Note:: Only FreeBSD 10 tested
|
.. Note:: Only FreeBSD 10 tested
|
||||||
|
|
||||||
|
|
|
@ -204,19 +204,6 @@ ImagingNewDIB(const char *mode, int xsize, int ysize)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0
|
|
||||||
{
|
|
||||||
/* DEBUG: dump palette to file */
|
|
||||||
FILE *err = fopen("dib.pal", "w");
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
fprintf(err, "%d: %d/%d/%d\n", i,
|
|
||||||
pal->palPalEntry[i].peRed,
|
|
||||||
pal->palPalEntry[i].peGreen,
|
|
||||||
pal->palPalEntry[i].peBlue);
|
|
||||||
fclose(err);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
dib->palette = CreatePalette(pal);
|
dib->palette = CreatePalette(pal);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,8 +98,8 @@ ImagingEffectNoise(int xsize, int ysize, float sigma)
|
||||||
/* after numerical recipes */
|
/* after numerical recipes */
|
||||||
double v1, v2, radius, factor;
|
double v1, v2, radius, factor;
|
||||||
do {
|
do {
|
||||||
v1 = rand()*(2.0/32767.0) - 1.0;
|
v1 = rand()*(2.0/RAND_MAX) - 1.0;
|
||||||
v2 = rand()*(2.0/32767.0) - 1.0;
|
v2 = rand()*(2.0/RAND_MAX) - 1.0;
|
||||||
radius= v1*v1 + v2*v2;
|
radius= v1*v1 + v2*v2;
|
||||||
} while (radius >= 1.0);
|
} while (radius >= 1.0);
|
||||||
factor = sqrt(-2.0*log(radius)/radius);
|
factor = sqrt(-2.0*log(radius)/radius);
|
||||||
|
|
|
@ -304,23 +304,6 @@ perspective_transform(double* xin, double* yin, int x, int y, void* data)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static int
|
|
||||||
quadratic_transform(double* xin, double* yin, int x, int y, void* data)
|
|
||||||
{
|
|
||||||
double* a = (double*) data;
|
|
||||||
|
|
||||||
double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; double a3 = a[3];
|
|
||||||
double a4 = a[4]; double a5 = a[5]; double a6 = a[6]; double a7 = a[7];
|
|
||||||
double a8 = a[8]; double a9 = a[9]; double a10 = a[10]; double a11 = a[11];
|
|
||||||
|
|
||||||
xin[0] = a0 + a1*x + a2*y + a3*x*x + a4*x*y + a5*y*y;
|
|
||||||
yin[0] = a6 + a7*x + a8*y + a9*x*x + a10*x*y + a11*y*y;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
quad_transform(double* xin, double* yin, int x, int y, void* data)
|
quad_transform(double* xin, double* yin, int x, int y, void* data)
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,9 +44,6 @@ struct _HashTable {
|
||||||
#define RESIZE_FACTOR 3
|
#define RESIZE_FACTOR 3
|
||||||
|
|
||||||
static int _hashtable_insert_node(HashTable *,HashNode *,int,int,CollisionFunc);
|
static int _hashtable_insert_node(HashTable *,HashNode *,int,int,CollisionFunc);
|
||||||
#if 0
|
|
||||||
static int _hashtable_test(HashTable *);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
HashTable *hashtable_new(HashFunc hf,HashCmpFunc cf) {
|
HashTable *hashtable_new(HashFunc hf,HashCmpFunc cf) {
|
||||||
HashTable *h;
|
HashTable *h;
|
||||||
|
@ -132,22 +129,6 @@ static void _hashtable_resize(HashTable *h) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static int _hashtable_test(HashTable *h) {
|
|
||||||
uint32_t i;
|
|
||||||
int j;
|
|
||||||
HashNode *n;
|
|
||||||
for (i=0;i<h->length;i++) {
|
|
||||||
for (n=h->table[i];n&&n->next;n=n->next) {
|
|
||||||
j=h->cmpFunc(h,n->key,n->next->key);
|
|
||||||
printf ("%c",j?(j<0?'-':'+'):'=');
|
|
||||||
}
|
|
||||||
printf ("\n");
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int _hashtable_insert_node(HashTable *h,HashNode *node,int resize,int update,CollisionFunc cf) {
|
static int _hashtable_insert_node(HashTable *h,HashNode *node,int resize,int update,CollisionFunc cf) {
|
||||||
uint32_t hash=h->hashFunc(h,node->key)%h->length;
|
uint32_t hash=h->hashFunc(h,node->key)%h->length;
|
||||||
HashNode **n,*nv;
|
HashNode **n,*nv;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user