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;
}
}
}