Initial public release
Some checks failed
Test / test (push) Has been cancelled

This commit is contained in:
2026-09-19 21:31:36 +08:00
commit 198fcbf55b
837 changed files with 67239 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
## Purpose
保证 Brush 的笔画范围准确跟随屏幕轨迹,预览与最终覆盖使用一致的几何并集,使长笔画持续响应,并提供清晰的完成、取消和单步撤销行为。
## ADDED Requirements
### Requirement: Stroke simplification bounds the whole segment error
Brush 与共享自由手绘手势 SHALL 将每个保留原始采样点到简化线段的偏差限制在 0.75 个 Viewport 像素以内。Polyline 的已提交顶点 SHALL 按用户输入保留。
#### Scenario: Dense curved stroke is simplified
- **WHEN** 用户以高密度采样绘制弯曲轨迹
- **THEN** 整段简化误差不超过 0.75 px,连续尾点替换不会累计放大偏差
- **AND** 预览与提交使用同一有效路径
### Requirement: Brush antialiases the complete geometric union
Brush SHALL 对全部圆形印记和连接条的完整几何并集应用一次抗锯齿。几何并集相同的图元分段方式 SHALL 产生相同覆盖值。
#### Scenario: Stroke turns through a right angle
- **WHEN** 半径为 2、5 或 25 px 的 Brush 形成直角连接或自交
- **THEN** 内部连接处不会因图元各自的抗锯齿边界减少覆盖
- **AND** 提交覆盖符合完整并集的抗锯齿参考结果
#### Scenario: Equivalent geometry has different segmentation
- **WHEN** 同一个直线 footprint 由不同数量的共线连接条描述
- **THEN** 输出 Alpha 覆盖在浮点误差内一致
### Requirement: Long stroke preview remains responsive
Brush SHALL 在每次有效路径变化后显示整条待提交笔画的合并填充和外轮廓。局部新增笔画的预览计算 SHALL 限定于变化范围,静止重绘 SHALL 复用已有预览结果。
#### Scenario: A short segment is appended to a long stroke
- **WHEN** 已有 800、1600 或 3200 个屏幕点,用户追加只影响局部范围的短线段
- **THEN** 预览更新覆盖新范围并保留其他区域,计算范围不扩展为完整历史笔画
- **AND** 预览与相同路径的完整几何参考一致
#### Scenario: Tail changes or crosses previous geometry
- **WHEN** 活动尾段变化或与已有笔画相交
- **THEN** 预览清除失效尾段的覆盖及内部轮廓,呈现当前完整 footprint
### Requirement: Mask provides one transactional gesture edit
Mask SHALL 在启动时冻结 Scene 的 Gesture、Mode 和 Radius;完成时一次提交 Packed Image 并支持单步 Undo。Mask SHALL NOT 暴露无法执行的操作后参数重做面板。
#### Scenario: Stroke is completed and undone
- **WHEN** 用户完成一个 Brush、Lasso 或 Polyline Mask 后执行 Undo
- **THEN** 源图片与对象状态恢复,整次手势只产生一个编辑步骤
#### Scenario: Stroke is cancelled or tool changes
- **WHEN** 用户按 Esc、RMB,或切换工具取消未提交手势
- **THEN** 原 Image 不变,所有操作内路径与预览资源释放
#### Scenario: User edits tool settings
- **WHEN** 用户修改 Scene 中的 Mask 工具设置
- **THEN** 新手势采用新设置,进行中的手势保持启动时设置

View File

@@ -0,0 +1,36 @@
## Purpose
定义 Frame 在透视观察平面附近的连续交叠判定,确保可见且可稳定求交的图片区域能够参与取景,并固定结果透明颜色和无效交叠时的对象保留行为。
## ADDED Requirements
### Requirement: Frame accepts a finite visible intersection
Frame SHALL 依据画框内的连续有效投射判断正面积交叠。完整源图片的角点接近无穷远 SHALL NOT 导致画框内稳定有效的交叠被拒绝。
#### Scenario: Tilted source crosses the perspective origin
- **WHEN** 30° 倾斜源平面位于视图深度 0.2 且部分跨越观察平面,透视 X/Y 焦距系数为 1.7、2 或 4,Frame 内有正面积前方交叠
- **THEN** Frame 接受交叠并生成结果
- **AND** 对应有效源坐标与实际采样保持一致
#### Scenario: Source lies extremely close in front
- **WHEN** 源平面非常接近观察原点但画框内仍存在数值可稳定表达的正面积前方交叠
- **THEN** Frame 接受交叠,不因源角点的远距离屏幕投射取消操作
#### Scenario: Orthographic source has non-positive depth
- **WHEN** 正交 Frame 与具有有限非正视图深度的源平面存在稳定正面积交叠
- **THEN** Frame 正常完成
### Requirement: Invalid active overlap preserves inputs
Frame SHALL 在 active 图片与画框没有稳定正面积交叠时以 warning 取消,并保留全部参与对象的图片、变换和存在状态。
#### Scenario: Frame only touches an edge or misses the source
- **WHEN** Frame 仅接触 active 图片投射边缘,或没有有效交叠
- **THEN** 操作取消,源对象与源图片均保持不变
### Requirement: Frame preserves independent color and alpha output
Frame SHALL 保留底层原色与前景混合得到的 RGB、独立累积的 Alpha 及边界子像素覆盖。源内透明 RGB SHALL 保留,完全未覆盖 Canvas SHALL 为 RGBA 全零。
#### Scenario: Frame result is revealed by Mask Add
- **WHEN** 多层 Frame 含透明底色与半透明前景,随后执行 Mask Add
- **THEN** 恢复区域显示原合成 RGB,源外透明 Canvas 的 RGB 保持为零
- **AND** 分块高度变化不会改变合成结果

View File

@@ -0,0 +1,37 @@
## Purpose
保证图片编辑与网格生成取得当前有效的业务像素,同时保护 Blender 源图片的未保存内容、透明颜色、呈现模式与共享引用,使连续编辑和保存重开具有一致的数据结果。
## ADDED Requirements
### Requirement: Reading business pixels preserves source state
系统 SHALL 在读取业务 RGBA 时保留源 Image 的像素缓存、Alpha 模式、脏状态、Packed 内容和对象引用。读取 SHALL NOT 通过重载源图片覆盖当前有效内容。
#### Scenario: Dirty packed image is read
- **WHEN** 用户修改 Packed Image 像素但尚未重新 Pack,图片编辑工具读取该图片
- **THEN** 读取结果包含最近修改的 RGB/Alpha
- **AND** 源像素、脏状态及原 Packed 内容保持读取前状态
#### Scenario: Shared source is read before an edit is cancelled
- **WHEN** 两个对象共享同一 PREMUL Image,其中一个工具读取图片后取消或报错
- **THEN** 两个对象仍引用相同源数据,源像素缓存与呈现设置保持不变
### Requirement: Business pixel interpretation survives persistence
系统 SHALL 保留既有 PREMUL 结果默认值,并在即时读取、Pack 和 blend 保存重开后取得相同业务 RGB/Alpha。误差 SHALL 仅来自既有编码精度,完全透明 RGB SHALL 可以通过 Mask Add 恢复。
#### Scenario: Edited image is reopened and read repeatedly
- **WHEN** 含透明及半透明像素的编辑结果保存重开并被多次读取
- **THEN** 每次返回相同业务像素,结果 Alpha 模式保持 PREMUL
- **AND** 读取不会改变源缓存或产生累计颜色变化
#### Scenario: Floating point source is consumed
- **WHEN** 工具读取生成或加载的浮点图片,包括原生预乘 Alpha 数据
- **THEN** 返回值符合源编码的业务 RGBA 语义并保留当前有效精度
- **AND** 源图片的像素及模式保持不变
### Requirement: Temporary decoding data has bounded lifetime
系统 SHALL 在单次业务读取结束或失败时释放该读取拥有的临时图片数据。
#### Scenario: Repeated read or decode failure
- **WHEN** 用户重复触发读取,或读取中的解码发生错误
- **THEN** 不留下额外 Image 数据块,原图片及共享引用保持不变