1use freya_core::prelude::Color;
2
3const ANSI_COLORS: [(u8, u8, u8); 16] = [
5 (0, 0, 0), (204, 85, 85), (85, 204, 85), (215, 215, 0), (84, 85, 203), (204, 85, 204), (122, 202, 202), (204, 204, 204), (85, 85, 85), (255, 85, 85), (85, 255, 85), (255, 255, 0), (85, 85, 255), (255, 85, 255), (85, 255, 255), (255, 255, 255), ];
22
23const RGB_LEVELS: [u8; 6] = [0u8, 95u8, 135u8, 175u8, 215u8, 255u8];
25
26pub fn map_vt100_color(c: vt100::Color, default: Color) -> Color {
30 match c {
31 vt100::Color::Default => default,
32 vt100::Color::Rgb(r, g, b) => Color::from_rgb(r, g, b),
33 vt100::Color::Idx(idx) => {
34 let i = idx as usize;
35
36 if i < 16 {
38 let (r, g, b) = ANSI_COLORS[i];
39 return Color::from_rgb(r, g, b);
40 }
41
42 if (16..=231).contains(&i) {
44 let v = i - 16;
45 let r = v / 36;
46 let g = (v / 6) % 6;
47 let b = v % 6;
48 return Color::from_rgb(RGB_LEVELS[r], RGB_LEVELS[g], RGB_LEVELS[b]);
49 }
50
51 if (232..=255).contains(&i) {
53 let shade = 8 + ((i - 232) * 10) as u8;
54 return Color::from_rgb(shade, shade, shade);
55 }
56
57 default
59 }
60 }
61}