mirror of
https://github.com/danbulant/cushy
synced 2026-07-04 18:50:44 +00:00
Fixing Color::contrast_between
While working on the color pickers, I was noticing the contrast_between choices seem a little off.
This commit is contained in:
parent
8a274df730
commit
6958c6863c
2 changed files with 11 additions and 9 deletions
|
|
@ -81,6 +81,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
- `Space` now honors `ConstraintLimit::Fill` in its layout.
|
- `Space` now honors `ConstraintLimit::Fill` in its layout.
|
||||||
- When handling the Ctrl/Cmd+W shortcut to close windows, repeat keys are now
|
- When handling the Ctrl/Cmd+W shortcut to close windows, repeat keys are now
|
||||||
ignored.
|
ignored.
|
||||||
|
- `Color::constrast_between` was incorrectly allowing hue shifts to weigh in on
|
||||||
|
the contrast when the color was desaturated, and the attempt to account for
|
||||||
|
that was incorrectly being applied to the lightness contrast calculation. In
|
||||||
|
short, this function should be much more accurate in perceived contrast
|
||||||
|
evaluation.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1799,6 +1799,7 @@ impl ColorSource {
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn contrast_between(self, other: Self) -> ZeroToOne {
|
pub fn contrast_between(self, other: Self) -> ZeroToOne {
|
||||||
let saturation_delta = self.saturation.difference_between(other.saturation);
|
let saturation_delta = self.saturation.difference_between(other.saturation);
|
||||||
|
let average_saturation = ZeroToOne::new((*self.saturation + *other.saturation) / 2.);
|
||||||
|
|
||||||
let self_hue = self.hue.into_positive_degrees();
|
let self_hue = self.hue.into_positive_degrees();
|
||||||
let other_hue = other.hue.into_positive_degrees();
|
let other_hue = other.hue.into_positive_degrees();
|
||||||
|
|
@ -1816,7 +1817,7 @@ impl ColorSource {
|
||||||
} / 180.,
|
} / 180.,
|
||||||
);
|
);
|
||||||
|
|
||||||
saturation_delta.one_minus() * hue_delta
|
ZeroToOne::new((*saturation_delta + *hue_delta * *average_saturation) / 2.)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1926,18 +1927,14 @@ impl ColorExt for Color {
|
||||||
let other = self.into_hsla();
|
let other = self.into_hsla();
|
||||||
let lightness_delta = other.hsl.lightness.difference_between(check_lightness);
|
let lightness_delta = other.hsl.lightness.difference_between(check_lightness);
|
||||||
|
|
||||||
let average_lightness = ZeroToOne::new((*check_lightness + *other.hsl.lightness) / 2.);
|
|
||||||
|
|
||||||
let source_change = check_source.contrast_between(other.hsl.source);
|
let source_change = check_source.contrast_between(other.hsl.source);
|
||||||
|
|
||||||
let alpha_delta = check_alpha.difference_between(other.alpha);
|
let alpha_delta = check_alpha.difference_between(other.alpha);
|
||||||
|
|
||||||
ZeroToOne::new(
|
// The lightness amount is the most important factor in contrast
|
||||||
(*lightness_delta
|
// calculations. Thus, we give a higher weight to it in our average
|
||||||
+ *average_lightness * *source_change
|
// calculation.
|
||||||
+ *average_lightness * *alpha_delta)
|
ZeroToOne::new((*lightness_delta * 3. + *source_change + *alpha_delta) / 5.)
|
||||||
/ 3.,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn most_contrasting(self, others: &[Self]) -> Self
|
fn most_contrasting(self, others: &[Self]) -> Self
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue