fix(tui): avoid grayscale luma overflow

This commit is contained in:
Hunter Bown
2026-05-21 00:12:55 +08:00
parent 57958dd444
commit ae1bb9dd95
+16 -2
View File
@@ -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"));