Repository navigation
Description
Objective. Close the two gaps left by 20.4: give the Properties panel's mask stack section a screenshot acceptance against CS6, and give the compositor a mask sampling resolution that matches the mask's own image rather than the canvas's.
Why. The mask stack landed as a model, a persistence format and a fold operation. Two things were never established, and both are the kind of gap that only shows up once a user has the feature open. The panel section is unstyled relative to the rest of the Properties panel, so the feature looks unfinished next to everything around it. And the compositor samples every level's mask at the canvas resolution — so a mask authored at a different resolution than the canvas shows sampling artifacts, and the fold is a hard per-pixel operation with no feathering beyond the mask's own gray level. CS6's feather control has no equivalent in FireCraft at all.
Current state. The stack model, FWMap persistence, the compositor fold and the level panel are in flight in PR #113 (head 71e375b4). The Properties panel's mask stack section is implemented but unstyled, and the Phase 22 screenshot audit has not covered it. The compositor samples at canvas resolution.
Authority. crates/compose/src/render.rs for the sampling path; crates/doc/src/fwmap/ for the mask's stored resolution; the CS6 Properties panel mask section and its feather control as the behavioural authority; the Phase 22 screenshot audit as the acceptance format.
Work.
- Screenshot acceptance. Style the Properties panel's mask stack section to match the rest of the panel, and take a screenshot of a document with two masks showing two rows, captured against the CS6 Properties panel's mask section as the reference.
- Sampling resolution. Sample each level's mask at the mask image's own resolution rather than at the canvas resolution, so a mask authored at a different size than the canvas does not show sampling artifacts.
- Decide and record the feather story: either implement a feather control comparable to CS6's, or state explicitly in the docs that FireCraft's fold has no feathering beyond the mask's own gray level.
Acceptance.
- The Properties panel's mask stack section is styled consistently with the rest of the panel.
- A screenshot of a two-mask document showing two rows exists in the Phase 22 audit, with the CS6 Properties panel mask section as the reference.
- A mask authored at a resolution different from the canvas's renders without sampling artifacts.
- The feather behaviour is either implemented and covered by a test, or documented as an explicit limitation.
Verification. cargo run -p xtask -- ci green; a compose test renders a document whose canvas and mask resolutions differ and asserts the result matches a reference render at the mask's own resolution.
Boundaries. The mask stack is a FireCraft extension — CS6 has one element mask per object and no stack. The screenshot acceptance compares FireCraft's mask section against CS6's single-mask section for style and behaviour, not for feature parity.
Tracking. Task #143; PR #113 for the base feature.
Next action (owner: shell + compose). Land PR #113 first — the styling and the sampling change are follow-ups on top of it, not part of it. Then take the sampling fix as a small, separately testable compose change with the differing-resolution case as its regression test.
Activity