public IEnumerable <VertexData> Vertices() { VertexData lastPosition = new VertexData(); IEnumerator <VertexData> vertexDataEnumerator = VertexSource.Vertices().GetEnumerator(); while (vertexDataEnumerator.MoveNext()) { VertexData vertexData = vertexDataEnumerator.Current; switch (vertexData.command) { case ShapePath.FlagsAndCommand.CommandCurve3: { vertexDataEnumerator.MoveNext(); VertexData vertexDataEnd = vertexDataEnumerator.Current; m_curve3.init(lastPosition.position.x, lastPosition.position.y, vertexData.position.x, vertexData.position.y, vertexDataEnd.position.x, vertexDataEnd.position.y); IEnumerator <VertexData> curveIterator = m_curve3.Vertices().GetEnumerator(); curveIterator.MoveNext(); // First call returns path_cmd_move_to do { curveIterator.MoveNext(); if (ShapePath.is_stop(curveIterator.Current.command)) { break; } vertexData = new VertexData(ShapePath.FlagsAndCommand.CommandLineTo, curveIterator.Current.position); yield return(vertexData); lastPosition = vertexData; } while (!ShapePath.is_stop(curveIterator.Current.command)); } break; case ShapePath.FlagsAndCommand.CommandCurve4: { vertexDataEnumerator.MoveNext(); VertexData vertexDataControl = vertexDataEnumerator.Current; vertexDataEnumerator.MoveNext(); VertexData vertexDataEnd = vertexDataEnumerator.Current; m_curve4.init(lastPosition.position.x, lastPosition.position.y, vertexData.position.x, vertexData.position.y, vertexDataControl.position.x, vertexDataControl.position.y, vertexDataEnd.position.x, vertexDataEnd.position.y); IEnumerator <VertexData> curveIterator = m_curve4.Vertices().GetEnumerator(); curveIterator.MoveNext(); // First call returns path_cmd_move_to while (!ShapePath.is_stop(vertexData.command)) { curveIterator.MoveNext(); if (ShapePath.is_stop(curveIterator.Current.command)) { break; } vertexData = new VertexData(ShapePath.FlagsAndCommand.CommandLineTo, curveIterator.Current.position); yield return(vertexData); lastPosition = vertexData; } } break; default: yield return(vertexData); lastPosition = vertexData; break; } } }