diff --git a/src/builtin/color/hsl.rs b/src/builtin/color/hsl.rs index 7581457..ff30593 100644 --- a/src/builtin/color/hsl.rs +++ b/src/builtin/color/hsl.rs @@ -150,7 +150,7 @@ pub(crate) fn register(f: &mut BTreeMap) { decl!(f "invert", |args, _| { max_args!(args, 2); let weight = match arg!(args, 1, "weight"=Value::Dimension(Number::from(100), Unit::Percent)) { - Value::Dimension(n, _) => n / Number::from(100), + Value::Dimension(n, u) => bound!("amount", n, u, 0, 100) / Number::from(100), v => return Err(format!("$weight: {} is not a number.", v).into()), }; match arg!(args, 0, "color") { diff --git a/src/color/mod.rs b/src/color/mod.rs index 8bc907d..9a088bc 100644 --- a/src/color/mod.rs +++ b/src/color/mod.rs @@ -424,18 +424,15 @@ impl Color { } pub fn invert(&self, weight: Number) -> Self { - let weight = if weight > Number::from(1) { - Number::from(1) - } else if weight < Number::from(0) { - Number::from(0) - } else { - weight - }; - let red = Number::from(u8::max_value()) - self.red() * weight.clone(); - let green = Number::from(u8::max_value()) - self.green() * weight.clone(); - let blue = Number::from(u8::max_value()) - self.blue() * weight; + if weight == Number::from(0) { + return self.clone(); + } + let red = Number::from(u8::max_value()) - self.red(); + let green = Number::from(u8::max_value()) - self.green(); + let blue = Number::from(u8::max_value()) - self.blue(); let repr = repr(&red, &green, &blue, &self.alpha()); - Color::new_rgba(red, green, blue, self.alpha(), repr) + let inverse = Color::new_rgba(red, green, blue, self.alpha(), repr); + inverse.mix(self.clone(), weight) } pub fn complement(&self) -> Self { diff --git a/tests/color.rs b/tests/color.rs index 7b63bd8..cca2cc1 100644 --- a/tests/color.rs +++ b/tests/color.rs @@ -263,6 +263,11 @@ test!( "a {\n color: invert(white, 20%);\n}\n", "a {\n color: #cccccc;\n}\n" ); +test!( + invert_weight_percent_turquoise, + "a {\n color: invert(turquoise, 23%);\n}\n", + "a {\n color: #5db4ab;\n}\n" +); test!( invert_weight_no_unit, "a {\n color: invert(white, 20);\n}\n",