Files
AnyImage/openspec/changes/preserve-frame-bottom-layer-rgb/specs/frame-transparent-rgb/spec.md
nan 1994d38ccd Add comprehensive tests for image processing and mask functionalities
- Introduced tests for color image handling, ensuring source preservation and premultiplied alpha usage.
- Implemented tests for brush stroke operations, validating segment boundaries and brush anti-aliasing.
- Added tests for frame anti-aliasing, confirming correct rendering behavior with various alpha values and depth settings.
- Created tests for frame projection, ensuring accurate overlap calculations and half-plane clipping.
- Developed tests for image premultiplied retention, verifying behavior during loading and packing processes.
- Added undo functionality tests for mask operations, ensuring single transaction behavior during edits.
2026-09-05 21:33:11 +08:00

92 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## ADDED Requirements
### Requirement: Frame selects the bottom valid source for hidden RGB
Frame SHALL 在每个输出像素复用当前有效投影和从远到近的稳定深度顺序,以第一个几何有效样本作为底层 RGB 来源。底层判定 SHALL 独立于 Alpha,并 SHALL 沿用相同深度时 active 位于最上层、其他对象按名称稳定排序的规则。
#### Scenario: Transparent foreground overlaps a transparent background
- **WHEN** 蓝色底层和红色前景覆盖同一像素,且两者 Alpha 都为零
- **THEN** 输出 RGB SHALL 为底层蓝色
- **AND** 输出 Alpha SHALL 为零
#### Scenario: The farthest image does not cover a pixel
- **WHEN** 最远图片在某像素没有有效投影,而其他图片具有有效投影
- **THEN** 该像素的底层来源 SHALL 为实际覆盖它的最远有效图片
#### Scenario: Transparent images share the same depth
- **WHEN** active 与另一透明图片在相同深度覆盖同一像素
- **THEN** 底层 RGB SHALL 来自非 active 图片
- **AND** 多个非 active 同深度图片 SHALL 沿用现有名称排序确定底层
#### Scenario: Source planes cross
- **WHEN** 两张透明图片的平面相交,并在不同像素交换前后关系
- **THEN** 各像素的隐藏 RGB SHALL 分别来自该像素处最底层的有效图片
#### Scenario: Projection validity depends on the view mode
- **WHEN** 一个候选底层在透视视图中位于观察方向后方,或无法取得有限且位于源边界内的交点
- **THEN** 该样本 SHALL 不作为底层来源
- **AND** 正交视图中有限且位于源边界内的非正深度交点 SHALL 继续具有底层资格
### Requirement: Frame preserves bottom RGB in transparent output
Frame SHALL 在最终 straight RGBA 转换后 Alpha 为零且具有有效源覆盖的像素中,保存底层源未乘 Alpha 的 RGB 双线性采样结果。采样 SHALL 使用现有 Frame 投影坐标和边界约定;系统 SHALL 保持当前 Alpha 可见性数值判定与最终 Alpha 结果。
#### Scenario: A masked single image is framed without resampling displacement
- **WHEN** 单张图片经 Mask 剔除 Alpha 后,以原尺寸和像素中心对齐的映射执行 Frame
- **THEN** 透明区域的 RGB SHALL 与源图片对应像素一致
- **AND** Alpha SHALL 保持剔除后的结果
#### Scenario: Transparent source colors require interpolation
- **WHEN** Frame 缩放或透视映射在底层完全透明区域取得非整数像素采样位置
- **THEN** RGB SHALL 为底层原始 RGB 的双线性插值结果
- **AND** Alpha SHALL 保持零
#### Scenario: Mask Add follows a packed Frame result
- **WHEN** 用户对 Mask 剔除后经 Frame 生成的单图 Packed Image 执行 Mask Add
- **THEN** 提升 Alpha 的区域 SHALL 显示 Frame 保留的底层颜色
- **AND** 该颜色 SHALL 在 Packed Image 像素中实际存在
### Requirement: Frame blends foreground RGB over bottom color with independent alpha
Frame SHALL 以最底层有效源的原始 RGB 双线性样本初始化颜色,随后从远到近对每个前景计算 C = P_front + C × (1 - A_front),其中 P_front 为预乘后插值的 RGB。Alpha SHALL 从零开始对包括底层在内的全部有效层独立执行 source-over,并沿用现有数值判定。最终 RGB SHALL 不除以合成 Alpha。
#### Scenario: Both layers are partially transparent
- **WHEN** 蓝色底层 Alpha 为 0.5,红色前景 Alpha 为 0.25
- **THEN** 输出 Alpha SHALL 为 0.625
- **AND** straight RGB SHALL 为红色 0.25、绿色 0、蓝色 0.75
#### Scenario: A visible foreground overlaps a transparent bottom layer
- **WHEN** 蓝色底层 Alpha 为零,红色前景 Alpha 为 0.25
- **THEN** 输出 SHALL 为 RGB (0.25, 0, 0.75) 和 Alpha 0.25
- **AND** 恢复 Alpha 后 SHALL 保留相同 RGB
#### Scenario: Hidden neighbor colors meet a visible sampling edge
- **WHEN** 前景插值邻域同时含有可见红色像素和完全透明绿色像素
- **THEN** 前景采样 SHALL 沿用预乘插值结果并按采样 Alpha 混入底色
- **AND** 隐藏绿色 SHALL 不污染可见红色
#### Scenario: Restoring alpha reveals a continuous transition into white
- **WHEN** 前景原图的黑色背景被 Alpha 隐藏,前景边缘 Alpha 逐渐下降,且底层原始 RGB 为白色、Alpha 为零
- **THEN** RGB SHALL 随前景 Alpha 连续过渡到白色
- **AND** Packed Image 经 Mask Add 恢复 Alpha 后 SHALL 保留该过渡
### Requirement: Source coverage takes priority over edge color extension
Frame SHALL 保持完整 Canvas 和源外透明边缘扩色。存在有效源覆盖且最终透明的像素 SHALL 使用底层 RGB;没有有效源覆盖的像素 SHALL 保持 Alpha 零,并沿用紧邻可见内容的一圈 RGB 扩色,其余区域保持透明黑色。
#### Scenario: Transparent source pixels border visible content
- **WHEN** 源内部透明像素紧邻可见像素,且隐藏 RGB 与相邻可见颜色不同
- **THEN** 源内部透明像素 SHALL 保留底层原始 RGB
- **AND** 该 RGB SHALL 不被边缘扩色覆盖
#### Scenario: The frame extends beyond all source images
- **WHEN** Frame 包含所有源投影之外的区域
- **THEN** 外部像素 Alpha SHALL 为零
- **AND** 一圈扩色之外的无覆盖像素 SHALL 为透明黑色
- **AND** Canvas 尺寸 SHALL 保持原有 Frame 规则
#### Scenario: A visible edge crosses a processing chunk boundary
- **WHEN** 可见边缘跨越 Frame 行块边界
- **THEN** 透明边缘颜色 SHALL 与使用同一规则处理完整画布的结果一致