P2-03 · core:tile 撤销(TilePatch[])
- Phase / ID: P2 / P2-03
- Depends on: P2-01、P1-04(UndoManager)
- Files:
packages/core/src/document/UndoManager.ts、src/surface/**、test/ - Effort: M
- Status: 🟡 条件性
Context
把 P1 的「bbox 区域位图快照」升级成 tile 级 before/after(D4)。撤销只触达脏 tile,内存与速度都更优。StrokePatch.before/after 改用 TilePatch[](interfaces)。
Steps
beginStroke:记录本笔将写的 tile 集;对每个首次将被弄脏的 tile,拷贝其data作为before(只拷脏 tile,不拷全图)。endStroke:对每个脏 tile 拷after,组装TilePatch[]→StrokePatch。applyPatch(patch,'undo'|'redo'):把对应 tile 的before/after写回TiledSurface并markDirty,触发 adapter 重传这些 tile。UndoManager对StrokePatch.before/after既能吃ImageBitmap|Uint8Array(P1)也能吃TilePatch[](P2)——保持接口不变(D5)。
Acceptance
- [ ]
test/tile-undo.spec.ts:画跨多 tile 一笔 → undo 后逐 tile == 画前;redo == 画后。 - [ ] 撤销只复制 / 恢复脏 tile(数量断言:未触碰的 tile 不进 patch)。
- [ ] 与 P1 的 UndoManager 行为兼容(容量、双栈、事件)。
Out of scope
- 非绘制操作(fill / filter / transform)的撤销(后续阶段)。