Skip to content

Commit 3beef8b

Browse files
kennytmBurntSushi
authored andcommitted
windows: support the first 16 Ansi256
While the native Windows console APIs have very limited support for colors, we can at least support the first 16 colors of the ANSI spectrum by translating them to the standard Windows 8-bit palette, along with toggling the intensity to make 16 total colors. This fixes a bug that was reported against rustc. See: rust-lang/rust#55788 (comment)
1 parent a250e46 commit 3beef8b

File tree

1 file changed

+40
-22
lines changed

1 file changed

+40
-22
lines changed

src/lib.rs

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,17 +1511,12 @@ impl ColorSpec {
15111511
&self,
15121512
console: &mut wincolor::Console,
15131513
) -> io::Result<()> {
1514-
use wincolor::Intense;
1515-
1516-
let intense = if self.intense { Intense::Yes } else { Intense::No };
1517-
1518-
let fg_color = self.fg_color.as_ref().and_then(|c| c.to_windows());
1519-
if let Some(color) = fg_color {
1514+
let fg_color = self.fg_color.and_then(|c| c.to_windows(self.intense));
1515+
if let Some((intense, color)) = fg_color {
15201516
console.fg(intense, color)?;
15211517
}
1522-
1523-
let bg_color = self.bg_color.as_ref().and_then(|c| c.to_windows());
1524-
if let Some(color) = bg_color {
1518+
let bg_color = self.bg_color.and_then(|c| c.to_windows(self.intense));
1519+
if let Some((intense, color)) = bg_color {
15251520
console.bg(intense, color)?;
15261521
}
15271522
Ok(())
@@ -1569,20 +1564,43 @@ pub enum Color {
15691564
impl Color {
15701565
/// Translate this color to a wincolor::Color.
15711566
#[cfg(windows)]
1572-
fn to_windows(&self) -> Option<wincolor::Color> {
1573-
match *self {
1574-
Color::Black => Some(wincolor::Color::Black),
1575-
Color::Blue => Some(wincolor::Color::Blue),
1576-
Color::Green => Some(wincolor::Color::Green),
1577-
Color::Red => Some(wincolor::Color::Red),
1578-
Color::Cyan => Some(wincolor::Color::Cyan),
1579-
Color::Magenta => Some(wincolor::Color::Magenta),
1580-
Color::Yellow => Some(wincolor::Color::Yellow),
1581-
Color::White => Some(wincolor::Color::White),
1582-
Color::Ansi256(_) => None,
1583-
Color::Rgb(_, _, _) => None,
1567+
fn to_windows(
1568+
self,
1569+
intense: bool,
1570+
) -> Option<(wincolor::Intense, wincolor::Color)> {
1571+
use wincolor::Intense::{Yes, No};
1572+
1573+
let color = match self {
1574+
Color::Black => wincolor::Color::Black,
1575+
Color::Blue => wincolor::Color::Blue,
1576+
Color::Green => wincolor::Color::Green,
1577+
Color::Red => wincolor::Color::Red,
1578+
Color::Cyan => wincolor::Color::Cyan,
1579+
Color::Magenta => wincolor::Color::Magenta,
1580+
Color::Yellow => wincolor::Color::Yellow,
1581+
Color::White => wincolor::Color::White,
1582+
Color::Ansi256(0) => return Some((No, wincolor::Color::Black)),
1583+
Color::Ansi256(1) => return Some((No, wincolor::Color::Red)),
1584+
Color::Ansi256(2) => return Some((No, wincolor::Color::Green)),
1585+
Color::Ansi256(3) => return Some((No, wincolor::Color::Yellow)),
1586+
Color::Ansi256(4) => return Some((No, wincolor::Color::Blue)),
1587+
Color::Ansi256(5) => return Some((No, wincolor::Color::Magenta)),
1588+
Color::Ansi256(6) => return Some((No, wincolor::Color::Cyan)),
1589+
Color::Ansi256(7) => return Some((No, wincolor::Color::White)),
1590+
Color::Ansi256(8) => return Some((Yes, wincolor::Color::Black)),
1591+
Color::Ansi256(9) => return Some((Yes, wincolor::Color::Red)),
1592+
Color::Ansi256(10) => return Some((Yes, wincolor::Color::Green)),
1593+
Color::Ansi256(11) => return Some((Yes, wincolor::Color::Yellow)),
1594+
Color::Ansi256(12) => return Some((Yes, wincolor::Color::Blue)),
1595+
Color::Ansi256(13) => return Some((Yes, wincolor::Color::Magenta)),
1596+
Color::Ansi256(14) => return Some((Yes, wincolor::Color::Cyan)),
1597+
Color::Ansi256(15) => return Some((Yes, wincolor::Color::White)),
1598+
Color::Ansi256(_) => return None,
1599+
Color::Rgb(_, _, _) => return None,
15841600
Color::__Nonexhaustive => unreachable!(),
1585-
}
1601+
};
1602+
let intense = if intense { Yes } else { No };
1603+
Some((intense, color))
15861604
}
15871605

15881606
/// Parses a numeric color string, either ANSI or RGB.

0 commit comments

Comments
 (0)