Implements @radial-gradient(circle, ...)

Only the circle is implemented so far.

Part of #263
This commit is contained in:
Olivier Goffart 2022-05-19 12:43:20 +02:00 committed by Olivier Goffart
parent 7a1e5bef93
commit b4ebd88d35
21 changed files with 418 additions and 56 deletions

View file

@ -453,6 +453,11 @@ pub enum Expression {
stops: Vec<(Expression, Expression)>,
},
RadialGradient {
/// First expression in the tuple is a color, second expression is the stop position
stops: Vec<(Expression, Expression)>,
},
EnumerationValue(EnumerationValue),
ReturnStatement(Option<Box<Expression>>),
@ -604,6 +609,7 @@ impl Expression {
Expression::ReadLocalVariable { ty, .. } => ty.clone(),
Expression::EasingCurve(_) => Type::Easing,
Expression::LinearGradient { .. } => Type::Brush,
Expression::RadialGradient { .. } => Type::Brush,
Expression::EnumerationValue(value) => Type::Enumeration(value.enumeration.clone()),
// invalid because the expression is unreachable
Expression::ReturnStatement(_) => Type::Invalid,
@ -692,6 +698,12 @@ impl Expression {
visitor(s);
}
}
Expression::RadialGradient { stops } => {
for (c, s) in stops {
visitor(c);
visitor(s);
}
}
Expression::EnumerationValue(_) => {}
Expression::ReturnStatement(expr) => {
expr.as_deref().map(visitor);
@ -785,6 +797,12 @@ impl Expression {
visitor(s);
}
}
Expression::RadialGradient { stops } => {
for (c, s) in stops {
visitor(c);
visitor(s);
}
}
Expression::EnumerationValue(_) => {}
Expression::ReturnStatement(expr) => {
expr.as_deref_mut().map(visitor);
@ -856,6 +874,9 @@ impl Expression {
Expression::LinearGradient { angle, stops } => {
angle.is_constant() && stops.iter().all(|(c, s)| c.is_constant() && s.is_constant())
}
Expression::RadialGradient { stops } => {
stops.iter().all(|(c, s)| c.is_constant() && s.is_constant())
}
Expression::EnumerationValue(_) => true,
Expression::ReturnStatement(expr) => {
expr.as_ref().map_or(true, |expr| expr.is_constant())
@ -1388,6 +1409,16 @@ pub fn pretty_print(f: &mut dyn std::fmt::Write, expression: &Expression) -> std
}
write!(f, ")")
}
Expression::RadialGradient { stops } => {
write!(f, "@radial-gradient(circle")?;
for (c, s) in stops {
write!(f, ", ")?;
pretty_print(f, c)?;
write!(f, " ")?;
pretty_print(f, s)?;
}
write!(f, ")")
}
Expression::EnumerationValue(e) => match e.enumeration.values.get(e.value as usize) {
Some(val) => write!(f, "{}.{}", e.enumeration.name, val),
None => write!(f, "{}.{}", e.enumeration.name, e.value),