ImageFont.py 62 KB

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