docs: close out Θ-W6 and Phase Θ, and file two legibility-pass deferrals

This commit is contained in:
2026-08-01 10:36:22 -04:00
parent 7504eefb59
commit ae9019465e
3 changed files with 145 additions and 53 deletions
+61
View File
@@ -552,3 +552,64 @@ cell widths are unchanged.
`enforceGateUnavailableWhileDrawn` (`core/instrument/engine/play_params.h`), now the
single home of that rule, called by both `resolvePlay` and the editor's
`applyControl`.
### Θ-W6-T1 — legibility-and-antialiasing
Made the editor legible, then audited every drawn surface for high-DPI clean rendering
— sequenced sizing first, audit second, since the audit's disposition list needed a
surface that had stopped moving.
- **Sizing.** Knobs grew 28→40 px (inner curve dial 14→20), the deck cell 48×58→60×74,
and the label band 12→16 px, now drawn in `Font::Label` rather than `Font::Micro`.
Group captions and toggle segments deliberately stay `Font::Micro` — bumping them
would grow the per-group `captionWidth` reserves, and row 1 has only 14 px of
headroom at the floor width.
- **Editor default/minimum size 840×620 → 980×680**, because the deck cannot pack
three rows at the old floor with the wider cells. An existing saved instance's
window grows on open. The floor is validated by a derived test rather than
literals.
- **All 14 time-constant labels now read in ms**; internal representation untouched
(`formatEnvTimeMs` is display-only). `holdFraction` knobs and `Len %` stay `%`
they are fractions, not times. The bank panel's clip-length readout is a duration,
not a parameter time constant, and stayed out of scope.
- **Double-click reset, per ring.** Outer ring resets the value, inner dial resets
the exponent to 1.0, independently. The window class gained `CS_DBLCLKS`;
`WM_RBUTTONDBLCLK` was added as its peer so the spline right-click delete survives,
and both DBLCLK handlers fall through to the ordinary down handler. The chrome's
preview-velocity knob answers reset too, resolving against the drawn circle via a
shared `inKnobFace` rule now used by both the deck and the chrome.
- **Antialiasing pass.** Fixed: knob track/value arcs (widened to 3 px stacked-radius
AA arcs), knob needle (`LICE_ThickFLine`), inner dial arc and needle, staged
envelope slopes, spline contour, velocity-popup trace, waveform outline, preview
triangle. Already clean: node handles, curve knots, knob discs, buttons, piano
keys, loop markers, borders, gradients, text. The full disposition table is a
standing artifact in `docs/product/visual-design-language.md` §8.
- Three LICE facts the audit established: `LICE_Line` takes integer endpoints so
`aa=true` still quantizes; `LICE_FillTriangle` has no `aa` parameter at all; LICE
has no thick-arc call, so a wider ring is stacked 1 px arcs.
- **Measured cost:** the new AA waveform stroke adds ~0.41 ms per full-grid panel
repaint (0.070 → 0.48 ms over a 24-card × 2-band × 136-column grid), ~2.5% of a
60 Hz frame. Recorded in the §8 table and annotated as a one-off scratchpad
measurement, not a standing regression guard.
- **The piano-key open question is answered: not aliasing.** Every key is an
axis-aligned integer-width `LICE_FillRect`, so there was no sloped edge for
aliasing to act on; the defect was integer-division residue in the tiling, and
W2-T3's fix (remainder moved into symmetric end margins) is arithmetic. Above
client-pixel scaling it is unverified — nothing implements
`IPlugViewContentScaleSupport`.
**Two structural changes forced by review.** The waveform column's vertical
arithmetic moved into a pure, unit-tested `waveformColumnSpan` in
`core/ui/component_geometry` — the first pass had silently broken symmetry about
the midline in the shared `draw_kit` primitive that also feeds the docked bank
panel and browse thumbnails. And `PlaySeconds` plus its `AdsrSeconds`/
`AhdSeconds`/`PitchEnvSeconds`/`FilterSeconds` companions hoisted out of
`sample_map.h` into a header-only `play_seconds` INTERFACE target, so the new
`core/instrument/ui/deck_values` module stops transitively linking the bank model
and WAV codec. `deck_values` itself is an extraction of `controlValue`/
`applyControl`/`resetDeckParam`/the ms formatter out of the editor shell, making
reset semantics unit-testable; `editor_controls.cpp` dropped 469→293 lines.
All visual outcomes remain **pending Daniel's by-eye sign-off on `dev`** — sizes,
arc weight, and whether the waveform stroke improves or thickens the docked panel.
Not recorded as accepted.