use crate::{geometry::FPoint, paint::Color, DefaultGradient, Float};
#[derive(Clone, Debug)]
pub(super) enum GradientData {
Linear((FPoint, FPoint)),
Radial((FPoint, FPoint, Float)),
}
pub trait GradientBackend {
fn new_linear(x1: Float, y1: Float, x2: Float, y2: Float) -> Self
where
Self: Sized;
fn new_radial(x1: Float, y1: Float, x2: Float, y2: Float, r: Float) -> Self
where
Self: Sized;
fn add_color_stop(&mut self, offset: Float, color: Color) -> bool;
}
pub struct Gradient<T: GradientBackend> {
pub(crate) backend: T,
}
impl<T: GradientBackend> Gradient<T> {
pub fn new_linear(x1: Float, y1: Float, x2: Float, y2: Float) -> Self {
Self {
backend: T::new_linear(x1, y1, x2, y2),
}
}
pub fn new_radial(x1: Float, y1: Float, x2: Float, y2: Float, r: Float) -> Self {
Self {
backend: T::new_radial(x1, y1, x2, y2, r),
}
}
pub fn add_color_stop(&mut self, offset: Float, color: Color) -> bool {
self.backend.add_color_stop(offset, color)
}
}
impl Gradient<DefaultGradient> {
pub fn default_new_linear(x1: Float, y1: Float, x2: Float, y2: Float) -> Self {
Self::new_linear(x1, y1, x2, y2)
}
pub fn default_new_radial(x1: Float, y1: Float, x2: Float, y2: Float, r: Float) -> Self {
Self::new_radial(x1, y1, x2, y2, r)
}
}