// http://apike.ca/prog_svg_paths.html public PathShape(SVG svg, XmlNode node) : base(svg, node) { if (DefaultFill == null) { DefaultFill = new Fill(svg); DefaultFill.Color = svg.PaintServers.Parse("black"); } this.ClosePath = false; string path = XmlUtil.AttrValue(node, "d", string.Empty); CommandSplitter cmd = new CommandSplitter(path); string commandstring; char command; List <PathElement> elements = this.m_elements; while (true) { commandstring = cmd.ReadNext(); if (commandstring.Length == 0) { break; } ShapeUtil.StringSplitter split = cmd.SplitCommand(commandstring, out command); if (command == 'm' || command == 'M') { elements.Add(new MoveTo(command, split)); if (split.More) { elements.Add(new LineTo(command, split)); } continue; } if (command == 'l' || command == 'L' || command == 'H' || command == 'h' || command == 'V' || command == 'v') { elements.Add(new LineTo(command, split)); continue; } if (command == 'c' || command == 'C') { while (split.More) { elements.Add(new CurveTo(command, split)); } continue; } if (command == 'q' || command == 'Q') { while (split.More) { elements.Add(new QuadraticCurveTo(command, split)); } continue; } if (command == 's' || command == 'S') { while (split.More) { CurveTo lastshape = elements[elements.Count - 1] as CurveTo; System.Diagnostics.Debug.Assert(lastshape != null); elements.Add(new CurveTo(command, split, lastshape.CtrlPoint2)); } continue; } if (command == 'a' || command == 'A') { elements.Add(new EllipticalArcTo(command, split)); while (split.More) { elements.Add(new EllipticalArcTo(command, split)); } continue; } if (command == 'z' || command == 'Z') { this.ClosePath = true; continue; } // extended format moveto or lineto can contain multiple points which should be translated into lineto PathElement lastitem = elements[elements.Count - 1]; if (lastitem is MoveTo || lastitem is LineTo || lastitem is CurveTo) { //Point p = Point.Parse(s); //elements.Add(new LineTo(p)); continue; } System.Diagnostics.Debug.Assert(false, string.Format("type '{0}' not supported", commandstring)); } }