Make the gradient construction methods more convenient

This commit is contained in:
Patrick Walton 2020-03-30 21:32:55 -07:00
parent 6d6b5191bb
commit f1d7a0bfa3
1 changed files with 33 additions and 3 deletions

View File

@ -12,6 +12,7 @@ use crate::sorted_vector::SortedVector;
use crate::util; use crate::util;
use pathfinder_color::ColorU; use pathfinder_color::ColorU;
use pathfinder_geometry::line_segment::LineSegment2F; use pathfinder_geometry::line_segment::LineSegment2F;
use pathfinder_geometry::vector::Vector2F;
use pathfinder_geometry::util as geometry_util; use pathfinder_geometry::util as geometry_util;
use pathfinder_simd::default::F32x2; use pathfinder_simd::default::F32x2;
use std::cmp::{Ordering, PartialOrd}; use std::cmp::{Ordering, PartialOrd};
@ -74,15 +75,26 @@ impl Gradient {
} }
#[inline] #[inline]
pub fn radial(line: LineSegment2F, radii: F32x2) -> Gradient { pub fn linear_from_points(from: Vector2F, to: Vector2F) -> Gradient {
Gradient { line, radii: Some(radii), stops: SortedVector::new() } Gradient::linear(LineSegment2F::new(from, to))
} }
#[inline] #[inline]
pub fn add_color_stop(&mut self, stop: ColorStop) { pub fn radial<L>(line: L, radii: F32x2) -> Gradient where L: RadialGradientLine {
Gradient { line: line.to_line(), radii: Some(radii), stops: SortedVector::new() }
}
#[inline]
pub fn add(&mut self, stop: ColorStop) {
self.stops.push(stop); self.stops.push(stop);
} }
/// A convenience method to add a color stop.
#[inline]
pub fn add_color_stop(&mut self, color: ColorU, offset: f32) {
self.add(ColorStop::new(color, offset))
}
#[inline] #[inline]
pub fn line(&self) -> LineSegment2F { pub fn line(&self) -> LineSegment2F {
self.line self.line
@ -141,3 +153,21 @@ impl ColorStop {
ColorStop { color, offset } ColorStop { color, offset }
} }
} }
pub trait RadialGradientLine {
fn to_line(self) -> LineSegment2F;
}
impl RadialGradientLine for LineSegment2F {
#[inline]
fn to_line(self) -> LineSegment2F {
self
}
}
impl RadialGradientLine for Vector2F {
#[inline]
fn to_line(self) -> LineSegment2F {
LineSegment2F::new(self, self)
}
}