terminal-use 1.1.0

Headless virtual terminal for AI agents
//! Xterm-256color palette and terminal-to-RGBA color conversion.
//!
//! The palette values match the standard xterm-256color definition: 16 named colors,
//! a 6x6x6 color cube (indices 16..=231), and a 24-step grayscale ramp (232..=255).
//! No theme customization is supported — these are the canonical defaults.

use image::Rgba;

use crate::render::screen::Color;

/// Convert a terminal [`Color`] to an `image::Rgba` pixel value.
///
/// `is_foreground` controls the fallback for [`Color::Default`]: white for foreground
/// text, black for background. This matches the standard light-on-dark terminal
/// convention (white text on a black background).
pub fn color_to_rgba(color: Color, is_foreground: bool) -> Rgba<u8> {
    match color {
        Color::Default => {
            if is_foreground {
                Rgba([255, 255, 255, 255])
            } else {
                Rgba([0, 0, 0, 255])
            }
        }
        Color::Indexed(idx) => COLOR_256[idx as usize],
        Color::Rgb(r, g, b) => Rgba([r, g, b, 255]),
    }
}

/// Standard xterm-256color palette as opaque RGBA values.
///
/// Indices 0..=15 are the 16 named ANSI colors, 16..=231 are the 6x6x6 color cube,
/// and 232..=255 are the 24-step grayscale ramp.
pub static COLOR_256: [Rgba<u8>; 256] = [
    Rgba([0, 0, 0, 255]),
    Rgba([128, 0, 0, 255]),
    Rgba([0, 128, 0, 255]),
    Rgba([128, 128, 0, 255]),
    Rgba([0, 0, 128, 255]),
    Rgba([128, 0, 128, 255]),
    Rgba([0, 128, 128, 255]),
    Rgba([192, 192, 192, 255]),
    Rgba([128, 128, 128, 255]),
    Rgba([255, 0, 0, 255]),
    Rgba([0, 255, 0, 255]),
    Rgba([255, 255, 0, 255]),
    Rgba([0, 0, 255, 255]),
    Rgba([255, 0, 255, 255]),
    Rgba([0, 255, 255, 255]),
    Rgba([255, 255, 255, 255]),
    Rgba([0, 0, 0, 255]),
    Rgba([0, 0, 95, 255]),
    Rgba([0, 0, 135, 255]),
    Rgba([0, 0, 175, 255]),
    Rgba([0, 0, 215, 255]),
    Rgba([0, 0, 255, 255]),
    Rgba([0, 95, 0, 255]),
    Rgba([0, 95, 95, 255]),
    Rgba([0, 95, 135, 255]),
    Rgba([0, 95, 175, 255]),
    Rgba([0, 95, 215, 255]),
    Rgba([0, 95, 255, 255]),
    Rgba([0, 135, 0, 255]),
    Rgba([0, 135, 95, 255]),
    Rgba([0, 135, 135, 255]),
    Rgba([0, 135, 175, 255]),
    Rgba([0, 135, 215, 255]),
    Rgba([0, 135, 255, 255]),
    Rgba([0, 175, 0, 255]),
    Rgba([0, 175, 95, 255]),
    Rgba([0, 175, 135, 255]),
    Rgba([0, 175, 175, 255]),
    Rgba([0, 175, 215, 255]),
    Rgba([0, 175, 255, 255]),
    Rgba([0, 215, 0, 255]),
    Rgba([0, 215, 95, 255]),
    Rgba([0, 215, 135, 255]),
    Rgba([0, 215, 175, 255]),
    Rgba([0, 215, 215, 255]),
    Rgba([0, 215, 255, 255]),
    Rgba([0, 255, 0, 255]),
    Rgba([0, 255, 95, 255]),
    Rgba([0, 255, 135, 255]),
    Rgba([0, 255, 175, 255]),
    Rgba([0, 255, 215, 255]),
    Rgba([0, 255, 255, 255]),
    Rgba([95, 0, 0, 255]),
    Rgba([95, 0, 95, 255]),
    Rgba([95, 0, 135, 255]),
    Rgba([95, 0, 175, 255]),
    Rgba([95, 0, 215, 255]),
    Rgba([95, 0, 255, 255]),
    Rgba([95, 95, 0, 255]),
    Rgba([95, 95, 95, 255]),
    Rgba([95, 95, 135, 255]),
    Rgba([95, 95, 175, 255]),
    Rgba([95, 95, 215, 255]),
    Rgba([95, 95, 255, 255]),
    Rgba([95, 135, 0, 255]),
    Rgba([95, 135, 95, 255]),
    Rgba([95, 135, 135, 255]),
    Rgba([95, 135, 175, 255]),
    Rgba([95, 135, 215, 255]),
    Rgba([95, 135, 255, 255]),
    Rgba([95, 175, 0, 255]),
    Rgba([95, 175, 95, 255]),
    Rgba([95, 175, 135, 255]),
    Rgba([95, 175, 175, 255]),
    Rgba([95, 175, 215, 255]),
    Rgba([95, 175, 255, 255]),
    Rgba([95, 215, 0, 255]),
    Rgba([95, 215, 95, 255]),
    Rgba([95, 215, 135, 255]),
    Rgba([95, 215, 175, 255]),
    Rgba([95, 215, 215, 255]),
    Rgba([95, 215, 255, 255]),
    Rgba([95, 255, 0, 255]),
    Rgba([95, 255, 95, 255]),
    Rgba([95, 255, 135, 255]),
    Rgba([95, 255, 175, 255]),
    Rgba([95, 255, 215, 255]),
    Rgba([95, 255, 255, 255]),
    Rgba([135, 0, 0, 255]),
    Rgba([135, 0, 95, 255]),
    Rgba([135, 0, 135, 255]),
    Rgba([135, 0, 175, 255]),
    Rgba([135, 0, 215, 255]),
    Rgba([135, 0, 255, 255]),
    Rgba([135, 95, 0, 255]),
    Rgba([135, 95, 95, 255]),
    Rgba([135, 95, 135, 255]),
    Rgba([135, 95, 175, 255]),
    Rgba([135, 95, 215, 255]),
    Rgba([135, 95, 255, 255]),
    Rgba([135, 135, 0, 255]),
    Rgba([135, 135, 95, 255]),
    Rgba([135, 135, 135, 255]),
    Rgba([135, 135, 175, 255]),
    Rgba([135, 135, 215, 255]),
    Rgba([135, 135, 255, 255]),
    Rgba([135, 175, 0, 255]),
    Rgba([135, 175, 95, 255]),
    Rgba([135, 175, 135, 255]),
    Rgba([135, 175, 175, 255]),
    Rgba([135, 175, 215, 255]),
    Rgba([135, 175, 255, 255]),
    Rgba([135, 215, 0, 255]),
    Rgba([135, 215, 95, 255]),
    Rgba([135, 215, 135, 255]),
    Rgba([135, 215, 175, 255]),
    Rgba([135, 215, 215, 255]),
    Rgba([135, 215, 255, 255]),
    Rgba([135, 255, 0, 255]),
    Rgba([135, 255, 95, 255]),
    Rgba([135, 255, 135, 255]),
    Rgba([135, 255, 175, 255]),
    Rgba([135, 255, 215, 255]),
    Rgba([135, 255, 255, 255]),
    Rgba([175, 0, 0, 255]),
    Rgba([175, 0, 95, 255]),
    Rgba([175, 0, 135, 255]),
    Rgba([175, 0, 175, 255]),
    Rgba([175, 0, 215, 255]),
    Rgba([175, 0, 255, 255]),
    Rgba([175, 95, 0, 255]),
    Rgba([175, 95, 95, 255]),
    Rgba([175, 95, 135, 255]),
    Rgba([175, 95, 175, 255]),
    Rgba([175, 95, 215, 255]),
    Rgba([175, 95, 255, 255]),
    Rgba([175, 135, 0, 255]),
    Rgba([175, 135, 95, 255]),
    Rgba([175, 135, 135, 255]),
    Rgba([175, 135, 175, 255]),
    Rgba([175, 135, 215, 255]),
    Rgba([175, 135, 255, 255]),
    Rgba([175, 175, 0, 255]),
    Rgba([175, 175, 95, 255]),
    Rgba([175, 175, 135, 255]),
    Rgba([175, 175, 175, 255]),
    Rgba([175, 175, 215, 255]),
    Rgba([175, 175, 255, 255]),
    Rgba([175, 215, 0, 255]),
    Rgba([175, 215, 95, 255]),
    Rgba([175, 215, 135, 255]),
    Rgba([175, 215, 175, 255]),
    Rgba([175, 215, 215, 255]),
    Rgba([175, 215, 255, 255]),
    Rgba([175, 255, 0, 255]),
    Rgba([175, 255, 95, 255]),
    Rgba([175, 255, 135, 255]),
    Rgba([175, 255, 175, 255]),
    Rgba([175, 255, 215, 255]),
    Rgba([175, 255, 255, 255]),
    Rgba([215, 0, 0, 255]),
    Rgba([215, 0, 95, 255]),
    Rgba([215, 0, 135, 255]),
    Rgba([215, 0, 175, 255]),
    Rgba([215, 0, 215, 255]),
    Rgba([215, 0, 255, 255]),
    Rgba([215, 95, 0, 255]),
    Rgba([215, 95, 95, 255]),
    Rgba([215, 95, 135, 255]),
    Rgba([215, 95, 175, 255]),
    Rgba([215, 95, 215, 255]),
    Rgba([215, 95, 255, 255]),
    Rgba([215, 135, 0, 255]),
    Rgba([215, 135, 95, 255]),
    Rgba([215, 135, 135, 255]),
    Rgba([215, 135, 175, 255]),
    Rgba([215, 135, 215, 255]),
    Rgba([215, 135, 255, 255]),
    Rgba([215, 175, 0, 255]),
    Rgba([215, 175, 95, 255]),
    Rgba([215, 175, 135, 255]),
    Rgba([215, 175, 175, 255]),
    Rgba([215, 175, 215, 255]),
    Rgba([215, 175, 255, 255]),
    Rgba([215, 215, 0, 255]),
    Rgba([215, 215, 95, 255]),
    Rgba([215, 215, 135, 255]),
    Rgba([215, 215, 175, 255]),
    Rgba([215, 215, 215, 255]),
    Rgba([215, 215, 255, 255]),
    Rgba([215, 255, 0, 255]),
    Rgba([215, 255, 95, 255]),
    Rgba([215, 255, 135, 255]),
    Rgba([215, 255, 175, 255]),
    Rgba([215, 255, 215, 255]),
    Rgba([215, 255, 255, 255]),
    Rgba([255, 0, 0, 255]),
    Rgba([255, 0, 95, 255]),
    Rgba([255, 0, 135, 255]),
    Rgba([255, 0, 175, 255]),
    Rgba([255, 0, 215, 255]),
    Rgba([255, 0, 255, 255]),
    Rgba([255, 95, 0, 255]),
    Rgba([255, 95, 95, 255]),
    Rgba([255, 95, 135, 255]),
    Rgba([255, 95, 175, 255]),
    Rgba([255, 95, 215, 255]),
    Rgba([255, 95, 255, 255]),
    Rgba([255, 135, 0, 255]),
    Rgba([255, 135, 95, 255]),
    Rgba([255, 135, 135, 255]),
    Rgba([255, 135, 175, 255]),
    Rgba([255, 135, 215, 255]),
    Rgba([255, 135, 255, 255]),
    Rgba([255, 175, 0, 255]),
    Rgba([255, 175, 95, 255]),
    Rgba([255, 175, 135, 255]),
    Rgba([255, 175, 175, 255]),
    Rgba([255, 175, 215, 255]),
    Rgba([255, 175, 255, 255]),
    Rgba([255, 215, 0, 255]),
    Rgba([255, 215, 95, 255]),
    Rgba([255, 215, 135, 255]),
    Rgba([255, 215, 175, 255]),
    Rgba([255, 215, 215, 255]),
    Rgba([255, 215, 255, 255]),
    Rgba([255, 255, 0, 255]),
    Rgba([255, 255, 95, 255]),
    Rgba([255, 255, 135, 255]),
    Rgba([255, 255, 175, 255]),
    Rgba([255, 255, 215, 255]),
    Rgba([255, 255, 255, 255]),
    Rgba([8, 8, 8, 255]),
    Rgba([18, 18, 18, 255]),
    Rgba([28, 28, 28, 255]),
    Rgba([38, 38, 38, 255]),
    Rgba([48, 48, 48, 255]),
    Rgba([58, 58, 58, 255]),
    Rgba([68, 68, 68, 255]),
    Rgba([78, 78, 78, 255]),
    Rgba([88, 88, 88, 255]),
    Rgba([98, 98, 98, 255]),
    Rgba([108, 108, 108, 255]),
    Rgba([118, 118, 118, 255]),
    Rgba([128, 128, 128, 255]),
    Rgba([138, 138, 138, 255]),
    Rgba([148, 148, 148, 255]),
    Rgba([158, 158, 158, 255]),
    Rgba([168, 168, 168, 255]),
    Rgba([178, 178, 178, 255]),
    Rgba([188, 188, 188, 255]),
    Rgba([198, 198, 198, 255]),
    Rgba([208, 208, 208, 255]),
    Rgba([218, 218, 218, 255]),
    Rgba([228, 228, 228, 255]),
    Rgba([238, 238, 238, 255]),
];