# feat: write ink drawings and handwriting through the page model · clo/snowbound

[View on GitCafe](https://git.cafe/clo/snowbound/commit/237d4668ad21d8c6275da60e59bc4acb066fb853)

Repository: [clo/snowbound](https://git.cafe/clo/snowbound)

Visibility: public

Requested revision: 237d4668ad21d8c6275da60e59bc4acb066fb853

Requested commit: 237d4668ad21d8c6275da60e59bc4acb066fb853

Commit: 237d4668ad21d8c6275da60e59bc4acb066fb853

Tree: 2c7c5a5f2c444fb6c0209e6631af6c549df97459

Author: clover caruso

Committer: clover caruso

## Message

```
feat: write ink drawings and handwriting through the page model

A page::Ink object in the model is written the way OneNote 2010 stores a
mouse drawing: an ink container (jcid 0x60014) the page lists as a child or
a paragraph holds as content, its data node (0x2003b) listing stroke objects
(0x20047) whose coordinates are ISF multi-byte first differences in HIMETRIC
with index, language, identity, time and half-inch origin, and one
drawing-attribute object (0x120048) per distinct pen carrying the dimension
table OneNote wrote for its own ink. Points are rounded to the HIMETRIC grid
(page::ink::snap gives callers the same rounding), so a written stroke reads
back equal. Editing rewrites the stroke list: stored strokes keep their paths
and pens, removed ones leave the list, new ones are created; removing the
object goes through the tree editor, which now accepts ink as a page child.

corpus/ink-edit holds cold reads of a Rust square-and-diagonal drawing on
the page and inside an outline paragraph, with screenshots of OneNote 2010
rendering both; tools/test_ink_edit.py checks them without a VM.

Assisted-by: claude-fable-5.1

```

## Parents

- [7f30bf34648c9ac7a69e74956b04546b9894a380](https://git.cafe/clo/snowbound/commit/7f30bf34648c9ac7a69e74956b04546b9894a380?format=markdown)

[Source at this commit](https://git.cafe/clo/snowbound/tree/237d4668ad21d8c6275da60e59bc4acb066fb853?format=markdown)
