Crate svg_path_ops
source ·Expand description
This crate includes utility functions to work with svg paths. Works on types from svgtypes crate.
This package exposes functions to manipulate svg paths with simplification purposes.
📦 Cargo.toml
[dependencies]
svg_path_ops = "0.1"
🔧 Example
use svgtypes::{PathParser, PathSegment};
use svg_path_ops::absolutize;
let path: String = "m 0 0 c 3 -0.6667 6 -1.3333 9 -2 a 1 1 0 0 0 -8 -1 a 1 1 0 0 0 -2 0 l 0 4 v 2 h 8 q 4 -10 9 -5 t -6 8 z".into();
let path_parser = PathParser::from(path.as_ref());
let path_segments: Vec<PathSegment> = path_parser.flatten().collect();
let mut absolute = absolutize(path_segments.iter());
assert_eq!(
absolute.next().unwrap(),
PathSegment::MoveTo { abs: true, x: 0.0, y: 0.0 }
);
assert_eq!(
absolute.next().unwrap(),
PathSegment::CurveTo {
abs: true,
x1: 3.0,
y1: -0.6667,
x2: 6.0,
y2: -1.3333,
x: 9.0,
y: -2.0
}
);
assert_eq!(
absolute.next().unwrap(),
PathSegment::EllipticalArc {
abs: true,
rx: 1.0,
ry: 1.0,
x_axis_rotation: 0.0,
large_arc: false,
sweep: false,
x: 1.0,
y: -3.0
}
);
assert_eq!(
absolute.next().unwrap(),
PathSegment::EllipticalArc {
abs: true,
rx: 1.0,
ry: 1.0,
x_axis_rotation: 0.0,
large_arc: false,
sweep: false,
x: -1.0,
y: -3.0
}
);
assert_eq!(
absolute.next().unwrap(),
PathSegment::LineTo { abs: true, x: -1.0, y: 1.0 }
);
assert_eq!(
absolute.next().unwrap(),
PathSegment::VerticalLineTo { abs: true, y: 3.0 }
);
assert_eq!(
absolute.next().unwrap(),
PathSegment::HorizontalLineTo { abs: true, x: 7.0 }
);
assert_eq!(
absolute.next().unwrap(),
PathSegment::Quadratic { abs: true, x1: 11.0, y1: -7.0, x: 16.0, y: -2.0 }
);
assert_eq!(
absolute.next().unwrap(),
PathSegment::SmoothQuadratic { abs: true, x: 10.0, y: 6.0 }
);
assert_eq!(
absolute.next().unwrap(),
PathSegment::ClosePath { abs: true }
);
Enums
Representation of the path segment.
Functions
Translates relative commands to absolute commands. All commands that use relative positions (lower-case ones),
turns into absolute position commands (upper-case ones).
Normalize takes a list of absolute segments and outputs a list of segments with only four commands: M, L, C, Z. So every segment is described as move, line, or a bezier curve (cubic).
This is useful when translating SVG paths to non SVG mediums - Canvas, or some other graphics platform. Most such platforms will support lines and bezier curves.
It also simplifies the cases to consider when modifying these segments.