use super::color::Rgba;
pub const SYSTEM_16: [Rgba; 16] = [
Rgba::rgb(0x00, 0x00, 0x00), Rgba::rgb(0x80, 0x00, 0x00), Rgba::rgb(0x00, 0x80, 0x00), Rgba::rgb(0x80, 0x80, 0x00), Rgba::rgb(0x00, 0x00, 0x80), Rgba::rgb(0x80, 0x00, 0x80), Rgba::rgb(0x00, 0x80, 0x80), Rgba::rgb(0xc0, 0xc0, 0xc0), Rgba::rgb(0x80, 0x80, 0x80), Rgba::rgb(0xff, 0x00, 0x00), Rgba::rgb(0x00, 0xff, 0x00), Rgba::rgb(0xff, 0xff, 0x00), Rgba::rgb(0x00, 0x00, 0xff), Rgba::rgb(0xff, 0x00, 0xff), Rgba::rgb(0x00, 0xff, 0xff), Rgba::rgb(0xff, 0xff, 0xff), ];
pub const CUBE_LEVELS: [u8; 6] = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];
pub const fn xterm_256(index: u8) -> Rgba {
match index {
0..=15 => SYSTEM_16[index as usize],
16..=231 => {
let i = index as usize - 16;
let r = CUBE_LEVELS[i / 36];
let g = CUBE_LEVELS[(i / 6) % 6];
let b = CUBE_LEVELS[i % 6];
Rgba::rgb(r, g, b)
}
232..=255 => {
let v = 8 + (index as u16 - 232) * 10;
Rgba::rgb(v as u8, v as u8, v as u8)
}
}
}
pub static XTERM_256: [Rgba; 256] = {
let mut t = [Rgba::BLACK; 256];
let mut i = 0usize;
while i < 256 {
t[i] = xterm_256(i as u8);
i += 1;
}
t
};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn spot_values() {
assert_eq!(xterm_256(1), Rgba::rgb(0x80, 0, 0));
assert_eq!(xterm_256(16), Rgba::rgb(0, 0, 0));
assert_eq!(xterm_256(21), Rgba::rgb(0, 0, 0xff));
assert_eq!(xterm_256(196), Rgba::rgb(0xff, 0, 0));
assert_eq!(xterm_256(232), Rgba::rgb(8, 8, 8));
assert_eq!(xterm_256(255), Rgba::rgb(238, 238, 238));
assert_eq!(XTERM_256[196], xterm_256(196));
}
}