You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
chromium/SOURCES/chromium-114-qt_logical_sca...

60 lines
2.2 KiB

commit ff39a278ddccf61716a7dbcb575415801bbf8ded
Author: Tom Anderson <thomasanderson@chromium.org>
Date: Wed May 31 18:31:09 2023 +0000
[QT] Account for logical scale factor
Previously we were only using the device pixel ratio. But QT UI
scales with both the device pixel ratio and the logical DPI. This CL
sets Chrome's scale factor to be the product of these two.
R=thestig
CC=jkummerow
Change-Id: I9bd414046058e741450fabae4913d47a16ca48c3
Bug: 1439149
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4575572
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Thomas Anderson <thomasanderson@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1151380}
diff --git a/ui/qt/qt_shim.cc b/ui/qt/qt_shim.cc
index 0aec9c3aed4ad..3780f8c3988b4 100644
--- a/ui/qt/qt_shim.cc
+++ b/ui/qt/qt_shim.cc
@@ -7,7 +7,7 @@
#include "ui/qt/qt_shim.h"
-#include <stdio.h>
+#include <cmath>
#include <QApplication>
#include <QFont>
@@ -219,7 +219,24 @@ QtShim::QtShim(QtInterface::Delegate* delegate, int* argc, char** argv)
QtShim::~QtShim() = default;
double QtShim::GetScaleFactor() const {
- return app_.devicePixelRatio();
+ constexpr double kDefaultPixelDpi = 96.0;
+ // Use the largest scale factor across all displays as the global scale
+ // factor. This matches the behavior of `app_.devicePixelRatio()`, except
+ // this also takes into account the logical DPI.
+ // TODO(https://crbug.com/1450301): Unlike GTK, QT supports per-display
+ // scaling. Use this instead of the max scale factor.
+ double scale = 0.0;
+ for (QScreen* screen : app_.screens()) {
+ scale =
+ std::max(scale, screen->devicePixelRatio() *
+ screen->logicalDotsPerInch() / kDefaultPixelDpi);
+ }
+ // Round to the nearest 16th so that UI can losslessly multiply and divide
+ // by the scale factor using floating point arithmetic. GtkUi also rounds
+ // in this way, but to 1/64th. 1/16th is chosen here since that's what
+ // KDE settings uses.
+ scale = std::round(scale * 16) / 16;
+ return scale > 0 ? scale : 1.0;
}
FontRenderParams QtShim::GetFontRenderParams() const {