using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; namespace Svg { /// /// Represents and SVG line element. /// [SvgElement("line")] public class SvgLine : SvgVisualElement { private SvgUnit _startX; private SvgUnit _startY; private SvgUnit _endX; private SvgUnit _endY; private GraphicsPath _path; [SvgAttribute("x1")] public SvgUnit StartX { get { return this._startX; } set { if(_startX != value) { this._startX = value; this.IsPathDirty = true; OnAttributeChanged(new AttributeEventArgs{ Attribute = "x1", Value = value }); } } } [SvgAttribute("y1")] public SvgUnit StartY { get { return this._startY; } set { if(_startY != value) { this._startY = value; this.IsPathDirty = true; OnAttributeChanged(new AttributeEventArgs{ Attribute = "y1", Value = value }); } } } [SvgAttribute("x2")] public SvgUnit EndX { get { return this._endX; } set { if(_endX != value) { this._endX = value; this.IsPathDirty = true; OnAttributeChanged(new AttributeEventArgs{ Attribute = "x2", Value = value }); } } } [SvgAttribute("y2")] public SvgUnit EndY { get { return this._endY; } set { if(_endY != value) { this._endY = value; this.IsPathDirty = true; OnAttributeChanged(new AttributeEventArgs{ Attribute = "y2", Value = value }); } } } /// /// Gets or sets the marker (end cap) of the path. /// [SvgAttribute("marker-end")] public Uri MarkerEnd { get { return this.Attributes.GetAttribute("marker-end"); } set { this.Attributes["marker-end"] = value; } } /// /// Gets or sets the marker (start cap) of the path. /// [SvgAttribute("marker-mid")] public Uri MarkerMid { get { return this.Attributes.GetAttribute("marker-mid"); } set { this.Attributes["marker-mid"] = value; } } /// /// Gets or sets the marker (start cap) of the path. /// [SvgAttribute("marker-start")] public Uri MarkerStart { get { return this.Attributes.GetAttribute("marker-start"); } set { this.Attributes["marker-start"] = value; } } public override SvgPaintServer Fill { get { return null; /* Line can't have a fill */ } set { // Do nothing } } public SvgLine() { } public override System.Drawing.Drawing2D.GraphicsPath Path(ISvgRenderer renderer) { if (this._path == null || this.IsPathDirty) { PointF start = new PointF(this.StartX.ToDeviceValue(renderer, UnitRenderingType.Horizontal, this), this.StartY.ToDeviceValue(renderer, UnitRenderingType.Vertical, this)); PointF end = new PointF(this.EndX.ToDeviceValue(renderer, UnitRenderingType.Horizontal, this), this.EndY.ToDeviceValue(renderer, UnitRenderingType.Vertical, this)); this._path = new GraphicsPath(); this._path.AddLine(start, end); this.IsPathDirty = false; } return this._path; } /// /// Renders the stroke of the to the specified /// /// The object to render to. protected internal override bool RenderStroke(ISvgRenderer renderer) { var result = base.RenderStroke(renderer); var path = this.Path(renderer); if (this.MarkerStart != null) { SvgMarker marker = this.OwnerDocument.GetElementById(this.MarkerStart.ToString()); marker.RenderMarker(renderer, this, path.PathPoints[0], path.PathPoints[0], path.PathPoints[1]); } if (this.MarkerMid != null) { SvgMarker marker = this.OwnerDocument.GetElementById(this.MarkerMid.ToString()); for (int i = 1; i <= path.PathPoints.Length - 2; i++) marker.RenderMarker(renderer, this, path.PathPoints[i], path.PathPoints[i - 1], path.PathPoints[i], path.PathPoints[i + 1]); } if (this.MarkerEnd != null) { SvgMarker marker = this.OwnerDocument.GetElementById(this.MarkerEnd.ToString()); marker.RenderMarker(renderer, this, path.PathPoints[path.PathPoints.Length - 1], path.PathPoints[path.PathPoints.Length - 2], path.PathPoints[path.PathPoints.Length - 1]); } return result; } public override System.Drawing.RectangleF Bounds { get { return this.Path(null).GetBounds(); } } public override SvgElement DeepCopy() { return DeepCopy(); } public override SvgElement DeepCopy() { var newObj = base.DeepCopy() as SvgLine; newObj.StartX = this.StartX; newObj.EndX = this.EndX; newObj.StartY = this.StartY; newObj.EndY = this.EndY; if (this.Fill != null) newObj.Fill = this.Fill.DeepCopy() as SvgPaintServer; return newObj; } } }