Retain regional paint stacks and coordinate frames through simplify, offset, flatten, bucket normalization and Shape Builder. Preserve legacy fill semantics and synchronize importer warning catalogs. Verified with cargo xtask ci on Windows and Ubuntu/WSL, native UI screenshots, and CLI round-trip/export checks.
reverseLoop reversed the list and skipped shared segments, which only turns a
loop of three or more round: a one-segment loop has no order at all, and a
two-segment ring reads the same whichever way its list is turned, so both
answered reversed: true without moving.
Three or more segments: reverse the list and leave every stored end alone (a
shared one belongs to the neighbour too). One or two: store one segment the
other way round, skipping any segment another short loop lists; when none is
left to swap, refuse with a clear error and leave the document as it was.
Tests: two 2-segment areas over one line that share it, the shared segment
listed first in one area and last in the other; each reversal flips that area's
winding sign and leaves the shared segment and the neighbour alone. A shared
one-segment loop is refused. The 4-segment squares stay as the long-loop case.
Drop the two catalog.rs menu lines: they aren't in the reference app's menus,
and the Vector menu runs commands without parameters, so both would fail there.
Two vector commands behind the fill-rule panel, split out so they can land
on their own (the panel is held for a maintainer design decision):
- vector.fillRule {ids? | id?, region?, rule: nonZero|evenOdd} sets the
winding rule a filled area fills by (the whole layer when region is left out).
- vector.reverseLoop {ids? | id?, region, loop} turns one loop round, which is
how a hole is made and unmade.
reverseLoop no longer swaps the stored ends of a segment a loop shares with a
neighbour: reversing the loop's list already flips this loop's traversal of the
shared segment, so flipping its segment would turn the neighbour's area round
too (bug called out in review). A new test builds two areas that share a segment
and checks the shared segment and the neighbour's fill are left alone.
Adds the commands to the Vector menu (catalog/parity), their locale labels, and
vector_fill_rule_tests (rule per area or whole layer, junk refused, shared segment).