Drop per-frame alpha-restore pass on macOS spectrum

On Cocoa the full-bitmap alpha-restore pass is unnecessary: Canvas
operations keep alpha at $FF and the cached grid background is opaque,
so removing it cuts a full-frame O(W*H) pass per spectrum frame with no
visual change (verified on macOS).

Kept under {$IFNDEF DARWIN} for Qt6/win32 (different drawing backends
may zero alpha on antialiased edges) until visually verified there.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Uladzimir Karpenka
2026-05-29 14:31:18 +03:00
co-authored by Claude Opus 4.8
parent 55d5bf01cf
commit c3a8a14110
+9 -9
View File
@@ -722,8 +722,9 @@ procedure TSpectrumView.DrawSpectrum;
var
C, GC: TCanvas;
i, Yp, W, H, GX: Integer;
{$IFNDEF DARWIN}
RowLW: PLongWord;
AMask: LongWord;
{$ENDIF}
DBmin, DBmax, dB: Double;
VfoX, X1, X2: Integer;
TXVfoX, TXX1, TXX2: Integer;
@@ -931,13 +932,11 @@ begin
if Assigned(FVfoOverlay) then
FVfoOverlay.DrawOverlay(FSpectrumBitmap, W, H);
// Восстанавливаем непрозрачность: Canvas-операции (текст/линии со сглаживанием)
// могли занулить альфу. OR маской выставляет альфу в $FF, RGB не меняя.
{$IFDEF DARWIN}
AMask := $000000FF; // ARGB: альфа в байте 0
{$ELSE}
AMask := $FF000000; // BGRA: альфа в байте 3
{$ENDIF}
// Восстановление непрозрачности. На Cocoa проверено, что проход не нужен
// (Canvas-операции сохраняют альфу $FF), поэтому там его не делаем.
// На Qt6/win32 бэкенд другой и сглаженные края могут занулять альфу —
// оставляем быстрый dword-OR до проверки на этих платформах.
{$IFNDEF DARWIN}
FSpectrumBitmap.BeginUpdate(False);
for i := 0 to H - 1 do
begin
@@ -945,11 +944,12 @@ begin
if RowLW = nil then Continue;
for Yp := 0 to W - 1 do
begin
RowLW^ := RowLW^ or AMask;
RowLW^ := RowLW^ or $FF000000; // BGRA: альфа в байте 3
Inc(RowLW);
end;
end;
FSpectrumBitmap.EndUpdate(False);
{$ENDIF}
end;
// ────────────────────────────────────────────────────────────────────────────