From f061c413de2e3fdc4cc1578f420651a7c45da3e9 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 23 Apr 2020 06:32:56 +0200 Subject: [PATCH] Windows: Fix wrong DPI used in font size after changing scaling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QWindowsFontDatabase::defaultVerticalDPI(), which was used for converting the point sizes was missing an updating logic for scaling changes. When implementing it, it turned out that the value obtained from GetDC(0) does not adapt to scaling changes. Remove the function and set it from the screen manager directly to the DPI of the primary screen. Pick-to: 5.15 Task-number: QTBUG-82267 Change-Id: If05ebc893fe78a9461500aba97f2dc127cdf4406 Reviewed-by: André de la Rocha Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../windows/qwindowsfontdatabasebase.cpp | 19 ++++++++----------- .../windows/qwindowsfontdatabasebase_p.h | 2 ++ .../platforms/windows/qwindowsscreen.cpp | 6 +++++- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase.cpp index e6dee54d849..568d1463e7f 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase.cpp @@ -624,19 +624,16 @@ void QWindowsFontDatabaseBase::createDirectWriteFactory(IDWriteFactory **factory } #endif // !defined(QT_NO_DIRECTWRITE) +static int s_defaultVerticalDPI = 96; // Native Pixels + int QWindowsFontDatabaseBase::defaultVerticalDPI() { - static int vDPI = -1; - if (vDPI == -1) { - if (HDC defaultDC = GetDC(0)) { - vDPI = GetDeviceCaps(defaultDC, LOGPIXELSY); - ReleaseDC(0, defaultDC); - } else { - // FIXME: Resolve now or return 96 and keep unresolved? - vDPI = 96; - } - } - return vDPI; + return s_defaultVerticalDPI; +} + +void QWindowsFontDatabaseBase::setDefaultVerticalDPI(int d) +{ + s_defaultVerticalDPI = d; } LOGFONT QWindowsFontDatabaseBase::fontDefToLOGFONT(const QFontDef &request, const QString &faceName) diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase_p.h b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase_p.h index 5b9db5dede1..55763f7c762 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase_p.h +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase_p.h @@ -93,6 +93,8 @@ public: QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) override; static int defaultVerticalDPI(); + static void setDefaultVerticalDPI(int d); + static QSharedPointer data(); #if !defined(QT_NO_DIRECTWRITE) static void createDirectWriteFactory(IDWriteFactory **factory); diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp index 8850d8cdd42..689624ff2a1 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.cpp +++ b/src/plugins/platforms/windows/qwindowsscreen.cpp @@ -51,6 +51,7 @@ #include #include #include +#include #include #include @@ -111,8 +112,11 @@ static bool monitorData(HMONITOR hMonitor, QWindowsScreenData *data) // EnumDisplayMonitors (as opposed to EnumDisplayDevices) enumerates only // virtual desktop screens. data->flags |= QWindowsScreenData::VirtualDesktop; - if (info.dwFlags & MONITORINFOF_PRIMARY) + if (info.dwFlags & MONITORINFOF_PRIMARY) { data->flags |= QWindowsScreenData::PrimaryScreen; + if ((data->flags & QWindowsScreenData::LockScreen) == 0) + QWindowsFontDatabase::setDefaultVerticalDPI(data->dpi.second); + } return true; }