Ω-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
@@ -54,6 +54,10 @@ void drawMeterNumerals(LICE_IBitmap* bmp, const MeterRects& m) {
// covers every pixel the rest of it then draws, so a meter frame can redraw this rect alone.
// Two bars or one is read off the rects (barB is empty exactly when the split is Single), so
// the lane decision has one representation here rather than two.
// This self-containment depends on Role::BgCell being fully OPAQUE at InteractionState::Rest
// (theme.cpp: alpha 255) — fillGradient blends rather than overwrites at alpha < 255, so a
// translucent BgCell would make every meter frame re-blend over whatever the last frame left,
// the exact AA-thickening the numeral gutter comment below is guarding against.
void drawMeterField(LICE_IBitmap* bmp, const MeterRects& m, const MasterMeterUi& state) {
// A column narrower than the interior needs yields all-empty rects, which under rect.h's
// contract means suppressed — not a zero-height field to fill, tick twelve times and cap.