using Svg.ExtensionMethods; using System; namespace Svg { /// /// Represents a path based element that can have markers. /// public abstract class SvgMarkerElement : SvgPathBasedElement { /// /// Gets or sets the marker (end cap) of the path. /// [SvgAttribute("marker-end", true)] public Uri MarkerEnd { get { return this.Attributes.GetAttribute("marker-end").ReplaceWithNullIfNone(); } set { this.Attributes["marker-end"] = value; } } /// /// Gets or sets the marker (mid points) of the path. /// [SvgAttribute("marker-mid", true)] public Uri MarkerMid { get { return this.Attributes.GetAttribute("marker-mid").ReplaceWithNullIfNone(); } set { this.Attributes["marker-mid"] = value; } } /// /// Gets or sets the marker (start cap) of the path. /// [SvgAttribute("marker-start", true)] public Uri MarkerStart { get { return this.Attributes.GetAttribute("marker-start").ReplaceWithNullIfNone(); } set { this.Attributes["marker-start"] = value; } } /// /// Renders the stroke of the element to the specified . /// Includes rendering of all markers defined in attributes. /// /// The object to render to. protected internal override bool RenderStroke(ISvgRenderer renderer) { var result = base.RenderStroke(renderer); var path = this.Path(renderer); var pathLength = path.PathPoints.Length; if (this.MarkerStart != null) { var refPoint1 = path.PathPoints[0]; var index = 1; while (index < pathLength && path.PathPoints[index] == refPoint1) { ++index; } var refPoint2 = path.PathPoints[index]; SvgMarker marker = this.OwnerDocument.GetElementById(this.MarkerStart.ToString()); marker.RenderMarker(renderer, this, refPoint1, refPoint1, refPoint2); } 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) { var index = pathLength - 1; var refPoint1 = path.PathPoints[index]; --index; while (index > 0 && path.PathPoints[index] == refPoint1) { --index; } var refPoint2 = path.PathPoints[index]; SvgMarker marker = this.OwnerDocument.GetElementById(this.MarkerEnd.ToString()); marker.RenderMarker(renderer, this, refPoint1, refPoint2, path.PathPoints[path.PathPoints.Length - 1]); } return result; } } }