Android: Fix reporting of QScreen's size() and physicalSize()
The screen's DPI need to be accounted for when calculating the size in mm from pixels. This was missing after multi-displays support was added for Android. Amends fbf586db2c587e7ba83cf1bfe8e5b912310d6bdb. Fixes: QTBUG-112742 Change-Id: I31814faa8de68e5193757d52e264b8ed90ae56b6 Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io> (cherry picked from commit 436923a76c4c60ad7271a66821768b06573310ce)
This commit is contained in:
parent
1cdc197664
commit
60dd3b71bb
@ -53,6 +53,7 @@ private:
|
||||
#endif
|
||||
|
||||
Q_DECLARE_JNI_CLASS(Display, "android/view/Display")
|
||||
Q_DECLARE_JNI_CLASS(DisplayMetrics, "android/util/DisplayMetrics")
|
||||
|
||||
Q_DECLARE_JNI_TYPE(DisplayMode, "Landroid/view/Display$Mode;")
|
||||
|
||||
@ -79,12 +80,21 @@ QAndroidPlatformScreen::QAndroidPlatformScreen(const QJniObject &displayObject)
|
||||
if (!displayObject.isValid())
|
||||
return;
|
||||
|
||||
m_size = QSize(displayObject.callMethod<jint>("getWidth"), displayObject.callMethod<jint>("getHeight"));
|
||||
m_name = displayObject.callObjectMethod<jstring>("getName").toString();
|
||||
m_refreshRate = displayObject.callMethod<jfloat>("getRefreshRate");
|
||||
m_displayId = displayObject.callMethod<jint>("getDisplayId");
|
||||
|
||||
QJniObject displayMetricsObj(QtJniTypes::className<QtJniTypes::DisplayMetrics>());
|
||||
displayObject.callMethod<void>("getRealMetrics", displayMetricsObj.object<QtJniTypes::DisplayMetrics>());
|
||||
|
||||
const int widthPixels = displayMetricsObj.getField<int>("widthPixels");
|
||||
const int heightPixels = displayMetricsObj.getField<int>("heightPixels");
|
||||
m_size = QSize(widthPixels, heightPixels);
|
||||
|
||||
if (QNativeInterface::QAndroidApplication::sdkVersion() >= 23) {
|
||||
const qreal xdpi = displayMetricsObj.getField<float>("xdpi");
|
||||
const qreal ydpi = displayMetricsObj.getField<float>("ydpi");
|
||||
|
||||
const QJniObject currentMode = displayObject.callObjectMethod<QtJniTypes::DisplayMode>("getMode");
|
||||
const jint currentModeId = currentMode.callMethod<jint>("getModeId");
|
||||
|
||||
@ -96,8 +106,9 @@ QAndroidPlatformScreen::QAndroidPlatformScreen(const QJniObject &displayObject)
|
||||
const auto size = env->GetArrayLength(modeArray);
|
||||
for (jsize i = 0; i < size; ++i) {
|
||||
const auto mode = QJniObject::fromLocalRef(env->GetObjectArrayElement(modeArray, i));
|
||||
const int physicalWidth = mode.callMethod<jint>("getPhysicalWidth");
|
||||
const int physicalHeight = mode.callMethod<jint>("getPhysicalHeight");
|
||||
// Physical sizes in millimeters
|
||||
const int physicalWidth = qRound(mode.callMethod<jint>("getPhysicalWidth") / xdpi * 25.4);
|
||||
const int physicalHeight = qRound(mode.callMethod<jint>("getPhysicalHeight") / ydpi * 25.4);
|
||||
|
||||
if (currentModeId == mode.callMethod<jint>("getModeId")) {
|
||||
m_currentMode = i;
|
||||
|
Loading…
x
Reference in New Issue
Block a user