summaryrefslogtreecommitdiffstats
path: root/tiny_skia/src/backend.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tiny_skia/src/backend.rs')
-rw-r--r--tiny_skia/src/backend.rs45
1 files changed, 45 insertions, 0 deletions
diff --git a/tiny_skia/src/backend.rs b/tiny_skia/src/backend.rs
index d481bacd..dd1adbd8 100644
--- a/tiny_skia/src/backend.rs
+++ b/tiny_skia/src/backend.rs
@@ -1,4 +1,5 @@
use crate::core::text;
+use crate::core::Gradient;
use crate::core::{Background, Color, Font, Point, Rectangle, Size, Vector};
use crate::graphics::backend;
use crate::graphics::{Primitive, Viewport};
@@ -183,6 +184,9 @@ impl Backend {
*color,
))
}
+ Background::Gradient(gradient) => {
+ into_gradient(*gradient, *bounds)
+ }
},
anti_alias: true,
..tiny_skia::Paint::default()
@@ -452,6 +456,47 @@ fn into_color(color: Color) -> tiny_skia::Color {
.expect("Convert color from iced to tiny_skia")
}
+fn into_gradient<'a>(
+ gradient: Gradient,
+ bounds: Rectangle,
+) -> tiny_skia::Shader<'a> {
+ let Gradient::Linear(linear) = gradient;
+ let (start, end) = linear.angle.to_distance(&bounds);
+ let stops: Vec<tiny_skia::GradientStop> = linear
+ .color_stops
+ .into_iter()
+ .flatten()
+ .map(|stop| {
+ tiny_skia::GradientStop::new(
+ stop.offset,
+ tiny_skia::Color::from_rgba(
+ stop.color.b,
+ stop.color.g,
+ stop.color.r,
+ stop.color.a,
+ )
+ .expect("Create color"),
+ )
+ })
+ .collect();
+
+ tiny_skia::LinearGradient::new(
+ tiny_skia::Point {
+ x: start.x,
+ y: start.y,
+ },
+ tiny_skia::Point { x: end.x, y: end.y },
+ if stops.is_empty() {
+ vec![tiny_skia::GradientStop::new(0.0, tiny_skia::Color::BLACK)]
+ } else {
+ stops
+ },
+ tiny_skia::SpreadMode::Pad,
+ tiny_skia::Transform::identity(),
+ )
+ .expect("Create linear gradient")
+}
+
fn rounded_rectangle(
bounds: Rectangle,
border_radius: [f32; 4],