diff --git a/Source/Painting/SvgMarker.cs b/Source/Painting/SvgMarker.cs
index 6d5de60e8bc9490113e090e83b7bb5d8520afcb5..1e42b3edfc2771e9dc3ccdaba3181dca59a3d9ad 100644
--- a/Source/Painting/SvgMarker.cs
+++ b/Source/Painting/SvgMarker.cs
@@ -133,9 +133,14 @@ namespace Svg
///
public void RenderMarker(ISvgRenderer pRenderer, SvgVisualElement pOwner, PointF pRefPoint, PointF pMarkerPoint1, PointF pMarkerPoint2)
{
- float xDiff = pMarkerPoint2.X - pMarkerPoint1.X;
- float yDiff = pMarkerPoint2.Y - pMarkerPoint1.Y;
- float fAngle1 = (float)(Math.Atan2(yDiff, xDiff) * 180.0 / Math.PI);
+ float fAngle1 = 0f;
+ if (Orient.IsAuto)
+ {
+ // Only calculate this if needed.
+ float xDiff = pMarkerPoint2.X - pMarkerPoint1.X;
+ float yDiff = pMarkerPoint2.Y - pMarkerPoint1.Y;
+ fAngle1 = (float)(Math.Atan2(yDiff, xDiff) * 180.0 / Math.PI);
+ }
RenderPart2(fAngle1, pRenderer, pOwner, pRefPoint);
}
@@ -184,10 +189,22 @@ namespace Svg
switch (MarkerUnits)
{
case SvgMarkerUnits.StrokeWidth:
- transMatrix.Translate(AdjustForViewBoxWidth(-RefX.ToDeviceValue(pRenderer, UnitRenderingType.Horizontal, this) *
- pOwner.StrokeWidth.ToDeviceValue(pRenderer, UnitRenderingType.Other, this)),
- AdjustForViewBoxHeight(-RefY.ToDeviceValue(pRenderer, UnitRenderingType.Vertical, this) *
- pOwner.StrokeWidth.ToDeviceValue(pRenderer, UnitRenderingType.Other, this)));
+ if (ViewBox.Width > 0 && ViewBox.Height > 0)
+ {
+ transMatrix.Translate(AdjustForViewBoxWidth(-RefX.ToDeviceValue(pRenderer, UnitRenderingType.Horizontal, this) *
+ pOwner.StrokeWidth.ToDeviceValue(pRenderer, UnitRenderingType.Other, this)),
+ AdjustForViewBoxHeight(-RefY.ToDeviceValue(pRenderer, UnitRenderingType.Vertical, this) *
+ pOwner.StrokeWidth.ToDeviceValue(pRenderer, UnitRenderingType.Other, this)));
+ }
+ else
+ {
+ // SvgMarkerUnits.UserSpaceOnUse
+ // TODO: We know this isn't correct.
+ // But use this until the TODOs from AdjustForViewBoxWidth and AdjustForViewBoxHeight are done.
+ // MORE see Unit Test "MakerEndTest.TestArrowCodeCreation()"
+ transMatrix.Translate(-RefX.ToDeviceValue(pRenderer, UnitRenderingType.Horizontal, this),
+ -RefY.ToDeviceValue(pRenderer, UnitRenderingType.Vertical, this));
+ }
break;
case SvgMarkerUnits.UserSpaceOnUse:
transMatrix.Translate(-RefX.ToDeviceValue(pRenderer, UnitRenderingType.Horizontal, this),
diff --git a/Tests/Svg.UnitTests/MarkerEndTest.cs b/Tests/Svg.UnitTests/MarkerEndTest.cs
new file mode 100644
index 0000000000000000000000000000000000000000..bbef2e75c099000787366185d7ba462a5a56fda3
--- /dev/null
+++ b/Tests/Svg.UnitTests/MarkerEndTest.cs
@@ -0,0 +1,96 @@
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Svg.DataTypes;
+using System;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+
+namespace Svg.UnitTests
+{
+ [TestClass]
+ public class MarkerEndTest : SvgTestHelper
+ {
+
+ protected override string TestResource { get { return GetFullResourceString("Issue212_MakerEnd.OperatingPlan.svg"); } }
+ protected override int ExpectedSize { get { return 5410; } }
+
+
+ [TestMethod]
+ public void TestOperatingPlanRendering()
+ {
+ LoadSvg(GetXMLDocFromResource());
+ }
+
+
+ [TestMethod]
+ public void TestArrowCodeCreation()
+ {
+ const int width = 50;
+ const int height = 50;
+
+ var document = new SvgDocument()
+ {
+ ID = "svgMap",
+ ViewBox = new SvgViewBox(0, 0, width, height)
+ };
+
+ var defsElement = new SvgDefinitionList() { ID = "defsMap" };
+ document.Children.Add(defsElement);
+
+ var groupElement = new SvgGroup() { ID = "gMap" };
+ document.Children.Add(groupElement);
+
+ var arrowPath = new SvgPath()
+ {
+ ID = "pathMarkerArrow",
+ Fill = new SvgColourServer(Color.Black),
+ PathData = SvgPathBuilder.Parse(@"M0,0 L4,2 L0,4 L1,2 z")
+ };
+
+ var arrowMarker = new SvgMarker()
+ {
+ ID = "markerArrow",
+ MarkerUnits = SvgMarkerUnits.StrokeWidth,
+ MarkerWidth = 5,
+ MarkerHeight = 5,
+ RefX = 3,
+ RefY = 2,
+ Orient = new SvgOrient() { IsAuto = true },
+ Children = { arrowPath }
+ };
+
+ defsElement.Children.Add(arrowMarker);
+
+ var line = new SvgLine()
+ {
+ ID = "lineLinkedPoint",
+ StartX = 0,
+ StartY = 15,
+ EndX = 35,
+ EndY = 35,
+ Stroke = new SvgColourServer(Color.Black),
+ StrokeWidth = 3,
+ MarkerEnd = new Uri(string.Format("url(#{0})", arrowMarker.ID), UriKind.Relative)
+ };
+
+ groupElement.Children.Add(line);
+
+ var svgXml = document.GetXML();
+ var img = document.Draw();
+
+ var file = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
+ File.WriteAllText(file + ".svg", svgXml);
+ img.Save(file + ".png");
+ Debug.WriteLine(string.Format("Svg saved to '{0}'", file));
+
+ Debugger.Break();
+
+ // Remove
+ var svg = new FileInfo(file + ".svg");
+ if (svg.Exists) svg.Delete();
+ var png = new FileInfo(file + ".png");
+ if (png.Exists) png.Delete();
+ }
+
+ }
+}
diff --git a/Tests/Svg.UnitTests/Resources/Issue212_MakerEnd/OperatingPlan.svg b/Tests/Svg.UnitTests/Resources/Issue212_MakerEnd/OperatingPlan.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6b58da5d53648b1c47feaa25f3a6ce6d12cc3917
--- /dev/null
+++ b/Tests/Svg.UnitTests/Resources/Issue212_MakerEnd/OperatingPlan.svg
@@ -0,0 +1,34 @@
+
+
\ No newline at end of file
diff --git a/Tests/Svg.UnitTests/Svg.UnitTests.csproj b/Tests/Svg.UnitTests/Svg.UnitTests.csproj
index d4956f79baa07fd450e3c9fc1b8b5d712b12920a..4a424cb1294e6a8fb8612adad69058c9525e765f 100644
--- a/Tests/Svg.UnitTests/Svg.UnitTests.csproj
+++ b/Tests/Svg.UnitTests/Svg.UnitTests.csproj
@@ -55,6 +55,7 @@
+
@@ -77,6 +78,9 @@
+
+
+