ImageFont.py 62 KB

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