private static void ReplacePolySegments(PathSegmentCollection pathSegments) { for (int index1 = 0; index1 < pathSegments.Count; ++index1) { PathSegment pathSegment = pathSegments[index1]; PolyLineSegment polyLineSegment = pathSegment as PolyLineSegment; if (polyLineSegment != null) { pathSegments.RemoveAt(index1); for (int index2 = 0; index2 < polyLineSegment.Points.Count; ++index2) { LineSegment lineSegment = PathSegmentUtilities.CreateLineSegment(polyLineSegment.Points[index2], polyLineSegment.IsStroked); pathSegments.Insert(index1, (PathSegment)lineSegment); ++index1; } --index1; } PolyQuadraticBezierSegment quadraticBezierSegment1 = pathSegment as PolyQuadraticBezierSegment; if (quadraticBezierSegment1 != null) { pathSegments.RemoveAt(index1); int index2 = 0; while (index2 < quadraticBezierSegment1.Points.Count - 1) { QuadraticBezierSegment quadraticBezierSegment2 = PathSegmentUtilities.CreateQuadraticBezierSegment(quadraticBezierSegment1.Points[index2], quadraticBezierSegment1.Points[index2 + 1], quadraticBezierSegment1.IsStroked); pathSegments.Insert(index1, (PathSegment)quadraticBezierSegment2); ++index1; index2 += 2; } --index1; } PolyBezierSegment polyBezierSegment = pathSegment as PolyBezierSegment; if (polyBezierSegment != null) { pathSegments.RemoveAt(index1); int index2 = 0; while (index2 < polyBezierSegment.Points.Count - 2) { BezierSegment bezierSegment = PathSegmentUtilities.CreateBezierSegment(polyBezierSegment.Points[index2], polyBezierSegment.Points[index2 + 1], polyBezierSegment.Points[index2 + 2], polyBezierSegment.IsStroked); pathSegments.Insert(index1, (PathSegment)bezierSegment); ++index1; index2 += 3; } --index1; } } }
private static void RemoveDegenerateSegments(PathFigure pathFigure, bool removeInvisible) { PathSegmentCollection segments = pathFigure.Segments; Point b = pathFigure.StartPoint; Point startPoint = pathFigure.StartPoint; for (int index = 0; index < segments.Count; ++index) { PathSegment pathSegment = segments[index]; LineSegment lineSegment; if ((lineSegment = pathSegment as LineSegment) != null) { if (VectorUtilities.ArePathPointsVeryClose(lineSegment.Point, b) || removeInvisible && !lineSegment.IsStroked && pathFigure.Segments.Count == 1) { segments.RemoveAt(index--); } else { b = lineSegment.Point; } } else { QuadraticBezierSegment quadraticBezierSegment; if ((quadraticBezierSegment = pathSegment as QuadraticBezierSegment) != null) { if (VectorUtilities.ArePathPointsVeryClose(quadraticBezierSegment.Point1, b) && VectorUtilities.ArePathPointsVeryClose(quadraticBezierSegment.Point2, b)) { segments.RemoveAt(index--); } else { b = quadraticBezierSegment.Point2; } } else { BezierSegment bezierSegment; if ((bezierSegment = pathSegment as BezierSegment) != null) { if (VectorUtilities.ArePathPointsVeryClose(bezierSegment.Point1, b) && VectorUtilities.ArePathPointsVeryClose(bezierSegment.Point2, b) && VectorUtilities.ArePathPointsVeryClose(bezierSegment.Point3, b)) { segments.RemoveAt(index--); } else { b = bezierSegment.Point3; } } } } } if (segments.Count < 1) { return; } LineSegment lineSegment1 = segments[segments.Count - 1] as LineSegment; if (lineSegment1 == null || !pathFigure.IsClosed || !VectorUtilities.ArePathPointsVeryClose(startPoint, lineSegment1.Point)) { return; } segments.RemoveAt(segments.Count - 1); }