List <Rect> SplitGeometryIntoRectangles(CanvasGeometry geometry, float rectangleHeight, CanvasControl sender) { List <Rect> result = new List <Rect>(); var geometryBounds = geometry.ComputeBounds(); double left = geometryBounds.X; double top = geometryBounds.Y; double y = top; while (y < geometryBounds.Bottom) { var lineRegion = new Rect(left, y, geometryBounds.Width, rectangleHeight); var lineRegionGeometry = CanvasGeometry.CreateRectangle(sender, lineRegion); var compareResult = geometry.CompareWith(lineRegionGeometry); if (compareResult == CanvasGeometryRelation.Contains) { // The whole line fits. result.Add(lineRegion); } else if (compareResult == CanvasGeometryRelation.Disjoint) { // The line doesn't fit, so skip it. } else if (compareResult == CanvasGeometryRelation.Overlap) { var intersection = geometry.CombineWith(lineRegionGeometry, Matrix3x2.Identity, CanvasGeometryCombine.Intersect); PathReader pathReader = new PathReader(lineRegion); intersection.Simplify(CanvasGeometrySimplification.Lines).SendPathTo(pathReader); var rectangles = pathReader.GetRectangles(); rectangles.Sort(new RectangleComparer(CurrentTextDirection == TextDirection.RightToLeft)); result.AddRange(rectangles); } y += rectangleHeight; } return(result); }