public CircleShape(SVG svg, XmlNode node) : base(svg, node) { CX = XmlUtil.AttrValue(node, "cx", 0); CY = XmlUtil.AttrValue(node, "cy", 0); R = XmlUtil.AttrValue(node, "r", 0); }
// 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"); } ClosePath = false; string path = XmlUtil.AttrValue(node, "d", string.Empty); //path = path.Replace(" ", ""); CommandSplitter cmd = new CommandSplitter(path); string commandstring; char command; List <PathElement> elements = 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 == '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') { 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)); } }
protected virtual void Parse(SVG svg, string name, string value) { if (name == SVGTags.sTransform) { Transform = ShapeUtil.ParseTransform(value.ToLower()); return; } if (name == SVGTags.sStroke) { GetStroke(svg).Color = svg.PaintServers.Parse(value); return; } if (name == SVGTags.sStrokeWidth) { GetStroke(svg).Width = XmlUtil.ParseDouble(svg, value); return; } if (name == SVGTags.sStrokeOpacity) { GetStroke(svg).Opacity = XmlUtil.ParseDouble(svg, value) * 100; return; } if (name == SVGTags.sStrokeDashArray) { if (value == "none") { GetStroke(svg).StrokeArray = null; return; } ShapeUtil.StringSplitter sp = new ShapeUtil.StringSplitter(value); List <double> a = new List <double>(); while (sp.More) { a.Add(sp.ReadNextValue()); } GetStroke(svg).StrokeArray = a.ToArray(); return; } if (name == SVGTags.sStrokeLinecap) { GetStroke(svg).LineCap = (ClipArtViewer.Stroke.eLineCap)Enum.Parse(typeof(ClipArtViewer.Stroke.eLineCap), value); return; } if (name == SVGTags.sStrokeLinejoin) { GetStroke(svg).LineJoin = (ClipArtViewer.Stroke.eLineJoin)Enum.Parse(typeof(ClipArtViewer.Stroke.eLineJoin), value); return; } if (name == SVGTags.sFill) { GetFill(svg).Color = svg.PaintServers.Parse(value); return; } if (name == SVGTags.sFillOpacity) { GetFill(svg).Opacity = XmlUtil.ParseDouble(svg, value) * 100; return; } if (name == SVGTags.sFillRule) { GetFill(svg).FillRule = (Fill.eFillRule)Enum.Parse(typeof(Fill.eFillRule), value); return; } if (name == SVGTags.sStyle) { foreach (ShapeUtil.Attribute item in XmlUtil.SplitStyle(svg, value)) { Parse(svg, item); } } //********************** text ******************* if (name == SVGTags.sFontFamily) { GetTextStyle(svg).FontFamily = value; return; } if (name == SVGTags.sFontSize) { GetTextStyle(svg).FontSize = XmlUtil.AttrValue(new ShapeUtil.Attribute(name, value)); return; } if (name == SVGTags.sFontWeight) { GetTextStyle(svg).Fontweight = (FontWeight) new FontWeightConverter().ConvertFromString(value); return; } if (name == SVGTags.sFontStyle) { GetTextStyle(svg).Fontstyle = (FontStyle) new FontStyleConverter().ConvertFromString(value); return; } if (name == SVGTags.sTextDecoration) { TextDecoration t = new TextDecoration(); if (value == "none") { return; } if (value == "underline") { t.Location = TextDecorationLocation.Underline; } if (value == "overline") { t.Location = TextDecorationLocation.OverLine; } if (value == "line-through") { t.Location = TextDecorationLocation.Strikethrough; } TextDecorationCollection tt = new TextDecorationCollection(); tt.Add(t); GetTextStyle(svg).TextDecoration = tt; return; } if (name == SVGTags.sTextAnchor) { if (value == "start") { GetTextStyle(svg).TextAlignment = TextAlignment.Left; } if (value == "middle") { GetTextStyle(svg).TextAlignment = TextAlignment.Center; } if (value == "end") { GetTextStyle(svg).TextAlignment = TextAlignment.Right; } return; } if (name == "word-spacing") { GetTextStyle(svg).WordSpacing = XmlUtil.AttrValue(new ShapeUtil.Attribute(name, value)); return; } if (name == "letter-spacing") { GetTextStyle(svg).LetterSpacing = XmlUtil.AttrValue(new ShapeUtil.Attribute(name, value)); return; } if (name == "baseline-shift") { //GetTextStyle(svg).BaseLineShift = XmlUtil.AttrValue(new ShapeUtil.Attribute(name, value)); GetTextStyle(svg).BaseLineShift = value; return; } }