use crate::color::Color;
use crate::geometry::Point;
mod blend;
mod gradient;
mod pattern;
pub use blend::BlendMode;
pub use gradient::{ConicGradient, GradientStop, LinearGradient, RadialGradient, SpreadMode};
pub use pattern::{FilterQuality, Pattern};
pub(crate) use blend::blend;
#[derive(Clone, Debug)]
pub enum Shader {
SolidColor(Color),
Linear(LinearGradient),
Radial(RadialGradient),
Conic(ConicGradient),
Pattern(Pattern),
}
impl Shader {
pub fn color_at(&self, x: f32, y: f32) -> Color {
match self {
Shader::SolidColor(c) => *c,
Shader::Linear(g) => g.color_at(Point::new(x, y)),
Shader::Radial(g) => g.color_at(Point::new(x, y)),
Shader::Conic(g) => g.color_at(Point::new(x, y)),
Shader::Pattern(p) => p.color_at(Point::new(x, y)),
}
}
pub(crate) fn shade_span(&self, x: usize, y: usize, len: usize, out: &mut Vec<Color>) {
match self {
Shader::SolidColor(c) => out.extend(std::iter::repeat_n(*c, len)),
Shader::Linear(g) => g.shade_span(x, y, len, out),
Shader::Radial(g) => g.shade_span(x, y, len, out),
Shader::Conic(g) => g.shade_span(x, y, len, out),
Shader::Pattern(p) => p.shade_span(x, y, len, out),
}
}
}
#[derive(Clone, Debug)]
pub struct Paint {
pub shader: Shader,
pub blend_mode: BlendMode,
pub anti_alias: bool,
pub opacity: f32,
}
impl Default for Paint {
fn default() -> Self {
Paint {
shader: Shader::SolidColor(Color::BLACK),
blend_mode: BlendMode::SourceOver,
anti_alias: true,
opacity: 1.0,
}
}
}
impl Paint {
pub fn from_color(color: Color) -> Self {
Paint { shader: Shader::SolidColor(color), ..Paint::default() }
}
pub fn set_color(&mut self, color: Color) -> &mut Self {
self.shader = Shader::SolidColor(color);
self
}
pub fn set_shader(&mut self, shader: Shader) -> &mut Self {
self.shader = shader;
self
}
}