# 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).

## Stroke Caps

Stroke caps are serialized as `u8`:

| Value | Field     |
| ----- | --------- |
| 1     | Line      |
| 2     | Triangle  |
| 3     | Rectangle |
| 4     | Circle    |
| 5     | Diamond   |
| 6     | Round     |
| 7     | Square    |
| \_    | None      |

## Stroke Sytles

Stroke styles are serialized as `u8`:

| Value | Field  |
| ----- | ------ |
| 1     | Dotted |
| 2     | Dashed |
| 3     | Mixed  |
| \_    | Solid  |

## Bool Operations

Bool operations (`bool-type`) are serialized as `u8`:

| Value | Field        |
| ----- | ------------ |
| 0     | Union        |
| 1     | Difference   |
| 2     | Intersection |
| 3     | Exclusion    |
| \_    | Union        |

## BlurType

Blur types are serialized as `u8`:

| Value | Field |
| ----- | ----- |
| 1     | Layer |
| \_    | None  |

## Shadow Styles

Shadow styles are serialized as `u8`:

| Value | Field        |
| ----- | ------------ |
| 0     | Drop Shadow  |
| 1     | Inner Shadow |
| \_    | Drop Shadow  |