public static void CreateMarkers(this SvgMarkerElement svgMarkerElement, SKPath skPath, SKRect skOwnerBounds, ref List <Drawable>?markerDrawables, CompositeDisposable disposable) { var pathTypes = skPath.GetPathTypes(); var pathLength = pathTypes.Count; var markerStart = svgMarkerElement.MarkerStart; if (markerStart != null && pathLength > 0 && !SvgExtensions.HasRecursiveReference(svgMarkerElement, (e) => e.MarkerStart, new HashSet <Uri>())) { var marker = SvgExtensions.GetReference <SvgMarker>(svgMarkerElement, markerStart); if (marker != null) { var refPoint1 = pathTypes[0].Point; var index = 1; while (index < pathLength && pathTypes[index].Point == refPoint1) { ++index; } var refPoint2 = pathLength == 1 ? refPoint1 : pathTypes[index].Point; CreateMarker(marker, svgMarkerElement, refPoint1, refPoint1, refPoint2, true, skOwnerBounds, ref markerDrawables, disposable); } } var markerMid = svgMarkerElement.MarkerMid; if (markerMid != null && pathLength > 0 && !SvgExtensions.HasRecursiveReference(svgMarkerElement, (e) => e.MarkerMid, new HashSet <Uri>())) { var marker = SvgExtensions.GetReference <SvgMarker>(svgMarkerElement, markerMid); if (marker != null) { int bezierIndex = -1; for (int i = 1; i <= pathLength - 2; i++) { // for Bezier curves, the marker shall only been shown at the last point if ((pathTypes[i].Type & (byte)PathPointType.PathTypeMask) == (byte)PathPointType.Bezier) { bezierIndex = (bezierIndex + 1) % 3; } else { bezierIndex = -1; } if (bezierIndex == -1 || bezierIndex == 2) { CreateMarker(marker, svgMarkerElement, pathTypes[i].Point, pathTypes[i - 1].Point, pathTypes[i].Point, pathTypes[i + 1].Point, skOwnerBounds, ref markerDrawables, disposable); } } } } var markerEnd = svgMarkerElement.MarkerEnd; if (markerEnd != null && pathLength > 0 && !SvgExtensions.HasRecursiveReference(svgMarkerElement, (e) => e.MarkerEnd, new HashSet <Uri>())) { var marker = SvgExtensions.GetReference <SvgMarker>(svgMarkerElement, markerEnd); if (marker != null) { var index = pathLength - 1; var refPoint1 = pathTypes[index].Point; if (pathLength > 1) { --index; while (index > 0 && pathTypes[index].Point == refPoint1) { --index; } } var refPoint2 = pathLength == 1 ? refPoint1 : pathTypes[index].Point; CreateMarker(marker, svgMarkerElement, refPoint1, refPoint2, pathTypes[pathLength - 1].Point, false, skOwnerBounds, ref markerDrawables, disposable); } } }