diff options
Diffstat (limited to 'tiny_skia/src/backend.rs')
-rw-r--r-- | tiny_skia/src/backend.rs | 45 |
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], |