调整WACG适配算法。
This commit is contained in:
@@ -24,29 +24,34 @@ pub struct ColorSet {
|
||||
|
||||
fn fit_to_wacg(reference: &Oklch, neutral_swatch: &NeutralSwatch, ratio: f32) -> Oklch {
|
||||
let reference_luma = map_oklch_to_luma(reference);
|
||||
let mut new_target = neutral_swatch.get(reference.l);
|
||||
let factor: f32 = if reference.l <= 0.5 { 0.01 } else { -0.01 };
|
||||
|
||||
let match_wacg = |original: &Oklch<f32>, reference: &Luma| {
|
||||
let luma = map_oklch_to_luma(original);
|
||||
luma.relative_contrast(*reference)
|
||||
};
|
||||
|
||||
loop {
|
||||
let mut fit_contrast = (f32::INFINITY, f32::NEG_INFINITY);
|
||||
let mut closest_contrast = (f32::INFINITY, f32::NEG_INFINITY);
|
||||
for scan_lightness in (0..=100).map(|x| x as f32 / 100.0) {
|
||||
let new_target = neutral_swatch.get(scan_lightness);
|
||||
let contrast_ratio = match_wacg(&new_target, &reference_luma);
|
||||
if contrast_ratio >= ratio || new_target.l <= 0.0 || new_target.l >= 1.0 {
|
||||
break;
|
||||
if (contrast_ratio - ratio).abs() < (closest_contrast.0 - ratio).abs()
|
||||
&& scan_lightness > closest_contrast.1
|
||||
{
|
||||
closest_contrast = (contrast_ratio, scan_lightness);
|
||||
}
|
||||
if contrast_ratio >= ratio
|
||||
&& (contrast_ratio - ratio).abs() < (closest_contrast.0 - ratio).abs()
|
||||
{
|
||||
fit_contrast = (contrast_ratio, scan_lightness);
|
||||
}
|
||||
new_target = neutral_swatch.get(if new_target.l + factor <= 0.0 {
|
||||
0.0
|
||||
} else if new_target.l + factor >= 1.0 {
|
||||
1.0
|
||||
} else {
|
||||
new_target.l + factor
|
||||
});
|
||||
}
|
||||
|
||||
new_target
|
||||
neutral_swatch.get(if fit_contrast.0 == f32::INFINITY {
|
||||
closest_contrast.1
|
||||
} else {
|
||||
fit_contrast.1
|
||||
})
|
||||
}
|
||||
|
||||
impl ColorSet {
|
||||
@@ -84,6 +89,13 @@ impl ColorSet {
|
||||
fit_to_wacg(&focus, neutral_swatch, 7.0),
|
||||
fit_to_wacg(&disabled, neutral_swatch, 7.0),
|
||||
),
|
||||
WACGSetting::HighContrast => (
|
||||
fit_to_wacg(&root, neutral_swatch, 21.0),
|
||||
fit_to_wacg(&hover, neutral_swatch, 21.0),
|
||||
fit_to_wacg(&active, neutral_swatch, 21.0),
|
||||
fit_to_wacg(&focus, neutral_swatch, 21.0),
|
||||
fit_to_wacg(&disabled, neutral_swatch, 21.0),
|
||||
),
|
||||
};
|
||||
|
||||
Self {
|
||||
|
@@ -139,6 +139,7 @@ pub enum WACGSetting {
|
||||
Fixed,
|
||||
AutomaticAA,
|
||||
AutomaticAAA,
|
||||
HighContrast,
|
||||
}
|
||||
|
||||
impl WACGSetting {
|
||||
@@ -147,6 +148,7 @@ impl WACGSetting {
|
||||
WACGSetting::Fixed => "Fixed".to_string(),
|
||||
WACGSetting::AutomaticAA => "Automatic AA".to_string(),
|
||||
WACGSetting::AutomaticAAA => "Automatic AAA".to_string(),
|
||||
WACGSetting::HighContrast => "High Contrast".to_string(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user