From 6365f98abebdff3615abf692f79f475fdcdeea11 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Sat, 7 Nov 2026 12:56:41 +0000 Subject: [PATCH] Keep Lab::hue within 0..360 for tiny negative b Found while testing crates/color/src/cms/lab.rs:25-27 (Lab::hue) Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/color/src/cms/lab.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/crates/color/src/cms/lab.rs b/crates/color/src/cms/lab.rs index 0cbbace7d..5ba921276 100644 --- a/crates/color/src/cms/lab.rs +++ b/crates/color/src/cms/lab.rs @@ -23,7 +23,9 @@ impl Lab { } /// Hue angle in degrees 0..360. pub fn hue(&self) -> f32 { - self.b.atan2(self.a).to_degrees().rem_euclid(360.0) + let h = self.b.atan2(self.a).to_degrees().rem_euclid(360.0); + // f32 rounding can turn a tiny negative angle into exactly 360.0. + if h >= 360.0 { 0.0 } else { h } } pub fn from_lch(l: f32, c: f32, h_deg: f32) -> Self { let h = h_deg.to_radians(); @@ -174,6 +176,13 @@ pub fn delta_e2000(x: Lab, y: Lab) -> f32 { mod tests { use super::*; + #[test] + fn hue_tiny_negative_b_stays_below_360() { + let h = Lab::new(50.0, 10.0, -1e-6).hue(); + assert!((0.0..360.0).contains(&h), "hue {h}"); + assert_eq!(h, 0.0); + } + #[test] fn white_and_black() { let w = srgb_to_lab([1.0, 1.0, 1.0]);