/// <summary> /// Renders the stroke of the <see cref="SvgVisualElement"/> to the specified <see cref="ISvgRenderer"/> /// </summary> /// <param name="renderer">The <see cref="ISvgRenderer"/> object to render to.</param> 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 <SvgMarker>(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 <SvgMarker>(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 <SvgMarker>(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); }
/// <summary> /// Renders the stroke of the element to the specified <see cref="ISvgRenderer"/>. /// Includes rendering of all markers defined in attributes. /// </summary> /// <param name="renderer">The <see cref="ISvgRenderer"/> object to render to.</param> protected internal override bool RenderStroke(ISvgRenderer renderer) { var result = base.RenderStroke(renderer); var path = this.Path(renderer); var pathLength = path.PointCount; 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 <SvgMarker>(this.MarkerStart.ToString()); marker.RenderMarker(renderer, this, refPoint1, refPoint1, refPoint2, true); } if (this.MarkerMid != null) { SvgMarker marker = this.OwnerDocument.GetElementById <SvgMarker>(this.MarkerMid.ToString()); int bezierIndex = -1; for (int i = 1; i <= path.PathPoints.Length - 2; i++) { // for Bezier curves, the marker shall only been shown at the last point if ((path.PathTypes[i] & 7) == 3) { bezierIndex = (bezierIndex + 1) % 3; } else { bezierIndex = -1; } if (bezierIndex == -1 || bezierIndex == 2) { 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 <SvgMarker>(this.MarkerEnd.ToString()); marker.RenderMarker(renderer, this, refPoint1, refPoint2, path.PathPoints[path.PathPoints.Length - 1], false); } return(result); }
/// <summary> /// Renders the stroke of the <see cref="SvgVisualElement"/> to the specified <see cref="SvgRenderer"/> /// </summary> /// <param name="renderer">The <see cref="SvgRenderer"/> object to render to.</param> protected internal override void RenderStroke(SvgRenderer renderer) { if (this.Stroke != null) { float strokeWidth = this.StrokeWidth.ToDeviceValue(renderer, UnitRenderingType.Other, this); using (Pen pen = new Pen(this.Stroke.GetBrush(this, renderer, this.StrokeOpacity), strokeWidth)) { if (this.StrokeDashArray != null && this.StrokeDashArray.Count > 0) { /* divide by stroke width - GDI behaviour that I don't quite understand yet.*/ pen.DashPattern = this.StrokeDashArray.ConvertAll(u => u.Value / ((strokeWidth <= 0) ? 1 : strokeWidth)).ToArray(); } var path = this.Path(renderer); renderer.DrawPath(pen, path); if (this.MarkerStart != null) { SvgMarker marker = this.OwnerDocument.GetElementById <SvgMarker>(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 <SvgMarker>(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 <SvgMarker>(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]); } } } }