---
title: "PathIterator"
description: "A path iterator can be used to iterate over all the [segments][PathSegment] that make up a path.
Those segments may in turn define multiple contours inside the path.

The handling of conic segments is defined by the [conicEvaluation] property. When set to
[AsConic][ConicEvaluation.AsConic], conic segments are preserved, but when set to
[AsConic][ConicEvaluation.AsQuadratics], conic segments are approximated using 1 or more
quadratic segments. The error of the approximation is controlled by [tolerance]."
type: "interface"
---

<div class='type'>Interface</div>


<a id='references'></a>

<div class='sourceset sourceset-common'>Common</div>



```kotlin
interface PathIterator : Iterator<PathSegment>
```


A path iterator can be used to iterate over all the `segments` that make up a path.
Those segments may in turn define multiple contours inside the path.

The handling of conic segments is defined by the `conicEvaluation` property. When set to
`AsConic`, conic segments are preserved, but when set to
`AsConic`, conic segments are approximated using 1 or more
quadratic segments. The error of the approximation is controlled by `tolerance`.


## Properties

<div class='sourceset sourceset-common'>Common</div>


```kotlin
val path: Path
```


The `Path` this iterator iterates on.



<div class='sourceset sourceset-common'>Common</div>


```kotlin
val conicEvaluation: ConicEvaluation
```


Indicates whether conic segments, when present, are preserved as-is or converted to quadratic
segments, using an approximation whose error is controlled by `tolerance`.



<div class='sourceset sourceset-common'>Common</div>


```kotlin
val tolerance: Float
```


Error of the approximation used to evaluate conic segments if they are converted to
quadratics. The error is defined as the maximum distance between the original conic segment
and its quadratic approximation. See `conicEvaluation`.



## Functions

```kotlin
fun calculateSize(includeConvertedConics: Boolean = true): Int
```


Returns the number of verbs present in this iterator, i.e. the number of calls to `next`
required to complete the iteration.

By default, `calculateSize` returns the true number of operations in the iterator. Deriving
this result requires converting any conics to quadratics, if `conicEvaluation` is set to
`ConicEvaluation.AsQuadratics`, which takes extra processing time. Set
`includeConvertedConics` to false if an approximate size, not including conic conversion, is
sufficient.

#### Parameters

| | |
| --- | --- |
| includeConvertedConics | The returned size includes any required conic conversions. Default is true, so it will return the exact size, at the cost of iterating through all elements and converting any conics as appropriate. Set to false to save on processing, at the cost of a less exact result. |



```kotlin
override fun hasNext(): Boolean
```


Returns `true` if the iteration has more elements.


```kotlin
fun next(outPoints: FloatArray, offset: Int = 0): PathSegment.Type
```


Returns the `type` of the next `path segment` in the iteration
and fills `outPoints` with the points specific to the segment type. Each pair of floats in
the `outPoints` array represents a point for the given segment. The number of pairs of floats
depends on the `PathSegment.Type`:
- `Move`: 1 pair (indices 0 to 1)
- `Line`: 2 pairs (indices 0 to 3)
- `Quadratic`: 3 pairs (indices 0 to 5)
- `Conic`: 3 pairs (indices 0 to 5), and the conic `weight` at index 6. The value of the last float is undefined. See `PathSegment.Type.Conic` for more details
- `Cubic`: 4 pairs (indices 0 to 7)
- `Close`: 0 pair
- `Done`: 0 pair

This method does not allocate any memory.

#### Parameters

| | |
| --- | --- |
| outPoints | A `FloatArray` large enough to hold 8 floats starting at `offset`, throws an `IllegalStateException` otherwise. |
| offset | Offset in `outPoints` where to store the result |



```kotlin
override fun next(): PathSegment
```


Returns the next `path segment` in the iteration, or `DoneSegment` if the
iteration is finished. To save on allocations, use the alternative `next` function, which
takes a `FloatArray`.



