feat: read ink drawings and handwriting as strokes in page coordinates

The public MS-ONE text has no ink object; the layout matches what the
onenote_parser crate (MPL-2.0, reimplemented here rather than copied) and
Joplin's converter read: a container (jcid 0x60014) whose data node (0x2003b)
lists strokes (0x20047), each packing its coordinates as ISF multi-byte
first differences in HIMETRIC, one block per dimension of the style object's
(0x120048) GUID table, with pen width, height, colour, transparency and tip
on the style. The reader interprets those four kinds, and page::Ink decodes
every stroke into a polyline of absolute page points, keeping nested
containers as groups; ink is a page object or paragraph content, and the
writer treats it as fixed.

corpus/native-ink/cold-ui-ink is the oracle: two mouse-drawn drawings whose
native positions and sizes the decoded extents reproduce (OneNote reports a
size one HIMETRIC unit larger than the point extent). tests/page_ink.rs
checks the Rust decoding and tools/test_ink_read.py an independent Python
decoding of the same packets; verify-document.py now compares every ink
drawing's extent, projected through the page origin on left-to-right pages,
and reports differences as geometry entries. The canvas places its read-only
ink placeholder at the stroke extent.

Assisted-by: claude-fable-5.1
7f30bf3464clover caruso committed on 9/26/2026, 3:26:20 AMparentbcb13ba
17 files changedLine totals unavailable