Savage Interactive does not publish the format. This page follows Silicate, an open
source viewer that reads .procreate files, and marks what it does not
establish.
Archive
| Entry | Contents |
|---|---|
Document.archive | The document: canvas, layer tree and settings, as an Apple keyed archive (below). |
QuickLook/Thumbnail.png | A small preview. |
uuid/col~row.chunk | One tile of a layer, a mask or the composite, LZO-compressed. The folder is the UUID of the layer. |
uuid/col~row.lz4 | The same tile, LZ4-compressed, as written by newer versions of Procreate. |
video/segments/segment-n.mp4 | The time-lapse recording, in parts. |
Document.archive
A binary property list written by NSKeyedArchiver: the objects sit in
a flat $objects array and refer to each other by index, and each object’s
$class names its type. The root object is a SilicaDocument.
SilicaDocument
| Key | Type | Meaning |
|---|---|---|
size | size string | Canvas width and height in pixels. |
tileSize | integer | Width and height of a tile in pixels. |
unwrappedLayers | array | The layer tree: SilicaLayer and SilicaGroup objects. |
composite | SilicaLayer | The flattened image, stored as a layer with its own tiles. |
name | string | Document name. |
authorName | string | Author. |
backgroundColor | data | Four little-endian 32-bit floats: red, green, blue, alpha. |
backgroundHidden | boolean | Whether the background colour is hidden (transparent background). |
strokeCount | integer | Number of strokes painted. |
orientation | integer | 1 no rotation, 2 rotated 180°, 3 rotated 270° clockwise, 4 rotated 90° clockwise. |
flippedHorizontally, flippedVertically | boolean | Canvas flips. |
Other keys seen in the archive include layers, selectedLayer,
primaryItem, mask, videoEnabled,
SilicaDocumentArchiveDPIKey, SilicaDocumentArchiveUnitKey,
SilicaDocumentTrackedTimeKey, SilicaDocumentVideoPurgedKey
and SilicaDocumentVideoSegmentInfoKey; their values are not described.
SilicaLayer
| Key | Type | Meaning |
|---|---|---|
UUID | string | The layer’s ID, which is also the folder of its tiles. |
name | string | Layer name. |
opacity | float | 0 to 1. |
hidden | boolean | Hidden. |
clipped | boolean | Clipping mask: drawn only where the layer below is. |
blend | integer | Blend mode, below. |
extendedBlend | integer | Blend mode in newer files; when present it overrides blend. |
mask | SilicaLayer | A layer mask, with its own one-channel tiles. |
version | integer | Layer version. |
Other layer keys seen but not described: type, locked,
preserve, private, contentsRect,
contentsRectValid, transform, perspectiveAssisted,
animationHeldLength, bundledImagePath,
bundledMaskPath, bundledVideoPath, text and
textPDF.
SilicaGroup
| Key | Type | Meaning |
|---|---|---|
name | string | Group name. |
isHidden | boolean | Hidden. |
children | array | The layers and groups inside. |
Blend modes
| Value | Mode | Value | Mode |
|---|---|---|---|
| 0 | Normal | 14 | Luminosity |
| 1 | Multiply | 15 | Hue |
| 2 | Screen | 16 | Saturation |
| 3 | Add | 17 | Soft light |
| 4 | Lighten | 18 | not known |
| 5 | Exclusion | 19 | Darken |
| 6 | Difference | 20 | Hard mix |
| 7 | Subtract | 21 | Vivid light |
| 8 | Linear burn | 22 | Linear light |
| 9 | Colour dodge | 23 | Pin light |
| 10 | Colour burn | 24 | Lighter colour |
| 11 | Overlay | 25 | Darker colour |
| 12 | Hard light | 26 | Divide |
| 13 | Colour |
Tiles
- The canvas is cut into
tileSizesquares:ceil(width / tileSize)columns andceil(height / tileSize)rows. Tiles in the last column and row are only as wide and high as what is left of the canvas. - A tile file name gives its column and row, such as
3~1.chunk. - A colour tile decompresses to width × height × 4 bytes of 8-bit RGBA; Silicate’s documentation describes the colour as premultiplied by alpha. A mask tile decompresses to one byte per pixel.
.chunkfiles are raw LZO1X data..lz4files are LZ4 blocks in a framing of their own, with separate block types for compressed data, stored data and the end; each block may refer back to the bytes already decoded.
Unknowns
- Blend mode 18, and the meaning of many archive keys listed above.
- The exact magic numbers and header of the LZ4 block framing.
- Whether row 0 is the top or the bottom of the canvas.
- Text layers, reference layers, animation settings and brush data.