Generate linear gradient in C++

This commit is contained in:
Olivier Goffart 2021-02-03 10:16:23 +01:00
parent c5ab214f55
commit d90fce9c1d
2 changed files with 19 additions and 1 deletions

View file

@ -155,6 +155,9 @@ public:
<< ")"; << ")";
} }
// FIXME: we need this to create GradientStop
operator const cbindgen_private::types::Color&() { return inner; }
private: private:
cbindgen_private::types::Color inner; cbindgen_private::types::Color inner;
friend class LinearGradientBrush; friend class LinearGradientBrush;

View file

@ -1645,7 +1645,22 @@ fn compile_expression(
"sixtyfps::EasingCurve(sixtyfps::EasingCurve::Tag::CubicBezier, {}, {}, {}, {})", "sixtyfps::EasingCurve(sixtyfps::EasingCurve::Tag::CubicBezier, {}, {}, {}, {})",
a, b, c, d a, b, c, d
), ),
Expression::LinearGradient{..} => todo!(), Expression::LinearGradient{angle, stops} => {
let angle = compile_expression(angle, component);
let mut stops_it = stops.iter().map(|(color, stop)| {
let color = compile_expression(color, component);
let position = if matches!(stop, Expression::Invalid) {
"std::numeric_limits<double>::quiet_NaN()".to_string()
} else {
compile_expression(stop, component)
};
format!("sixtyfps::GradientStop{{ {}, {}, }}", color, position)
});
format!(
"[&] {{ const sixtyfps::GradientStop stops[] = {{ {} }}; return sixtyfps::LinearGradientBrush({}, stops, {}); }}()",
stops_it.join(", "), angle, stops.len()
)
}
Expression::EnumerationValue(value) => { Expression::EnumerationValue(value) => {
format!("sixtyfps::{}::{}", value.enumeration.name, value.to_string()) format!("sixtyfps::{}::{}", value.enumeration.name, value.to_string())
} }