1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// todo!()
use alacritty_terminal::term::color::Rgb as AlacRgb;
// use gpui::color::Color;
// use theme2::TerminalStyle;

///Converts a 2, 8, or 24 bit color ANSI color to the GPUI equivalent
// pub fn convert_color(alac_color: &AnsiColor, style: &TerminalStyle) -> Color {
//     match alac_color {
//         //Named and theme defined colors
//         alacritty_terminal::ansi::Color::Named(n) => match n {
//             alacritty_terminal::ansi::NamedColor::Black => style.black,
//             alacritty_terminal::ansi::NamedColor::Red => style.red,
//             alacritty_terminal::ansi::NamedColor::Green => style.green,
//             alacritty_terminal::ansi::NamedColor::Yellow => style.yellow,
//             alacritty_terminal::ansi::NamedColor::Blue => style.blue,
//             alacritty_terminal::ansi::NamedColor::Magenta => style.magenta,
//             alacritty_terminal::ansi::NamedColor::Cyan => style.cyan,
//             alacritty_terminal::ansi::NamedColor::White => style.white,
//             alacritty_terminal::ansi::NamedColor::BrightBlack => style.bright_black,
//             alacritty_terminal::ansi::NamedColor::BrightRed => style.bright_red,
//             alacritty_terminal::ansi::NamedColor::BrightGreen => style.bright_green,
//             alacritty_terminal::ansi::NamedColor::BrightYellow => style.bright_yellow,
//             alacritty_terminal::ansi::NamedColor::BrightBlue => style.bright_blue,
//             alacritty_terminal::ansi::NamedColor::BrightMagenta => style.bright_magenta,
//             alacritty_terminal::ansi::NamedColor::BrightCyan => style.bright_cyan,
//             alacritty_terminal::ansi::NamedColor::BrightWhite => style.bright_white,
//             alacritty_terminal::ansi::NamedColor::Foreground => style.foreground,
//             alacritty_terminal::ansi::NamedColor::Background => style.background,
//             alacritty_terminal::ansi::NamedColor::Cursor => style.cursor,
//             alacritty_terminal::ansi::NamedColor::DimBlack => style.dim_black,
//             alacritty_terminal::ansi::NamedColor::DimRed => style.dim_red,
//             alacritty_terminal::ansi::NamedColor::DimGreen => style.dim_green,
//             alacritty_terminal::ansi::NamedColor::DimYellow => style.dim_yellow,
//             alacritty_terminal::ansi::NamedColor::DimBlue => style.dim_blue,
//             alacritty_terminal::ansi::NamedColor::DimMagenta => style.dim_magenta,
//             alacritty_terminal::ansi::NamedColor::DimCyan => style.dim_cyan,
//             alacritty_terminal::ansi::NamedColor::DimWhite => style.dim_white,
//             alacritty_terminal::ansi::NamedColor::BrightForeground => style.bright_foreground,
//             alacritty_terminal::ansi::NamedColor::DimForeground => style.dim_foreground,
//         },
//         //'True' colors
//         alacritty_terminal::ansi::Color::Spec(rgb) => Color::new(rgb.r, rgb.g, rgb.b, u8::MAX),
//         //8 bit, indexed colors
//         alacritty_terminal::ansi::Color::Indexed(i) => get_color_at_index(&(*i as usize), style),
//     }
// }

/// TODO: Move this
///Converts an 8 bit ANSI color to it's GPUI equivalent.
///Accepts usize for compatibility with the alacritty::Colors interface,
///Other than that use case, should only be called with values in the [0,255] range
// pub fn get_color_at_index(index: &usize, style: &TerminalStyle) -> Color {
//     match index {
//         //0-15 are the same as the named colors above
//         0 => style.black,
//         1 => style.red,
//         2 => style.green,
//         3 => style.yellow,
//         4 => style.blue,
//         5 => style.magenta,
//         6 => style.cyan,
//         7 => style.white,
//         8 => style.bright_black,
//         9 => style.bright_red,
//         10 => style.bright_green,
//         11 => style.bright_yellow,
//         12 => style.bright_blue,
//         13 => style.bright_magenta,
//         14 => style.bright_cyan,
//         15 => style.bright_white,
//         //16-231 are mapped to their RGB colors on a 0-5 range per channel
//         16..=231 => {
//             let (r, g, b) = rgb_for_index(&(*index as u8)); //Split the index into it's ANSI-RGB components
//             let step = (u8::MAX as f32 / 5.).floor() as u8; //Split the RGB range into 5 chunks, with floor so no overflow
//             Color::new(r * step, g * step, b * step, u8::MAX) //Map the ANSI-RGB components to an RGB color
//         }
//         //232-255 are a 24 step grayscale from black to white
//         232..=255 => {
//             let i = *index as u8 - 232; //Align index to 0..24
//             let step = (u8::MAX as f32 / 24.).floor() as u8; //Split the RGB grayscale values into 24 chunks
//             Color::new(i * step, i * step, i * step, u8::MAX) //Map the ANSI-grayscale components to the RGB-grayscale
//         }
//         //For compatibility with the alacritty::Colors interface
//         256 => style.foreground,
//         257 => style.background,
//         258 => style.cursor,
//         259 => style.dim_black,
//         260 => style.dim_red,
//         261 => style.dim_green,
//         262 => style.dim_yellow,
//         263 => style.dim_blue,
//         264 => style.dim_magenta,
//         265 => style.dim_cyan,
//         266 => style.dim_white,
//         267 => style.bright_foreground,
//         268 => style.black, //'Dim Background', non-standard color
//         _ => Color::new(0, 0, 0, 255),
//     }
// }
///Generates the rgb channels in [0, 5] for a given index into the 6x6x6 ANSI color cube
///See: [8 bit ansi color](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit).
///
///Wikipedia gives a formula for calculating the index for a given color:
///
///index = 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
///
///This function does the reverse, calculating the r, g, and b components from a given index.
// fn rgb_for_index(i: &u8) -> (u8, u8, u8) {
//     debug_assert!((&16..=&231).contains(&i));
//     let i = i - 16;
//     let r = (i - (i % 36)) / 36;
//     let g = ((i % 36) - (i % 6)) / 6;
//     let b = (i % 36) % 6;
//     (r, g, b)
// }
use gpui::Rgba;

//Convenience method to convert from a GPUI color to an alacritty Rgb
pub fn to_alac_rgb(color: impl Into<Rgba>) -> AlacRgb {
    let color = color.into();
    let r = ((color.r * color.a) * 255.) as u8;
    let g = ((color.g * color.a) * 255.) as u8;
    let b = ((color.b * color.a) * 255.) as u8;
    AlacRgb::new(r, g, b)
}

// #[cfg(test)]
// mod tests {
//     #[test]
//     fn test_rgb_for_index() {
//         //Test every possible value in the color cube
//         for i in 16..=231 {
//             let (r, g, b) = crate::mappings::colors::rgb_for_index(&(i as u8));
//             assert_eq!(i, 16 + 36 * r + 6 * g + b);
//         }
//     }
// }