| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | from __future__ import annotations
|
| |
|
| | import base64
|
| | import os
|
| | import sys
|
| | import warnings
|
| | from enum import IntEnum
|
| | from io import BytesIO
|
| | from types import ModuleType
|
| | from typing import IO, TYPE_CHECKING, Any, BinaryIO
|
| |
|
| | from . import Image
|
| | from ._typing import StrOrBytesPath
|
| | from ._util import DeferredError, is_path
|
| |
|
| | if TYPE_CHECKING:
|
| | from . import ImageFile
|
| | from ._imaging import ImagingFont
|
| | from ._imagingft import Font
|
| |
|
| |
|
| | class Layout(IntEnum):
|
| | BASIC = 0
|
| | RAQM = 1
|
| |
|
| |
|
| | MAX_STRING_LENGTH = 1_000_000
|
| |
|
| |
|
| | core: ModuleType | DeferredError
|
| | try:
|
| | from . import _imagingft as core
|
| | except ImportError as ex:
|
| | core = DeferredError.new(ex)
|
| |
|
| |
|
| | def _string_length_check(text: str | bytes | bytearray) -> None:
|
| | if MAX_STRING_LENGTH is not None and len(text) > MAX_STRING_LENGTH:
|
| | msg = "too many characters in string"
|
| | raise ValueError(msg)
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | class ImageFont:
|
| | """PIL font wrapper"""
|
| |
|
| | font: ImagingFont
|
| |
|
| | def _load_pilfont(self, filename: str) -> None:
|
| | with open(filename, "rb") as fp:
|
| | image: ImageFile.ImageFile | None = None
|
| | for ext in (".png", ".gif", ".pbm"):
|
| | if image:
|
| | image.close()
|
| | try:
|
| | fullname = os.path.splitext(filename)[0] + ext
|
| | image = Image.open(fullname)
|
| | except Exception:
|
| | pass
|
| | else:
|
| | if image and image.mode in ("1", "L"):
|
| | break
|
| | else:
|
| | if image:
|
| | image.close()
|
| | msg = "cannot find glyph data file"
|
| | raise OSError(msg)
|
| |
|
| | self.file = fullname
|
| |
|
| | self._load_pilfont_data(fp, image)
|
| | image.close()
|
| |
|
| | def _load_pilfont_data(self, file: IO[bytes], image: Image.Image) -> None:
|
| |
|
| | if file.readline() != b"PILfont\n":
|
| | msg = "Not a PILfont file"
|
| | raise SyntaxError(msg)
|
| | file.readline().split(b";")
|
| | self.info = []
|
| | while True:
|
| | s = file.readline()
|
| | if not s or s == b"DATA\n":
|
| | break
|
| | self.info.append(s)
|
| |
|
| |
|
| | data = file.read(256 * 20)
|
| |
|
| |
|
| | if image.mode not in ("1", "L"):
|
| | msg = "invalid font image mode"
|
| | raise TypeError(msg)
|
| |
|
| | image.load()
|
| |
|
| | self.font = Image.core.font(image.im, data)
|
| |
|
| | def getmask(self, text, mode="", *args, **kwargs):
|
| | """
|
| | Create a bitmap for the text.
|
| |
|
| | If the font uses antialiasing, the bitmap should have mode ``L`` and use a
|
| | maximum value of 255. Otherwise, it should have mode ``1``.
|
| |
|
| | :param text: Text to render.
|
| | :param mode: Used by some graphics drivers to indicate what mode the
|
| | driver prefers; if empty, the renderer may return either
|
| | mode. Note that the mode is always a string, to simplify
|
| | C-level implementations.
|
| |
|
| | .. versionadded:: 1.1.5
|
| |
|
| | :return: An internal PIL storage memory instance as defined by the
|
| | :py:mod:`PIL.Image.core` interface module.
|
| | """
|
| | _string_length_check(text)
|
| | Image._decompression_bomb_check(self.font.getsize(text))
|
| | return self.font.getmask(text, mode)
|
| |
|
| | def getbbox(
|
| | self, text: str | bytes | bytearray, *args: Any, **kwargs: Any
|
| | ) -> tuple[int, int, int, int]:
|
| | """
|
| | Returns bounding box (in pixels) of given text.
|
| |
|
| | .. versionadded:: 9.2.0
|
| |
|
| | :param text: Text to render.
|
| |
|
| | :return: ``(left, top, right, bottom)`` bounding box
|
| | """
|
| | _string_length_check(text)
|
| | width, height = self.font.getsize(text)
|
| | return 0, 0, width, height
|
| |
|
| | def getlength(
|
| | self, text: str | bytes | bytearray, *args: Any, **kwargs: Any
|
| | ) -> int:
|
| | """
|
| | Returns length (in pixels) of given text.
|
| | This is the amount by which following text should be offset.
|
| |
|
| | .. versionadded:: 9.2.0
|
| | """
|
| | _string_length_check(text)
|
| | width, height = self.font.getsize(text)
|
| | return width
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | class FreeTypeFont:
|
| | """FreeType font wrapper (requires _imagingft service)"""
|
| |
|
| | font: Font
|
| | font_bytes: bytes
|
| |
|
| | def __init__(
|
| | self,
|
| | font: StrOrBytesPath | BinaryIO | None = None,
|
| | size: float = 10,
|
| | index: int = 0,
|
| | encoding: str = "",
|
| | layout_engine: Layout | None = None,
|
| | ) -> None:
|
| |
|
| |
|
| | if isinstance(core, DeferredError):
|
| | raise core.ex
|
| |
|
| | if size <= 0:
|
| | msg = "font size must be greater than 0"
|
| | raise ValueError(msg)
|
| |
|
| | self.path = font
|
| | self.size = size
|
| | self.index = index
|
| | self.encoding = encoding
|
| |
|
| | if layout_engine not in (Layout.BASIC, Layout.RAQM):
|
| | layout_engine = Layout.BASIC
|
| | if core.HAVE_RAQM:
|
| | layout_engine = Layout.RAQM
|
| | elif layout_engine == Layout.RAQM and not core.HAVE_RAQM:
|
| | warnings.warn(
|
| | "Raqm layout was requested, but Raqm is not available. "
|
| | "Falling back to basic layout."
|
| | )
|
| | layout_engine = Layout.BASIC
|
| |
|
| | self.layout_engine = layout_engine
|
| |
|
| | def load_from_bytes(f):
|
| | self.font_bytes = f.read()
|
| | self.font = core.getfont(
|
| | "", size, index, encoding, self.font_bytes, layout_engine
|
| | )
|
| |
|
| | if is_path(font):
|
| | font = os.path.realpath(os.fspath(font))
|
| | if sys.platform == "win32":
|
| | font_bytes_path = font if isinstance(font, bytes) else font.encode()
|
| | try:
|
| | font_bytes_path.decode("ascii")
|
| | except UnicodeDecodeError:
|
| |
|
| |
|
| | with open(font, "rb") as f:
|
| | load_from_bytes(f)
|
| | return
|
| | self.font = core.getfont(
|
| | font, size, index, encoding, layout_engine=layout_engine
|
| | )
|
| | else:
|
| | load_from_bytes(font)
|
| |
|
| | def __getstate__(self):
|
| | return [self.path, self.size, self.index, self.encoding, self.layout_engine]
|
| |
|
| | def __setstate__(self, state):
|
| | path, size, index, encoding, layout_engine = state
|
| | self.__init__(path, size, index, encoding, layout_engine)
|
| |
|
| | def getname(self) -> tuple[str | None, str | None]:
|
| | """
|
| | :return: A tuple of the font family (e.g. Helvetica) and the font style
|
| | (e.g. Bold)
|
| | """
|
| | return self.font.family, self.font.style
|
| |
|
| | def getmetrics(self) -> tuple[int, int]:
|
| | """
|
| | :return: A tuple of the font ascent (the distance from the baseline to
|
| | the highest outline point) and descent (the distance from the
|
| | baseline to the lowest outline point, a negative value)
|
| | """
|
| | return self.font.ascent, self.font.descent
|
| |
|
| | def getlength(
|
| | self, text: str | bytes, mode="", direction=None, features=None, language=None
|
| | ) -> float:
|
| | """
|
| | Returns length (in pixels with 1/64 precision) of given text when rendered
|
| | in font with provided direction, features, and language.
|
| |
|
| | This is the amount by which following text should be offset.
|
| | Text bounding box may extend past the length in some fonts,
|
| | e.g. when using italics or accents.
|
| |
|
| | The result is returned as a float; it is a whole number if using basic layout.
|
| |
|
| | Note that the sum of two lengths may not equal the length of a concatenated
|
| | string due to kerning. If you need to adjust for kerning, include the following
|
| | character and subtract its length.
|
| |
|
| | For example, instead of ::
|
| |
|
| | hello = font.getlength("Hello")
|
| | world = font.getlength("World")
|
| | hello_world = hello + world # not adjusted for kerning
|
| | assert hello_world == font.getlength("HelloWorld") # may fail
|
| |
|
| | use ::
|
| |
|
| | hello = font.getlength("HelloW") - font.getlength("W") # adjusted for kerning
|
| | world = font.getlength("World")
|
| | hello_world = hello + world # adjusted for kerning
|
| | assert hello_world == font.getlength("HelloWorld") # True
|
| |
|
| | or disable kerning with (requires libraqm) ::
|
| |
|
| | hello = draw.textlength("Hello", font, features=["-kern"])
|
| | world = draw.textlength("World", font, features=["-kern"])
|
| | hello_world = hello + world # kerning is disabled, no need to adjust
|
| | assert hello_world == draw.textlength("HelloWorld", font, features=["-kern"])
|
| |
|
| | .. versionadded:: 8.0.0
|
| |
|
| | :param text: Text to measure.
|
| | :param mode: Used by some graphics drivers to indicate what mode the
|
| | driver prefers; if empty, the renderer may return either
|
| | mode. Note that the mode is always a string, to simplify
|
| | C-level implementations.
|
| |
|
| | :param direction: Direction of the text. It can be 'rtl' (right to
|
| | left), 'ltr' (left to right) or 'ttb' (top to bottom).
|
| | Requires libraqm.
|
| |
|
| | :param features: A list of OpenType font features to be used during text
|
| | layout. This is usually used to turn on optional
|
| | font features that are not enabled by default,
|
| | for example 'dlig' or 'ss01', but can be also
|
| | used to turn off default font features for
|
| | example '-liga' to disable ligatures or '-kern'
|
| | to disable kerning. To get all supported
|
| | features, see
|
| | https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
|
| | Requires libraqm.
|
| |
|
| | :param language: Language of the text. Different languages may use
|
| | different glyph shapes or ligatures. This parameter tells
|
| | the font which language the text is in, and to apply the
|
| | correct substitutions as appropriate, if available.
|
| | It should be a `BCP 47 language code
|
| | <https://www.w3.org/International/articles/language-tags/>`_
|
| | Requires libraqm.
|
| |
|
| | :return: Either width for horizontal text, or height for vertical text.
|
| | """
|
| | _string_length_check(text)
|
| | return self.font.getlength(text, mode, direction, features, language) / 64
|
| |
|
| | def getbbox(
|
| | self,
|
| | text: str | bytes,
|
| | mode: str = "",
|
| | direction: str | None = None,
|
| | features: list[str] | None = None,
|
| | language: str | None = None,
|
| | stroke_width: float = 0,
|
| | anchor: str | None = None,
|
| | ) -> tuple[float, float, float, float]:
|
| | """
|
| | Returns bounding box (in pixels) of given text relative to given anchor
|
| | when rendered in font with provided direction, features, and language.
|
| |
|
| | Use :py:meth:`getlength()` to get the offset of following text with
|
| | 1/64 pixel precision. The bounding box includes extra margins for
|
| | some fonts, e.g. italics or accents.
|
| |
|
| | .. versionadded:: 8.0.0
|
| |
|
| | :param text: Text to render.
|
| | :param mode: Used by some graphics drivers to indicate what mode the
|
| | driver prefers; if empty, the renderer may return either
|
| | mode. Note that the mode is always a string, to simplify
|
| | C-level implementations.
|
| |
|
| | :param direction: Direction of the text. It can be 'rtl' (right to
|
| | left), 'ltr' (left to right) or 'ttb' (top to bottom).
|
| | Requires libraqm.
|
| |
|
| | :param features: A list of OpenType font features to be used during text
|
| | layout. This is usually used to turn on optional
|
| | font features that are not enabled by default,
|
| | for example 'dlig' or 'ss01', but can be also
|
| | used to turn off default font features for
|
| | example '-liga' to disable ligatures or '-kern'
|
| | to disable kerning. To get all supported
|
| | features, see
|
| | https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
|
| | Requires libraqm.
|
| |
|
| | :param language: Language of the text. Different languages may use
|
| | different glyph shapes or ligatures. This parameter tells
|
| | the font which language the text is in, and to apply the
|
| | correct substitutions as appropriate, if available.
|
| | It should be a `BCP 47 language code
|
| | <https://www.w3.org/International/articles/language-tags/>`_
|
| | Requires libraqm.
|
| |
|
| | :param stroke_width: The width of the text stroke.
|
| |
|
| | :param anchor: The text anchor alignment. Determines the relative location of
|
| | the anchor to the text. The default alignment is top left,
|
| | specifically ``la`` for horizontal text and ``lt`` for
|
| | vertical text. See :ref:`text-anchors` for details.
|
| |
|
| | :return: ``(left, top, right, bottom)`` bounding box
|
| | """
|
| | _string_length_check(text)
|
| | size, offset = self.font.getsize(
|
| | text, mode, direction, features, language, anchor
|
| | )
|
| | left, top = offset[0] - stroke_width, offset[1] - stroke_width
|
| | width, height = size[0] + 2 * stroke_width, size[1] + 2 * stroke_width
|
| | return left, top, left + width, top + height
|
| |
|
| | def getmask(
|
| | self,
|
| | text,
|
| | mode="",
|
| | direction=None,
|
| | features=None,
|
| | language=None,
|
| | stroke_width=0,
|
| | anchor=None,
|
| | ink=0,
|
| | start=None,
|
| | ):
|
| | """
|
| | Create a bitmap for the text.
|
| |
|
| | If the font uses antialiasing, the bitmap should have mode ``L`` and use a
|
| | maximum value of 255. If the font has embedded color data, the bitmap
|
| | should have mode ``RGBA``. Otherwise, it should have mode ``1``.
|
| |
|
| | :param text: Text to render.
|
| | :param mode: Used by some graphics drivers to indicate what mode the
|
| | driver prefers; if empty, the renderer may return either
|
| | mode. Note that the mode is always a string, to simplify
|
| | C-level implementations.
|
| |
|
| | .. versionadded:: 1.1.5
|
| |
|
| | :param direction: Direction of the text. It can be 'rtl' (right to
|
| | left), 'ltr' (left to right) or 'ttb' (top to bottom).
|
| | Requires libraqm.
|
| |
|
| | .. versionadded:: 4.2.0
|
| |
|
| | :param features: A list of OpenType font features to be used during text
|
| | layout. This is usually used to turn on optional
|
| | font features that are not enabled by default,
|
| | for example 'dlig' or 'ss01', but can be also
|
| | used to turn off default font features for
|
| | example '-liga' to disable ligatures or '-kern'
|
| | to disable kerning. To get all supported
|
| | features, see
|
| | https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
|
| | Requires libraqm.
|
| |
|
| | .. versionadded:: 4.2.0
|
| |
|
| | :param language: Language of the text. Different languages may use
|
| | different glyph shapes or ligatures. This parameter tells
|
| | the font which language the text is in, and to apply the
|
| | correct substitutions as appropriate, if available.
|
| | It should be a `BCP 47 language code
|
| | <https://www.w3.org/International/articles/language-tags/>`_
|
| | Requires libraqm.
|
| |
|
| | .. versionadded:: 6.0.0
|
| |
|
| | :param stroke_width: The width of the text stroke.
|
| |
|
| | .. versionadded:: 6.2.0
|
| |
|
| | :param anchor: The text anchor alignment. Determines the relative location of
|
| | the anchor to the text. The default alignment is top left,
|
| | specifically ``la`` for horizontal text and ``lt`` for
|
| | vertical text. See :ref:`text-anchors` for details.
|
| |
|
| | .. versionadded:: 8.0.0
|
| |
|
| | :param ink: Foreground ink for rendering in RGBA mode.
|
| |
|
| | .. versionadded:: 8.0.0
|
| |
|
| | :param start: Tuple of horizontal and vertical offset, as text may render
|
| | differently when starting at fractional coordinates.
|
| |
|
| | .. versionadded:: 9.4.0
|
| |
|
| | :return: An internal PIL storage memory instance as defined by the
|
| | :py:mod:`PIL.Image.core` interface module.
|
| | """
|
| | return self.getmask2(
|
| | text,
|
| | mode,
|
| | direction=direction,
|
| | features=features,
|
| | language=language,
|
| | stroke_width=stroke_width,
|
| | anchor=anchor,
|
| | ink=ink,
|
| | start=start,
|
| | )[0]
|
| |
|
| | def getmask2(
|
| | self,
|
| | text: str | bytes,
|
| | mode="",
|
| | direction=None,
|
| | features=None,
|
| | language=None,
|
| | stroke_width=0,
|
| | anchor=None,
|
| | ink=0,
|
| | start=None,
|
| | *args,
|
| | **kwargs,
|
| | ):
|
| | """
|
| | Create a bitmap for the text.
|
| |
|
| | If the font uses antialiasing, the bitmap should have mode ``L`` and use a
|
| | maximum value of 255. If the font has embedded color data, the bitmap
|
| | should have mode ``RGBA``. Otherwise, it should have mode ``1``.
|
| |
|
| | :param text: Text to render.
|
| | :param mode: Used by some graphics drivers to indicate what mode the
|
| | driver prefers; if empty, the renderer may return either
|
| | mode. Note that the mode is always a string, to simplify
|
| | C-level implementations.
|
| |
|
| | .. versionadded:: 1.1.5
|
| |
|
| | :param direction: Direction of the text. It can be 'rtl' (right to
|
| | left), 'ltr' (left to right) or 'ttb' (top to bottom).
|
| | Requires libraqm.
|
| |
|
| | .. versionadded:: 4.2.0
|
| |
|
| | :param features: A list of OpenType font features to be used during text
|
| | layout. This is usually used to turn on optional
|
| | font features that are not enabled by default,
|
| | for example 'dlig' or 'ss01', but can be also
|
| | used to turn off default font features for
|
| | example '-liga' to disable ligatures or '-kern'
|
| | to disable kerning. To get all supported
|
| | features, see
|
| | https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
|
| | Requires libraqm.
|
| |
|
| | .. versionadded:: 4.2.0
|
| |
|
| | :param language: Language of the text. Different languages may use
|
| | different glyph shapes or ligatures. This parameter tells
|
| | the font which language the text is in, and to apply the
|
| | correct substitutions as appropriate, if available.
|
| | It should be a `BCP 47 language code
|
| | <https://www.w3.org/International/articles/language-tags/>`_
|
| | Requires libraqm.
|
| |
|
| | .. versionadded:: 6.0.0
|
| |
|
| | :param stroke_width: The width of the text stroke.
|
| |
|
| | .. versionadded:: 6.2.0
|
| |
|
| | :param anchor: The text anchor alignment. Determines the relative location of
|
| | the anchor to the text. The default alignment is top left,
|
| | specifically ``la`` for horizontal text and ``lt`` for
|
| | vertical text. See :ref:`text-anchors` for details.
|
| |
|
| | .. versionadded:: 8.0.0
|
| |
|
| | :param ink: Foreground ink for rendering in RGBA mode.
|
| |
|
| | .. versionadded:: 8.0.0
|
| |
|
| | :param start: Tuple of horizontal and vertical offset, as text may render
|
| | differently when starting at fractional coordinates.
|
| |
|
| | .. versionadded:: 9.4.0
|
| |
|
| | :return: A tuple of an internal PIL storage memory instance as defined by the
|
| | :py:mod:`PIL.Image.core` interface module, and the text offset, the
|
| | gap between the starting coordinate and the first marking
|
| | """
|
| | _string_length_check(text)
|
| | if start is None:
|
| | start = (0, 0)
|
| |
|
| | def fill(width, height):
|
| | size = (width, height)
|
| | Image._decompression_bomb_check(size)
|
| | return Image.core.fill("RGBA" if mode == "RGBA" else "L", size)
|
| |
|
| | return self.font.render(
|
| | text,
|
| | fill,
|
| | mode,
|
| | direction,
|
| | features,
|
| | language,
|
| | stroke_width,
|
| | anchor,
|
| | ink,
|
| | start[0],
|
| | start[1],
|
| | )
|
| |
|
| | def font_variant(
|
| | self, font=None, size=None, index=None, encoding=None, layout_engine=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.
|
| |
|
| | :return: A FreeTypeFont object.
|
| | """
|
| | if font is None:
|
| | try:
|
| | font = BytesIO(self.font_bytes)
|
| | except AttributeError:
|
| | font = self.path
|
| | return FreeTypeFont(
|
| | font=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,
|
| | layout_engine=layout_engine or self.layout_engine,
|
| | )
|
| |
|
| | def get_variation_names(self) -> list[bytes]:
|
| | """
|
| | :returns: A list of the named styles in a variation font.
|
| | :exception OSError: If the font is not a variation font.
|
| | """
|
| | try:
|
| | names = self.font.getvarnames()
|
| | except AttributeError as e:
|
| | msg = "FreeType 2.9.1 or greater is required"
|
| | raise NotImplementedError(msg) from e
|
| | return [name.replace(b"\x00", b"") for name in names]
|
| |
|
| | def set_variation_by_name(self, name):
|
| | """
|
| | :param name: The name of the style.
|
| | :exception OSError: If the font is not a variation font.
|
| | """
|
| | names = self.get_variation_names()
|
| | if not isinstance(name, bytes):
|
| | name = name.encode()
|
| | index = names.index(name) + 1
|
| |
|
| | if index == getattr(self, "_last_variation_index", None):
|
| |
|
| |
|
| |
|
| | return
|
| | self._last_variation_index = index
|
| |
|
| | self.font.setvarname(index)
|
| |
|
| | def get_variation_axes(self):
|
| | """
|
| | :returns: A list of the axes in a variation font.
|
| | :exception OSError: If the font is not a variation font.
|
| | """
|
| | try:
|
| | axes = self.font.getvaraxes()
|
| | except AttributeError as e:
|
| | msg = "FreeType 2.9.1 or greater is required"
|
| | raise NotImplementedError(msg) from e
|
| | for axis in axes:
|
| | if axis["name"]:
|
| | axis["name"] = axis["name"].replace(b"\x00", b"")
|
| | return axes
|
| |
|
| | def set_variation_by_axes(self, axes: list[float]) -> None:
|
| | """
|
| | :param axes: A list of values for each axis.
|
| | :exception OSError: If the font is not a variation font.
|
| | """
|
| | try:
|
| | self.font.setvaraxes(axes)
|
| | except AttributeError as e:
|
| | msg = "FreeType 2.9.1 or greater is required"
|
| | raise NotImplementedError(msg) from e
|
| |
|
| |
|
| | class TransposedFont:
|
| | """Wrapper for writing rotated or mirrored text"""
|
| |
|
| | def __init__(self, font, orientation=None):
|
| | """
|
| | Wrapper that creates a transposed font from any existing font
|
| | object.
|
| |
|
| | :param font: A font object.
|
| | :param orientation: An optional orientation. If given, this should
|
| | be one of Image.Transpose.FLIP_LEFT_RIGHT, Image.Transpose.FLIP_TOP_BOTTOM,
|
| | Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_180, or
|
| | Image.Transpose.ROTATE_270.
|
| | """
|
| | self.font = font
|
| | self.orientation = orientation
|
| |
|
| | def getmask(self, text, mode="", *args, **kwargs):
|
| | im = self.font.getmask(text, mode, *args, **kwargs)
|
| | if self.orientation is not None:
|
| | return im.transpose(self.orientation)
|
| | return im
|
| |
|
| | def getbbox(self, text, *args, **kwargs):
|
| |
|
| |
|
| | left, top, right, bottom = self.font.getbbox(text, *args, **kwargs)
|
| | width = right - left
|
| | height = bottom - top
|
| | if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270):
|
| | return 0, 0, height, width
|
| | return 0, 0, width, height
|
| |
|
| | def getlength(self, text: str | bytes, *args, **kwargs) -> float:
|
| | if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270):
|
| | msg = "text length is undefined for text rotated by 90 or 270 degrees"
|
| | raise ValueError(msg)
|
| | return self.font.getlength(text, *args, **kwargs)
|
| |
|
| |
|
| | def load(filename: str) -> ImageFont:
|
| | """
|
| | Load a font file. This function loads a font object from the given
|
| | bitmap font file, and returns the corresponding font object.
|
| |
|
| | :param filename: Name of font file.
|
| | :return: A font object.
|
| | :exception OSError: If the file could not be read.
|
| | """
|
| | f = ImageFont()
|
| | f._load_pilfont(filename)
|
| | return f
|
| |
|
| |
|
| | def truetype(
|
| | font: StrOrBytesPath | BinaryIO | None = None,
|
| | size: float = 10,
|
| | index: int = 0,
|
| | encoding: str = "",
|
| | layout_engine: Layout | None = None,
|
| | ) -> FreeTypeFont:
|
| | """
|
| | Load a TrueType or OpenType font from a file or file-like object,
|
| | and create a font object.
|
| | This function loads a font object from the given file or file-like
|
| | object, and creates a font object for a font of the given size.
|
| |
|
| | Pillow uses FreeType to open font files. On Windows, be aware that FreeType
|
| | will keep the file open as long as the FreeTypeFont object exists. Windows
|
| | limits the number of files that can be open in C at once to 512, so if many
|
| | fonts are opened simultaneously and that limit is approached, an
|
| | ``OSError`` may be thrown, reporting that FreeType "cannot open resource".
|
| | A workaround would be to copy the file(s) into memory, and open that instead.
|
| |
|
| | This function requires the _imagingft service.
|
| |
|
| | :param font: A filename or file-like object containing a TrueType font.
|
| | If the file is not found in this filename, the loader may also
|
| | search in other directories, such as:
|
| |
|
| | * The :file:`fonts/` directory on Windows,
|
| | * :file:`/Library/Fonts/`, :file:`/System/Library/Fonts/`
|
| | and :file:`~/Library/Fonts/` on macOS.
|
| | * :file:`~/.local/share/fonts`, :file:`/usr/local/share/fonts`,
|
| | and :file:`/usr/share/fonts` on Linux; or those specified by
|
| | the ``XDG_DATA_HOME`` and ``XDG_DATA_DIRS`` environment variables
|
| | for user-installed and system-wide fonts, respectively.
|
| |
|
| | :param size: The requested size, in pixels.
|
| | :param index: Which font face to load (default is first available face).
|
| | :param encoding: Which font encoding to use (default is Unicode). Possible
|
| | encodings include (see the FreeType documentation for more
|
| | information):
|
| |
|
| | * "unic" (Unicode)
|
| | * "symb" (Microsoft Symbol)
|
| | * "ADOB" (Adobe Standard)
|
| | * "ADBE" (Adobe Expert)
|
| | * "ADBC" (Adobe Custom)
|
| | * "armn" (Apple Roman)
|
| | * "sjis" (Shift JIS)
|
| | * "gb " (PRC)
|
| | * "big5"
|
| | * "wans" (Extended Wansung)
|
| | * "joha" (Johab)
|
| | * "lat1" (Latin-1)
|
| |
|
| | This specifies the character set to use. It does not alter the
|
| | encoding of any text provided in subsequent operations.
|
| | :param layout_engine: Which layout engine to use, if available:
|
| | :attr:`.ImageFont.Layout.BASIC` or :attr:`.ImageFont.Layout.RAQM`.
|
| | If it is available, Raqm layout will be used by default.
|
| | Otherwise, basic layout will be used.
|
| |
|
| | Raqm layout is recommended for all non-English text. If Raqm layout
|
| | is not required, basic layout will have better performance.
|
| |
|
| | You can check support for Raqm layout using
|
| | :py:func:`PIL.features.check_feature` with ``feature="raqm"``.
|
| |
|
| | .. versionadded:: 4.2.0
|
| | :return: A font object.
|
| | :exception OSError: If the file could not be read.
|
| | :exception ValueError: If the font size is not greater than zero.
|
| | """
|
| |
|
| | def freetype(font: StrOrBytesPath | BinaryIO | None) -> FreeTypeFont:
|
| | return FreeTypeFont(font, size, index, encoding, layout_engine)
|
| |
|
| | try:
|
| | return freetype(font)
|
| | except OSError:
|
| | if not is_path(font):
|
| | raise
|
| | ttf_filename = os.path.basename(font)
|
| |
|
| | dirs = []
|
| | if sys.platform == "win32":
|
| |
|
| |
|
| |
|
| | windir = os.environ.get("WINDIR")
|
| | if windir:
|
| | dirs.append(os.path.join(windir, "fonts"))
|
| | elif sys.platform in ("linux", "linux2"):
|
| | data_home = os.environ.get("XDG_DATA_HOME")
|
| | if not data_home:
|
| |
|
| |
|
| |
|
| | data_home = os.path.expanduser("~/.local/share")
|
| | xdg_dirs = [data_home]
|
| |
|
| | data_dirs = os.environ.get("XDG_DATA_DIRS")
|
| | if not data_dirs:
|
| |
|
| | data_dirs = "/usr/local/share:/usr/share"
|
| | xdg_dirs += data_dirs.split(":")
|
| |
|
| | dirs += [os.path.join(xdg_dir, "fonts") for xdg_dir in xdg_dirs]
|
| | elif sys.platform == "darwin":
|
| | dirs += [
|
| | "/Library/Fonts",
|
| | "/System/Library/Fonts",
|
| | os.path.expanduser("~/Library/Fonts"),
|
| | ]
|
| |
|
| | ext = os.path.splitext(ttf_filename)[1]
|
| | first_font_with_a_different_extension = None
|
| | for directory in dirs:
|
| | for walkroot, walkdir, walkfilenames in os.walk(directory):
|
| | for walkfilename in walkfilenames:
|
| | if ext and walkfilename == ttf_filename:
|
| | return freetype(os.path.join(walkroot, walkfilename))
|
| | elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename:
|
| | fontpath = os.path.join(walkroot, walkfilename)
|
| | if os.path.splitext(fontpath)[1] == ".ttf":
|
| | return freetype(fontpath)
|
| | if not ext and first_font_with_a_different_extension is None:
|
| | first_font_with_a_different_extension = fontpath
|
| | if first_font_with_a_different_extension:
|
| | return freetype(first_font_with_a_different_extension)
|
| | raise
|
| |
|
| |
|
| | def load_path(filename: str | bytes) -> ImageFont:
|
| | """
|
| | Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a
|
| | bitmap font along the Python path.
|
| |
|
| | :param filename: Name of font file.
|
| | :return: A font object.
|
| | :exception OSError: If the file could not be read.
|
| | """
|
| | if not isinstance(filename, str):
|
| | filename = filename.decode("utf-8")
|
| | for directory in sys.path:
|
| | try:
|
| | return load(os.path.join(directory, filename))
|
| | except OSError:
|
| | pass
|
| | msg = "cannot find font file"
|
| | raise OSError(msg)
|
| |
|
| |
|
| | def load_default_imagefont() -> ImageFont:
|
| | f = ImageFont()
|
| | f._load_pilfont_data(
|
| |
|
| | BytesIO(
|
| | base64.b64decode(
|
| | b"""
|
| | UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA
|
| | BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL
|
| | AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA
|
| | AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB
|
| | ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A
|
| | BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB
|
| | //kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA
|
| | AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH
|
| | AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA
|
| | ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv
|
| | AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/
|
| | /gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5
|
| | AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA
|
| | AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG
|
| | AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA
|
| | BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA
|
| | AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA
|
| | 2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF
|
| | AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA////
|
| | +gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA
|
| | ////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA
|
| | BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv
|
| | AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA
|
| | AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA
|
| | AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA
|
| | BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP//
|
| | //kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA
|
| | AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF
|
| | AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB
|
| | mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn
|
| | AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA
|
| | AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7
|
| | AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA
|
| | Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB
|
| | //sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA
|
| | AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ
|
| | AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC
|
| | DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ
|
| | AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/
|
| | +wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5
|
| | AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/
|
| | ///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG
|
| | AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA
|
| | BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA
|
| | Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC
|
| | eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG
|
| | AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA////
|
| | +gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA
|
| | ////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA
|
| | BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT
|
| | AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A
|
| | AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA
|
| | Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA
|
| | Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP//
|
| | //cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA
|
| | AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ
|
| | AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA
|
| | LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5
|
| | AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA
|
| | AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5
|
| | AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA
|
| | AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG
|
| | AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA
|
| | EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK
|
| | AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA
|
| | pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG
|
| | AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA////
|
| | +QAGAAIAzgAKANUAEw==
|
| | """
|
| | )
|
| | ),
|
| | 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
|
| | LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F
|
| | IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA
|
| | Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791
|
| | NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx
|
| | in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9
|
| | SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY
|
| | AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt
|
| | y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG
|
| | ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY
|
| | lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H
|
| | /Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3
|
| | AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47
|
| | c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/
|
| | /yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw
|
| | pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv
|
| | oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR
|
| | evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA
|
| | AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v//
|
| | Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR
|
| | w7IkEbzhVQAAAABJRU5ErkJggg==
|
| | """
|
| | )
|
| | )
|
| | ),
|
| | )
|
| | return f
|
| |
|
| |
|
| | def load_default(size: float | None = None) -> FreeTypeFont | ImageFont:
|
| | """If FreeType support is available, load a version of Aileron Regular,
|
| | https://dotcolon.net/font/aileron, with a more limited character set.
|
| |
|
| | Otherwise, load a "better than nothing" font.
|
| |
|
| | .. versionadded:: 1.1.4
|
| |
|
| | :param size: The font size of Aileron Regular.
|
| |
|
| | .. versionadded:: 10.1.0
|
| |
|
| | :return: A font object.
|
| | """
|
| | if isinstance(core, ModuleType) or size is not None:
|
| | return truetype(
|
| | BytesIO(
|
| | base64.b64decode(
|
| | b"""
|
| | AAEAAAAPAIAAAwBwRkZUTYwDlUAAADFoAAAAHEdERUYAqADnAAAo8AAAACRHUE9ThhmITwAAKfgAA
|
| | AduR1NVQnHxefoAACkUAAAA4k9TLzJovoHLAAABeAAAAGBjbWFw5lFQMQAAA6gAAAGqZ2FzcP//AA
|
| | MAACjoAAAACGdseWYmRXoPAAAGQAAAHfhoZWFkE18ayQAAAPwAAAA2aGhlYQboArEAAAE0AAAAJGh
|
| | tdHjjERZ8AAAB2AAAAdBsb2NhuOexrgAABVQAAADqbWF4cAC7AEYAAAFYAAAAIG5hbWUr+h5lAAAk
|
| | OAAAA6Jwb3N0D3oPTQAAJ9wAAAEKAAEAAAABGhxJDqIhXw889QALA+gAAAAA0Bqf2QAAAADhCh2h/
|
| | 2r/LgOxAyAAAAAIAAIAAAAAAAAAAQAAA8r/GgAAA7j/av9qA7EAAQAAAAAAAAAAAAAAAAAAAHQAAQ
|
| | AAAHQAQwAFAAAAAAACAAAAAQABAAAAQAAAAAAAAAADAfoBkAAFAAgCigJYAAAASwKKAlgAAAFeADI
|
| | BPgAAAAAFAAAAAAAAAAAAAAcAAAAAAAAAAAAAAABVS1dOAEAAIPsCAwL/GgDIA8oA5iAAAJMAAAAA
|
| | AhICsgAAACAAAwH0AAAAAAAAAU0AAADYAAAA8gA5AVMAVgJEAEYCRAA1AuQAKQKOAEAAsAArATsAZ
|
| | AE7AB4CMABVAkQAUADc/+EBEgAgANwAJQEv//sCRAApAkQAggJEADwCRAAtAkQAIQJEADkCRAArAk
|
| | QAMgJEACwCRAAxANwAJQDc/+ECRABnAkQAUAJEAEQB8wAjA1QANgJ/AB0CcwBkArsALwLFAGQCSwB
|
| | kAjcAZALGAC8C2gBkAQgAZAIgADcCYQBkAj8AZANiAGQCzgBkAuEALwJWAGQC3QAvAmsAZAJJADQC
|
| | ZAAiAqoAXgJuACADuAAaAnEAGQJFABMCTwAuATMAYgEv//sBJwAiAkQAUAH0ADIBLAApAhMAJAJjA
|
| | EoCEQAeAmcAHgIlAB4BIgAVAmcAHgJRAEoA7gA+AOn/8wIKAEoA9wBGA1cASgJRAEoCSgAeAmMASg
|
| | JnAB4BSgBKAcsAGAE5ABQCUABCAgIAAQMRAAEB4v/6AgEAAQHOABQBLwBAAPoAYAEvACECRABNA0Y
|
| | AJAItAHgBKgAcAkQAUAEsAHQAygAgAi0AOQD3ADYA9wAWAaEANgGhABYCbAAlAYMAeAGDADkA6/9q
|
| | AhsAFAIKABUB/QAVAAAAAwAAAAMAAAAcAAEAAAAAAKQAAwABAAAAHAAEAIgAAAAeABAAAwAOAH4Aq
|
| | QCrALEAtAC3ALsgGSAdICYgOiBEISL7Av//AAAAIACpAKsAsAC0ALcAuyAYIBwgJiA5IEQhIvsB//
|
| | //4/+5/7j/tP+y/7D/reBR4E/gR+A14CzfTwVxAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAEGAAABAAAAAAAAAAECAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAMEBQYHCAkKCwwNDg8QERIT
|
| | FBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMT
|
| | U5PUFFSU1RVVldYWVpbXF1eX2BhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAA
|
| | AAAAAAYnFmAAAAAABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2htAAAAAAAAAABrbGlqAAAAAHAAbm9
|
| | ycwBnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmACYAJgAmAD4AUgCCAMoBCgFO
|
| | AVwBcgGIAaYBvAHKAdYB6AH2AgwCIAJKAogCpgLWAw4DIgNkA5wDugPUA+gD/AQQBEYEogS8BPoFJ
|
| | gVSBWoFgAWwBcoF1gX6BhQGJAZMBmgGiga0BuIHGgdUB2YHkAeiB8AH3AfyCAoIHAgqCDoITghcCG
|
| | oIogjSCPoJKglYCXwJwgnqCgIKKApACl4Klgq8CtwLDAs8C1YLjAuyC9oL7gwMDCYMSAxgDKAMrAz
|
| | qDQoNTA1mDYQNoA2uDcAN2g3oDfYODA4iDkoOXA5sDnoOnA7EDvwAAAAFAAAAAAH0ArwAAwAGAAkA
|
| | DAAPAAAxESERAxMhExcRASELARETAfT6qv6syKr+jgFUqsiqArz9RAGLAP/+1P8B/v3VAP8BLP4CA
|
| | P8AAgA5//IAuQKyAAMACwAANyMDMwIyFhQGIiY0oE4MZk84JCQ4JLQB/v3AJDgkJDgAAgBWAeUBPA
|
| | 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
|
| | gQAAwABBAkADAAuAkwATgBvACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAATm8gUm
|
| | lnaHRzIFJlc2VydmVkLgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAUgBlAGcAdQBsAGEAcgAAUmV
|
| | ndWxhcgAAMQAuADEAMAAyADsAVQBLAFcATgA7AEEAaQBsAGUAcgBvAG4ALQBSAGUAZwB1AGwAYQBy
|
| | AAAxLjEwMjtVS1dOO0FpbGVyb24tUmVndWxhcgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAVgBlA
|
| | HIAcwBpAG8AbgAgADEALgAxADAAMgA7AFAAUwAgADAAMAAxAC4AMQAwADIAOwBoAG8AdABjAG8Abg
|
| | B2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADk
|
| | AAFZlcnNpb24gMS4xMDI7UFMgMDAxLjEwMjtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41
|
| | ODMyOQAAQQBpAGwAZQByAG8AbgAtAFIAZQBnAHUAbABhAHIAAEFpbGVyb24tUmVndWxhcgAAUwBvA
|
| | HIAYQAgAFMAYQBnAGEAbgBvAABTb3JhIFNhZ2FubwAAUwBvAHIAYQAgAFMAYQBnAGEAbgBvAABTb3
|
| | JhIFNhZ2FubwAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBsAG8AbgAuAG4AZQB0AAB
|
| | odHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBs
|
| | AG8AbgAuAG4AZQB0AABodHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAAAACAAAAAAAA/4MAMgAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAHQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATAB
|
| | QAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAA
|
| | xADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0A
|
| | TgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAIsAqQCDAJMAjQDDAKoAtgC3A
|
| | LQAtQCrAL4AvwC8AIwAwADBAAAAAAAB//8AAgABAAAADAAAABwAAAACAAIAAwBxAAEAcgBzAAIABA
|
| | AAAAIAAAABAAAACgBMAGYAAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAWAANDQVQgAB5NT0wgABZ
|
| | ST00gABYAAP//AAEAAAAA//8AAgAAAAEAAmxpZ2EADmxvY2wAFAAAAAEAAQAAAAEAAAACAAYAEAAG
|
| | AAAAAgASADQABAAAAAEATAADAAAAAgAQABYAAQAcAAAAAQABAE8AAQABAGcAAQABAE8AAwAAAAIAE
|
| | AAWAAEAHAAAAAEAAQAvAAEAAQBnAAEAAQAvAAEAGgABAAgAAgAGAAwAcwACAE8AcgACAEwAAQABAE
|
| | kAAAABAAAACgBGAGAAAkRGTFQADmxhdG4AHAAEAAAAAP//AAIAAAABABYAA0NBVCAAFk1PTCAAFlJ
|
| | PTSAAFgAA//8AAgAAAAEAAmNwc3AADmtlcm4AFAAAAAEAAAAAAAEAAQACAAYADgABAAAAAQASAAIA
|
| | AAACAB4ANgABAAoABQAFAAoAAgABACQAPQAAAAEAEgAEAAAAAQAMAAEAOP/nAAEAAQAkAAIGigAEA
|
| | AAFJAXKABoAGQAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAD/sv+4/+z/7v/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9T/6AAAAAD/8QAA
|
| | ABD/vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAA//MAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAP/5AAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAD/4AAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/9AAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAA/+gAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAD
|
| | /4gAA//AAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAP/OAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zv/qAAAAAP/0AAAACAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/ZAAD/egAA/1kAAAAA/5D/rgAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAD/8AAA/7b/8P+wAAD/8P/E/98AAAAA/8P/+P/0//oAAAAAAAAAAAAA//gA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/w//C/9MAAP/SAAD/9wAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yAAA/+kAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9wAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAP/cAAAAAAAAAAAAAAAA/7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAkAFAAEAAAAAQACwAAABcA
|
| | BgAAAAAAAAAIAA4AAAAAAAsAEgAAAAAAAAATABkAAwANAAAAAQAJAAAAAAAAAAAAAAAAAAAAGAAAA
|
| | AAABwAAAAAAAAAAAAAAFQAFAAAAAAAYABgAAAAUAAAACgAAAAwAAgAPABEAFgAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAEAEQBdAAYAAAAAAAAAAAAAAAAAAAAAAAA
|
| | AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABwAAAAAACAAAAAAAAAAAAAcAAAAHAAAAEwAJ
|
| | ABUADgAPAAAACwAQAAAAAAAAAAAAAAAAAAUAGAACAAIAAgAAAAIAGAAXAAAAGAAAABYAFgACABYAA
|
| | gAWAAAAEQADAAoAFAAMAA0ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEgAGAAEAHgAkAC
|
| | YAJwApACoALQAuAC8AMgAzADcAOAA5ADoAPAA9AEUASABOAE8AUgBTAFUAVwBZAFoAWwBcAF0AcwA
|
| | AAAAAAQAAAADa3tfFAAAAANAan9kAAAAA4QodoQ==
|
| | """
|
| | )
|
| | ),
|
| | 10 if size is None else size,
|
| | layout_engine=Layout.BASIC,
|
| | )
|
| | return load_default_imagefont()
|
| |
|