ImageFont.py 61 KB

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