From 170ac18007209a239431e43b3fbe110c63f366bd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 18 Oct 2023 14:47:03 +1100 Subject: [PATCH] Added load_pilfont() --- Tests/test_imagefontpil.py | 26 +++++++++++++++--------- docs/reference/ImageFont.rst | 1 + src/PIL/ImageFont.py | 39 ++++++++++++++++++++++-------------- 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/Tests/test_imagefontpil.py b/Tests/test_imagefontpil.py index c30463e81c2..1086a6c688a 100644 --- a/Tests/test_imagefontpil.py +++ b/Tests/test_imagefontpil.py @@ -4,42 +4,48 @@ from .helper import assert_image_equal_tofile -pytestmark = pytest.mark.skipif( - features.check_module("freetype2"), - reason="PILfont superseded if FreeType is supported", -) +funcs = [ImageFont.load_pilfont] +if not features.check_module("freetype2"): + funcs.append(ImageFont.load_default) -def test_default_font(): +@pytest.mark.parametrize("func", funcs) +def test_default_font(func): # Arrange txt = 'This is a "better than nothing" default font.' im = Image.new(mode="RGB", size=(300, 100)) draw = ImageDraw.Draw(im) # Act - default_font = ImageFont.load_default() + default_font = func() draw.text((10, 10), txt, font=default_font) # Assert assert_image_equal_tofile(im, "Tests/images/default_font.png") +@pytest.mark.skipif( + features.check_module("freetype2"), + reason="PILfont superseded if FreeType is supported", +) def test_size_without_freetype(): with pytest.raises(ImportError): ImageFont.load_default(size=14) -def test_unicode(): +@pytest.mark.parametrize("func", funcs) +def test_unicode(func): # should not segfault, should return UnicodeDecodeError # issue #2826 - font = ImageFont.load_default() + font = func() with pytest.raises(UnicodeEncodeError): font.getbbox("’") -def test_textbbox(): +@pytest.mark.parametrize("func", funcs) +def test_textbbox(func): im = Image.new("RGB", (200, 200)) d = ImageDraw.Draw(im) - default_font = ImageFont.load_default() + default_font = func() assert d.textlength("test", font=default_font) == 24 assert d.textbbox((0, 0), "test", font=default_font) == (0, 0, 24, 11) diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index 2abfa0cc997..a3772922e4a 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -53,6 +53,7 @@ Functions .. autofunction:: PIL.ImageFont.load_path .. autofunction:: PIL.ImageFont.truetype .. autofunction:: PIL.ImageFont.load_default +.. autofunction:: PIL.ImageFont.load_pilfont Methods ------- diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index c2956213519..d178620ce60 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -1107,12 +1107,21 @@ def load_default(size=None): layout_engine=Layout.BASIC, ) else: - f = ImageFont() - f._load_pilfont_data( - # courB08 - BytesIO( - base64.b64decode( - b""" + f = load_pilfont() + return f + + +def load_pilfont(): + """Load a "better than nothing" font. + + :return: A font object. + """ + f = ImageFont() + f._load_pilfont_data( + # courB08 + BytesIO( + base64.b64decode( + b""" UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA @@ -1205,12 +1214,12 @@ def load_default(size=None): AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// +QAGAAIAzgAKANUAEw== """ - ) - ), - Image.open( - BytesIO( - base64.b64decode( - b""" + ) + ), + Image.open( + BytesIO( + base64.b64decode( + b""" iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g @@ -1235,8 +1244,8 @@ def load_default(size=None): Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR w7IkEbzhVQAAAABJRU5ErkJggg== """ - ) ) - ), - ) + ) + ), + ) return f