1use crate::{geometry::FPoint, paint::Color, DefaultGradient, Float};
2
3#[derive(Clone, Debug)]
4pub(super) enum GradientData {
5 Linear((FPoint, FPoint)),
6 Radial((FPoint, FPoint, Float)),
7}
8
9pub trait GradientBackend {
10 fn new_linear(x1: Float, y1: Float, x2: Float, y2: Float) -> Self
11 where
12 Self: Sized;
13 fn new_radial(x1: Float, y1: Float, x2: Float, y2: Float, r: Float) -> Self
14 where
15 Self: Sized;
16 fn add_color_stop(&mut self, offset: Float, color: Color) -> bool;
17}
18
19pub struct Gradient<T: GradientBackend> {
20 pub(crate) backend: T,
21}
22
23impl<T: GradientBackend> Gradient<T> {
24 pub fn new_linear(x1: Float, y1: Float, x2: Float, y2: Float) -> Self {
25 Self {
26 backend: T::new_linear(x1, y1, x2, y2),
27 }
28 }
29
30 pub fn new_radial(x1: Float, y1: Float, x2: Float, y2: Float, r: Float) -> Self {
31 Self {
32 backend: T::new_radial(x1, y1, x2, y2, r),
33 }
34 }
35
36 pub fn add_color_stop(&mut self, offset: Float, color: Color) -> bool {
37 self.backend.add_color_stop(offset, color)
38 }
39}
40
41impl Gradient<DefaultGradient> {
42 pub fn default_new_linear(x1: Float, y1: Float, x2: Float, y2: Float) -> Self {
43 Self::new_linear(x1, y1, x2, y2)
44 }
45
46 pub fn default_new_radial(x1: Float, y1: Float, x2: Float, y2: Float, r: Float) -> Self {
47 Self::new_radial(x1, y1, x2, y2, r)
48 }
49}