From fcb8dc0cb92f9cf689bfae4d5fff55d63ca4accb Mon Sep 17 00:00:00 2001 From: Jochen Seemann Date: Fri, 25 Jul 2014 16:03:18 +0300 Subject: WinRT: Fix physical size of screen Currently, the physical size of the screen is calculated with the logicalSize and the logicalDpi of the screen. This doesn't work because logicalDpi has a user-defined multiplier and a strange value. The easiest and accuratest way is to take the raw dpi of the axis and the raw pixel size (logicalSize*scaleFactor). This all is needed for a correct value of Screen.pixelDensity in QtQuick. Change-Id: I8be0139d762364140043c3fa0d203298ca7ef293 Reviewed-by: Jochen Seemann Reviewed-by: Andrew Knight --- src/plugins/platforms/winrt/qwinrtscreen.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'src/plugins/platforms/winrt') diff --git a/src/plugins/platforms/winrt/qwinrtscreen.cpp b/src/plugins/platforms/winrt/qwinrtscreen.cpp index 1a263719b5..c366babebc 100644 --- a/src/plugins/platforms/winrt/qwinrtscreen.cpp +++ b/src/plugins/platforms/winrt/qwinrtscreen.cpp @@ -448,6 +448,7 @@ public: QSizeF logicalSize; QSurfaceFormat surfaceFormat; qreal logicalDpi; + QDpi physicalDpi; qreal scaleFactor; Qt::ScreenOrientation nativeOrientation; Qt::ScreenOrientation orientation; @@ -629,7 +630,8 @@ QSurfaceFormat QWinRTScreen::surfaceFormat() const QSizeF QWinRTScreen::physicalSize() const { Q_D(const QWinRTScreen); - return d->logicalSize / d->logicalDpi * qreal(25.4); + return QSizeF(d->logicalSize.width() * d->scaleFactor / d->physicalDpi.first * qreal(25.4), + d->logicalSize.height() * d->scaleFactor / d->physicalDpi.second * qreal(25.4)); } QDpi QWinRTScreen::logicalDpi() const @@ -1137,6 +1139,14 @@ HRESULT QWinRTScreen::onDpiChanged(IDisplayInformation *, IInspectable *) RETURN_OK_IF_FAILED("Failed to get logical DPI."); d->logicalDpi = dpi; + hr = d->displayInformation->get_RawDpiX(&dpi); + RETURN_OK_IF_FAILED("Failed to get x raw DPI."); + d->physicalDpi.first = dpi ? dpi : 96.0; + + hr = d->displayInformation->get_RawDpiY(&dpi); + RETURN_OK_IF_FAILED("Failed to get y raw DPI."); + d->physicalDpi.second = dpi ? dpi : 96.0; + return S_OK; } -- cgit v1.2.3