fix: some color conversions were incorrect

This commit is contained in:
lisk77 2025-03-13 23:54:19 +01:00
parent ac690694a3
commit 81d3b2f714
4 changed files with 32 additions and 41 deletions

View file

@ -94,12 +94,12 @@ impl Hwba {
let w = self.whiteness.min(1.0 - self.blackness); let w = self.whiteness.min(1.0 - self.blackness);
let c = 1.0 - self.whiteness - self.blackness; let c = 1.0 - self.whiteness - self.blackness;
let hue = self.hue % 360.0; let hue = (self.hue % 360.0 + 360.0) % 360.0;
let h_prime = hue / 60.0; let h_prime = hue / 60.0;
let x = c * (1.0 - (h_prime % 2.0 - 1.0).abs()); let x = c * (1.0 - (h_prime % 2.0 - 1.0).abs());
let (r1, g1, b1) = match h_prime as u32 { let (r1, g1, b1) = match h_prime.floor() as u32 {
0 => (c, x, 0.0), 0 => (c, x, 0.0),
1 => (x, c, 0.0), 1 => (x, c, 0.0),
2 => (0.0, c, x), 2 => (0.0, c, x),
@ -110,20 +110,25 @@ impl Hwba {
}; };
sRgba::<f32>::new( sRgba::<f32>::new(
r1 + w, (r1 + w).min(1.0),
g1 + w, (g1 + w).min(1.0),
b1 + w, (b1 + w).min(1.0),
self.alpha() self.alpha()
) )
} }
pub fn to_hsva(&self) -> Hsva { pub fn to_hsva(&self) -> Hsva {
let value = 1.0 - self.blackness;
let saturation = 1.0 - (self.whiteness / value);
Hsva::new( Hsva::new(
self.hue, self.hue,
1.0 - self.hue / (1.0 - self.blackness), saturation,
1.0 - self.blackness, value,
self.alpha self.alpha
) )
} }
pub fn to_hsla(&self) -> Hsla { pub fn to_hsla(&self) -> Hsla {

View file

@ -48,8 +48,8 @@ impl Lcha {
pub fn to_laba(&self) -> Laba { pub fn to_laba(&self) -> Laba {
Laba::new( Laba::new(
self.lightness, self.lightness,
self.chroma * self.hue.cos().to_radians(), self.chroma * self.hue.to_radians().cos(),
self.chroma * self.hue.sin().to_radians(), self.chroma * self.hue.to_radians().sin(),
self.alpha self.alpha
) )
} }

View file

@ -151,7 +151,7 @@ impl sRgba<u8> {
impl sRgba<f32> { impl sRgba<f32> {
pub fn new(red: f32, green: f32, blue: f32, alpha: f32) -> Self { pub fn new(red: f32, green: f32, blue: f32, alpha: f32) -> Self {
assert!((0.0..1.0).contains(&red) && (0.0..1.0).contains(&green) && (0.0..1.0).contains(&blue) && (0.0..1.0).contains(&alpha), "Red needs to be in range 0..1\nGreen needs to be in range 0..1\nBlue needs to be in range 0..1\nAlpha needs to be in range 0..1"); assert!((0.0..=1.0).contains(&red) && (0.0..=1.0).contains(&green) && (0.0..=1.0).contains(&blue) && (0.0..=1.0).contains(&alpha), "Red needs to be in range 0..=1\nGreen needs to be in range 0..=1\nBlue needs to be in range 0..=1\nAlpha needs to be in range 0..=1");
Self { Self {
red, red,
green, green,
@ -300,43 +300,29 @@ impl sRgba<f32> {
} }
pub fn to_hwba(&self) -> Hwba { pub fn to_hwba(&self) -> Hwba {
let w = self.red.min(self.green).min(self.blue); let (r,g,b) = (self.red, self.green, self.blue);
let v = self.red.max(self.green).max(self.blue);
let b = 1.0 - v;
if v == w { let c_max = r.max(g).max(b);
return Hwba::new( let c_min = r.min(g).min(b);
0.0, let delta = c_max - c_min;
w,
b,
self.alpha()
)
}
let f = if self.red == v { let mut hue = if c_max == self.red {
(self.green - self.blue) / (v - w) 60.0 * (((self.green - self.blue) / delta) % 6.0)
} else if self.green == v { } else if c_max == self.green {
(self.blue - self.red) / (v - w) 60.0 * (((self.blue - self.red) / delta) + 2.0)
} else if c_max == self.blue {
60.0 * (((self.red - self.green) / delta) + 4.0)
} else { } else {
(self.red - self.green) / (v - w) 0.0
}; };
let h = if self.red == v { hue = if hue < 0.0 { hue + 360.0 } else { hue };
(f / 6.0) % 1.0
} else if self.green == v {
(f + 2.0) / 6.0
} else {
(f + 4.0) / 6.0
};
let mut h = if h < 0.0 { h + 1.0 } else { h };
h *= 360.0;
Hwba::new( Hwba::new(
h, hue,
w, c_min,
b, 1.0 - c_max,
self.alpha() as f32 / 255.0 self.alpha
) )
} }

View file

@ -7,7 +7,7 @@ pub struct Entity {
} }
impl Entity { impl Entity {
pub fn new(id: u32) -> Self { pub(crate) fn new(id: u32) -> Self {
let mut components = BitSet::new(); let mut components = BitSet::new();
components.insert(0); components.insert(0);
Self { Self {