feat: TCustomOpenGLControl.PixelScale — devicePixelRatio для HiDPI

LOpenGLPixelScale в Qt-бэкенде (QLCLGLWidget_devicePixelRatioF),
на прочих бэкендах возвращает 1.0. Нужен коду с явными glViewport
и текстурами в физических пикселях.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-04 16:12:11 +03:00
co-authored by Claude Fable 5
parent ac46e3d13a
commit dd9717b982
2 changed files with 26 additions and 5 deletions
+14 -5
View File
@@ -57,6 +57,7 @@ uses
qtwidgets, qtint;
procedure LOpenGLViewport(Handle: HWND; Left, Top, Width, Height: integer);
function LOpenGLPixelScale(Handle: HWND): Double;
procedure LOpenGLSwapBuffers(Handle: HWND);
function LOpenGLMakeCurrent(Handle: HWND): boolean;
function LOpenGLReleaseContext(Handle: HWND): boolean;
@@ -250,17 +251,25 @@ begin
end;
end;
procedure LOpenGLViewport(Handle: HWND; Left, Top, Width, Height: integer);
// devicePixelRatio виджета (1.0 если недоступен) — для явных glViewport
// в пользовательском коде и текстур в физических пикселях.
function LOpenGLPixelScale(Handle: HWND): Double;
var
Widget: TQtGLWidget;
Dpr: Double;
begin
Dpr := 1.0;
Result := 1.0;
if (Handle <> 0) and Assigned(QLCLGLWidget_devicePixelRatioF) then begin
Widget := TQtGLWidget(Handle);
Dpr := QLCLGLWidget_devicePixelRatioF(Widget.Widget);
if Dpr <= 0 then Dpr := 1.0;
Result := QLCLGLWidget_devicePixelRatioF(Widget.Widget);
if Result <= 0 then Result := 1.0;
end;
end;
procedure LOpenGLViewport(Handle: HWND; Left, Top, Width, Height: integer);
var
Dpr: Double;
begin
Dpr := LOpenGLPixelScale(Handle);
glViewport(Round(Left*Dpr), Round(Top*Dpr), Round(Width*Dpr), Round(Height*Dpr));
end;