diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index d5816813a..32177f1d8 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -29,6 +29,7 @@ from __future__ import print_function from PIL import Image import os, sys +import warnings class _imagingft_not_installed: # module placeholder @@ -129,9 +130,19 @@ class ImageFont: class FreeTypeFont: "FreeType font wrapper (requires _imagingft service)" - def __init__(self, file=None, size=10, index=0, encoding="", file_like=None): + def __init__(self, font=None, size=10, index=0, encoding="", file=None): # FIXME: use service provider instead - self.font = core.getfont(file, size, index, encoding, file_like) + if file: + warnings.warn('`file` parameter deprecated, please use `font` instead.', DeprecationWarning) + font = file + + if isinstance(font, basestring): + self.font = core.getfont(font, size, index, encoding) + else: + bytes = font.read() + font.seek(0, 2) + size = font.tell() + self.font = core.getfont("", size, index, encoding, bytes, size) def getname(self): return self.font.family, self.font.style @@ -212,10 +223,15 @@ def load(filename): # @return A font object. # @exception IOError If the file could not be read. -def truetype(filename=None, size=10, index=0, encoding="", file_like=None): +def truetype(font=None, size=10, index=0, encoding="", filename=None): "Load a truetype font file." + + if filename: + warnings.warn('`file` parameter deprecated, please use `font` instead.', DeprecationWarning) + font = filename + try: - return FreeTypeFont(filename, size, index, encoding, file_like) + return FreeTypeFont(font, size, index, encoding) except IOError: if sys.platform == "win32": # check the windows font repository @@ -223,8 +239,8 @@ def truetype(filename=None, size=10, index=0, encoding="", file_like=None): # 1.5.2's os.environ.get() windir = os.environ.get("WINDIR") if windir: - filename = os.path.join(windir, "fonts", filename) - return FreeTypeFont(filename, size, index, encoding, file_like) + filename = os.path.join(windir, "fonts", font) + return FreeTypeFont(font, size, index, encoding) raise ## diff --git a/Tests/fonts/FreeMono.ttf b/Tests/fonts/FreeMono.ttf new file mode 100644 index 000000000..f88bcef9c Binary files /dev/null and b/Tests/fonts/FreeMono.ttf differ diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 3c4e1f1b8..27af95cd3 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -1,6 +1,7 @@ from tester import * from PIL import Image +import StringIO try: from PIL import ImageFont ImageFont.core.getfont # check if freetype is available @@ -8,5 +9,21 @@ except ImportError: skip() def test_sanity(): - assert_match(ImageFont.core.freetype2_version, "\d+\.\d+\.\d+$") + +def test_font_with_name(): + font_name = "Tests/fonts/FreeMono.ttf" + font_size = 10 + assert_no_exception(lambda: ImageFont.truetype(font_name, font_size)) + +def test_font_with_filelike(): + font_name = "Tests/fonts/FreeMono.ttf" + font_filelike = StringIO.StringIO(open(font_name, 'rb').read()) + font_size = 10 + assert_no_exception(lambda: ImageFont.truetype(font_filelike, font_size)) + +def test_font_old_parameters(): + font_name = "Tests/fonts/FreeMono.ttf" + font_size = 10 + assert_warning(DeprecationWarning, lambda: ImageFont.truetype(filename=font_name, size=font_size)) + diff --git a/_imagingft.c b/_imagingft.c index e3e5bf638..910e4bfde 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -102,15 +102,17 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) char* filename = NULL; int size; int index = 0; - unsigned char* encoding = NULL; - Py_buffer file_like; + unsigned char* encoding; + unsigned char** file_like; + int file_like_size = 0; static char* kwlist[] = { - "filename", "size", "index", "encoding", "file_like", NULL + "filename", "size", "index", "encoding", "file_like", "file_like_size", NULL }; - if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|isz*", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|isz*i", kwlist, Py_FileSystemDefaultEncoding, &filename, - &size, &index, &encoding, &file_like)) + &size, &index, &encoding, file_like, + &file_like_size)) return NULL; if (!library) { @@ -125,10 +127,10 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) if (!self) return NULL; - if (filename && file_like.len<0) { + if (filename && file_like_size <= 0) { error = FT_New_Face(library, filename, index, &self->face); } else { - error = FT_New_Memory_Face(library, (FT_Byte*)file_like.buf, file_like.len, index, &self->face); + error = FT_New_Memory_Face(library, (FT_Byte*)file_like, file_like_size, index, &self->face); } if (!error) @@ -142,13 +144,12 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) } if (error) { - if(file_like.len < 0) { - PyBuffer_Release(&file_like); - } PyObject_Del(self); return geterror(error); } + fprintf(stderr, "> %d %d %s\n", error, file_like_size, self); + return (PyObject*) self; }