public LineTo(char command, ShapeUtil.StringSplitter value) : base(command) { if (char.ToLower(command) == 'h') { PositionType = eType.Horizontal; double v = value.ReadNextValue(); Points = new Point[] { new Point(v, 0) }; return; } if (char.ToLower(command) == 'v') { PositionType = eType.Vertical; double v = value.ReadNextValue(); Points = new Point[] { new Point(0, v) }; return; } PositionType = eType.Point; List <Point> list = new List <Point>(); while (value.More) { Point p = value.ReadNextPoint(); list.Add(p); } Points = list.ToArray(); }
public static Transform ParseTransform(string value) { string type = ExtractUntil(value, '('); string v1 = ExtractBetween(value, '(', ')'); ShapeUtil.StringSplitter split = new ShapeUtil.StringSplitter(v1); List <double> values = new List <double>(); while (split.More) { values.Add(split.ReadNextValue()); } if (type == SVGTags.sTranslate) { return(new TranslateTransform(values[0], values[1])); } if (type == SVGTags.sMatrix) { return(Transform.Parse(v1)); } if (type == SVGTags.sScale) { return(new ScaleTransform(values[0], values[1])); } if (type == SVGTags.sRotate) { return(new RotateTransform(values[0], values[1], values[2])); } return(null); }
public PolylineShape(SVG svg, XmlNode node) : base(svg, node) { string points = XmlUtil.AttrValue(node, SVGTags.sPoints, string.Empty); ShapeUtil.StringSplitter split = new ShapeUtil.StringSplitter(points); List <Point> list = new List <Point>(); while (split.More) { list.Add(split.ReadNextPoint()); } Points = list.ToArray(); }
public EllipticalArcTo(char command, ShapeUtil.StringSplitter value) : base(command) { RX = value.ReadNextValue(); RY = value.ReadNextValue(); AxisRotation = value.ReadNextValue(); double arcflag = value.ReadNextValue(); LargeArc = (arcflag > 0); double sweepflag = value.ReadNextValue(); Clockwise = (sweepflag > 0); X = value.ReadNextValue(); Y = value.ReadNextValue(); }
public PolygonShape(SVG svg, XmlNode node) : base(svg, node) { if (DefaultFill == null) { DefaultFill = new Fill(svg); DefaultFill.Color = svg.PaintServers.Parse("black"); } string points = XmlUtil.AttrValue(node, SVGTags.sPoints, string.Empty); ShapeUtil.StringSplitter split = new ShapeUtil.StringSplitter(points); List <Point> list = new List <Point>(); while (split.More) { list.Add(split.ReadNextPoint()); } Points = list.ToArray(); }
public MoveTo(char command, ShapeUtil.StringSplitter value) : base(command) { Point = value.ReadNextPoint(); }
// 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); 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)); } }
public CurveTo(char command, ShapeUtil.StringSplitter value, Point ctrlPoint1) : base(command) { CtrlPoint1 = ctrlPoint1; CtrlPoint2 = value.ReadNextPoint(); Point = value.ReadNextPoint(); }
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; } }