use super::funejson::Value; use super::charts_color_parse_hex::parse_hex; use super::charts_color_srgb_to_linear::srgb_to_linear; use super::math_round_float::round_float; /// WCAG 2.x relative luminance: linear-light R, G, B weighted 0.2126, 0.7152, 0.0722. pub fn relative_luminance(hex: &str) -> f64 { let c = parse_hex(hex); 0.2126 * srgb_to_linear(c.r) + 0.7152 * srgb_to_linear(c.g) + 0.0722 * srgb_to_linear(c.b) } /// (lighter + 0.05) / (darker + 0.05), unrounded. pub fn luminance_contrast(a: &str, b: &str) -> f64 { let la = relative_luminance(a); let lb = relative_luminance(b); if la > lb { (la + 0.05) / (lb + 0.05) } else { (lb + 0.05) / (la + 0.05) } } /// The WCAG 2.x contrast ratio, 1 to 21, rounded to 6 places. /// /// # Panics /// Panics if either colour is not a hex colour. pub fn contrast_ratio(foreground: &str, background: &str) -> f64 { round_float(luminance_contrast(foreground, background), 6) } pub fn fune_vector(args: &[Value]) -> Value { Value::Float(contrast_ratio(args[0].as_str(), args[1].as_str())) }