Packages
Multi-surface application runtime for Elixir. One TEA module renders to terminal, browser (LiveView), SSH, and MCP (agents). 30+ widgets, flexbox + CSS grid, AI agent runtime, distributed swarm with CRDTs, time-travel debugging, session recording, sandboxed REPL, and agentic commerce.
Current section
Files
Jump to
Current section
Files
lib/raxol/terminal/rendering/backend.ex
defmodule Raxol.Terminal.Rendering.Backend do
@moduledoc """
Behaviour definition for terminal rendering backends.
This module defines the interface that all rendering backends must implement,
including GPU-accelerated backends (OpenGL, Metal, Vulkan) and software rendering.
"""
@type surface :: %{
id: String.t(),
width: pos_integer(),
height: pos_integer(),
format: atom(),
backend: atom()
}
@type terminal_buffer :: %{
lines: list(),
width: pos_integer(),
height: pos_integer(),
cursor: map(),
colors: map()
}
@type render_opts :: [
viewport: {integer(), integer(), pos_integer(), pos_integer()},
scale: float(),
vsync: boolean(),
effects: list()
]
@type effect_type ::
:blur | :glow | :scanlines | :chromatic_aberration | :vignette
@type stats :: %{
fps: float(),
frame_time: float(),
draw_calls: non_neg_integer(),
vertices: non_neg_integer(),
memory_usage: non_neg_integer()
}
@doc """
Initializes the rendering backend with the given configuration.
"""
@callback init(config :: map()) ::
{:ok, state :: term()} | {:error, reason :: term()}
@doc """
Creates a rendering surface with the specified options.
"""
@callback create_surface(state :: term(), opts :: keyword()) ::
{:ok, surface(), new_state :: term()} | {:error, reason :: term()}
@doc """
Destroys a rendering surface and releases its resources.
"""
@callback destroy_surface(state :: term(), surface :: surface()) ::
{:ok, new_state :: term()} | {:error, reason :: term()}
@doc """
Renders terminal content to the specified surface.
"""
@callback render(
state :: term(),
surface :: surface(),
buffer :: terminal_buffer(),
opts :: render_opts()
) ::
{:ok, new_state :: term()} | {:error, reason :: term()}
@doc """
Enables a visual effect on the rendering backend.
"""
@callback enable_effect(
state :: term(),
effect :: effect_type(),
params :: keyword()
) ::
{:ok, new_state :: term()} | {:error, reason :: term()}
@doc """
Disables a visual effect.
"""
@callback disable_effect(state :: term(), effect :: effect_type()) ::
{:ok, new_state :: term()} | {:error, reason :: term()}
@doc """
Gets rendering performance statistics.
"""
@callback get_stats(state :: term()) :: {:ok, stats(), new_state :: term()}
@doc """
Updates the backend configuration.
"""
@callback update_config(state :: term(), config :: map()) ::
{:ok, new_state :: term()} | {:error, reason :: term()}
@doc """
Checks if the backend is available on the current system.
"""
@callback available?() :: boolean()
@doc """
Gets the backend's capabilities and supported features.
"""
@callback capabilities() :: %{
max_texture_size: pos_integer(),
supports_shaders: boolean(),
supports_effects: [effect_type()],
hardware_accelerated: boolean()
}
end