Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow default ImageDraw font to be set #6484

Merged
merged 3 commits into from
Aug 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions Tests/test_imagedraw.py
Original file line number Diff line number Diff line change
Expand Up @@ -1314,6 +1314,23 @@ def test_stroke_multiline():
assert_image_similar_tofile(im, "Tests/images/imagedraw_stroke_multiline.png", 3.3)


def test_setting_default_font():
# Arrange
im = Image.new("RGB", (100, 250))
draw = ImageDraw.Draw(im)
font = ImageFont.truetype("Tests/fonts/FreeMono.ttf", 120)

# Act
ImageDraw.ImageDraw.font = font

# Assert
try:
assert draw.getfont() == font
finally:
ImageDraw.ImageDraw.font = None
assert isinstance(draw.getfont(), ImageFont.ImageFont)


def test_same_color_outline():
# Prepare shape
x0, y0 = 5, 5
Expand Down
7 changes: 6 additions & 1 deletion docs/reference/ImageDraw.rst
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ Fonts

PIL can use bitmap fonts or OpenType/TrueType fonts.

Bitmap fonts are stored in PILs own format, where each font typically consists
Bitmap fonts are stored in PIL's own format, where each font typically consists
of two files, one named .pil and the other usually named .pbm. The former
contains font metrics, the latter raster data.

Expand Down Expand Up @@ -146,6 +146,11 @@ Methods

Get the current default font.

To set the default font for all future ImageDraw instances::

from PIL import ImageDraw, ImageFont
ImageDraw.ImageDraw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf")

:returns: An image font.

.. py:method:: ImageDraw.arc(xy, start, end, fill=None, width=0)
Expand Down
10 changes: 10 additions & 0 deletions docs/releasenotes/9.3.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,16 @@ TODO
API Additions
=============

Allow default ImageDraw font to be set
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Rather than specifying a font when calling text-related ImageDraw methods, or
setting a font on each ImageDraw instance, the default font can now be set for
all future ImageDraw operations::

from PIL import ImageDraw, ImageFont
ImageDraw.ImageDraw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf")

Saving multiple MPO frames
^^^^^^^^^^^^^^^^^^^^^^^^^^

Expand Down
8 changes: 7 additions & 1 deletion src/PIL/ImageDraw.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@


class ImageDraw:
font = None

def __init__(self, im, mode=None):
"""
Create a drawing instance.
Expand Down Expand Up @@ -86,12 +88,16 @@ def __init__(self, im, mode=None):
else:
self.fontmode = "L" # aliasing is okay for other modes
self.fill = 0
self.font = None

def getfont(self):
"""
Get the current default font.

To set the default font for all future ImageDraw instances::

from PIL import ImageDraw, ImageFont
ImageDraw.ImageDraw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf")

:returns: An image font."""
if not self.font:
# FIXME: should add a font repository
Expand Down