Maps font family names to protocol font IDs (0-255).
Font ID 0 is always the primary font (configured via :font_family).
IDs 1-255 are assigned on demand when a Face with a non-nil font_family
is first rendered. The Emit stage sends register_font protocol commands
for pending registrations so the GUI frontend can load the corresponding FontFace instances.
MingaEditor.Renderer.Server owns the long-lived registry. Each render passes
the immutable value through composition and emission, then the renderer stores
the completed result. It resets when the renderer restarts or the font config changes.
Summary
Functions
Returns the font_id for a font family, allocating a new ID if needed.
Returns the font_id for a family, or 0 if not registered.
Marks all pending font registrations as emitted.
Creates a new empty font registry.
Returns font registrations that have been allocated but not emitted yet.
Requires every allocated fallback font to be emitted in the next recovery keyframe.
Types
@type t() :: %MingaEditor.UI.FontRegistry{ families: %{required(String.t()) => non_neg_integer()}, next_id: non_neg_integer(), pending: %{required(non_neg_integer()) => String.t()} }
Functions
@spec get_or_register(t(), String.t()) :: {non_neg_integer(), t(), boolean()}
Returns the font_id for a font family, allocating a new ID if needed.
Returns {font_id, updated_registry, new?} where new? is true if
a new ID was allocated (caller should send register_font to the GUI).
The primary font (ID 0) is never registered here; it's set via set_font.
@spec lookup(t(), String.t()) :: non_neg_integer()
Returns the font_id for a family, or 0 if not registered.
Marks all pending font registrations as emitted.
@spec new() :: t()
Creates a new empty font registry.
@spec pending_registrations(t()) :: [{non_neg_integer(), String.t()}]
Returns font registrations that have been allocated but not emitted yet.
Requires every allocated fallback font to be emitted in the next recovery keyframe.