Commit 8badbd50 authored by Tor Arne Vestbø's avatar Tor Arne Vestbø
Browse files

iOS: Report correct physicalSize and physicalDotsPerInch for iPhone6+


On iPhone 6(s) Plus devices, or when display zoom is enabled in an iPhone 6,
the render buffer is scaled before being output on the physical display.
We have to take this into account when computing the physical size.

Task-number: QTBUG-50941
Change-Id: I318f3a866d039fccf0ba08f381fc9d8bcd676acd
Reviewed-by: default avatarRichard Moe Gustavsen <richard.gustavsen@theqtcompany.com>
Showing with 22 additions and 7 deletions
...@@ -73,7 +73,7 @@ private: ...@@ -73,7 +73,7 @@ private:
QRect m_geometry; QRect m_geometry;
QRect m_availableGeometry; QRect m_availableGeometry;
int m_depth; int m_depth;
uint m_pixelDensity; uint m_physicalDpi;
QSizeF m_physicalSize; QSizeF m_physicalSize;
QIOSOrientationListener *m_orientationListener; QIOSOrientationListener *m_orientationListener;
}; };
......
...@@ -180,18 +180,18 @@ QIOSScreen::QIOSScreen(UIScreen *screen) ...@@ -180,18 +180,18 @@ QIOSScreen::QIOSScreen(UIScreen *screen)
if (deviceIdentifier.contains(QRegularExpression("^iPhone(7,1|8,2)$"))) { if (deviceIdentifier.contains(QRegularExpression("^iPhone(7,1|8,2)$"))) {
// iPhone 6 Plus or iPhone 6S Plus // iPhone 6 Plus or iPhone 6S Plus
m_pixelDensity = 401; m_physicalDpi = 401;
} else if (deviceIdentifier.contains(QRegularExpression("^iPad(1,1|2,[1-4]|3,[1-6]|4,[1-3]|5,[3-4]|6,[7-8])$"))) { } else if (deviceIdentifier.contains(QRegularExpression("^iPad(1,1|2,[1-4]|3,[1-6]|4,[1-3]|5,[3-4]|6,[7-8])$"))) {
// All iPads except the iPad Mini series // All iPads except the iPad Mini series
m_pixelDensity = 132 * devicePixelRatio(); m_physicalDpi = 132 * devicePixelRatio();
} else { } else {
// All non-Plus iPhones, and iPad Minis // All non-Plus iPhones, and iPad Minis
m_pixelDensity = 163 * devicePixelRatio(); m_physicalDpi = 163 * devicePixelRatio();
} }
} else { } else {
// External display, hard to say // External display, hard to say
m_depth = 24; m_depth = 24;
m_pixelDensity = 96; m_physicalDpi = 96;
} }
for (UIWindow *existingWindow in [[UIApplication sharedApplication] windows]) { for (UIWindow *existingWindow in [[UIApplication sharedApplication] windows]) {
...@@ -253,8 +253,23 @@ void QIOSScreen::updateProperties() ...@@ -253,8 +253,23 @@ void QIOSScreen::updateProperties()
} }
if (m_geometry != previousGeometry) { if (m_geometry != previousGeometry) {
const qreal millimetersPerInch = 25.4; QRectF physicalGeometry;
m_physicalSize = QSizeF(m_geometry.size() * devicePixelRatio()) / m_pixelDensity * millimetersPerInch; if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_8_0) {
// We can't use the primaryOrientation of screen(), as we haven't reported the new geometry yet
Qt::ScreenOrientation primaryOrientation = m_geometry.width() >= m_geometry.height() ?
Qt::LandscapeOrientation : Qt::PortraitOrientation;
// On iPhone 6+ devices, or when display zoom is enabled, the render buffer is scaled
// before being output on the physical display. We have to take this into account when
// computing the physical size. Note that unlike the native bounds, the physical size
// follows the primary orientation of the screen.
physicalGeometry = mapBetween(nativeOrientation(), primaryOrientation, fromCGRect(m_uiScreen.nativeBounds).toRect());
} else {
physicalGeometry = QRectF(0, 0, m_geometry.width() * devicePixelRatio(), m_geometry.height() * devicePixelRatio());
}
static const qreal millimetersPerInch = 25.4;
m_physicalSize = physicalGeometry.size() / m_physicalDpi * millimetersPerInch;
} }
// At construction time, we don't yet have an associated QScreen, but we still want // At construction time, we don't yet have an associated QScreen, but we still want
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment