ratatui-wgpu 0.5.0

A wgpu based backend for ratatui.
Documentation
use ratatui_core::style::Color;

pub(crate) type Rgb = [u8; 3];

#[allow(non_snake_case)]
#[derive(Debug, Default, Clone)]
pub struct ColorTable {
    pub BLACK: Rgb,
    pub RED: Rgb,
    pub GREEN: Rgb,
    pub YELLOW: Rgb,
    pub BLUE: Rgb,
    pub MAGENTA: Rgb,
    pub CYAN: Rgb,
    pub GRAY: Rgb,
    pub DARKGRAY: Rgb,
    pub LIGHTRED: Rgb,
    pub LIGHTGREEN: Rgb,
    pub LIGHTYELLOW: Rgb,
    pub LIGHTBLUE: Rgb,
    pub LIGHTMAGENTA: Rgb,
    pub LIGHTCYAN: Rgb,
    pub WHITE: Rgb,
}

impl ColorTable {
    pub(crate) fn c2c(
        &self,
        color: Color,
        reset: Rgb,
    ) -> Rgb {
        match color {
            Color::Reset => reset,
            Color::Black => self.BLACK,
            Color::Red => self.RED,
            Color::Green => self.GREEN,
            Color::Yellow => self.YELLOW,
            Color::Blue => self.BLUE,
            Color::Magenta => self.MAGENTA,
            Color::Cyan => self.CYAN,
            Color::Gray => self.GRAY,
            Color::DarkGray => self.DARKGRAY,
            Color::LightRed => self.LIGHTRED,
            Color::LightGreen => self.LIGHTGREEN,
            Color::LightYellow => self.LIGHTYELLOW,
            Color::LightBlue => self.LIGHTBLUE,
            Color::LightMagenta => self.LIGHTMAGENTA,
            Color::LightCyan => self.LIGHTCYAN,
            Color::White => self.WHITE,
            Color::Rgb(r, g, b) => [r, g, b],
            Color::Indexed(idx) => ANSI_TO_RGB[idx as usize],
        }
    }
}

/// <https://www.w3.org/TR/SVG11/types.html#ColorKeywords>
pub(crate) mod named {
    use crate::colors::ColorTable;

    pub(crate) const DEFAULT_COLORS: ColorTable = ColorTable {
        BLACK: [0, 0, 0],
        GREEN: [0, 128, 0],
        RED: [255, 0, 0],
        BLUE: [0, 0, 255],
        CYAN: [0, 255, 255],
        DARKGRAY: [169, 169, 169],
        GRAY: [128, 128, 128],
        LIGHTBLUE: [173, 216, 230],
        LIGHTCYAN: [224, 255, 255],
        LIGHTGREEN: [144, 238, 144],
        LIGHTMAGENTA: [255, 128, 255],
        LIGHTRED: [240, 128, 128],
        LIGHTYELLOW: [255, 255, 224],
        MAGENTA: [255, 0, 255],
        WHITE: [255, 255, 255],
        YELLOW: [255, 255, 0],
    };
}

/// This could be split into `[standard table]` + `[high intensity table]` +
/// `<6x6x6 cube fn>` + `<grayscale step fn>`, but a lookup table is only 768
/// bytes and way simpler to implement.
const ANSI_TO_RGB: [Rgb; 256] = [
    [0x00, 0x00, 0x00],
    [0x80, 0x00, 0x00],
    [0x00, 0x80, 0x00],
    [0x80, 0x80, 0x00],
    [0x00, 0x00, 0x80],
    [0x80, 0x00, 0x80],
    [0x00, 0x80, 0x80],
    [0xc0, 0xc0, 0xc0],
    [0x80, 0x80, 0x80],
    [0xff, 0x00, 0x00],
    [0x00, 0xff, 0x00],
    [0xff, 0xff, 0x00],
    [0x00, 0x00, 0xff],
    [0xff, 0x00, 0xff],
    [0x00, 0xff, 0xff],
    [0xff, 0xff, 0xff],
    [0x00, 0x00, 0x00],
    [0x00, 0x00, 0x5f],
    [0x00, 0x00, 0x87],
    [0x00, 0x00, 0xaf],
    [0x00, 0x00, 0xd7],
    [0x00, 0x00, 0xff],
    [0x00, 0x5f, 0x00],
    [0x00, 0x5f, 0x5f],
    [0x00, 0x5f, 0x87],
    [0x00, 0x5f, 0xaf],
    [0x00, 0x5f, 0xd7],
    [0x00, 0x5f, 0xff],
    [0x00, 0x87, 0x00],
    [0x00, 0x87, 0x5f],
    [0x00, 0x87, 0x87],
    [0x00, 0x87, 0xaf],
    [0x00, 0x87, 0xd7],
    [0x00, 0x87, 0xff],
    [0x00, 0xaf, 0x00],
    [0x00, 0xaf, 0x5f],
    [0x00, 0xaf, 0x87],
    [0x00, 0xaf, 0xaf],
    [0x00, 0xaf, 0xd7],
    [0x00, 0xaf, 0xff],
    [0x00, 0xd7, 0x00],
    [0x00, 0xd7, 0x5f],
    [0x00, 0xd7, 0x87],
    [0x00, 0xd7, 0xaf],
    [0x00, 0xd7, 0xd7],
    [0x00, 0xd7, 0xff],
    [0x00, 0xff, 0x00],
    [0x00, 0xff, 0x5f],
    [0x00, 0xff, 0x87],
    [0x00, 0xff, 0xaf],
    [0x00, 0xff, 0xd7],
    [0x00, 0xff, 0xff],
    [0x5f, 0x00, 0x00],
    [0x5f, 0x00, 0x5f],
    [0x5f, 0x00, 0x87],
    [0x5f, 0x00, 0xaf],
    [0x5f, 0x00, 0xd7],
    [0x5f, 0x00, 0xff],
    [0x5f, 0x5f, 0x00],
    [0x5f, 0x5f, 0x5f],
    [0x5f, 0x5f, 0x87],
    [0x5f, 0x5f, 0xaf],
    [0x5f, 0x5f, 0xd7],
    [0x5f, 0x5f, 0xff],
    [0x5f, 0x87, 0x00],
    [0x5f, 0x87, 0x5f],
    [0x5f, 0x87, 0x87],
    [0x5f, 0x87, 0xaf],
    [0x5f, 0x87, 0xd7],
    [0x5f, 0x87, 0xff],
    [0x5f, 0xaf, 0x00],
    [0x5f, 0xaf, 0x5f],
    [0x5f, 0xaf, 0x87],
    [0x5f, 0xaf, 0xaf],
    [0x5f, 0xaf, 0xd7],
    [0x5f, 0xaf, 0xff],
    [0x5f, 0xd7, 0x00],
    [0x5f, 0xd7, 0x5f],
    [0x5f, 0xd7, 0x87],
    [0x5f, 0xd7, 0xaf],
    [0x5f, 0xd7, 0xd7],
    [0x5f, 0xd7, 0xff],
    [0x5f, 0xff, 0x00],
    [0x5f, 0xff, 0x5f],
    [0x5f, 0xff, 0x87],
    [0x5f, 0xff, 0xaf],
    [0x5f, 0xff, 0xd7],
    [0x5f, 0xff, 0xff],
    [0x87, 0x00, 0x00],
    [0x87, 0x00, 0x5f],
    [0x87, 0x00, 0x87],
    [0x87, 0x00, 0xaf],
    [0x87, 0x00, 0xd7],
    [0x87, 0x00, 0xff],
    [0x87, 0x5f, 0x00],
    [0x87, 0x5f, 0x5f],
    [0x87, 0x5f, 0x87],
    [0x87, 0x5f, 0xaf],
    [0x87, 0x5f, 0xd7],
    [0x87, 0x5f, 0xff],
    [0x87, 0x87, 0x00],
    [0x87, 0x87, 0x5f],
    [0x87, 0x87, 0x87],
    [0x87, 0x87, 0xaf],
    [0x87, 0x87, 0xd7],
    [0x87, 0x87, 0xff],
    [0x87, 0xaf, 0x00],
    [0x87, 0xaf, 0x5f],
    [0x87, 0xaf, 0x87],
    [0x87, 0xaf, 0xaf],
    [0x87, 0xaf, 0xd7],
    [0x87, 0xaf, 0xff],
    [0x87, 0xd7, 0x00],
    [0x87, 0xd7, 0x5f],
    [0x87, 0xd7, 0x87],
    [0x87, 0xd7, 0xaf],
    [0x87, 0xd7, 0xd7],
    [0x87, 0xd7, 0xff],
    [0x87, 0xff, 0x00],
    [0x87, 0xff, 0x5f],
    [0x87, 0xff, 0x87],
    [0x87, 0xff, 0xaf],
    [0x87, 0xff, 0xd7],
    [0x87, 0xff, 0xff],
    [0xaf, 0x00, 0x00],
    [0xaf, 0x00, 0x5f],
    [0xaf, 0x00, 0x87],
    [0xaf, 0x00, 0xaf],
    [0xaf, 0x00, 0xd7],
    [0xaf, 0x00, 0xff],
    [0xaf, 0x5f, 0x00],
    [0xaf, 0x5f, 0x5f],
    [0xaf, 0x5f, 0x87],
    [0xaf, 0x5f, 0xaf],
    [0xaf, 0x5f, 0xd7],
    [0xaf, 0x5f, 0xff],
    [0xaf, 0x87, 0x00],
    [0xaf, 0x87, 0x5f],
    [0xaf, 0x87, 0x87],
    [0xaf, 0x87, 0xaf],
    [0xaf, 0x87, 0xd7],
    [0xaf, 0x87, 0xff],
    [0xaf, 0xaf, 0x00],
    [0xaf, 0xaf, 0x5f],
    [0xaf, 0xaf, 0x87],
    [0xaf, 0xaf, 0xaf],
    [0xaf, 0xaf, 0xd7],
    [0xaf, 0xaf, 0xff],
    [0xaf, 0xd7, 0x00],
    [0xaf, 0xd7, 0x5f],
    [0xaf, 0xd7, 0x87],
    [0xaf, 0xd7, 0xaf],
    [0xaf, 0xd7, 0xd7],
    [0xaf, 0xd7, 0xff],
    [0xaf, 0xff, 0x00],
    [0xaf, 0xff, 0x5f],
    [0xaf, 0xff, 0x87],
    [0xaf, 0xff, 0xaf],
    [0xaf, 0xff, 0xd7],
    [0xaf, 0xff, 0xff],
    [0xd7, 0x00, 0x00],
    [0xd7, 0x00, 0x5f],
    [0xd7, 0x00, 0x87],
    [0xd7, 0x00, 0xaf],
    [0xd7, 0x00, 0xd7],
    [0xd7, 0x00, 0xff],
    [0xd7, 0x5f, 0x00],
    [0xd7, 0x5f, 0x5f],
    [0xd7, 0x5f, 0x87],
    [0xd7, 0x5f, 0xaf],
    [0xd7, 0x5f, 0xd7],
    [0xd7, 0x5f, 0xff],
    [0xd7, 0x87, 0x00],
    [0xd7, 0x87, 0x5f],
    [0xd7, 0x87, 0x87],
    [0xd7, 0x87, 0xaf],
    [0xd7, 0x87, 0xd7],
    [0xd7, 0x87, 0xff],
    [0xd7, 0xaf, 0x00],
    [0xd7, 0xaf, 0x5f],
    [0xd7, 0xaf, 0x87],
    [0xd7, 0xaf, 0xaf],
    [0xd7, 0xaf, 0xd7],
    [0xd7, 0xaf, 0xff],
    [0xd7, 0xd7, 0x00],
    [0xd7, 0xd7, 0x5f],
    [0xd7, 0xd7, 0x87],
    [0xd7, 0xd7, 0xaf],
    [0xd7, 0xd7, 0xd7],
    [0xd7, 0xd7, 0xff],
    [0xd7, 0xff, 0x00],
    [0xd7, 0xff, 0x5f],
    [0xd7, 0xff, 0x87],
    [0xd7, 0xff, 0xaf],
    [0xd7, 0xff, 0xd7],
    [0xd7, 0xff, 0xff],
    [0xff, 0x00, 0x00],
    [0xff, 0x00, 0x5f],
    [0xff, 0x00, 0x87],
    [0xff, 0x00, 0xaf],
    [0xff, 0x00, 0xd7],
    [0xff, 0x00, 0xff],
    [0xff, 0x5f, 0x00],
    [0xff, 0x5f, 0x5f],
    [0xff, 0x5f, 0x87],
    [0xff, 0x5f, 0xaf],
    [0xff, 0x5f, 0xd7],
    [0xff, 0x5f, 0xff],
    [0xff, 0x87, 0x00],
    [0xff, 0x87, 0x5f],
    [0xff, 0x87, 0x87],
    [0xff, 0x87, 0xaf],
    [0xff, 0x87, 0xd7],
    [0xff, 0x87, 0xff],
    [0xff, 0xaf, 0x00],
    [0xff, 0xaf, 0x5f],
    [0xff, 0xaf, 0x87],
    [0xff, 0xaf, 0xaf],
    [0xff, 0xaf, 0xd7],
    [0xff, 0xaf, 0xff],
    [0xff, 0xd7, 0x00],
    [0xff, 0xd7, 0x5f],
    [0xff, 0xd7, 0x87],
    [0xff, 0xd7, 0xaf],
    [0xff, 0xd7, 0xd7],
    [0xff, 0xd7, 0xff],
    [0xff, 0xff, 0x00],
    [0xff, 0xff, 0x5f],
    [0xff, 0xff, 0x87],
    [0xff, 0xff, 0xaf],
    [0xff, 0xff, 0xd7],
    [0xff, 0xff, 0xff],
    [0x08, 0x08, 0x08],
    [0x12, 0x12, 0x12],
    [0x1c, 0x1c, 0x1c],
    [0x26, 0x26, 0x26],
    [0x30, 0x30, 0x30],
    [0x3a, 0x3a, 0x3a],
    [0x44, 0x44, 0x44],
    [0x4e, 0x4e, 0x4e],
    [0x58, 0x58, 0x58],
    [0x62, 0x62, 0x62],
    [0x6c, 0x6c, 0x6c],
    [0x76, 0x76, 0x76],
    [0x80, 0x80, 0x80],
    [0x8a, 0x8a, 0x8a],
    [0x94, 0x94, 0x94],
    [0x9e, 0x9e, 0x9e],
    [0xa8, 0xa8, 0xa8],
    [0xb2, 0xb2, 0xb2],
    [0xbc, 0xbc, 0xbc],
    [0xc6, 0xc6, 0xc6],
    [0xd0, 0xd0, 0xd0],
    [0xda, 0xda, 0xda],
    [0xe4, 0xe4, 0xe4],
    [0xee, 0xee, 0xee],
];