mcfonts.render

A simple font rendering module. This is experimental, rudimentary, and should not be relied upon.

Submodules

Package Contents

class Glyph

Bases: abc.ABC

The Glyph class represents any visible character glyph.

Glyphs are immutable. To change them, create another with different fields and overwrite the previous glyph.

__bool__() bool

Return True if glyph is not empty.

Return type:

bool

abstractmethod bake() PIL.Image.Image

Return a image rendering of this glyph.

This does not include any right padding.

Return type:

PIL.Image.Image

abstractmethod get_metrics() GlyphMetrics

Return the metrics of this glyph.

Returns:

The metrics.

Return type:

GlyphMetrics

is_empty() bool

Return if glyph is entirely empty.

Returns:

True if height and width bearings are height and width, respectively.

Return type:

bool

abstractmethod show() str

Return a pretty visual representation of this glyph.

It is best to pass this into print().

Returns:

String of glyph representation.

Return type:

str

class MinecraftFont

Bases: collections.abc.MutableSequence[mcfonts.provider.Provider[mcfonts.glyph.Glyph]]

The MinecraftFont class contains a list of providers which supply character-glyph mappings.

By default, these do not have any "not defined" glyphs. Items that expect such default fallbacks must generate their own. You can manually create and add a NotdefProvider or similar that implements it.

This class is a MutableSequence:

font = MinecraftFont()
BitmapProvider(...) in font
glyph = font.get_first_provider_covering("A")
del font[BitmapProvider(...)]
for provider in font:
    ...
if len(font) > 0:
    ...
if font:
    ...
__bool__() bool

Return if this font has any providers.

Return type:

bool

__contains__(item: object, /) bool
Parameters:
item : object

Return type:

bool

__delitem__(index: int | slice) None
Parameters:
index : int | slice

Return type:

None

__getitem__(index: int) mcfonts.provider.Provider[mcfonts.glyph.Glyph]
__getitem__(index: slice) list[mcfonts.provider.Provider[mcfonts.glyph.Glyph]]
__iter__() collections.abc.Generator[mcfonts.provider.Provider[mcfonts.glyph.Glyph]]
Return type:

collections.abc.Generator[mcfonts.provider.Provider[mcfonts.glyph.Glyph]]

__len__() int

Length is number of providers.

Return type:

int

__repr__() str

Return MinecraftFont(x providers => x characters).

Return type:

str

__reversed__() collections.abc.Generator[mcfonts.provider.Provider[mcfonts.glyph.Glyph]]
Return type:

collections.abc.Generator[mcfonts.provider.Provider[mcfonts.glyph.Glyph]]

__setitem__(index: int, value: mcfonts.provider.Provider[mcfonts.glyph.Glyph])
__setitem__(index: slice, value: collections.abc.Iterable[mcfonts.provider.Provider[mcfonts.glyph.Glyph]])
delete_character_from_providers(character: str) None

Delete character from all providers.

Parameters:
character : str

Return type:

None

delete_providers_with_character(character: str) None

Delete all providers from this font which cover character.

Parameters:
character : str

Return type:

None

get_characters() collections.abc.Generator[str]

Yield all characters this font covers.

Returns:

Generator that yields characters.

Return type:

collections.abc.Generator[str]

get_first_provider_covering(character: str, /) mcfonts.provider.Provider[mcfonts.glyph.Glyph] | None
Parameters:
character : str

Return type:

mcfonts.provider.Provider[mcfonts.glyph.Glyph] | None

get_notdef() mcfonts.provider.Provider[mcfonts.glyph.Glyph] | None

Return the first provider which responds to/has a glyph for the character "notdef".

Returns:

Provider, or None if no providers respond.

Return type:

mcfonts.provider.Provider[mcfonts.glyph.Glyph] | None

get_provider_count() dict[type[mcfonts.provider.Provider[mcfonts.glyph.Glyph]], int]

Return a count of the providers stored.

Returns:

Dictionary of provider type field to amount.

Return type:

dict[type[mcfonts.provider.Provider[mcfonts.glyph.Glyph]], int]

get_providers(order: PrioritySortOrder | None = None) collections.abc.Generator[mcfonts.provider.Provider[mcfonts.glyph.Glyph]]

Yield providers by their priority, ascending by default.

Parameters:
order : PrioritySortOrder | None

Order to yield in. Default is None - insertion order regardless of priority

Returns:

Generator yielding Provider.

Return type:

collections.abc.Generator[mcfonts.provider.Provider[mcfonts.glyph.Glyph]]

get_providers_covering(characters: collections.abc.Iterable[str], /) collections.abc.Generator[tuple[set[str], mcfonts.provider.Provider[mcfonts.glyph.Glyph]]]

Yield providers that cover at least 1 of any of the characters in characters.

Providers will be yielded at most once, and in descending priority order.

Warning

Multiple providers may overlap and cover the same character.

Parameters:
characters : collections.abc.Iterable[str]

Set of characters.

Returns:

Generator that yields tuple of (set of characters this provider covers, the provider).

Return type:

collections.abc.Generator[tuple[set[str], mcfonts.provider.Provider[mcfonts.glyph.Glyph]]]

has_character(character: str) bool
Parameters:
character : str

Return type:

bool

insert(index: int, value: mcfonts.provider.Provider[mcfonts.glyph.Glyph]) None

S.insert(index, value) -- insert value before index

Parameters:
index : int

value : mcfonts.provider.Provider[mcfonts.glyph.Glyph]

Return type:

None

with_filter(game_filter: mcfonts.provider.ProviderFilter) MinecraftFont

Return a new font with a filter applied, including only providers which would be enabled for it.

Parameters:
game_filter : mcfonts.provider.ProviderFilter

ProviderFilter reflecting the game's state.

Returns:

New MinecraftFont with filtered providers.

Return type:

MinecraftFont

class RenderContext(*args, **kwds)

Bases: enum.Enum

Create a collection of name/value pairs.

Example enumeration:

>>> class Color(Enum):
...     RED = 1
...     BLUE = 2
...     GREEN = 3

Access them by:

  • attribute access:

    >>> Color.RED
    <Color.RED: 1>
    
  • value lookup:

    >>> Color(1)
    <Color.RED: 1>
    
  • name lookup:

    >>> Color['RED']
    <Color.RED: 1>
    

Enumerations can be iterated over, and know how many members they have:

>>> len(Color)
3
>>> list(Color)
[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]

Methods can be added to enumerations, and members can have their own attributes -- see the documentation for details.

ACTIONBAR = 2
CHAT = 0
DEBUG = 4
TITLE = 1
UI = 3
class RenderMetrics
advance : int
baseline : int
kerning : int
scale : int
class RenderResult
advance_delta : int
baseline : int
image : PIL.Image.Image
pre_advance_delta : int
class Renderable

Bases: Protocol

Functional interface for providers to render the glyphs they contain.

render(character: str, metrics: RenderMetrics) RenderResult | None

Draw a character contained in this provider.

Parameters:
character : str

The character to render.

metrics : RenderMetrics

Current rendering metrics.

Returns:

RenderResult, or None if character cannot be rendered by this provider.

Return type:

RenderResult | None

alpha_paste(first: PIL.Image.Image, second: PIL.Image.Image, offset: tuple[int, int], mask: PIL.Image.Image | None = None) PIL.Image.Image
Parameters:
first : PIL.Image.Image

second : PIL.Image.Image

offset : tuple[int, int]

mask : PIL.Image.Image | None

Return type:

PIL.Image.Image

apply_render(canvas: PIL.Image.Image, rendered: RenderResult, metrics: RenderMetrics) PIL.Image.Image
Parameters:
canvas : PIL.Image.Image

rendered : RenderResult

metrics : RenderMetrics

Return type:

PIL.Image.Image

canvas_extend(image: PIL.Image.Image, *, left: int = 0, up: int = 0, right: int = 0, down: int = 0) PIL.Image.Image

Extend the canvas of an image by adding transparent space in specified directions.

Parameters:
image : PIL.Image.Image

The source image.

left : int

Number of pixels to extend on the left.

up : int

Number of pixels to extend upward.

right : int

Number of pixels to extend on the right.

down : int

Number of pixels to extend downward.

Returns:

New image with extended canvas.

Return type:

PIL.Image.Image

get_notdef(font: mcfonts.font.MinecraftFont, metrics: RenderMetrics) RenderResult
Parameters:
font : mcfonts.font.MinecraftFont

metrics : RenderMetrics

Return type:

RenderResult

render_text(font: mcfonts.font.MinecraftFont, text: str, kerning: int = 1, scale: int = 1) PIL.Image.Image

Render text with font.

Parameters:
font : mcfonts.font.MinecraftFont

Font to source glyphs from.

text : str

Text to render.

kerning : int

Unscaled space between each glyph. Default is 1.

scale : int

GUI scale, default is 1.

Returns:

Image depicting text.

Return type:

PIL.Image.Image

resolve_caching(font: mcfonts.font.MinecraftFont, character: str, metrics: RenderMetrics, cache: collections.abc.MutableMapping[str, RenderResult], notdef: RenderResult, cached_provider: Renderable | None) tuple[RenderResult, Renderable | None]
Parameters:
font : mcfonts.font.MinecraftFont

character : str

metrics : RenderMetrics

cache : collections.abc.MutableMapping[str, RenderResult]

notdef : RenderResult

cached_provider : Renderable | None

Return type:

tuple[RenderResult, Renderable | None]

shadow(image: PIL.Image.Image, color: int | None, offset: tuple[int, int], brightness_factor: float = SHADOW_BRIGHTNESS_FACTOR) PIL.Image.Image

Create a shadow on an image.

Parameters:
image : PIL.Image.Image

The image.

color : int | None

Color of the shadow.

offset : tuple[int, int]

Offset of the shadow, in (x, y).

brightness_factor : float

Brightness factor of the shadow, if color is None.

Returns:

Image with the shadow applied.

Return type:

PIL.Image.Image

standard_render_glyph(glyph: mcfonts.glyph.Glyph, nominal_height: int, baseline: int, gui_scale: int = 2) RenderResult
Parameters:
glyph : mcfonts.glyph.Glyph

nominal_height : int

baseline : int

gui_scale : int

Return type:

RenderResult

DUMMY_RENDERRESULT : Final[RenderResult]
LOGGER : Final[logging.Logger]
NOTDEF_FALLBACK_IMAGE : PIL.Image.Image