pub struct PathBuilder {
pub style: PathStyle,
/* private fields */
}Expand description
Builds a Path from lines and curves, and tessellates it into triangles.
Create a builder with crate::PathBuilder::fill or crate::PathBuilder::stroke, add commands, and call
crate::PathBuilder::build. Paint the result with crate::Window::paint_path. Coordinates are in window
pixels, so use the bounds that a canvas gives you.
§Examples
let mut builder = PathBuilder::fill();
builder.move_to(point(px(0.), px(0.)));
builder.line_to(point(px(10.), px(0.)));
builder.line_to(point(px(0.), px(10.)));
builder.close();
let path = builder.build().unwrap();
assert_eq!(path.vertices.len() % 3, 0);
assert_eq!(path.bounds.size.width, px(10.));
assert_eq!(path.bounds.size.height, px(10.));See drawing custom graphics for more.
Fields§
§style: PathStyleHow crate::PathBuilder::build tessellates the path. crate::PathBuilder::stroke,
crate::PathBuilder::fill and crate::PathBuilder::with_style set it.
Implementations§
Source§impl PathBuilder
impl PathBuilder
Sourcepub fn stroke(width: Pixels) -> Self
pub fn stroke(width: Pixels) -> Self
Returns a builder that strokes the path with a line width logical pixels wide.
The stroke has butt caps and miter joins, with a miter limit of 4. Use crate::PathBuilder::fill for a
filled shape.
§Examples
let mut builder = PathBuilder::stroke(px(2.));
builder.move_to(point(px(0.), px(5.)));
builder.line_to(point(px(20.), px(5.)));
let path = builder.build().unwrap();
assert_eq!(path.bounds.origin, point(px(0.), px(4.)));
assert_eq!(path.bounds.size, size(px(20.), px(2.)));Sourcepub fn fill() -> Self
pub fn fill() -> Self
Returns a builder that fills the interior of the path using the even-odd rule.
An open sub-path is closed implicitly when it is filled. For the non-zero rule, pass a style to
crate::PathBuilder::with_style.
Sourcepub fn with_style(self, style: PathStyle) -> Self
pub fn with_style(self, style: PathStyle) -> Self
Replaces the style of this builder.
Use this for options that crate::PathBuilder::stroke and crate::PathBuilder::fill don’t set, such as the
non-zero FillRule.
§Examples
let style = PathStyle::Fill(FillOptions::default().with_fill_rule(FillRule::NonZero));
let mut builder = PathBuilder::fill().with_style(style);
builder.move_to(point(px(0.), px(0.)));
builder.line_to(point(px(10.), px(0.)));
builder.line_to(point(px(0.), px(10.)));
builder.close();
assert!(builder.build().is_ok());Sourcepub fn dash_array(self, dash_array: &[Pixels]) -> Self
pub fn dash_array(self, dash_array: &[Pixels]) -> Self
Sets the dash pattern of a stroked path.
The values alternate between dash and gap lengths, in logical pixels, measured along the path.
An odd number of values is repeated, so [5, 3, 2] is the same as [5, 3, 2, 5, 3, 2]. The
pattern has no effect on fills.
Pass a non-empty slice of finite, positive lengths. crate::PathBuilder::build returns an
error for an empty or invalid pattern, including a length too small to advance along the path.
§Examples
let mut solid = PathBuilder::stroke(px(1.));
solid.move_to(point(px(0.), px(0.)));
solid.line_to(point(px(20.), px(0.)));
let solid = solid.build().unwrap();
let mut dashed = PathBuilder::stroke(px(1.)).dash_array(&[px(4.), px(4.)]);
dashed.move_to(point(px(0.), px(0.)));
dashed.line_to(point(px(20.), px(0.)));
let dashed = dashed.build().unwrap();
assert!(dashed.vertices.len() > solid.vertices.len());
assert_eq!(dashed.bounds.size.width, px(20.));Sourcepub fn move_to(&mut self, to: Point<Pixels>)
pub fn move_to(&mut self, to: Point<Pixels>)
Starts a new sub-path at to. The current point becomes to.
Sourcepub fn line_to(&mut self, to: Point<Pixels>)
pub fn line_to(&mut self, to: Point<Pixels>)
Adds a straight line from the current point to to.
Sourcepub fn curve_to(&mut self, to: Point<Pixels>, ctrl: Point<Pixels>)
pub fn curve_to(&mut self, to: Point<Pixels>, ctrl: Point<Pixels>)
Adds a quadratic Bézier curve from the current point to to, bent toward the control point ctrl.
Sourcepub fn cubic_bezier_to(
&mut self,
to: Point<Pixels>,
control_a: Point<Pixels>,
control_b: Point<Pixels>,
)
pub fn cubic_bezier_to( &mut self, to: Point<Pixels>, control_a: Point<Pixels>, control_b: Point<Pixels>, )
Adds a cubic Bézier curve from the current point to to, shaped by the control points
control_a and control_b.
Sourcepub fn arc_to(
&mut self,
radii: Point<Pixels>,
x_rotation: Pixels,
large_arc: bool,
sweep: bool,
to: Point<Pixels>,
)
pub fn arc_to( &mut self, radii: Point<Pixels>, x_rotation: Pixels, large_arc: bool, sweep: bool, to: Point<Pixels>, )
Adds an elliptical arc from the current point to to, in absolute coordinates.
radii gives the x and y radii in logical pixels. x_rotation is the rotation of the ellipse in
degrees, even though its type is Pixels. large_arc and sweep choose one of the four
possible arcs, as they do in SVG path data.
Sourcepub fn relative_arc_to(
&mut self,
radii: Point<Pixels>,
x_rotation: Pixels,
large_arc: bool,
sweep: bool,
to: Point<Pixels>,
)
pub fn relative_arc_to( &mut self, radii: Point<Pixels>, x_rotation: Pixels, large_arc: bool, sweep: bool, to: Point<Pixels>, )
Adds an elliptical arc like crate::PathBuilder::arc_to, but to is relative to the current point.
x_rotation is in degrees, as it is for arc_to.
Sourcepub fn add_polygon(&mut self, points: &[Point<Pixels>], closed: bool)
pub fn add_polygon(&mut self, points: &[Point<Pixels>], closed: bool)
Adds points as a sub-path. If closed is true, the last point connects back to the first.
Sourcepub fn transform(&mut self, transform: Transform)
pub fn transform(&mut self, transform: Transform)
Replaces the transform that crate::PathBuilder::build applies with transform.
This discards the effect of any crate::PathBuilder::translate, crate::PathBuilder::scale or
crate::PathBuilder::rotate calls made before it.
Sourcepub fn translate(&mut self, to: Point<Pixels>)
pub fn translate(&mut self, to: Point<Pixels>)
Moves the path by to when it is built.
Each transform call applies to the path after the transform calls before it.
§Examples
let mut builder = PathBuilder::fill();
builder.move_to(point(px(0.), px(0.)));
builder.line_to(point(px(10.), px(0.)));
builder.line_to(point(px(0.), px(10.)));
builder.translate(point(px(5.), px(5.)));
let path = builder.build().unwrap();
assert_eq!(path.bounds.origin, point(px(5.), px(5.)));Sourcepub fn scale(&mut self, scale: f32)
pub fn scale(&mut self, scale: f32)
Scales the path by scale on both axes when it is built.
Stroke widths are not scaled, because the geometry is transformed before it is stroked.
§Examples
let mut builder = PathBuilder::fill();
builder.move_to(point(px(0.), px(0.)));
builder.line_to(point(px(10.), px(0.)));
builder.line_to(point(px(0.), px(10.)));
builder.scale(2.);
let path = builder.build().unwrap();
assert_eq!(path.bounds.size.width, px(20.));
assert_eq!(path.bounds.size.height, px(20.));Sourcepub fn rotate(&mut self, angle: f32)
pub fn rotate(&mut self, angle: f32)
Rotates the path by angle degrees around the origin when it is built.
Sourcepub fn build(self) -> Result<Path<Pixels>, Error>
pub fn build(self) -> Result<Path<Pixels>, Error>
Tessellates the path and returns it as a Path.
The transform is applied to the geometry first. A fill uses the FillOptions of its style. A
stroke uses the StrokeOptions of its style and the dash array.
Building is the expensive step. Build a path once, and keep it while its shape doesn’t change, rather than rebuilding it every frame.
§Errors
Returns an error if a point or the tolerance is NaN, if the mesh needs more vertices than a
u16 index can address, or if the dash array is empty, has a length that isn’t finite and
positive, or has a length too small to advance along the path.
§Examples
let mut builder = PathBuilder::fill();
builder.move_to(point(px(0.), px(0.)));
builder.line_to(point(px(10.), px(0.)));
builder.line_to(point(px(0.), px(10.)));
builder.close();
let path = builder.build().unwrap();
assert!(path.vertices.len() >= 3);
assert_eq!(path.vertices.len() % 3, 0);Sourcepub fn build_path(buf: VertexBuffers<Point, u16>) -> Path<Pixels>
pub fn build_path(buf: VertexBuffers<Point, u16>) -> Path<Pixels>
Trait Implementations§
Source§impl Default for PathBuilder
impl Default for PathBuilder
Source§impl From<NoAttributes<BuilderImpl>> for PathBuilder
impl From<NoAttributes<BuilderImpl>> for PathBuilder
Source§impl From<WithSvg<BuilderImpl>> for PathBuilder
impl From<WithSvg<BuilderImpl>> for PathBuilder
Source§fn from(raw: WithSvg<BuilderImpl>) -> Self
fn from(raw: WithSvg<BuilderImpl>) -> Self
Auto Trait Implementations§
impl Freeze for PathBuilder
impl RefUnwindSafe for PathBuilder
impl Send for PathBuilder
impl Sync for PathBuilder
impl Unpin for PathBuilder
impl UnsafeUnpin for PathBuilder
impl UnwindSafe for PathBuilder
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
replaced by palette::chromatic_adaptation::AdaptIntoUnclamped
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
replaced by palette::chromatic_adaptation::AdaptIntoUnclamped
Source§impl<T, C> AdaptIntoUnclamped<T> for Cwhere
T: AdaptFromUnclamped<C>,
impl<T, C> AdaptIntoUnclamped<T> for Cwhere
T: AdaptFromUnclamped<C>,
Source§type Scalar = <T as AdaptFromUnclamped<C>>::Scalar
type Scalar = <T as AdaptFromUnclamped<C>>::Scalar
Source§fn adapt_into_unclamped_with<M>(self) -> Twhere
M: LmsToXyz<<C as AdaptIntoUnclamped<T>>::Scalar> + XyzToLms<<C as AdaptIntoUnclamped<T>>::Scalar>,
fn adapt_into_unclamped_with<M>(self) -> Twhere
M: LmsToXyz<<C as AdaptIntoUnclamped<T>>::Scalar> + XyzToLms<<C as AdaptIntoUnclamped<T>>::Scalar>,
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<T, C> ComponentsInto<C> for T
impl<T, C> ComponentsInto<C> for T
Source§fn components_into(self) -> C
fn components_into(self) -> C
Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other into Self, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self into T, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds error is returned which contains
the unclamped color. Read more