UInkPageDocument) is not “some text with pictures
around it”. It is an ordered stack of layers, and each layer is one of three things: a body
of text, a placed image, or a set of brush strokes. Where the text sits in that stack is
what decides whether an image is a watermark under the writing or a stamp over it.
The stacking model
A page (FInkPageSpec) owns a Layers array of FInkPageLayer. The bake walks that array
in order and draws each layer over the one before it:
- Index 0 is the back of the page. It draws first, and everything else draws on top.
- The last entry is the front. It draws last, over everything.
Delta = +1. Send Backward is Delta = -1.
The two sides of a sheet
A page is one side of a physical sheet, and the sheet has another. AlongsideLayers (the
front) a page carries BackLayers — everything drawn on the back of the same sheet,
authored independently under exactly the same stacking rules. Which side is meant is an
Ink Page Side (EInkPageSide): Front or Back.
In the Page Editor, the Front / Back toggle sits directly under the page list —
page picks the sheet, the toggle picks the side. Flip to Back and the page surface, the
Layers panel, and every mode work on the back’s stack instead. The Back button reads
Back • when the current sheet has an authored back, so a journal’s backs can be
surveyed without flipping every sheet.
Three rules make backs free until you use them:
- An empty
BackLayersarray means the back was never authored. The sheet renders bare paper there, and it costs no bake and no render target. Every document saved before backs existed loads exactly like this. - Putting any layer on the back authors it.
HasBack()flips to true, and the back starts baking like any page. - Deleting the back’s last layer un-authors it again. The “a page must keep one Text layer” rule is a front rule only — on the back, deleting the last layer of any kind is the gesture that returns the underside to bare paper at zero cost.
Layer types
Type is drawn, and only
that one is shown when the layer is edited in a details view — change a layer’s Type
and the matching payload appears in its place. Nothing is thrown away: the other payloads
keep their data, which is what makes switching a type back harmless.
Text layers
Text is a layer payload, not a page property. A page can carry a heading, a body, and a signature as three separate text layers, with images or drawings stacked between them.Size is zero on either axis fills the page inside the document
margins (FInkPageText::FillsPage()). That is exactly how a page written as one block of
text behaves, and it is what every page authored before text layers existed becomes. A
page-filling box wraps and follows the margins; a placed box wraps at its own explicit
width. Give a filling box a Box W and Box H and it turns into a placed box you can
drag.Line spacing, per box
Line height in Page Setup sets the spacing for the whole document, and every text layer follows it. A single box can break ranks with its own Line height in the layer panel — which is what a heading, a block of verse or a signature usually wants, since a script or display face needs room that body text does not. The layer’s spin box always reads the spacing the box is actually drawn at: the document’s until you change it, its own afterwards. Once it holds an override the reset arrow appears beside it, and clicking that hands the box back to the document.LineHeightPercentage is 0 on a text layer that has not overridden anything, and 0 is
the sentinel rather than a real spacing — FInkPageText::ResolveLineHeight() is what turns
it into the number the bake uses. Read InheritsLineHeight() rather than comparing to zero
yourself.Image layers
Per-layer controls
Every layer, whatever its type, has these four:What locked actually prevents
A locked layer still draws, on the page and in the bake. Locking is purely about not grabbing it by accident. While a layer is locked you cannot:- select it — clicking its row or its content on the page does nothing;
- drag it around the page surface;
- drag its row to a new place in the Layers list;
- double-click its content on the page to activate it;
- draw strokes into it (a locked Drawing layer is never a stroke target).
The Layers panel
The panel is the bottom half of the Page Editor’s right column, under the 3D preview. The splitter between them is draggable, so you can squeeze the preview down to a thumbnail when the work is in the layers. It always shows the stack of the side being edited: flip to Back and the rows are the back’s layers.
The Layers panel: front-to-back rows, each with an eye, a lock, a name, and a type badge.
1 — Eye and lock
2 — Row and name
3 — Type badge
4 — Add and reorder
Working the panel
Add a layer
Position (0.15, 0.15), Size (0.5, 0.25) — deliberately not page-filling, since a second full-page box would sit
invisibly over the first. A new image layer starts at Position (0.35, 0.35),
Size (0.3, 0).Select one
Restack by dragging
Right-click for the row menu
Edit the selected layer

The row menu on a layer named SIGNATURE: rename, duplicate or delete it, toggle Visible and Locked, or move it one step through the stack.

Image mode: an image layer can be dragged anywhere in its area, not only by a handle.
A layer draws in the editor but not in the game
A layer draws in the editor but not in the game
A row will not select, drag, or accept strokes
A row will not select, drag, or accept strokes
Three recipes
A watermark behind the writing
The stamp goes below the text layer in the panel — earlier in the array — so the writing draws over it.Select the text layer
Add the image layer
Send it behind
Fade it
A stamp over the writing
Identical, minus the last two steps: add the image layer while the text layer is selected and leave it where it lands — in front. Turn its Rotation a few degrees off square so it reads as something pressed onto the page rather than composited into it.Several independent text boxes
Write the body
Add the heading
Add the signature
Name the rows
Blueprint API
Every function below is on the Ink Page Document asset, in the Inkwell | Page Document category. Layer indices are array indices — index 0 is the back of the page, not the top row of the panel. Every layer function takes a Side pin (an Ink Page Side:Front or Back, defaulting to Front), so the same calls read and
write the back of a sheet.
- Set Page Layers repairs the front. A front stack containing no Text layer gets one
appended, because a page with nowhere to draw its markup renders blank paper. The same
repair runs on Add Page and on load. It deliberately does not run on the back: an
empty back is the legal un-authored state, and the zero-cost guarantee hangs off it —
which also means Set Page Layers with an empty array and
Side = Backis how you un-author a back from Blueprint. - Set Page Layers, Add Page Layer, Remove Page Layer, and Move Page Layer all bump the document’s content revision, which is what invalidates cached bakes. If you mutate a layer struct you pulled out with Get Page Layers, you are working on a copy — write it back with Set Page Layers or nothing on screen changes.
- Adding a layer to an unauthored back authors it — the sheet starts baking a back and the reader will flip to it. Nothing else needs to be set.
Recipe: add a watermark from Blueprint
- Make Ink Page Layer — set Type to
Image, Name toWatermark, Opacity to0.15. - On its Image member: set Texture, Position
(0.2, 0.3), Size(0.6, 0.0). - Find Text Layer Index (
PageIndex) → store asTextIndex. - Add Page Layer (
PageIndex, the new layer) → returnsNewIndexat the front. - Move Page Layer (
PageIndex,NewIndex,TextIndex - NewIndex) — a negative delta, which drops the image behind the writing. - Refresh on any Ink Page Display already showing that page.