Rendro.FontRegistry (Rendro v0.2.0)

Copy Markdown View Source

Pure data registry for document-owned logical font registrations.

Public authoring code registers logical names such as :body or :heading against a narrow built-in descriptor. PDF object names and writer resource allocation stay private implementation details.

Summary

Functions

Converts a resolved built-in descriptor into the PDF font definition used by downstream measurement and rendering stages.

Returns the default logical font name used by new documents.

Fetches a registered logical font descriptor.

Returns the built-in Helvetica descriptor used by the public compatibility path.

Returns a registry seeded with the built-in Helvetica-compatible default entry.

Preflights embedded font registrations into cached PDF font descriptors.

Sets the registry default to a previously registered logical font name.

Registers a logical font name against a supported built-in font descriptor.

Registers a logical font name against an explicit embedded font source.

Registers a narrow four-variant embedded font family.

Resolves an authored text font reference into one shared built-in descriptor.

Resolves an authored text font reference into the concrete built-in PDF font struct used by deterministic measurement and rendering.

Resolves an authored text font reference into a chain of concrete PDF font structs, recursively resolving fallbacks.

Types

built_in_descriptor()

@type built_in_descriptor() :: %{
  :source => :built_in,
  :family => built_in_family(),
  optional(:fallbacks) => [logical_name()]
}

built_in_family()

@type built_in_family() :: :helvetica

descriptor()

@type descriptor() :: built_in_descriptor() | embedded_descriptor()

embedded_descriptor()

@type embedded_descriptor() :: %{
  :source => :embedded,
  :source_kind => embedded_source_kind(),
  :variant => embedded_variant(),
  :source_data => embedded_normalized_source(),
  optional(:pdf_font) => Rendro.PDF.Font.t(),
  optional(:fallbacks) => [logical_name()]
}

embedded_normalized_source()

@type embedded_normalized_source() ::
  %{
    status: :ok,
    kind: embedded_source_kind(),
    bytes: binary(),
    byte_size: non_neg_integer()
  }
  | %{status: :error, kind: embedded_source_kind(), reason: term()}

embedded_source_kind()

@type embedded_source_kind() :: :path | :binary

embedded_variant()

@type embedded_variant() :: :regular | :bold | :italic | :bold_italic

logical_name()

@type logical_name() :: atom()

resolve_error()

@type resolve_error() ::
  {:unknown_logical_font, logical_name()}
  | {:unsupported_font_reference, term()}
  | {:invalid_embedded_font,
     %{
       logical_name: logical_name(),
       source_kind: embedded_source_kind(),
       reason: term()
     }}

t()

@type t() :: %Rendro.FontRegistry{
  default_font: logical_name(),
  fonts: %{optional(logical_name()) => descriptor()}
}

Functions

built_in(map)

@spec built_in(descriptor()) :: Rendro.PDF.Font.t()

Converts a resolved built-in descriptor into the PDF font definition used by downstream measurement and rendering stages.

built_in(map, logical_name)

@spec built_in(descriptor(), logical_name()) :: Rendro.PDF.Font.t()

default_font()

@spec default_font() :: logical_name()

Returns the default logical font name used by new documents.

fetch(registry, logical_name)

@spec fetch(t(), logical_name()) :: {:ok, descriptor()} | :error

Fetches a registered logical font descriptor.

helvetica()

@spec helvetica() :: descriptor()

Returns the built-in Helvetica descriptor used by the public compatibility path.

new()

@spec new() :: t()

Returns a registry seeded with the built-in Helvetica-compatible default entry.

preflight(registry)

@spec preflight(t()) :: {:ok, t()} | {:error, resolve_error()}

Preflights embedded font registrations into cached PDF font descriptors.

put_default_font(registry, logical_name)

@spec put_default_font(t(), logical_name()) :: t()

Sets the registry default to a previously registered logical font name.

register(registry, logical_name, opts)

@spec register(t(), logical_name(), keyword()) :: t()

Registers a logical font name against a supported built-in font descriptor.

register_embedded(registry, logical_name, source, opts \\ [])

@spec register_embedded(
  t(),
  logical_name(),
  {:path, Path.t()} | {:binary, binary()},
  keyword()
) :: t()

Registers a logical font name against an explicit embedded font source.

register_embedded_family(registry, family_name, variants)

@spec register_embedded_family(
  t(),
  logical_name(),
  %{required(embedded_variant()) => {:path, Path.t()} | {:binary, binary()}}
) :: t()

Registers a narrow four-variant embedded font family.

The root logical name resolves to the :regular face and the helper also registers :<family>_bold, :<family>_italic, and :<family>_bold_italic.

resolve(registry, text_font_ref, document_default_font)

@spec resolve(t(), Rendro.Text.font_ref(), logical_name()) ::
  {:ok, descriptor()} | {:error, resolve_error()}

Resolves an authored text font reference into one shared built-in descriptor.

The resolver only supports the registry-backed built-in fonts available in Phase 25. It intentionally does not load external files, build fallback chains, or expose embedding details.

resolve_pdf_font(registry, text_font_ref, document_default_font)

@spec resolve_pdf_font(t(), Rendro.Text.font_ref(), logical_name()) ::
  {:ok, Rendro.PDF.Font.t()} | {:error, resolve_error()}

Resolves an authored text font reference into the concrete built-in PDF font struct used by deterministic measurement and rendering.

resolve_pdf_font_chain(registry, text_font_ref, document_default_font)

@spec resolve_pdf_font_chain(t(), Rendro.Text.font_ref(), logical_name()) ::
  {:ok, [Rendro.PDF.Font.t()]} | {:error, term()}

Resolves an authored text font reference into a chain of concrete PDF font structs, recursively resolving fallbacks.

variant_logical_name(family_name, variant)

@spec variant_logical_name(logical_name(), embedded_variant()) :: logical_name()