pub(crate) mod color_mix;
pub(crate) mod functional;
pub(crate) mod hex;
pub(crate) mod named;
use crate::color::Color;
use crate::spaces::Rgb;
pub fn parse(input: &str) -> Option<Color> {
if let Some(c) = parse_named_or_transparent(input) {
return Some(Color::Rgb(c));
}
if let Some(c) = hex::parse_hex(input) {
return Some(Color::Rgb(c));
}
if let Some(c) = color_mix::parse_color_mix(input) {
return Some(c);
}
functional::parse_functional(input)
}
fn parse_named_or_transparent(input: &str) -> Option<Rgb> {
if input == "transparent" {
return Some(Rgb {
r: 0.0,
g: 0.0,
b: 0.0,
alpha: Some(0.0),
});
}
let lower = input.to_ascii_lowercase();
let packed = named::lookup(&lower)?;
Some(unpack_rgb(packed))
}
fn unpack_rgb(packed: u32) -> Rgb {
Rgb {
r: ((packed >> 16) & 0xff) as f64 / 255.0,
g: ((packed >> 8) & 0xff) as f64 / 255.0,
b: (packed & 0xff) as f64 / 255.0,
alpha: None,
}
}