From c3a8a14110167edcf51496b644128d513cd01990 Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Fri, 29 May 2026 14:31:18 +0300 Subject: [PATCH] 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 --- SpectrumView.pas | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/SpectrumView.pas b/SpectrumView.pas index 4e0271a..faf2bd1 100644 --- a/SpectrumView.pas +++ b/SpectrumView.pas @@ -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; // ────────────────────────────────────────────────────────────────────────────