Clear 块
约 1076 字大约 4 分钟
- Type ID: 6
- Type: Map
Clear 表示当前 Canvas 内容流中的一次完整可撤回清空。它把同一 Canvas 在该对象之前形成的可见合成结果重置为透明,但不删除旧内容;旧内容继续保留在文件中,供后续按 undoId 撤回 Clear 时恢复。
字段
| 字段 | 类型 | 要求 | 说明 |
|---|---|---|---|
type | uint16 | Required | 固定为 6 |
contentId | uint32 | Required | Canvas 内 Ink/Shape/Media/Clear 共享的连续内容编号 |
undoId | uint32 | Required | Canvas 内非递减的撤回操作分组编号;Clear 必须独占该组 |
extra | Map | Optional | 私有扩展 |
contentId 与 Ink、Shape、Media 共用同一编号空间,并严格按照顶层对象流顺序从 0 连续递增。Clear 的 undoId 必须大于它前一个内容块的 undoId;当 Clear 是 Canvas 的首个内容时使用 undoId = 0。Clear 后第一个内容块也必须大于该 Clear 的 undoId,从而保证 Clear 独占撤回组。
当前标准 Clear 没有几何、范围或内容类型筛选字段。未来版本可以增加矩形范围,以及仅清空 Ink/Shape、保留 Media 等可选模式;缺少这些未来字段时始终表示清空当前 Canvas 的全部可见内容。
作用域与呈现
读取器按对象流顺序合成当前 Canvas:
- Ink、Shape 与 Media 按各自规则作用到当前结果。
- 遇到 Clear 时,把当前 Canvas 已形成的全部可见结果重置为透明。
- Clear 后的内容从透明结果继续合成。
Clear 只作用于它所属的单个 Canvas。它不影响同页其他 Device、其他 layerIndex、其他页面或其他 Workspace,也不改变 Canvas 的 pageGuid、pageIndex、slideId、viewport 或图层顺序。
Clear 清空此前全部可见类型,包括 Media。它不修改旧块本身;被 Clear 隐藏的旧内容仍是有效撤回历史。写入器不应使用新 Canvas、新图层、全屏 Erase Ink 或私有 extra 模拟标准 Clear。
撤回与重做
Clear 必须独占一个 undoId,不得与相邻 Ink、Shape、Media 或另一个 Clear 共用撤回组。
对于以下内容流:
A, Clear1, B, Clear2, C当前显示只包含 C。按撤回组从尾部操作时,撤回 C 后画布为空;再撤回 Clear2 后显示 B;继续撤回 B、Clear1 后依次为空和显示 A。实现可以在当前区间已经撤空时,把“撤回 Clear”呈现为一次区间恢复,但文件中的操作顺序不得改变。
UInk 不保存已撤回后的 Redo 状态。完整保存可以移除真正已经撤回的尾部内容或 Clear 并重新整理编号;仍有效但被后续 Clear 隐藏、可通过撤回恢复的旧区间必须保留。应用明确丢弃 Clear 历史时,可以把最后一个有效 Clear 之前的内容和该 Clear 一并压缩掉,使当前可见区间成为新的 Canvas 根。
增量写入
完整 Clear 块可以追加到文件末尾最后一个 Canvas:
contentId承接当前 Canvas 的连续内容序列;undoId使用新的分组编号并独占该组;- 写入前必须完成整个 MessagePack Map,不得留下待补齐对象。
目标不是文件末尾最后一个 Canvas、撤回或重做 Clear、修改旧区间,或压缩 Clear 历史时必须执行完整保存。
示例
{
"type": 6,
"contentId": 2,
"undoId": 2
}该对象清空当前 Canvas 在 contentId = 0 和 1 形成的可见结果。后续 contentId = 3 从透明 Canvas 继续合成。
容错
- 缺少
type、contentId或undoId,字段类型错误,或 Clear 与相邻内容共用undoId时,当前 Clear 无效并报告警告。 - 忽略无效 Clear 会改变可见结果,因此包含无效 Clear 的文件不得被视为可安全原地覆盖;默认应只读恢复或另存为。
- Map 中重复任一已知键时当前 Clear 无效;未知键按通用 Map 扩展规则忽略。
- 空 Canvas 或上一有效操作已经是 Clear 时再次出现 Clear,呈现结果仍为空;写入器应避免生成这种无效果的连续 Clear,读取器可以保留其撤回组。