x_graphics/
gradient.rs

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}