From 84ec2af495a13076ca5d0bec2f9439e9ee639a3c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 27 Feb 2015 14:48:07 +1100 Subject: [PATCH] Allow truetype() to search for extensions other than .ttf --- PIL/ImageFont.py | 34 +++++++++++++++------------------- Tests/test_imagefont.py | 6 +++++- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index a9c50e560..61c552b1d 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -261,38 +261,34 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): try: return FreeTypeFont(font, size, index, encoding) except IOError: - if font.endswith(".ttf"): - ttf_filename = font - else: - ttf_filename = "%s.ttf" % font + ttf_filename = os.path.basename(font) + + dirs = [] if sys.platform == "win32": # check the windows font repository # NOTE: must use uppercase WINDIR, to work around bugs in # 1.5.2's os.environ.get() windir = os.environ.get("WINDIR") if windir: - filename = os.path.join(windir, "fonts", font) - return FreeTypeFont(filename, size, index, encoding) + dirs.append(os.path.join(windir, "fonts")) elif sys.platform in ('linux', 'linux2'): lindirs = os.environ.get("XDG_DATA_DIRS", "") if not lindirs: # According to the freedesktop spec, XDG_DATA_DIRS should # default to /usr/share lindirs = '/usr/share' - lindirs = lindirs.split(":") - for lindir in lindirs: - parentpath = os.path.join(lindir, "fonts") - for walkroot, walkdir, walkfilenames in os.walk(parentpath): - if ttf_filename in walkfilenames: - filepath = os.path.join(walkroot, ttf_filename) - return FreeTypeFont(filepath, size, index, encoding) + dirs += [os.path.join(lindir, "fonts") for lindir in lindirs.split(":")] elif sys.platform == 'darwin': - macdirs = ['/Library/Fonts/', '/System/Library/Fonts/', - os.path.expanduser('~/Library/Fonts/')] - for macdir in macdirs: - filepath = os.path.join(macdir, ttf_filename) - if os.path.exists(filepath): - return FreeTypeFont(filepath, size, index, encoding) + dirs += ['/Library/Fonts/', '/System/Library/Fonts/', + os.path.expanduser('~/Library/Fonts/')] + + ext = os.path.splitext(ttf_filename)[1] + for dir in dirs: + for walkroot, walkdir, walkfilenames in os.walk(dir): + for walkfilename in walkfilenames: + if (ext and walkfilename == ttf_filename) or (not ext and os.path.splitext(walkfilename)[0] == ttf_filename): + fontpath = os.path.join(walkroot, walkfilename) + return FreeTypeFont(fontpath, size, index, encoding) raise diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 1b03ed13b..a7d3e5ebb 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -269,7 +269,11 @@ try: #correctness. with SimplePatcher(sys, 'platform', 'darwin'): fake_font_path = '/System/Library/Fonts/Arial.ttf' - with SimplePatcher(os.path, 'exists', lambda x: x == fake_font_path): + def fake_walker(path): + if path == '/System/Library/Fonts/': + return [(path, [], ['Arial.ttf'], )] + return [(path, [], ['some_random_font.ttf'], )] + with SimplePatcher(os, 'walk', fake_walker): self._test_fake_loading_font(fake_font_path)