1 use super::Parameters; 2 use super::Position; 3 4 /// A command of a data attribute. 5 #[derive(Clone, Debug)] 6 pub enum Command { 7 /// [Establish][1] a new current point. 8 /// 9 /// [1]: https://www.w3.org/TR/SVG/paths.html#PathDataMovetoCommands 10 Move(Position, Parameters), 11 12 /// [Draw][1] straight lines. 13 /// 14 /// [1]: https://www.w3.org/TR/SVG/paths.html#PathDataLinetoCommands 15 Line(Position, Parameters), 16 17 /// [Draw][1] horizontal lines. 18 /// 19 /// [1]: https://www.w3.org/TR/SVG/paths.html#PathDataLinetoCommands 20 HorizontalLine(Position, Parameters), 21 22 /// [Draw][1] vertical lines. 23 /// 24 /// [1]: https://www.w3.org/TR/SVG/paths.html#PathDataLinetoCommands 25 VerticalLine(Position, Parameters), 26 27 /// [Draw][1] a quadratic Bézier curve. 28 /// 29 /// [1]: https://www.w3.org/TR/SVG/paths.html#PathDataQuadraticBezierCommands 30 QuadraticCurve(Position, Parameters), 31 32 /// [Draw][1] a quadratic Bézier curve assuming the control point to be the 33 /// reflection of the control point on the previous command relative to the 34 /// current point. 35 /// 36 /// [1]: https://www.w3.org/TR/SVG/paths.html#PathDataQuadraticBezierCommands 37 SmoothQuadraticCurve(Position, Parameters), 38 39 /// [Draw][1] a cubic Bézier curve. 40 /// 41 /// [1]: https://www.w3.org/TR/SVG/paths.html#PathDataCubicBezierCommands 42 CubicCurve(Position, Parameters), 43 44 /// [Draw][1] a cubic Bézier curve assuming the first control point to be 45 /// the reflection of the second control point on the previous command 46 /// relative to the current point. 47 /// 48 /// [1]: https://www.w3.org/TR/SVG/paths.html#PathDataCubicBezierCommands 49 SmoothCubicCurve(Position, Parameters), 50 51 /// [Draw][1] an elliptical arc. 52 /// 53 /// [1]: https://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands 54 EllipticalArc(Position, Parameters), 55 56 /// [End][1] the current subpath. 57 /// 58 /// [1]: https://www.w3.org/TR/SVG/paths.html#PathDataClosePathCommand 59 Close, 60 } 61 62 macro_rules! implement { 63 ($($command:ident($position:ident) => $letter:expr,)*) => ( 64 impl From<Command> for String { 65 fn from(command: Command) -> Self { 66 use self::Command::*; 67 use super::Position::*; 68 match command { 69 $($command($position, parameters) => { 70 format!(concat!($letter, "{}"), String::from(parameters)) 71 })* 72 Close => String::from("z"), 73 } 74 } 75 } 76 ); 77 } 78 79 implement! { 80 Move(Absolute) => "M", 81 Move(Relative) => "m", 82 Line(Absolute) => "L", 83 Line(Relative) => "l", 84 HorizontalLine(Absolute) => "H", 85 HorizontalLine(Relative) => "h", 86 VerticalLine(Absolute) => "V", 87 VerticalLine(Relative) => "v", 88 QuadraticCurve(Absolute) => "Q", 89 QuadraticCurve(Relative) => "q", 90 SmoothQuadraticCurve(Absolute) => "T", 91 SmoothQuadraticCurve(Relative) => "t", 92 CubicCurve(Absolute) => "C", 93 CubicCurve(Relative) => "c", 94 SmoothCubicCurve(Absolute) => "S", 95 SmoothCubicCurve(Relative) => "s", 96 EllipticalArc(Absolute) => "A", 97 EllipticalArc(Relative) => "a", 98 } 99