mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 17:27:32 +00:00
fix(macos): S-метр, линейка и зумбар больше не мылятся на Retina
Cocoa рисует канву в физических пикселях, TBitmap всегда 1x, поэтому кадр,
собранный в offscreen-битмап логического размера, растягивался вдвое.
PlatformUtils.GetScreenScale возвращает 2 на Retina и 1 на остальных
платформах. Масштаб — обычная переменная, а не условная компиляция: на
Windows/Linux умножение на 1 даёт прежние числа, а на канву кадр кладётся
через Draw, как и раньше (StretchDraw только при масштабе > 1).
В SMeterView, RulerView и PanZoomBar битмап растёт в S раз, пиксельные
константы, размеры шрифтов и толщина пера умножаются на S. Перо важно
отдельно: иначе на Retina все риски стали бы вдвое тоньше.
RulerView кэширует битмап, поэтому смена масштаба сбрасывает кэш.
PanZoomBar.ThumbGeom получил параметр AScale: отрисовка зовёт его с
физической шириной, хит-тест мыши — с логической, код мыши не менялся.
Objective-C изолирован в MacScale.pas: {$MODESWITCH OBJECTIVEC1} несовместим
с {$MODE Delphi}, а DWARF-3 (-gw3, Debug-режим lazbuild) роняет FPC 3.2.4 с
internal error 200609171 на любых Objective-C типах — отсюда {$DEBUGINFO OFF}.
Замер после правки: 37.5% CPU против 38% базовых, отрисовка этих трёх
элементов ниже уровня шума в профиле.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+16
-1
@@ -12,6 +12,9 @@ interface
|
||||
|
||||
function HasOpenGLSpectrumSwitch: Boolean;
|
||||
function CurrentScreenDPI: Integer;
|
||||
// Целочисленный масштаб канвы экрана: 2 на Retina, 1 везде остальном.
|
||||
// Windows/Linux всегда получают 1 ⇒ умножение на него ничего не меняет.
|
||||
function GetScreenScale: Integer;
|
||||
// Возвращает каталог для хранения конфигурации (с завершающим разделителем).
|
||||
// macOS: ~/Library/Application Support/ewsdr/
|
||||
// Linux: ~/.config/ewsdr/
|
||||
@@ -21,7 +24,8 @@ function GetAppCfgDir: string;
|
||||
implementation
|
||||
|
||||
uses
|
||||
SysUtils {$IFNDEF HEADLESS}, Forms{$ENDIF};
|
||||
SysUtils {$IFNDEF HEADLESS}, Forms{$ENDIF}
|
||||
{$IF DEFINED(DARWIN) AND NOT DEFINED(HEADLESS)}, MacScale{$ENDIF};
|
||||
|
||||
function HasOpenGLSpectrumSwitch: Boolean;
|
||||
var
|
||||
@@ -42,6 +46,17 @@ begin
|
||||
Exit(True);
|
||||
end;
|
||||
|
||||
function GetScreenScale: Integer;
|
||||
begin
|
||||
{$IF DEFINED(DARWIN) AND NOT DEFINED(HEADLESS)}
|
||||
// Cocoa рисует канву в физических пикселях, а TBitmap всегда 1x. Кто рисует
|
||||
// через offscreen-битмап, должен растить его в GetScreenScale раз.
|
||||
Result := MacBackingScale;
|
||||
{$ELSE}
|
||||
Result := 1;
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
function CurrentScreenDPI: Integer;
|
||||
begin
|
||||
{$IFNDEF HEADLESS}
|
||||
|
||||
Reference in New Issue
Block a user