Ω-W1-T3 review fixes: skip meter invalidate when covered; push fast-path predicates into core

Fixes the critical finding — Browse/curve-popup no longer trigger 60 Hz
whole-client repaints when the meter is invisible. Pushes the fast-path and
self-containment geometry into master_meter with tests; batches the four minor
findings.
This commit is contained in:
2026-08-03 13:31:50 -04:00
parent 4320bfdb08
commit dd067a192e
9 changed files with 102 additions and 21 deletions
+5 -1
View File
@@ -284,7 +284,11 @@ against a performance budget — they are there because `VoiceEngine::applyLiveT
a flag would paint a meter frame over a face that had really changed. What stays outside the
field stays on the full path: the static numeral gutter (AA text re-blended onto itself every
frame thickens) and the GR lamp (drawn straight onto the deck group's gradient, which a
sub-rect fill cannot reproduce), so a lamp transition takes a whole-client repaint.
sub-rect fill cannot reproduce), so a lamp transition takes a whole-client repaint. **When the
meter is covered or absent** (Browse, the curve popup, the empty state) `invalidateMeter`
skips invalidating anything at all rather than falling back to a whole-client repaint — the
ballistics still advance on `onMeterTimer`'s own clock, but nothing visible changed, so a
60 FPS whole-client repaint under a modal sheet would be pure cost for zero pixels shown.
- The bake's availability probe runs on the SAME tick that paints the button, so the
control can never be enabled on one tick and refuse on the next. The bake Hold control's
applicability (`resolveBakeHoldNeeded`) rides the same tick for the same reason, and