x-graphics 0.2.1

Graphics framework for X
Documentation
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)
    }
}