Skip to main content

PathBuilder

Struct PathBuilder 

Source
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: PathStyle

Implementations§

Source§

impl PathBuilder

Source

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.)));
Source

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.

Source

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());
Source

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.));
Source

pub fn move_to(&mut self, to: Point<Pixels>)

Starts a new sub-path at to. The current point becomes to.

Source

pub fn line_to(&mut self, to: Point<Pixels>)

Adds a straight line from the current point to to.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

pub fn close(&mut self)

Closes the current sub-path with a line back to its start.

Source

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.

Source

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.)));
Source

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.));
Source

pub fn rotate(&mut self, angle: f32)

Rotates the path by angle degrees around the origin when it is built.

Source

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);
Source

pub fn build_path(buf: VertexBuffers<Point, u16>) -> Path<Pixels>

Converts triangles from a lyon VertexBuffers into a Path. Each run of three indices is one triangle. An empty buffer gives an empty path at the origin.

§Panics

Panics if an index is out of range for the buffer’s vertices.

Trait Implementations§

Source§

impl Default for PathBuilder

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl From<NoAttributes<BuilderImpl>> for PathBuilder

Source§

fn from(builder: Builder) -> Self

Converts to this type from the input type.
Source§

impl From<WithSvg<BuilderImpl>> for PathBuilder

Source§

fn from(raw: WithSvg<BuilderImpl>) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where 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) -> D
where M: TransformMatrix<T>,

👎Deprecated since 0.7.7:

replaced by palette::chromatic_adaptation::AdaptIntoUnclamped

Convert the source color to the destination color using the specified method.
Source§

fn adapt_into(self) -> D

👎Deprecated since 0.7.7:

replaced by palette::chromatic_adaptation::AdaptIntoUnclamped

Convert the source color to the destination color using the bradford method by default.
Source§

impl<T, C> AdaptIntoUnclamped<T> for C
where T: AdaptFromUnclamped<C>,

Source§

type Scalar = <T as AdaptFromUnclamped<C>>::Scalar

The number type that’s used as the color’s components.
Source§

fn adapt_into_unclamped_with<M>(self) -> T

Adapt a color of type Self into a color of type T, using the custom matrix M. Read more
Source§

fn adapt_into_unclamped(self) -> T
where Bradford: LmsToXyz<Self::Scalar> + XyzToLms<Self::Scalar>,

Adapt a color of type Self into a color of type T, using the Bradford matrix. Read more
Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T, C> ArraysFrom<C> for T
where C: IntoArrays<T>,

Source§

fn arrays_from(colors: C) -> T

Cast a collection of colors into a collection of arrays.
Source§

impl<T, C> ArraysInto<C> for T
where C: FromArrays<T>,

Source§

fn arrays_into(self) -> C

Cast this collection of arrays into a collection of colors.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for U
where T: FromCam16Unclamped<WpParam, U>,

Source§

type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
Source§

fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T

Converts self into C, using the provided parameters.
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T, C> ComponentsFrom<C> for T
where C: IntoComponents<T>,

Source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
Source§

impl<T, C> ComponentsInto<C> for T

Source§

fn components_into(self) -> C

Cast this collection of color components into a collection of colors. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromAngle<T> for T

Source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
Source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

Source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, rounding and clamping.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> IntoAngle<U> for T
where U: FromAngle<T>,

Source§

fn into_angle(self) -> U

Performs a conversion into T.
Source§

impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for U
where T: Cam16FromUnclamped<WpParam, U>,

Source§

type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
Source§

fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T

Converts self into C, using the provided parameters.
Source§

impl<T, U> IntoColor<U> for T
where U: FromColor<T>,

Source§

fn into_color(self) -> U

Convert into T with values clamped to the color defined bounds Read more
Source§

impl<T, U> IntoColorUnclamped<U> for T
where U: FromColorUnclamped<T>,

Source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> IntoStimulus<T> for T

Source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, rounding and clamping.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<R, P> ReadPrimitive<R> for P
where R: Read + ReadEndian<P>, P: Default,

Source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
Source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
Source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
Source§

impl<T, C> TryComponentsInto<C> for T
where C: TryFromComponents<T>,

Source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
Source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of colors. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T, U> TryIntoColor<U> for T
where U: TryFromColor<T>,

Source§

fn try_into_color(self) -> Result<U, OutOfBounds<U>>

Convert into T, returning ok if the color is inside of its defined range, otherwise an OutOfBounds error is returned which contains the unclamped color. Read more
Source§

impl<C, U> UintsFrom<C> for U
where C: IntoUints<U>,

Source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
Source§

impl<C, U> UintsInto<C> for U
where C: FromUints<U>,

Source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more