From ae1bb9dd950ccf0a502ad75279dadff9f371f9be Mon Sep 17 00:00:00 2001 From: Hunter Bown Date: Thu, 21 May 2026 00:12:55 +0800 Subject: [PATCH] fix(tui): avoid grayscale luma overflow --- crates/tui/src/palette.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/crates/tui/src/palette.rs b/crates/tui/src/palette.rs index e37e75c8..c792d97e 100644 --- a/crates/tui/src/palette.rs +++ b/crates/tui/src/palette.rs @@ -1089,7 +1089,8 @@ fn grayscale_bg_from_luma(luma: u8) -> Color { } fn luma(r: u8, g: u8, b: u8) -> u8 { - (((u16::from(r) * 299) + (u16::from(g) * 587) + (u16::from(b) * 114)) / 1000) as u8 + let weighted = u32::from(r) * 299 + u32::from(g) * 587 + u32::from(b) * 114; + (weighted / 1000) as u8 } // === Color depth + brightness helpers (v0.6.6 UI redesign) === @@ -1355,7 +1356,7 @@ mod tests { LIGHT_SURFACE, LIGHT_TEXT_BODY, LIGHT_TEXT_HINT, LIGHT_UI_THEME, PaletteMode, SURFACE_REASONING, SURFACE_REASONING_TINT, TEXT_BODY, TEXT_HINT, TEXT_REASONING, TEXT_TOOL_OUTPUT, UI_THEME, adapt_bg, adapt_bg_for_palette_mode, adapt_color, - adapt_fg_for_palette_mode, blend, nearest_ansi16, normalize_hex_rgb_color, + adapt_fg_for_palette_mode, blend, luma, nearest_ansi16, normalize_hex_rgb_color, normalize_theme_name, parse_hex_rgb_color, pulse_brightness, reasoning_surface_tint, rgb_to_ansi256, theme_label_for_mode, ui_theme_from_settings, }; @@ -1540,6 +1541,19 @@ mod tests { ); } + #[test] + fn grayscale_luma_handles_bright_rgb_without_overflow() { + assert_eq!(luma(255, 255, 255), 255); + assert_eq!( + adapt_fg_for_palette_mode( + Color::Rgb(255, 255, 255), + GRAYSCALE_SURFACE, + PaletteMode::Grayscale + ), + GRAYSCALE_TEXT_BODY + ); + } + #[test] fn ui_theme_from_settings_applies_theme_and_background() { let theme = ui_theme_from_settings("grayscale", Some("#111111"));