use crate::{Angle, Color, OnLinePos, OnPlanePos, Point, RelativeDir};
#[derive(Copy, Clone, Debug, Default, PartialEq)]
pub struct GradientStop {
pub pos: Option<OnLinePos>,
pub color: Color,
}
impl GradientStop {
pub fn new(pos: Option<OnLinePos>, color: Color) -> GradientStop {
GradientStop { pos, color }
}
}
impl From<(OnLinePos, Color)> for GradientStop {
fn from(d: (OnLinePos, Color)) -> Self {
Self {
pos: Some(d.0),
color: d.1,
}
}
}
impl From<(f64, Color)> for GradientStop {
fn from(d: (f64, Color)) -> Self {
Self {
pos: Some(OnLinePos::from_unit_percent(d.0)),
color: d.1,
}
}
}
impl From<Color> for GradientStop {
fn from(color: Color) -> Self {
Self { pos: None, color }
}
}
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum LinearGradientCoords {
Ends { start: Point, end: Point },
Angle {
angle: Angle,
displacement: OnPlanePos,
},
Direction {
direction: RelativeDir,
displacement: OnPlanePos,
},
}
impl LinearGradientCoords {
pub fn from_ends(start: impl Into<Point>, end: impl Into<Point>) -> LinearGradientCoords {
LinearGradientCoords::Ends {
start: start.into(),
end: end.into(),
}
}
pub fn from_angle(angle: Angle) -> LinearGradientCoords {
LinearGradientCoords::Angle {
angle,
displacement: OnPlanePos::default(),
}
}
pub fn with_displacement(&mut self, displacement: impl Into<OnPlanePos>) -> Self {
if let LinearGradientCoords::Angle {
angle: _,
displacement: disp,
} = self
{
*disp = displacement.into();
}
*self
}
}
impl Default for LinearGradientCoords {
fn default() -> LinearGradientCoords {
LinearGradientCoords::Direction {
direction: RelativeDir::Top,
displacement: OnPlanePos::default(),
}
}
}
#[derive(Clone, PartialEq, Debug)]
pub struct Gradient {
pub kind: GradientKind,
pub stops: Vec<GradientStop>,
pub repeat: bool,
}
impl Default for Gradient {
fn default() -> Self {
Self {
kind: GradientKind::Linear(LinearGradientCoords::default()),
stops: vec![
GradientStop {
pos: None,
color: Color::rgb(0, 0, 0),
},
GradientStop {
pos: None,
color: Color::rgb(255, 255, 255),
},
],
repeat: false,
}
}
}
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum GradientKind {
Linear(LinearGradientCoords),
}
impl Default for GradientKind {
fn default() -> GradientKind {
GradientKind::Linear(LinearGradientCoords::default())
}
}