# Serialization

## Paths

Paths are made of segments of **28 bytes** each. The layout (assuming positions in a `Uint8Array`) is the following:

| Offset | Length (bytes) | Data Type | Field   |
| ------ | -------------- | --------- | ------- |
| 0      | 2              | `u16`     | Command |
| 2      | 2              | `u16`     | Flags   |
| 4      | 4              | `f32`     | `c1_x`  |
| 8      | 4              | `f32`     | `c1_y`  |
| 12     | 4              | `f32`     | `c2_x`  |
| 16     | 4              | `f32`     | `c2_y`  |
| 20     | 4              | `f32`     | `x`     |
| 24     | 4              | `f32`     | `y`     |

**Command** can be one of these values:

- `:move-to`: `1`
- `:line-to`: `2`
- `:curve-to`: `3`
- `:close-path`: `4`

**Flags** is not being used at the moment.

## Gradient stops

Gradient stops are serialized in a `Uint8Array`, each stop taking **5 bytes**.

| Offset | Length (bytes) | Data Type | Field       |
| ------ | -------------- | --------- | ----------- |
| 0      | 1              | `u8`      | Red         |
| 1      | 1              | `u8`      | Green       |
| 2      | 1              | `u8`      | Blue        |
| 3      | 1              | `u8`      | Alpha       |
| 4      | 1              | `u8`      | Stop Offset |

**Red**, **Green**, **Blue** and **Alpha** are the RGBA components of the stop.

**Stop offset** is the offset, being integer values ranging from `0` to `100` (both inclusive).