ImageFont.py 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312
  1. #
  2. # The Python Imaging Library.
  3. # $Id$
  4. #
  5. # PIL raster font management
  6. #
  7. # History:
  8. # 1996-08-07 fl created (experimental)
  9. # 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3
  10. # 1999-02-06 fl rewrote most font management stuff in C
  11. # 1999-03-17 fl take pth files into account in load_path (from Richard Jones)
  12. # 2001-02-17 fl added freetype support
  13. # 2001-05-09 fl added TransposedFont wrapper class
  14. # 2002-03-04 fl make sure we have a "L" or "1" font
  15. # 2002-12-04 fl skip non-directory entries in the system path
  16. # 2003-04-29 fl add embedded default font
  17. # 2003-09-27 fl added support for truetype charmap encodings
  18. #
  19. # Todo:
  20. # Adapt to PILFONT2 format (16-bit fonts, compressed, single file)
  21. #
  22. # Copyright (c) 1997-2003 by Secret Labs AB
  23. # Copyright (c) 1996-2003 by Fredrik Lundh
  24. #
  25. # See the README file for information on usage and redistribution.
  26. #
  27. from __future__ import annotations
  28. import base64
  29. import os
  30. import sys
  31. import warnings
  32. from enum import IntEnum
  33. from io import BytesIO
  34. from types import ModuleType
  35. from typing import IO, Any, BinaryIO, TypedDict, cast
  36. from . import Image
  37. from ._typing import StrOrBytesPath
  38. from ._util import DeferredError, is_path
  39. TYPE_CHECKING = False
  40. if TYPE_CHECKING:
  41. from . import ImageFile
  42. from ._imaging import ImagingFont
  43. from ._imagingft import Font
  44. class Axis(TypedDict):
  45. minimum: int | None
  46. default: int | None
  47. maximum: int | None
  48. name: bytes | None
  49. class Layout(IntEnum):
  50. BASIC = 0
  51. RAQM = 1
  52. MAX_STRING_LENGTH = 1_000_000
  53. core: ModuleType | DeferredError
  54. try:
  55. from . import _imagingft as core
  56. except ImportError as ex:
  57. core = DeferredError.new(ex)
  58. def _string_length_check(text: str | bytes | bytearray) -> None:
  59. if MAX_STRING_LENGTH is not None and len(text) > MAX_STRING_LENGTH:
  60. msg = "too many characters in string"
  61. raise ValueError(msg)
  62. # FIXME: add support for pilfont2 format (see FontFile.py)
  63. # --------------------------------------------------------------------
  64. # Font metrics format:
  65. # "PILfont" LF
  66. # fontdescriptor LF
  67. # (optional) key=value... LF
  68. # "DATA" LF
  69. # binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox)
  70. #
  71. # To place a character, cut out srcbox and paste at dstbox,
  72. # relative to the character position. Then move the character
  73. # position according to dx, dy.
  74. # --------------------------------------------------------------------
  75. class ImageFont:
  76. """PIL font wrapper"""
  77. font: ImagingFont
  78. def _load_pilfont(self, filename: str) -> None:
  79. with open(filename, "rb") as fp:
  80. image: ImageFile.ImageFile | None = None
  81. root = os.path.splitext(filename)[0]
  82. for ext in (".png", ".gif", ".pbm"):
  83. if image:
  84. image.close()
  85. try:
  86. fullname = root + ext
  87. image = Image.open(fullname)
  88. except Exception:
  89. pass
  90. else:
  91. if image and image.mode in ("1", "L"):
  92. break
  93. else:
  94. if image:
  95. image.close()
  96. msg = f"cannot find glyph data file {root}.{{gif|pbm|png}}"
  97. raise OSError(msg)
  98. self.file = fullname
  99. self._load_pilfont_data(fp, image)
  100. image.close()
  101. def _load_pilfont_data(self, file: IO[bytes], image: Image.Image) -> None:
  102. # check image
  103. if image.mode not in ("1", "L"):
  104. msg = "invalid font image mode"
  105. raise TypeError(msg)
  106. # read PILfont header
  107. if file.read(8) != b"PILfont\n":
  108. msg = "Not a PILfont file"
  109. raise SyntaxError(msg)
  110. file.readline()
  111. self.info = [] # FIXME: should be a dictionary
  112. while True:
  113. s = file.readline()
  114. if not s or s == b"DATA\n":
  115. break
  116. self.info.append(s)
  117. # read PILfont metrics
  118. data = file.read(256 * 20)
  119. image.load()
  120. self.font = Image.core.font(image.im, data)
  121. def getmask(
  122. self, text: str | bytes, mode: str = "", *args: Any, **kwargs: Any
  123. ) -> Image.core.ImagingCore:
  124. """
  125. Create a bitmap for the text.
  126. If the font uses antialiasing, the bitmap should have mode ``L`` and use a
  127. maximum value of 255. Otherwise, it should have mode ``1``.
  128. :param text: Text to render.
  129. :param mode: Used by some graphics drivers to indicate what mode the
  130. driver prefers; if empty, the renderer may return either
  131. mode. Note that the mode is always a string, to simplify
  132. C-level implementations.
  133. .. versionadded:: 1.1.5
  134. :return: An internal PIL storage memory instance as defined by the
  135. :py:mod:`PIL.Image.core` interface module.
  136. """
  137. _string_length_check(text)
  138. Image._decompression_bomb_check(self.font.getsize(text))
  139. return self.font.getmask(text, mode)
  140. def getbbox(
  141. self, text: str | bytes | bytearray, *args: Any, **kwargs: Any
  142. ) -> tuple[int, int, int, int]:
  143. """
  144. Returns bounding box (in pixels) of given text.
  145. .. versionadded:: 9.2.0
  146. :param text: Text to render.
  147. :return: ``(left, top, right, bottom)`` bounding box
  148. """
  149. _string_length_check(text)
  150. width, height = self.font.getsize(text)
  151. return 0, 0, width, height
  152. def getlength(
  153. self, text: str | bytes | bytearray, *args: Any, **kwargs: Any
  154. ) -> int:
  155. """
  156. Returns length (in pixels) of given text.
  157. This is the amount by which following text should be offset.
  158. .. versionadded:: 9.2.0
  159. """
  160. _string_length_check(text)
  161. width, height = self.font.getsize(text)
  162. return width
  163. ##
  164. # Wrapper for FreeType fonts. Application code should use the
  165. # <b>truetype</b> factory function to create font objects.
  166. class FreeTypeFont:
  167. """FreeType font wrapper (requires _imagingft service)"""
  168. font: Font
  169. font_bytes: bytes
  170. def __init__(
  171. self,
  172. font: StrOrBytesPath | BinaryIO,
  173. size: float = 10,
  174. index: int = 0,
  175. encoding: str = "",
  176. layout_engine: Layout | None = None,
  177. ) -> None:
  178. # FIXME: use service provider instead
  179. if isinstance(core, DeferredError):
  180. raise core.ex
  181. if size <= 0:
  182. msg = f"font size must be greater than 0, not {size}"
  183. raise ValueError(msg)
  184. self.path = font
  185. self.size = size
  186. self.index = index
  187. self.encoding = encoding
  188. if layout_engine not in (Layout.BASIC, Layout.RAQM):
  189. layout_engine = Layout.BASIC
  190. if core.HAVE_RAQM:
  191. layout_engine = Layout.RAQM
  192. elif layout_engine == Layout.RAQM and not core.HAVE_RAQM:
  193. warnings.warn(
  194. "Raqm layout was requested, but Raqm is not available. "
  195. "Falling back to basic layout."
  196. )
  197. layout_engine = Layout.BASIC
  198. self.layout_engine = layout_engine
  199. def load_from_bytes(f: IO[bytes]) -> None:
  200. self.font_bytes = f.read()
  201. self.font = core.getfont(
  202. "", size, index, encoding, self.font_bytes, layout_engine
  203. )
  204. if is_path(font):
  205. font = os.fspath(font)
  206. if sys.platform == "win32":
  207. font_bytes_path = font if isinstance(font, bytes) else font.encode()
  208. try:
  209. font_bytes_path.decode("ascii")
  210. except UnicodeDecodeError:
  211. # FreeType cannot load fonts with non-ASCII characters on Windows
  212. # So load it into memory first
  213. with open(font, "rb") as f:
  214. load_from_bytes(f)
  215. return
  216. self.font = core.getfont(
  217. font, size, index, encoding, layout_engine=layout_engine
  218. )
  219. else:
  220. load_from_bytes(cast(IO[bytes], font))
  221. def __getstate__(self) -> list[Any]:
  222. return [self.path, self.size, self.index, self.encoding, self.layout_engine]
  223. def __setstate__(self, state: list[Any]) -> None:
  224. path, size, index, encoding, layout_engine = state
  225. FreeTypeFont.__init__(self, path, size, index, encoding, layout_engine)
  226. def getname(self) -> tuple[str | None, str | None]:
  227. """
  228. :return: A tuple of the font family (e.g. Helvetica) and the font style
  229. (e.g. Bold)
  230. """
  231. return self.font.family, self.font.style
  232. def getmetrics(self) -> tuple[int, int]:
  233. """
  234. :return: A tuple of the font ascent (the distance from the baseline to
  235. the highest outline point) and descent (the distance from the
  236. baseline to the lowest outline point, a negative value)
  237. """
  238. return self.font.ascent, self.font.descent
  239. def getlength(
  240. self,
  241. text: str | bytes,
  242. mode: str = "",
  243. direction: str | None = None,
  244. features: list[str] | None = None,
  245. language: str | None = None,
  246. ) -> float:
  247. """
  248. Returns length (in pixels with 1/64 precision) of given text when rendered
  249. in font with provided direction, features, and language.
  250. This is the amount by which following text should be offset.
  251. Text bounding box may extend past the length in some fonts,
  252. e.g. when using italics or accents.
  253. The result is returned as a float; it is a whole number if using basic layout.
  254. Note that the sum of two lengths may not equal the length of a concatenated
  255. string due to kerning. If you need to adjust for kerning, include the following
  256. character and subtract its length.
  257. For example, instead of ::
  258. hello = font.getlength("Hello")
  259. world = font.getlength("World")
  260. hello_world = hello + world # not adjusted for kerning
  261. assert hello_world == font.getlength("HelloWorld") # may fail
  262. use ::
  263. hello = font.getlength("HelloW") - font.getlength("W") # adjusted for kerning
  264. world = font.getlength("World")
  265. hello_world = hello + world # adjusted for kerning
  266. assert hello_world == font.getlength("HelloWorld") # True
  267. or disable kerning with (requires libraqm) ::
  268. hello = draw.textlength("Hello", font, features=["-kern"])
  269. world = draw.textlength("World", font, features=["-kern"])
  270. hello_world = hello + world # kerning is disabled, no need to adjust
  271. assert hello_world == draw.textlength("HelloWorld", font, features=["-kern"])
  272. .. versionadded:: 8.0.0
  273. :param text: Text to measure.
  274. :param mode: Used by some graphics drivers to indicate what mode the
  275. driver prefers; if empty, the renderer may return either
  276. mode. Note that the mode is always a string, to simplify
  277. C-level implementations.
  278. :param direction: Direction of the text. It can be 'rtl' (right to
  279. left), 'ltr' (left to right) or 'ttb' (top to bottom).
  280. Requires libraqm.
  281. :param features: A list of OpenType font features to be used during text
  282. layout. This is usually used to turn on optional
  283. font features that are not enabled by default,
  284. for example 'dlig' or 'ss01', but can be also
  285. used to turn off default font features for
  286. example '-liga' to disable ligatures or '-kern'
  287. to disable kerning. To get all supported
  288. features, see
  289. https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
  290. Requires libraqm.
  291. :param language: Language of the text. Different languages may use
  292. different glyph shapes or ligatures. This parameter tells
  293. the font which language the text is in, and to apply the
  294. correct substitutions as appropriate, if available.
  295. It should be a `BCP 47 language code
  296. <https://www.w3.org/International/articles/language-tags/>`_
  297. Requires libraqm.
  298. :return: Either width for horizontal text, or height for vertical text.
  299. """
  300. _string_length_check(text)
  301. return self.font.getlength(text, mode, direction, features, language) / 64
  302. def getbbox(
  303. self,
  304. text: str | bytes,
  305. mode: str = "",
  306. direction: str | None = None,
  307. features: list[str] | None = None,
  308. language: str | None = None,
  309. stroke_width: float = 0,
  310. anchor: str | None = None,
  311. ) -> tuple[float, float, float, float]:
  312. """
  313. Returns bounding box (in pixels) of given text relative to given anchor
  314. when rendered in font with provided direction, features, and language.
  315. Use :py:meth:`getlength()` to get the offset of following text with
  316. 1/64 pixel precision. The bounding box includes extra margins for
  317. some fonts, e.g. italics or accents.
  318. .. versionadded:: 8.0.0
  319. :param text: Text to render.
  320. :param mode: Used by some graphics drivers to indicate what mode the
  321. driver prefers; if empty, the renderer may return either
  322. mode. Note that the mode is always a string, to simplify
  323. C-level implementations.
  324. :param direction: Direction of the text. It can be 'rtl' (right to
  325. left), 'ltr' (left to right) or 'ttb' (top to bottom).
  326. Requires libraqm.
  327. :param features: A list of OpenType font features to be used during text
  328. layout. This is usually used to turn on optional
  329. font features that are not enabled by default,
  330. for example 'dlig' or 'ss01', but can be also
  331. used to turn off default font features for
  332. example '-liga' to disable ligatures or '-kern'
  333. to disable kerning. To get all supported
  334. features, see
  335. https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
  336. Requires libraqm.
  337. :param language: Language of the text. Different languages may use
  338. different glyph shapes or ligatures. This parameter tells
  339. the font which language the text is in, and to apply the
  340. correct substitutions as appropriate, if available.
  341. It should be a `BCP 47 language code
  342. <https://www.w3.org/International/articles/language-tags/>`_
  343. Requires libraqm.
  344. :param stroke_width: The width of the text stroke.
  345. :param anchor: The text anchor alignment. Determines the relative location of
  346. the anchor to the text. The default alignment is top left,
  347. specifically ``la`` for horizontal text and ``lt`` for
  348. vertical text. See :ref:`text-anchors` for details.
  349. :return: ``(left, top, right, bottom)`` bounding box
  350. """
  351. _string_length_check(text)
  352. size, offset = self.font.getsize(
  353. text, mode, direction, features, language, anchor
  354. )
  355. left, top = offset[0] - stroke_width, offset[1] - stroke_width
  356. width, height = size[0] + 2 * stroke_width, size[1] + 2 * stroke_width
  357. return left, top, left + width, top + height
  358. def getmask(
  359. self,
  360. text: str | bytes,
  361. mode: str = "",
  362. direction: str | None = None,
  363. features: list[str] | None = None,
  364. language: str | None = None,
  365. stroke_width: float = 0,
  366. anchor: str | None = None,
  367. ink: int = 0,
  368. start: tuple[float, float] | None = None,
  369. ) -> Image.core.ImagingCore:
  370. """
  371. Create a bitmap for the text.
  372. If the font uses antialiasing, the bitmap should have mode ``L`` and use a
  373. maximum value of 255. If the font has embedded color data, the bitmap
  374. should have mode ``RGBA``. Otherwise, it should have mode ``1``.
  375. :param text: Text to render.
  376. :param mode: Used by some graphics drivers to indicate what mode the
  377. driver prefers; if empty, the renderer may return either
  378. mode. Note that the mode is always a string, to simplify
  379. C-level implementations.
  380. .. versionadded:: 1.1.5
  381. :param direction: Direction of the text. It can be 'rtl' (right to
  382. left), 'ltr' (left to right) or 'ttb' (top to bottom).
  383. Requires libraqm.
  384. .. versionadded:: 4.2.0
  385. :param features: A list of OpenType font features to be used during text
  386. layout. This is usually used to turn on optional
  387. font features that are not enabled by default,
  388. for example 'dlig' or 'ss01', but can be also
  389. used to turn off default font features for
  390. example '-liga' to disable ligatures or '-kern'
  391. to disable kerning. To get all supported
  392. features, see
  393. https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
  394. Requires libraqm.
  395. .. versionadded:: 4.2.0
  396. :param language: Language of the text. Different languages may use
  397. different glyph shapes or ligatures. This parameter tells
  398. the font which language the text is in, and to apply the
  399. correct substitutions as appropriate, if available.
  400. It should be a `BCP 47 language code
  401. <https://www.w3.org/International/articles/language-tags/>`_
  402. Requires libraqm.
  403. .. versionadded:: 6.0.0
  404. :param stroke_width: The width of the text stroke.
  405. .. versionadded:: 6.2.0
  406. :param anchor: The text anchor alignment. Determines the relative location of
  407. the anchor to the text. The default alignment is top left,
  408. specifically ``la`` for horizontal text and ``lt`` for
  409. vertical text. See :ref:`text-anchors` for details.
  410. .. versionadded:: 8.0.0
  411. :param ink: Foreground ink for rendering in RGBA mode.
  412. .. versionadded:: 8.0.0
  413. :param start: Tuple of horizontal and vertical offset, as text may render
  414. differently when starting at fractional coordinates.
  415. .. versionadded:: 9.4.0
  416. :return: An internal PIL storage memory instance as defined by the
  417. :py:mod:`PIL.Image.core` interface module.
  418. """
  419. return self.getmask2(
  420. text,
  421. mode,
  422. direction=direction,
  423. features=features,
  424. language=language,
  425. stroke_width=stroke_width,
  426. anchor=anchor,
  427. ink=ink,
  428. start=start,
  429. )[0]
  430. def getmask2(
  431. self,
  432. text: str | bytes,
  433. mode: str = "",
  434. direction: str | None = None,
  435. features: list[str] | None = None,
  436. language: str | None = None,
  437. stroke_width: float = 0,
  438. anchor: str | None = None,
  439. ink: int = 0,
  440. start: tuple[float, float] | None = None,
  441. *args: Any,
  442. **kwargs: Any,
  443. ) -> tuple[Image.core.ImagingCore, tuple[int, int]]:
  444. """
  445. Create a bitmap for the text.
  446. If the font uses antialiasing, the bitmap should have mode ``L`` and use a
  447. maximum value of 255. If the font has embedded color data, the bitmap
  448. should have mode ``RGBA``. Otherwise, it should have mode ``1``.
  449. :param text: Text to render.
  450. :param mode: Used by some graphics drivers to indicate what mode the
  451. driver prefers; if empty, the renderer may return either
  452. mode. Note that the mode is always a string, to simplify
  453. C-level implementations.
  454. .. versionadded:: 1.1.5
  455. :param direction: Direction of the text. It can be 'rtl' (right to
  456. left), 'ltr' (left to right) or 'ttb' (top to bottom).
  457. Requires libraqm.
  458. .. versionadded:: 4.2.0
  459. :param features: A list of OpenType font features to be used during text
  460. layout. This is usually used to turn on optional
  461. font features that are not enabled by default,
  462. for example 'dlig' or 'ss01', but can be also
  463. used to turn off default font features for
  464. example '-liga' to disable ligatures or '-kern'
  465. to disable kerning. To get all supported
  466. features, see
  467. https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
  468. Requires libraqm.
  469. .. versionadded:: 4.2.0
  470. :param language: Language of the text. Different languages may use
  471. different glyph shapes or ligatures. This parameter tells
  472. the font which language the text is in, and to apply the
  473. correct substitutions as appropriate, if available.
  474. It should be a `BCP 47 language code
  475. <https://www.w3.org/International/articles/language-tags/>`_
  476. Requires libraqm.
  477. .. versionadded:: 6.0.0
  478. :param stroke_width: The width of the text stroke.
  479. .. versionadded:: 6.2.0
  480. :param anchor: The text anchor alignment. Determines the relative location of
  481. the anchor to the text. The default alignment is top left,
  482. specifically ``la`` for horizontal text and ``lt`` for
  483. vertical text. See :ref:`text-anchors` for details.
  484. .. versionadded:: 8.0.0
  485. :param ink: Foreground ink for rendering in RGBA mode.
  486. .. versionadded:: 8.0.0
  487. :param start: Tuple of horizontal and vertical offset, as text may render
  488. differently when starting at fractional coordinates.
  489. .. versionadded:: 9.4.0
  490. :return: A tuple of an internal PIL storage memory instance as defined by the
  491. :py:mod:`PIL.Image.core` interface module, and the text offset, the
  492. gap between the starting coordinate and the first marking
  493. """
  494. _string_length_check(text)
  495. if start is None:
  496. start = (0, 0)
  497. def fill(width: int, height: int) -> Image.core.ImagingCore:
  498. size = (width, height)
  499. Image._decompression_bomb_check(size)
  500. return Image.core.fill("RGBA" if mode == "RGBA" else "L", size)
  501. return self.font.render(
  502. text,
  503. fill,
  504. mode,
  505. direction,
  506. features,
  507. language,
  508. stroke_width,
  509. kwargs.get("stroke_filled", False),
  510. anchor,
  511. ink,
  512. start,
  513. )
  514. def font_variant(
  515. self,
  516. font: StrOrBytesPath | BinaryIO | None = None,
  517. size: float | None = None,
  518. index: int | None = None,
  519. encoding: str | None = None,
  520. layout_engine: Layout | None = None,
  521. ) -> FreeTypeFont:
  522. """
  523. Create a copy of this FreeTypeFont object,
  524. using any specified arguments to override the settings.
  525. Parameters are identical to the parameters used to initialize this
  526. object.
  527. :return: A FreeTypeFont object.
  528. """
  529. if font is None:
  530. try:
  531. font = BytesIO(self.font_bytes)
  532. except AttributeError:
  533. font = self.path
  534. return FreeTypeFont(
  535. font=font,
  536. size=self.size if size is None else size,
  537. index=self.index if index is None else index,
  538. encoding=self.encoding if encoding is None else encoding,
  539. layout_engine=layout_engine or self.layout_engine,
  540. )
  541. def get_variation_names(self) -> list[bytes]:
  542. """
  543. :returns: A list of the named styles in a variation font.
  544. :exception OSError: If the font is not a variation font.
  545. """
  546. names = self.font.getvarnames()
  547. return [name.replace(b"\x00", b"") for name in names]
  548. def set_variation_by_name(self, name: str | bytes) -> None:
  549. """
  550. :param name: The name of the style.
  551. :exception OSError: If the font is not a variation font.
  552. """
  553. names = self.get_variation_names()
  554. if not isinstance(name, bytes):
  555. name = name.encode()
  556. index = names.index(name) + 1
  557. if index == getattr(self, "_last_variation_index", None):
  558. # When the same name is set twice in a row,
  559. # there is an 'unknown freetype error'
  560. # https://savannah.nongnu.org/bugs/?56186
  561. return
  562. self._last_variation_index = index
  563. self.font.setvarname(index)
  564. def get_variation_axes(self) -> list[Axis]:
  565. """
  566. :returns: A list of the axes in a variation font.
  567. :exception OSError: If the font is not a variation font.
  568. """
  569. axes = self.font.getvaraxes()
  570. for axis in axes:
  571. if axis["name"]:
  572. axis["name"] = axis["name"].replace(b"\x00", b"")
  573. return axes
  574. def set_variation_by_axes(self, axes: list[float]) -> None:
  575. """
  576. :param axes: A list of values for each axis.
  577. :exception OSError: If the font is not a variation font.
  578. """
  579. self.font.setvaraxes(axes)
  580. class TransposedFont:
  581. """Wrapper for writing rotated or mirrored text"""
  582. def __init__(
  583. self, font: ImageFont | FreeTypeFont, orientation: Image.Transpose | None = None
  584. ):
  585. """
  586. Wrapper that creates a transposed font from any existing font
  587. object.
  588. :param font: A font object.
  589. :param orientation: An optional orientation. If given, this should
  590. be one of Image.Transpose.FLIP_LEFT_RIGHT, Image.Transpose.FLIP_TOP_BOTTOM,
  591. Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_180, or
  592. Image.Transpose.ROTATE_270.
  593. """
  594. self.font = font
  595. self.orientation = orientation # any 'transpose' argument, or None
  596. def getmask(
  597. self, text: str | bytes, mode: str = "", *args: Any, **kwargs: Any
  598. ) -> Image.core.ImagingCore:
  599. im = self.font.getmask(text, mode, *args, **kwargs)
  600. if self.orientation is not None:
  601. return im.transpose(self.orientation)
  602. return im
  603. def getbbox(
  604. self, text: str | bytes, *args: Any, **kwargs: Any
  605. ) -> tuple[int, int, float, float]:
  606. # TransposedFont doesn't support getmask2, move top-left point to (0, 0)
  607. # this has no effect on ImageFont and simulates anchor="lt" for FreeTypeFont
  608. left, top, right, bottom = self.font.getbbox(text, *args, **kwargs)
  609. width = right - left
  610. height = bottom - top
  611. if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270):
  612. return 0, 0, height, width
  613. return 0, 0, width, height
  614. def getlength(self, text: str | bytes, *args: Any, **kwargs: Any) -> float:
  615. if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270):
  616. msg = "text length is undefined for text rotated by 90 or 270 degrees"
  617. raise ValueError(msg)
  618. return self.font.getlength(text, *args, **kwargs)
  619. def load(filename: str) -> ImageFont:
  620. """
  621. Load a font file. This function loads a font object from the given
  622. bitmap font file, and returns the corresponding font object. For loading TrueType
  623. or OpenType fonts instead, see :py:func:`~PIL.ImageFont.truetype`.
  624. :param filename: Name of font file.
  625. :return: A font object.
  626. :exception OSError: If the file could not be read.
  627. """
  628. f = ImageFont()
  629. f._load_pilfont(filename)
  630. return f
  631. def truetype(
  632. font: StrOrBytesPath | BinaryIO,
  633. size: float = 10,
  634. index: int = 0,
  635. encoding: str = "",
  636. layout_engine: Layout | None = None,
  637. ) -> FreeTypeFont:
  638. """
  639. Load a TrueType or OpenType font from a file or file-like object,
  640. and create a font object. This function loads a font object from the given
  641. file or file-like object, and creates a font object for a font of the given
  642. size. For loading bitmap fonts instead, see :py:func:`~PIL.ImageFont.load`
  643. and :py:func:`~PIL.ImageFont.load_path`.
  644. Pillow uses FreeType to open font files. On Windows, be aware that FreeType
  645. will keep the file open as long as the FreeTypeFont object exists. Windows
  646. limits the number of files that can be open in C at once to 512, so if many
  647. fonts are opened simultaneously and that limit is approached, an
  648. ``OSError`` may be thrown, reporting that FreeType "cannot open resource".
  649. A workaround would be to copy the file(s) into memory, and open that instead.
  650. This function requires the _imagingft service.
  651. :param font: A filename or file-like object containing a TrueType font.
  652. If the file is not found in this filename, the loader may also
  653. search in other directories, such as:
  654. * The :file:`fonts/` directory on Windows,
  655. * :file:`/Library/Fonts/`, :file:`/System/Library/Fonts/`
  656. and :file:`~/Library/Fonts/` on macOS.
  657. * :file:`~/.local/share/fonts`, :file:`/usr/local/share/fonts`,
  658. and :file:`/usr/share/fonts` on Linux; or those specified by
  659. the ``XDG_DATA_HOME`` and ``XDG_DATA_DIRS`` environment variables
  660. for user-installed and system-wide fonts, respectively.
  661. :param size: The requested size, in pixels.
  662. :param index: Which font face to load (default is first available face).
  663. :param encoding: Which font encoding to use (default is Unicode). Possible
  664. encodings include (see the FreeType documentation for more
  665. information):
  666. * "unic" (Unicode)
  667. * "symb" (Microsoft Symbol)
  668. * "ADOB" (Adobe Standard)
  669. * "ADBE" (Adobe Expert)
  670. * "ADBC" (Adobe Custom)
  671. * "armn" (Apple Roman)
  672. * "sjis" (Shift JIS)
  673. * "gb " (PRC)
  674. * "big5"
  675. * "wans" (Extended Wansung)
  676. * "joha" (Johab)
  677. * "lat1" (Latin-1)
  678. This specifies the character set to use. It does not alter the
  679. encoding of any text provided in subsequent operations.
  680. :param layout_engine: Which layout engine to use, if available:
  681. :attr:`.ImageFont.Layout.BASIC` or :attr:`.ImageFont.Layout.RAQM`.
  682. If it is available, Raqm layout will be used by default.
  683. Otherwise, basic layout will be used.
  684. Raqm layout is recommended for all non-English text. If Raqm layout
  685. is not required, basic layout will have better performance.
  686. You can check support for Raqm layout using
  687. :py:func:`PIL.features.check_feature` with ``feature="raqm"``.
  688. .. versionadded:: 4.2.0
  689. :return: A font object.
  690. :exception OSError: If the file could not be read.
  691. :exception ValueError: If the font size is not greater than zero.
  692. """
  693. def freetype(font: StrOrBytesPath | BinaryIO) -> FreeTypeFont:
  694. return FreeTypeFont(font, size, index, encoding, layout_engine)
  695. try:
  696. return freetype(font)
  697. except OSError:
  698. if not is_path(font):
  699. raise
  700. ttf_filename = os.path.basename(font)
  701. dirs = []
  702. if sys.platform == "win32":
  703. # check the windows font repository
  704. # NOTE: must use uppercase WINDIR, to work around bugs in
  705. # 1.5.2's os.environ.get()
  706. windir = os.environ.get("WINDIR")
  707. if windir:
  708. dirs.append(os.path.join(windir, "fonts"))
  709. elif sys.platform in ("linux", "linux2"):
  710. data_home = os.environ.get("XDG_DATA_HOME")
  711. if not data_home:
  712. # The freedesktop spec defines the following default directory for
  713. # when XDG_DATA_HOME is unset or empty. This user-level directory
  714. # takes precedence over system-level directories.
  715. data_home = os.path.expanduser("~/.local/share")
  716. xdg_dirs = [data_home]
  717. data_dirs = os.environ.get("XDG_DATA_DIRS")
  718. if not data_dirs:
  719. # Similarly, defaults are defined for the system-level directories
  720. data_dirs = "/usr/local/share:/usr/share"
  721. xdg_dirs += data_dirs.split(":")
  722. dirs += [os.path.join(xdg_dir, "fonts") for xdg_dir in xdg_dirs]
  723. elif sys.platform == "darwin":
  724. dirs += [
  725. "/Library/Fonts",
  726. "/System/Library/Fonts",
  727. os.path.expanduser("~/Library/Fonts"),
  728. ]
  729. ext = os.path.splitext(ttf_filename)[1]
  730. first_font_with_a_different_extension = None
  731. for directory in dirs:
  732. for walkroot, walkdir, walkfilenames in os.walk(directory):
  733. for walkfilename in walkfilenames:
  734. if ext and walkfilename == ttf_filename:
  735. return freetype(os.path.join(walkroot, walkfilename))
  736. elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename:
  737. fontpath = os.path.join(walkroot, walkfilename)
  738. if os.path.splitext(fontpath)[1] == ".ttf":
  739. return freetype(fontpath)
  740. if not ext and first_font_with_a_different_extension is None:
  741. first_font_with_a_different_extension = fontpath
  742. if first_font_with_a_different_extension:
  743. return freetype(first_font_with_a_different_extension)
  744. raise
  745. def load_path(filename: str | bytes) -> ImageFont:
  746. """
  747. Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a
  748. bitmap font along the Python path.
  749. :param filename: Name of font file.
  750. :return: A font object.
  751. :exception OSError: If the file could not be read.
  752. """
  753. if not isinstance(filename, str):
  754. filename = filename.decode("utf-8")
  755. for directory in sys.path:
  756. try:
  757. return load(os.path.join(directory, filename))
  758. except OSError:
  759. pass
  760. msg = f'cannot find font file "{filename}" in sys.path'
  761. if os.path.exists(filename):
  762. msg += f', did you mean ImageFont.load("{filename}") instead?'
  763. raise OSError(msg)
  764. def load_default_imagefont() -> ImageFont:
  765. f = ImageFont()
  766. f._load_pilfont_data(
  767. # courB08
  768. BytesIO(
  769. base64.b64decode(
  770. b"""
  771. UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  772. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  773. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  774. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  775. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  776. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  777. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  778. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  779. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  780. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  781. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  782. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA
  783. BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL
  784. AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA
  785. AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB
  786. ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A
  787. BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB
  788. //kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA
  789. AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH
  790. AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA
  791. ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv
  792. AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/
  793. /gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5
  794. AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA
  795. AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG
  796. AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA
  797. BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA
  798. AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA
  799. 2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF
  800. AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA////
  801. +gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA
  802. ////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA
  803. BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv
  804. AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA
  805. AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA
  806. AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA
  807. BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP//
  808. //kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA
  809. AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF
  810. AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB
  811. mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn
  812. AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA
  813. AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7
  814. AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA
  815. Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA
  816. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  817. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  818. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  819. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  820. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  821. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  822. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  823. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  824. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  825. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  826. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  827. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB
  828. //sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA
  829. AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ
  830. AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC
  831. DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ
  832. AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/
  833. +wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5
  834. AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/
  835. ///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG
  836. AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA
  837. BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA
  838. Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC
  839. eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG
  840. AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA////
  841. +gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA
  842. ////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA
  843. BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT
  844. AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A
  845. AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA
  846. Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA
  847. Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP//
  848. //cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA
  849. AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ
  850. AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA
  851. LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5
  852. AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA
  853. AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5
  854. AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA
  855. AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG
  856. AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA
  857. EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK
  858. AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA
  859. pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG
  860. AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA////
  861. +QAGAAIAzgAKANUAEw==
  862. """
  863. )
  864. ),
  865. Image.open(
  866. BytesIO(
  867. base64.b64decode(
  868. b"""
  869. iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u
  870. Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9
  871. M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g
  872. LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F
  873. IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA
  874. Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791
  875. NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx
  876. in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9
  877. SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY
  878. AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt
  879. y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG
  880. ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY
  881. lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H
  882. /Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3
  883. AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47
  884. c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/
  885. /yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw
  886. pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv
  887. oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR
  888. evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA
  889. AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v//
  890. Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR
  891. w7IkEbzhVQAAAABJRU5ErkJggg==
  892. """
  893. )
  894. )
  895. ),
  896. )
  897. return f
  898. def load_default(size: float | None = None) -> FreeTypeFont | ImageFont:
  899. """If FreeType support is available, load a version of Aileron Regular,
  900. https://dotcolon.net/fonts/aileron, with a more limited character set.
  901. Otherwise, load a "better than nothing" font.
  902. .. versionadded:: 1.1.4
  903. :param size: The font size of Aileron Regular.
  904. .. versionadded:: 10.1.0
  905. :return: A font object.
  906. """
  907. if isinstance(core, ModuleType) or size is not None:
  908. return truetype(
  909. BytesIO(
  910. base64.b64decode(
  911. b"""
  912. AAEAAAAPAIAAAwBwRkZUTYwDlUAAADFoAAAAHEdERUYAqADnAAAo8AAAACRHUE9ThhmITwAAKfgAA
  913. AduR1NVQnHxefoAACkUAAAA4k9TLzJovoHLAAABeAAAAGBjbWFw5lFQMQAAA6gAAAGqZ2FzcP//AA
  914. MAACjoAAAACGdseWYmRXoPAAAGQAAAHfhoZWFkE18ayQAAAPwAAAA2aGhlYQboArEAAAE0AAAAJGh
  915. tdHjjERZ8AAAB2AAAAdBsb2NhuOexrgAABVQAAADqbWF4cAC7AEYAAAFYAAAAIG5hbWUr+h5lAAAk
  916. OAAAA6Jwb3N0D3oPTQAAJ9wAAAEKAAEAAAABGhxJDqIhXw889QALA+gAAAAA0Bqf2QAAAADhCh2h/
  917. 2r/LgOxAyAAAAAIAAIAAAAAAAAAAQAAA8r/GgAAA7j/av9qA7EAAQAAAAAAAAAAAAAAAAAAAHQAAQ
  918. AAAHQAQwAFAAAAAAACAAAAAQABAAAAQAAAAAAAAAADAfoBkAAFAAgCigJYAAAASwKKAlgAAAFeADI
  919. BPgAAAAAFAAAAAAAAAAAAAAcAAAAAAAAAAAAAAABVS1dOAEAAIPsCAwL/GgDIA8oA5iAAAJMAAAAA
  920. AhICsgAAACAAAwH0AAAAAAAAAU0AAADYAAAA8gA5AVMAVgJEAEYCRAA1AuQAKQKOAEAAsAArATsAZ
  921. AE7AB4CMABVAkQAUADc/+EBEgAgANwAJQEv//sCRAApAkQAggJEADwCRAAtAkQAIQJEADkCRAArAk
  922. QAMgJEACwCRAAxANwAJQDc/+ECRABnAkQAUAJEAEQB8wAjA1QANgJ/AB0CcwBkArsALwLFAGQCSwB
  923. kAjcAZALGAC8C2gBkAQgAZAIgADcCYQBkAj8AZANiAGQCzgBkAuEALwJWAGQC3QAvAmsAZAJJADQC
  924. ZAAiAqoAXgJuACADuAAaAnEAGQJFABMCTwAuATMAYgEv//sBJwAiAkQAUAH0ADIBLAApAhMAJAJjA
  925. EoCEQAeAmcAHgIlAB4BIgAVAmcAHgJRAEoA7gA+AOn/8wIKAEoA9wBGA1cASgJRAEoCSgAeAmMASg
  926. JnAB4BSgBKAcsAGAE5ABQCUABCAgIAAQMRAAEB4v/6AgEAAQHOABQBLwBAAPoAYAEvACECRABNA0Y
  927. AJAItAHgBKgAcAkQAUAEsAHQAygAgAi0AOQD3ADYA9wAWAaEANgGhABYCbAAlAYMAeAGDADkA6/9q
  928. AhsAFAIKABUB/QAVAAAAAwAAAAMAAAAcAAEAAAAAAKQAAwABAAAAHAAEAIgAAAAeABAAAwAOAH4Aq
  929. QCrALEAtAC3ALsgGSAdICYgOiBEISL7Av//AAAAIACpAKsAsAC0ALcAuyAYIBwgJiA5IEQhIvsB//
  930. //4/+5/7j/tP+y/7D/reBR4E/gR+A14CzfTwVxAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  931. AAAAAAAEGAAABAAAAAAAAAAECAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAMEBQYHCAkKCwwNDg8QERIT
  932. FBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMT
  933. U5PUFFSU1RVVldYWVpbXF1eX2BhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAA
  934. AAAAAAYnFmAAAAAABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2htAAAAAAAAAABrbGlqAAAAAHAAbm9
  935. ycwBnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmACYAJgAmAD4AUgCCAMoBCgFO
  936. AVwBcgGIAaYBvAHKAdYB6AH2AgwCIAJKAogCpgLWAw4DIgNkA5wDugPUA+gD/AQQBEYEogS8BPoFJ
  937. gVSBWoFgAWwBcoF1gX6BhQGJAZMBmgGiga0BuIHGgdUB2YHkAeiB8AH3AfyCAoIHAgqCDoITghcCG
  938. oIogjSCPoJKglYCXwJwgnqCgIKKApACl4Klgq8CtwLDAs8C1YLjAuyC9oL7gwMDCYMSAxgDKAMrAz
  939. qDQoNTA1mDYQNoA2uDcAN2g3oDfYODA4iDkoOXA5sDnoOnA7EDvwAAAAFAAAAAAH0ArwAAwAGAAkA
  940. DAAPAAAxESERAxMhExcRASELARETAfT6qv6syKr+jgFUqsiqArz9RAGLAP/+1P8B/v3VAP8BLP4CA
  941. P8AAgA5//IAuQKyAAMACwAANyMDMwIyFhQGIiY0oE4MZk84JCQ4JLQB/v3AJDgkJDgAAgBWAeUBPA
  942. LfAAMABwAAEyMnMxcjJzOmRgpagkYKWgHl+vr6AAAAAAIARgAAAf4CsgAbAB8AAAEHMxUjByM3Iwc
  943. jNyM1MzcjNTM3MwczNzMHMxUrAQczAZgdZXEvOi9bLzovWmYdZXEvOi9bLzovWp9bHlsBn4w429vb
  944. 2ziMONvb29s4jAAAAAMANf+mAg4DDAAfACYALAAAJRQGBxUjNS4BJzMeARcRLgE0Njc1MxUeARcjJ
  945. icVHgEBFBYXNQ4BExU+ATU0Ag5xWDpgcgRcBz41Xl9oVTpVYwpcC1ttXP6cLTQuM5szOrVRZwlOTQ
  946. ZqVzZECAEAGlukZAlOTQdrUG8O7iNlAQgxNhDlCDj+8/YGOjReAAAAAAUAKf/yArsCvAAHAAsAFQA
  947. dACcAABIyFhQGIiY0EyMBMwQiBhUUFjI2NTQSMhYUBiImNDYiBhUUFjI2NTR5iFBQiFCVVwHAV/5c
  948. OiMjOiPmiFBQiFCxOiMjOiMCvFaSVlaS/ZoCsjIzMC80NC8w/uNWklZWkhozMC80NC8wAAAAAgBA/
  949. /ICbgLAACIALgAAARUjEQYjIiY1NDY3LgE1NDYzMhcVJiMiBhUUFhcWOwE1MxUFFBYzMjc1IyIHDg
  950. ECbmBcYYOOVkg7R4hsQjY4Q0RNRD4SLDxW/pJUXzksPCkUUk0BgUb+zBVUZ0BkDw5RO1huCkULQzp
  951. COAMBcHDHRz0J/AIHRQAAAAEAKwHlAIUC3wADAAATIycze0YKWgHl+gAAAAABAGT/sAEXAwwACQAA
  952. EzMGEBcjLgE0Nt06dXU6OUBAAwzG/jDGVePs4wAAAAEAHv+wANEDDAAJAAATMx4BFAYHIzYQHjo5Q
  953. EA5OnUDDFXj7ONVxgHQAAAAAQBVAFIB2wHbAA4AAAE3FwcXBycHJzcnNxcnMwEtmxOfcTJjYzJxnx
  954. ObCj4BKD07KYolmZkliik7PbMAAQBQAFUB9AIlAAsAAAEjFSM1IzUzNTMVMwH0tTq1tTq1AR/Kyjj
  955. OzgAAAAAB/+H/iACMAGQABAAANwcjNzOMWlFOXVrS3AAAAQAgAP8A8gE3AAMAABMjNTPy0tIA/zgA
  956. AQAl//IApQByAAcAADYyFhQGIiY0STgkJDgkciQ4JCQ4AAAAAf/7/+IBNALQAAMAABcjEzM5Pvs+H
  957. gLuAAAAAAIAKf/yAhsCwAADAAcAABIgECA2IBAgKQHy/g5gATL+zgLA/TJEAkYAAAAAAQCCAAABlg
  958. KyAAgAAAERIxEHNTc2MwGWVr6SIygCsv1OAldxW1sWAAEAPAAAAg4CwAAZAAA3IRUhNRM+ATU0JiM
  959. iDwEjNz4BMzIWFRQGB7kBUv4x+kI2QTt+EAFWAQp8aGVtSl5GRjEA/0RVLzlLmAoKa3FsUkNxXQAA
  960. AAEALf/yAhYCwAAqAAABHgEVFAYjIi8BMxceATMyNjU0KwE1MzI2NTQmIyIGDwEjNz4BMzIWFRQGA
  961. YxBSZJo2RUBVgEHV0JBUaQREUBUQzc5TQcBVgEKfGhfcEMBbxJbQl1x0AoKRkZHPn9GSD80QUVCCg
  962. pfbGBPOlgAAAACACEAAAIkArIACgAPAAAlIxUjNSE1ATMRMyMRBg8BAiRXVv6qAVZWV60dHLCurq4
  963. rAdn+QgFLMibzAAABADn/8gIZArIAHQAAATIWFRQGIyIvATMXFjMyNjU0JiMiByMTIRUhBzc2ATNv
  964. d5Fl1RQBVgIad0VSTkVhL1IwAYj+vh8rMAHHgGdtgcUKCoFXTU5bYgGRRvAuHQAAAAACACv/8gITA
  965. sAAFwAjAAABMhYVFAYjIhE0NjMyFh8BIycmIyIDNzYTMjY1NCYjIgYVFBYBLmp7imr0l3RZdAgBXA
  966. IYZ5wKJzU6QVNJSz5SUAHSgWltiQFGxcNlVQoKdv7sPiz+ZF1LTmJbU0lhAAAAAQAyAAACGgKyAAY
  967. AAAEVASMBITUCGv6oXAFL/oECsij9dgJsRgAAAAMALP/xAhgCwAAWACAALAAAAR4BFRQGIyImNTQ2
  968. Ny4BNTQ2MhYVFAYmIgYVFBYyNjU0AzI2NTQmIyIGFRQWAZQ5S5BmbIpPOjA7ecp5P2F8Q0J8RIVJS
  969. 0pLTEtOAW0TXTxpZ2ZqPF0SE1A3VWVlVTdQ/UU0N0RENzT9/ko+Ok1NOj1LAAIAMf/yAhkCwAAXAC
  970. MAAAEyERQGIyImLwEzFxYzMhMHBiMiJjU0NhMyNjU0JiMiBhUUFgEl9Jd0WXQIAVwCGGecCic1SWp
  971. 7imo+UlBAQVNJAsD+usXDZVUKCnYBFD4sgWltif5kW1NJYV1LTmIAAAACACX/8gClAiAABwAPAAAS
  972. MhYUBiImNBIyFhQGIiY0STgkJDgkJDgkJDgkAiAkOCQkOP52JDgkJDgAAAAC/+H/iAClAiAABwAMA
  973. AASMhYUBiImNBMHIzczSTgkJDgkaFpSTl4CICQ4JCQ4/mba5gAAAQBnAB4B+AH0AAYAAAENARUlNS
  974. UB+P6qAVb+bwGRAbCmpkbJRMkAAAIAUAC7AfQBuwADAAcAAAEhNSERITUhAfT+XAGk/lwBpAGDOP8
  975. AOAABAEQAHgHVAfQABgAAARUFNS0BNQHV/m8BVv6qAStEyUSmpkYAAAAAAgAj//IB1ALAABgAIAAA
  976. ATIWFRQHDgEHIz4BNz4BNTQmIyIGByM+ARIyFhQGIiY0AQRibmktIAJWBSEqNig+NTlHBFoDezQ4J
  977. CQ4JALAZ1BjaS03JS1DMD5LLDQ/SUVgcv2yJDgkJDgAAAAAAgA2/5gDFgKYADYAQgAAAQMGFRQzMj
  978. Y1NCYjIg4CFRQWMzI2NxcGIyImNTQ+AjMyFhUUBiMiJwcGIyImNTQ2MzIfATcHNzYmIyIGFRQzMjY
  979. Cej8EJjJJlnBAfGQ+oHtAhjUYg5OPx0h2k06Os3xRWQsVLjY5VHtdPBwJETcJDyUoOkZEJz8B0f74
  980. EQ8kZl6EkTFZjVOLlyknMVm1pmCiaTq4lX6CSCknTVRmmR8wPdYnQzxuSWVGAAIAHQAAAncCsgAHA
  981. AoAACUjByMTMxMjATMDAcj+UVz4dO5d/sjPZPT0ArL9TgE6ATQAAAADAGQAAAJMArIAEAAbACcAAA
  982. EeARUUBgcGKwERMzIXFhUUJRUzMjc2NTQnJiMTPgE1NCcmKwEVMzIBvkdHZkwiNt7LOSGq/oeFHBt
  983. hahIlSTM+cB8Yj5UWAW8QT0VYYgwFArIEF5Fv1eMED2NfDAL93AU+N24PBP0AAAAAAQAv//ICjwLA
  984. ABsAAAEyFh8BIycmIyIGFRQWMzI/ATMHDgEjIiY1NDYBdX+PCwFWAiKiaHx5ZaIiAlYBCpWBk6a0A
  985. sCAagoKpqN/gaOmCgplhcicn8sAAAIAZAAAAp8CsgAMABkAAAEeARUUBgcGKwERMzITPgE1NCYnJi
  986. sBETMyAY59lJp8IzXN0jUVWmdjWRs5d3I4Aq4QqJWUug8EArL9mQ+PeHGHDgX92gAAAAABAGQAAAI
  987. vArIACwAAJRUhESEVIRUhFSEVAi/+NQHB/pUBTf6zRkYCskbwRvAAAAABAGQAAAIlArIACQAAExUh
  988. FSERIxEhFboBQ/69VgHBAmzwRv7KArJGAAAAAAEAL//yAo8CwAAfAAABMxEjNQcGIyImNTQ2MzIWH
  989. wEjJyYjIgYVFBYzMjY1IwGP90wfPnWTprSSf48LAVYCIqJofHllVG+hAU3+s3hARsicn8uAagoKpq
  990. N/gaN1XAAAAAEAZAAAAowCsgALAAABESMRIREjETMRIRECjFb+hFZWAXwCsv1OAS7+0gKy/sQBPAA
  991. AAAABAGQAAAC6ArIAAwAAMyMRM7pWVgKyAAABADf/8gHoArIAEwAAAREUBw4BIyImLwEzFxYzMjc2
  992. NREB6AIFcGpgbQIBVgIHfXQKAQKy/lYxIltob2EpKYyEFD0BpwAAAAABAGQAAAJ0ArIACwAACQEjA
  993. wcVIxEzEQEzATsBJ3ntQlZWAVVlAWH+nwEnR+ACsv6RAW8AAQBkAAACLwKyAAUAACUVIREzEQIv/j
  994. VWRkYCsv2UAAABAGQAAAMUArIAFAAAAREjETQ3BgcDIwMmJxYVESMRMxsBAxRWAiMxemx8NxsCVo7
  995. MywKy/U4BY7ZLco7+nAFmoFxLtP6dArL9lwJpAAAAAAEAZAAAAoACsgANAAAhIwEWFREjETMBJjUR
  996. MwKAhP67A1aEAUUDVAJeeov+pwKy/aJ5jAFZAAAAAgAv//ICuwLAAAkAEwAAEiAWFRQGICY1NBIyN
  997. jU0JiIGFRTbATSsrP7MrNrYenrYegLAxaKhxsahov47nIeIm5uIhwACAGQAAAJHArIADgAYAAABHg
  998. EVFAYHBisBESMRMzITNjQnJisBETMyAZRUX2VOHzuAVtY7GlxcGDWIiDUCrgtnVlVpCgT+5gKy/rU
  999. V1BUF/vgAAAACAC//zAK9AsAAEgAcAAAlFhcHJiMiBwYjIiY1NDYgFhUUJRQWMjY1NCYiBgI9PUMx
  1000. UDcfKh8omqysATSs/dR62Hp62HpICTg7NgkHxqGixcWitbWHnJyHiJubAAIAZAAAAlgCsgAXACMAA
  1001. CUWFyMmJyYnJisBESMRMzIXHgEVFAYHFiUzMjc+ATU0JyYrAQIqDCJfGQwNWhAhglbiOx9QXEY1Tv
  1002. 6bhDATMj1lGSyMtYgtOXR0BwH+1wKyBApbU0BSESRAAgVAOGoQBAABADT/8gIoAsAAJQAAATIWFyM
  1003. uASMiBhUUFhceARUUBiMiJiczHgEzMjY1NCYnLgE1NDYBOmd2ClwGS0E6SUNRdW+HZnKKC1wPWkQ9
  1004. Uk1cZGuEAsBwXUJHNjQ3OhIbZVZZbm5kREo+NT5DFRdYUFdrAAAAAAEAIgAAAmQCsgAHAAABIxEjE
  1005. SM1IQJk9lb2AkICbP2UAmxGAAEAXv/yAmQCsgAXAAABERQHDgEiJicmNREzERQXHgEyNjc2NRECZA
  1006. IIgfCBCAJWAgZYmlgGAgKy/k0qFFxzc1wUKgGz/lUrEkRQUEQSKwGrAAAAAAEAIAAAAnoCsgAGAAA
  1007. hIwMzGwEzAYJ07l3N1FwCsv2PAnEAAAEAGgAAA7ECsgAMAAABAyMLASMDMxsBMxsBA7HAcZyicrZi
  1008. kaB0nJkCsv1OAlP9rQKy/ZsCW/2kAmYAAAEAGQAAAm8CsgALAAAhCwEjEwMzGwEzAxMCCsrEY/bkY
  1009. re+Y/D6AST+3AFcAVb+5gEa/q3+oQAAAQATAAACUQKyAAgAAAERIxEDMxsBMwFdVvRjwLphARD+8A
  1010. EQAaL+sQFPAAABAC4AAAI5ArIACQAAJRUhNQEhNSEVAQI5/fUBof57Aen+YUZGQgIqRkX92QAAAAA
  1011. BAGL/sAEFAwwABwAAARUjETMVIxEBBWlpowMMOP0UOANcAAAB//v/4gE0AtAAAwAABSMDMwE0Pvs+
  1012. HgLuAAAAAQAi/7AAxQMMAAcAABcjNTMRIzUzxaNpaaNQOALsOAABAFAA1wH0AmgABgAAJQsBIxMzE
  1013. wGwjY1GsESw1wFZ/qcBkf5vAAAAAQAy/6oBwv/iAAMAAAUhNSEBwv5wAZBWOAAAAAEAKQJEALYCsg
  1014. ADAAATIycztjhVUAJEbgAAAAACACT/8gHQAiAAHQAlAAAhJwcGIyImNTQ2OwE1NCcmIyIHIz4BMzI
  1015. XFh0BFBcnMjY9ASYVFAF6CR0wVUtgkJoiAgdgaQlaBm1Zrg4DCuQ9R+5MOSFQR1tbDiwUUXBUXowf
  1016. J8c9SjRORzYSgVwAAAAAAgBK//ICRQLfABEAHgAAATIWFRQGIyImLwEVIxEzETc2EzI2NTQmIyIGH
  1017. QEUFgFUcYCVbiNJEyNWVigySElcU01JXmECIJd4i5QTEDRJAt/+3jkq/hRuZV55ZWsdX14AAQAe//
  1018. IB9wIgABgAAAEyFhcjJiMiBhUUFjMyNjczDgEjIiY1NDYBF152DFocbEJXU0A1Rw1aE3pbaoKQAiB
  1019. oWH5qZm1tPDlaXYuLgZcAAAACAB7/8gIZAt8AEQAeAAABESM1BwYjIiY1NDYzMhYfAREDMjY9ATQm
  1020. IyIGFRQWAhlWKDJacYCVbiNJEyOnSV5hQUlcUwLf/SFVOSqXeIuUExA0ARb9VWVrHV9ebmVeeQACA
  1021. B7/8gH9AiAAFQAbAAABFAchHgEzMjY3Mw4BIyImNTQ2MzIWJyIGByEmAf0C/oAGUkA1SwlaD4FXbI
  1022. WObmt45UBVBwEqDQEYFhNjWD84W16Oh3+akU9aU60AAAEAFQAAARoC8gAWAAATBh0BMxUjESMRIzU
  1023. zNTQ3PgEzMhcVJqcDbW1WOTkDB0k8Hx5oAngVITRC/jQBzEIsJRs5PwVHEwAAAAIAHv8uAhkCIAAi
  1024. AC8AAAERFAcOASMiLwEzFx4BMzI2NzY9AQcGIyImNTQ2MzIWHwE1AzI2PQE0JiMiBhUUFgIZAQSEd
  1025. NwRAVcBBU5DTlUDASgyWnGAlW4jSRMjp0leYUFJXFMCEv5wSh1zeq8KCTI8VU0ZIQk5Kpd4i5QTED
  1026. RJ/iJlax1fXm5lXnkAAQBKAAACCgLkABcAAAEWFREjETQnLgEHDgEdASMRMxE3NjMyFgIIAlYCBDs
  1027. 6RVRWViE5UVViAYUbQP7WASQxGzI7AQJyf+kC5P7TPSxUAAACAD4AAACsAsAABwALAAASMhYUBiIm
  1028. NBMjETNeLiAgLiBiVlYCwCAuICAu/WACEgAC//P/LgCnAsAABwAVAAASMhYUBiImNBcRFAcGIyInN
  1029. RY3NjURWS4gIC4gYgMLcRwNSgYCAsAgLiAgLo79wCUbZAJGBzMOHgJEAAAAAQBKAAACCALfAAsAAC
  1030. EnBxUjETMREzMHEwGTwTJWVvdu9/rgN6kC3/4oAQv6/ugAAQBG//wA3gLfAA8AABMRFBceATcVBiM
  1031. iJicmNRGcAQIcIxkkKi4CAQLf/bkhERoSBD4EJC8SNAJKAAAAAQBKAAADEAIgACQAAAEWFREjETQn
  1032. JiMiFREjETQnJiMiFREjETMVNzYzMhYXNzYzMhYDCwVWBAxedFYEDF50VlYiJko7ThAvJkpEVAGfI
  1033. jn+vAEcQyRZ1v76ARxDJFnW/voCEk08HzYtRB9HAAAAAAEASgAAAgoCIAAWAAABFhURIxE0JyYjIg
  1034. YdASMRMxU3NjMyFgIIAlYCCXBEVVZWITlRVWIBhRtA/tYBJDEbbHR/6QISWz0sVAAAAAACAB7/8gI
  1035. sAiAABwARAAASIBYUBiAmNBIyNjU0JiIGFRSlAQCHh/8Ah7ieWlqeWgIgn/Cfn/D+s3ZfYHV1YF8A
  1036. AgBK/zwCRQIgABEAHgAAATIWFRQGIyImLwERIxEzFTc2EzI2NTQmIyIGHQEUFgFUcYCVbiNJEyNWV
  1037. igySElcU01JXmECIJd4i5QTEDT+8wLWVTkq/hRuZV55ZWsdX14AAgAe/zwCGQIgABEAHgAAAREjEQ
  1038. cGIyImNTQ2MzIWHwE1AzI2PQE0JiMiBhUUFgIZVigyWnGAlW4jSRMjp0leYUFJXFMCEv0qARk5Kpd
  1039. 4i5QTEDRJ/iJlax1fXm5lXnkAAQBKAAABPgIeAA0AAAEyFxUmBhURIxEzFTc2ARoWDkdXVlYwIwIe
  1040. B0EFVlf+0gISU0cYAAEAGP/yAa0CIAAjAAATMhYXIyYjIgYVFBYXHgEVFAYjIiYnMxYzMjY1NCYnL
  1041. gE1NDbkV2MJWhNdKy04PF1XbVhWbgxaE2ktOjlEUllkAiBaS2MrJCUoEBlPQkhOVFZoKCUmLhIWSE
  1042. BIUwAAAAEAFP/4ARQCiQAXAAATERQXHgE3FQYjIiYnJjURIzUzNTMVMxWxAQMmMx8qMjMEAUdHVmM
  1043. BzP7PGw4mFgY/BSwxDjQBNUJ7e0IAAAABAEL/8gICAhIAFwAAAREjNQcGIyImJyY1ETMRFBceATMy
  1044. Nj0BAgJWITlRT2EKBVYEBkA1RFECEv3uWj4qTToiOQE+/tIlJC43c4DpAAAAAAEAAQAAAfwCEgAGA
  1045. AABAyMDMxsBAfzJaclfop8CEv3uAhL+LQHTAAABAAEAAAMLAhIADAAAAQMjCwEjAzMbATMbAQMLqW
  1046. Z2dmapY3t0a3Z7AhL97gG+/kICEv5AAcD+QwG9AAAB//oAAAHWAhIACwAAARMjJwcjEwMzFzczARq
  1047. 8ZIuKY763ZoWFYwEO/vLV1QEMAQbNzQAAAQAB/y4B+wISABEAAAEDDgEjIic1FjMyNj8BAzMbAQH7
  1048. 2iFZQB8NDRIpNhQH02GenQIS/cFVUAJGASozEwIt/i4B0gABABQAAAGxAg4ACQAAJRUhNQEhNSEVA
  1049. QGx/mMBNP7iAYL+zkREQgGIREX+ewAAAAABAED/sAEOAwwALAAAASMiBhUUFxYVFAYHHgEVFAcGFR
  1050. QWOwEVIyImNTQ3NjU0JzU2NTQnJjU0NjsBAQ4MKiMLDS4pKS4NCyMqDAtERAwLUlILDERECwLUGBk
  1051. WTlsgKzUFBTcrIFtOFhkYOC87GFVMIkUIOAhFIkxVGDsvAAAAAAEAYP84AJoDIAADAAAXIxEzmjo6
  1052. yAPoAAEAIf+wAO8DDAAsAAATFQYVFBcWFRQGKwE1MzI2NTQnJjU0NjcuATU0NzY1NCYrATUzMhYVF
  1053. AcGFRTvUgsMREQLDCojCw0uKSkuDQsjKgwLREQMCwF6OAhFIkxVGDsvOBgZFk5bICs1BQU3KyBbTh
  1054. YZGDgvOxhVTCJFAAABAE0A3wH2AWQAEwAAATMUIyImJyYjIhUjNDMyFhcWMzIBvjhuGywtQR0xOG4
  1055. bLC1BHTEBZIURGCNMhREYIwAAAwAk/94DIgLoAAcAEQApAAAAIBYQBiAmECQgBhUUFiA2NTQlMhYX
  1056. IyYjIgYUFjMyNjczDgEjIiY1NDYBAQFE3d3+vN0CB/7wubkBELn+xVBnD1wSWDo+QTcqOQZcEmZWX
  1057. HN2Aujg/rbg4AFKpr+Mjb6+jYxbWEldV5ZZNShLVn5na34AAgB4AFIB9AGeAAUACwAAAQcXIyc3Mw
  1058. cXIyc3AUqJiUmJifOJiUmJiQGepqampqampqYAAAIAHAHSAQ4CwAAHAA8AABIyFhQGIiY0NiIGFBY
  1059. yNjRgakREakSTNCEhNCECwEJqQkJqCiM4IyM4AAAAAAIAUAAAAfQCCwALAA8AAAEzFSMVIzUjNTM1
  1060. MxMhNSEBP7W1OrW1OrX+XAGkAVs4tLQ4sP31OAAAAQB0AkQBAQKyAAMAABMjNzOsOD1QAkRuAAAAA
  1061. AEAIADsAKoBdgAHAAASMhYUBiImNEg6KCg6KAF2KDooKDoAAAIAOQBSAbUBngAFAAsAACUHIzcnMw
  1062. UHIzcnMwELiUmJiUkBM4lJiYlJ+KampqampqYAAAABADYB5QDhAt8ABAAAEzczByM2Xk1OXQHv8Po
  1063. AAQAWAeUAwQLfAAQAABMHIzczwV5NTl0C1fD6AAIANgHlAYsC3wAEAAkAABM3MwcjPwEzByM2Xk1O
  1064. XapeTU5dAe/w+grw+gAAAgAWAeUBawLfAAQACQAAEwcjNzMXByM3M8FeTU5dql5NTl0C1fD6CvD6A
  1065. AADACX/8gI1AHIABwAPABcAADYyFhQGIiY0NjIWFAYiJjQ2MhYUBiImNEk4JCQ4JOw4JCQ4JOw4JC
  1066. Q4JHIkOCQkOCQkOCQkOCQkOCQkOAAAAAEAeABSAUoBngAFAAABBxcjJzcBSomJSYmJAZ6mpqamAAA
  1067. AAAEAOQBSAQsBngAFAAAlByM3JzMBC4lJiYlJ+KampgAAAf9qAAABgQKyAAMAACsBATM/VwHAVwKy
  1068. AAAAAAIAFAHIAdwClAAHABQAABMVIxUjNSM1BRUjNwcjJxcjNTMXN9pKMkoByDICKzQqATJLKysCl
  1069. CmjoykBy46KiY3Lm5sAAQAVAAABvALyABgAAAERIxEjESMRIzUzNTQ3NjMyFxUmBgcGHQEBvFbCVj
  1070. k5AxHHHx5iVgcDAg798gHM/jQBzEIOJRuWBUcIJDAVIRYAAAABABX//AHkAvIAJQAAJR4BNxUGIyI
  1071. mJyY1ESYjIgcGHQEzFSMRIxEjNTM1NDc2MzIXERQBowIcIxkkKi4CAR4nXgwDbW1WLy8DEbNdOmYa
  1072. EQQ/BCQvEjQCFQZWFSEWQv40AcxCDiUblhP9uSEAAAAAAAAWAQ4AAQAAAAAAAAATACgAAQAAAAAAA
  1073. QAHAEwAAQAAAAAAAgAHAGQAAQAAAAAAAwAaAKIAAQAAAAAABAAHAM0AAQAAAAAABQA8AU8AAQAAAA
  1074. AABgAPAawAAQAAAAAACAALAdQAAQAAAAAACQALAfgAAQAAAAAACwAXAjQAAQAAAAAADAAXAnwAAwA
  1075. BBAkAAAAmAAAAAwABBAkAAQAOADwAAwABBAkAAgAOAFQAAwABBAkAAwA0AGwAAwABBAkABAAOAL0A
  1076. AwABBAkABQB4ANUAAwABBAkABgAeAYwAAwABBAkACAAWAbwAAwABBAkACQAWAeAAAwABBAkACwAuA
  1077. gQAAwABBAkADAAuAkwATgBvACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAATm8gUm
  1078. lnaHRzIFJlc2VydmVkLgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAUgBlAGcAdQBsAGEAcgAAUmV
  1079. ndWxhcgAAMQAuADEAMAAyADsAVQBLAFcATgA7AEEAaQBsAGUAcgBvAG4ALQBSAGUAZwB1AGwAYQBy
  1080. AAAxLjEwMjtVS1dOO0FpbGVyb24tUmVndWxhcgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAVgBlA
  1081. HIAcwBpAG8AbgAgADEALgAxADAAMgA7AFAAUwAgADAAMAAxAC4AMQAwADIAOwBoAG8AdABjAG8Abg
  1082. B2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADk
  1083. AAFZlcnNpb24gMS4xMDI7UFMgMDAxLjEwMjtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41
  1084. ODMyOQAAQQBpAGwAZQByAG8AbgAtAFIAZQBnAHUAbABhAHIAAEFpbGVyb24tUmVndWxhcgAAUwBvA
  1085. HIAYQAgAFMAYQBnAGEAbgBvAABTb3JhIFNhZ2FubwAAUwBvAHIAYQAgAFMAYQBnAGEAbgBvAABTb3
  1086. JhIFNhZ2FubwAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBsAG8AbgAuAG4AZQB0AAB
  1087. odHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBs
  1088. AG8AbgAuAG4AZQB0AABodHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAAAACAAAAAAAA/4MAMgAAAAAAA
  1089. AAAAAAAAAAAAAAAAAAAAHQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATAB
  1090. QAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAA
  1091. xADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0A
  1092. TgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAIsAqQCDAJMAjQDDAKoAtgC3A
  1093. LQAtQCrAL4AvwC8AIwAwADBAAAAAAAB//8AAgABAAAADAAAABwAAAACAAIAAwBxAAEAcgBzAAIABA
  1094. AAAAIAAAABAAAACgBMAGYAAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAWAANDQVQgAB5NT0wgABZ
  1095. ST00gABYAAP//AAEAAAAA//8AAgAAAAEAAmxpZ2EADmxvY2wAFAAAAAEAAQAAAAEAAAACAAYAEAAG
  1096. AAAAAgASADQABAAAAAEATAADAAAAAgAQABYAAQAcAAAAAQABAE8AAQABAGcAAQABAE8AAwAAAAIAE
  1097. AAWAAEAHAAAAAEAAQAvAAEAAQBnAAEAAQAvAAEAGgABAAgAAgAGAAwAcwACAE8AcgACAEwAAQABAE
  1098. kAAAABAAAACgBGAGAAAkRGTFQADmxhdG4AHAAEAAAAAP//AAIAAAABABYAA0NBVCAAFk1PTCAAFlJ
  1099. PTSAAFgAA//8AAgAAAAEAAmNwc3AADmtlcm4AFAAAAAEAAAAAAAEAAQACAAYADgABAAAAAQASAAIA
  1100. AAACAB4ANgABAAoABQAFAAoAAgABACQAPQAAAAEAEgAEAAAAAQAMAAEAOP/nAAEAAQAkAAIGigAEA
  1101. AAFJAXKABoAGQAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1102. AAAAD/sv+4/+z/7v/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1103. AAAAAAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9T/6AAAAAD/8QAA
  1104. ABD/vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAA//MAA
  1105. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAP/5AAAAAAAAAA
  1106. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAD/4AAAAAAAAAAAAAAAAAA
  1107. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/9AAAAAAAAAAAAAAAAAAAAAAA
  1108. AAAAAAAAAAAA/+gAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1109. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAA
  1110. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAD
  1111. /4gAA//AAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAP/OAAAAAAAAAAAAAAAA
  1112. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zv/qAAAAAP/0AAAACAAAAAAAAAAAAAAAAAAAAAAAA
  1113. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/ZAAD/egAA/1kAAAAA/5D/rgAAAAAAAAAAAA
  1114. AAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1115. AAAAAAAAAAAAAAAAAAAD/8AAA/7b/8P+wAAD/8P/E/98AAAAA/8P/+P/0//oAAAAAAAAAAAAA//gA
  1116. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAA
  1117. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/w//C/9MAAP/SAAD/9wAAAAAAAA
  1118. AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yAAA/+kAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1119. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9wAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1120. AAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1121. AAAAAAAAP/cAAAAAAAAAAAAAAAA/7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1122. AAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAA
  1123. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAkAFAAEAAAAAQACwAAABcA
  1124. BgAAAAAAAAAIAA4AAAAAAAsAEgAAAAAAAAATABkAAwANAAAAAQAJAAAAAAAAAAAAAAAAAAAAGAAAA
  1125. AAABwAAAAAAAAAAAAAAFQAFAAAAAAAYABgAAAAUAAAACgAAAAwAAgAPABEAFgAAAAAAAAAAAAAAAA
  1126. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAEAEQBdAAYAAAAAAAAAAAAAAAAAAAAAAAA
  1127. AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABwAAAAAACAAAAAAAAAAAAAcAAAAHAAAAEwAJ
  1128. ABUADgAPAAAACwAQAAAAAAAAAAAAAAAAAAUAGAACAAIAAgAAAAIAGAAXAAAAGAAAABYAFgACABYAA
  1129. gAWAAAAEQADAAoAFAAMAA0ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEgAGAAEAHgAkAC
  1130. YAJwApACoALQAuAC8AMgAzADcAOAA5ADoAPAA9AEUASABOAE8AUgBTAFUAVwBZAFoAWwBcAF0AcwA
  1131. AAAAAAQAAAADa3tfFAAAAANAan9kAAAAA4QodoQ==
  1132. """
  1133. )
  1134. ),
  1135. 10 if size is None else size,
  1136. layout_engine=Layout.BASIC,
  1137. )
  1138. return load_default_imagefont()