`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. |
||
|---|---|---|
| .. | ||
| beamdsp | ||
| egui_node_graph2 | ||
| lightningbeam-core | ||
| lightningbeam-editor | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| build-static.sh | ||
| build-windows.bat | ||