Implement builtin function adjust-hue
This commit is contained in:
parent
f8a09bec6e
commit
6427a7ab81
@ -166,4 +166,17 @@ pub(crate) fn register(f: &mut BTreeMap<String, Builtin>) {
|
|||||||
_ => todo!("non-color given to builtin function `alpha()`")
|
_ => todo!("non-color given to builtin function `alpha()`")
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
decl!(f "adjust-hue", |args, _| {
|
||||||
|
let color = match arg!(args, 0, "color").eval() {
|
||||||
|
Value::Color(c) => c,
|
||||||
|
_ => todo!("non-color given to builtin function `adjust-hue()`")
|
||||||
|
};
|
||||||
|
let degrees = match arg!(args, 1, "degrees").eval() {
|
||||||
|
Value::Dimension(n, Unit::None)
|
||||||
|
| Value::Dimension(n, Unit::Percent)
|
||||||
|
| Value::Dimension(n, Unit::Deg) => n,
|
||||||
|
_ => todo!("expected either unitless or % number for alpha"),
|
||||||
|
};
|
||||||
|
Some(Value::Color(color.adjust_hue(degrees)))
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
@ -102,6 +102,13 @@ impl Color {
|
|||||||
(((min + max) / Number::from(2)) * Number::from(100)).round()
|
(((min + max) / Number::from(2)) * Number::from(100)).round()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn adjust_hue(&self, degrees: Number) -> Self {
|
||||||
|
let hue = self.hue();
|
||||||
|
let saturation = Number::ratio(self.saturation(), 100);
|
||||||
|
let luminance = Number::ratio(self.lightness(), 100);
|
||||||
|
Color::from_hsla(hue + degrees, saturation, luminance, self.alpha())
|
||||||
|
}
|
||||||
|
|
||||||
pub fn alpha(&self) -> Number {
|
pub fn alpha(&self) -> Number {
|
||||||
self.alpha.clone()
|
self.alpha.clone()
|
||||||
}
|
}
|
||||||
|
@ -58,6 +58,12 @@ impl From<BigInt> for Number {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<Number> for BigInt {
|
||||||
|
fn from(b: Number) -> Self {
|
||||||
|
b.to_integer()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
macro_rules! from_integer {
|
macro_rules! from_integer {
|
||||||
($ty:ty) => {
|
($ty:ty) => {
|
||||||
impl From<$ty> for Number {
|
impl From<$ty> for Number {
|
||||||
|
@ -196,3 +196,24 @@ test!(
|
|||||||
"a {\n color: invert(white, 20);\n}\n",
|
"a {\n color: invert(white, 20);\n}\n",
|
||||||
"a {\n color: #cccccc;\n}\n"
|
"a {\n color: #cccccc;\n}\n"
|
||||||
);
|
);
|
||||||
|
test!(
|
||||||
|
adjust_hue_positive,
|
||||||
|
"a {\n color: adjust-hue(hsl(120, 30%, 90%), 60deg);\n}\n",
|
||||||
|
"a {\n color: #deeded;\n}\n"
|
||||||
|
);
|
||||||
|
test!(
|
||||||
|
adjust_hue_negative,
|
||||||
|
"a {\n color: adjust-hue(hsl(120, 30%, 90%), -60deg);\n}\n",
|
||||||
|
"a {\n color: #ededde;\n}\n"
|
||||||
|
);
|
||||||
|
test!(
|
||||||
|
adjust_hue_3_hex,
|
||||||
|
"a {\n color: adjust-hue(#811, 45deg);\n}\n",
|
||||||
|
"a {\n color: #886a11;\n}\n"
|
||||||
|
);
|
||||||
|
// blocked on better parsing of call args
|
||||||
|
// test!(
|
||||||
|
// adjust_hue_named_args,
|
||||||
|
// "a {\n color: adjust-hue($color: hsl(120, 30%, 90%), $degrees: 60deg);\n}\n",
|
||||||
|
// "a {\n color: #deeded;\n}\n"
|
||||||
|
// );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user