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 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 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),
1 => (x, c, 0.0),
2 => (0.0, c, x),
@ -110,20 +110,25 @@ impl Hwba {
};
sRgba::<f32>::new(
r1 + w,
g1 + w,
b1 + w,
(r1 + w).min(1.0),
(g1 + w).min(1.0),
(b1 + w).min(1.0),
self.alpha()
)
}
pub fn to_hsva(&self) -> Hsva {
let value = 1.0 - self.blackness;
let saturation = 1.0 - (self.whiteness / value);
Hsva::new(
self.hue,
1.0 - self.hue / (1.0 - self.blackness),
1.0 - self.blackness,
saturation,
value,
self.alpha
)
}
pub fn to_hsla(&self) -> Hsla {

View file

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

View file

@ -151,7 +151,7 @@ impl sRgba<u8> {
impl sRgba<f32> {
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 {
red,
green,
@ -300,43 +300,29 @@ impl sRgba<f32> {
}
pub fn to_hwba(&self) -> Hwba {
let w = self.red.min(self.green).min(self.blue);
let v = self.red.max(self.green).max(self.blue);
let b = 1.0 - v;
let (r,g,b) = (self.red, self.green, self.blue);
if v == w {
return Hwba::new(
0.0,
w,
b,
self.alpha()
)
}
let c_max = r.max(g).max(b);
let c_min = r.min(g).min(b);
let delta = c_max - c_min;
let f = if self.red == v {
(self.green - self.blue) / (v - w)
} else if self.green == v {
(self.blue - self.red) / (v - w)
let mut hue = if c_max == self.red {
60.0 * (((self.green - self.blue) / delta) % 6.0)
} else if c_max == self.green {
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 {
(self.red - self.green) / (v - w)
0.0
};
let h = if self.red == v {
(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;
hue = if hue < 0.0 { hue + 360.0 } else { hue };
Hwba::new(
h,
w,
b,
self.alpha() as f32 / 255.0
hue,
c_min,
1.0 - c_max,
self.alpha
)
}

View file

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