`RasterStrokeAction`/`RasterFillAction` stored the whole before+after RGBA frame (~16 MB/action at 1080p → up to ~1.6 GB at the 100-action cap). They now store a `RasterDiff` — only the changed bounding box's pixels before and after — computed once in `new()` from the full buffers, which are then dropped. A brush dab shrinks from ~16 MB to tens of KB; a full-canvas fill is unchanged (its bbox is the frame). Paging interaction: a diff overwrites just the bbox, so the keyframe's pixels must be resident when undo/redo applies. A clean evicted frame's container bytes equal its current logical state, so the editor faults the target frame in (synchronously) before undo/redo via a new `Action::raster_resident_hint` + `peek_undo/redo_raster_hint`. Dirty frames are never evicted, so they're already resident. If a base is somehow not resident the apply is skipped (logged), never resized-and-corrupted. Unit tests cover exact before/after round-trip, blank-first-stroke, no-op, and the non-resident-base skip. |
||
|---|---|---|
| .. | ||
| assets | ||
| examples | ||
| src | ||
| Cargo.toml | ||
| PLAN.md | ||
| TOOL_IMPLEMENTATION_PLAN.md | ||
| build.rs | ||