Skip to content

GPU slice flags: consistent AA on hover (option b) + idle re-raster optimizations (follow-up to #3695) #3746

Description

@ten9876

Follow-up to #3695 (GPU-composite slice flags). The maintainer decision on the AA visual trade-off was option (a) — ship as-is: at rest a flag is a GPU sprite (grayscale AA); on hover/focus it's a live widget (ClearType subpixel AA), so flag text rendering changes on hover. This issue tracks revisiting that for consistency.

The improvement: option (b) — consistent AA, no hover-pop

Force QFont::NoSubpixelAntialias on the live flags too, so both states render text the same way (grayscale). This removes the visible grayscale↔ClearType "pop" when the cursor enters/leaves a flag, at the cost of slightly softer text on the live flag. It keeps the full −45% main-thread CPU win from #3695 — it's purely a rendering-consistency change (~1 line on the live-flag font hint).

Why deferred, not done now: shipping (a) first gets the #3617 performance win to users immediately (it's the flag-composite cost behind the laptop-lag reports). The AA consistency is a polish refinement, not a correctness issue, so it's tracked here for a follow-up once (a) has had real-world exposure and we can judge whether the hover-pop is actually bothersome in practice.

Scope: the live-flag rasterization path in SpectrumWidget (where a flag promotes to a live VfoWidget on hover/focus/popup) — apply NoSubpixelAntialias to match the at-rest sprite.

Related minor follow-ups raised in the #3695 review (non-blocking)

  • 80 ms blank on first slice creation. addVfoWidget() shows the widget but doesn't grab a sprite immediately; if the new flag isn't the live flag, it can render as neither widget nor sprite until the refresh timer fires (~80 ms). A grabFlagSprites() at the end of addVfoWidget() closes the gap. (Usually masked because new slices are typically the active/live flag.)
  • Idle 12.5 Hz re-raster. The refresh timer QWidget::renders every non-live flag every 80 ms regardless of whether content/geometry changed or whether the panadapter is visible. Pausing the timer when !isVisible() and/or skipping the re-raster when nothing dirtied would reduce the idle floor further on slow hardware — exactly the case perf(panadapter): main-thread CPU ~75–95% is Qt CPU-side compositing of translucent child widgets over the QRhiWidget (render is 0.4 ms) #3617 cares about.

Refs #3695, #3617.

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    GUIUser interfaceenhancementImprovement to existing featuremaintainer-reviewRequires maintainer review before any action is takenpriority: lowLow priorityspectrumPanadapter and waterfall

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions