From 439a6fec84a62b9d166b84dc7574ddc250a38bfb Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Thu, 4 Apr 2013 18:15:00 +0200 Subject: Android: set logicalDpi based on DisplayMetrics.scaledDensity The mathematically correct way would be to set logicalDPi to 160*scaledDensity, but then a 12 pt font would be gigantic. On iOS, we use a factor of 72 to be compatible with the native APIs, but that means that a 12 pt font is very small. A factor of 100 means that desktop apps look reasonable by default. Task-number: QTBUG-29674 Change-Id: I607f110150fb95685a6980b92f6f92f2b489f959 Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../src/org/qtproject/qt5/android/QtActivityDelegate.java | 2 +- .../jar/src/org/qtproject/qt5/android/QtNative.java | 14 ++++++++++---- .../jar/src/org/qtproject/qt5/android/QtSurface.java | 5 +++-- src/plugins/platforms/android/src/androidjnimain.cpp | 11 +++++++++-- src/plugins/platforms/android/src/androidjnimain.h | 1 + .../platforms/android/src/opengl/qeglfshooks_android.cpp | 7 +++++++ .../android/src/raster/qandroidplatformscreen.cpp | 6 ++++++ .../platforms/android/src/raster/qandroidplatformscreen.h | 1 + 8 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java index b6e6e3397e..c1fe8920f5 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -476,7 +476,7 @@ public class QtActivityDelegate m_activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); QtNative.setApplicationDisplayMetrics(metrics.widthPixels, metrics.heightPixels, metrics.widthPixels, metrics.heightPixels, - metrics.xdpi, metrics.ydpi); + metrics.xdpi, metrics.ydpi, metrics.scaledDensity); } m_layout = new QtLayout(m_activity); m_surface = new QtSurface(m_activity, 0); diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java index 7cb3fdff45..4586ae2002 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -72,6 +72,7 @@ public class QtNative private static int m_displayMetricsDesktopHeightPixels = 0; private static double m_displayMetricsXDpi = .0; private static double m_displayMetricsYDpi = .0; + private static double m_displayMetricsScaledDensity = 1.0; private static int m_oldx, m_oldy; private static final int m_moveThreshold = 0; private static ClipboardManager m_clipboardManager = null; @@ -195,7 +196,8 @@ public class QtNative m_displayMetricsDesktopWidthPixels, m_displayMetricsDesktopHeightPixels, m_displayMetricsXDpi, - m_displayMetricsYDpi); + m_displayMetricsYDpi, + m_displayMetricsScaledDensity); if (params.length() > 0) params = "\t" + params; startQtApplication(f.getAbsolutePath() + "\t" + params, environment); @@ -209,7 +211,8 @@ public class QtNative int desktopWidthPixels, int desktopHeightPixels, double XDpi, - double YDpi) + double YDpi, + double scaledDensity) { /* Fix buggy dpi report */ if (XDpi < android.util.DisplayMetrics.DENSITY_LOW) @@ -224,7 +227,8 @@ public class QtNative desktopWidthPixels, desktopHeightPixels, XDpi, - YDpi); + YDpi, + scaledDensity); } else { m_displayMetricsScreenWidthPixels = screenWidthPixels; m_displayMetricsScreenHeightPixels = screenHeightPixels; @@ -232,6 +236,7 @@ public class QtNative m_displayMetricsDesktopHeightPixels = desktopHeightPixels; m_displayMetricsXDpi = XDpi; m_displayMetricsYDpi = YDpi; + m_displayMetricsScaledDensity = scaledDensity; } } } @@ -535,7 +540,8 @@ public class QtNative int desktopWidthPixels, int desktopHeightPixels, double XDpi, - double YDpi); + double YDpi, + double scaledDensity); public static native void handleOrientationChanged(int newOrientation); // screen methods diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java b/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java index 77126ec1c8..b994a43ac4 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java @@ -103,7 +103,7 @@ public class QtSurface extends SurfaceView implements SurfaceHolder.Callback DisplayMetrics metrics = new DisplayMetrics(); ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics); QtNative.setApplicationDisplayMetrics(metrics.widthPixels, - metrics.heightPixels, getWidth(), getHeight(), metrics.xdpi, metrics.ydpi); + metrics.heightPixels, getWidth(), getHeight(), metrics.xdpi, metrics.ydpi, metrics.scaledDensity); if (m_usesGL) holder.setFormat(PixelFormat.RGBA_8888); @@ -136,7 +136,8 @@ public class QtSurface extends SurfaceView implements SurfaceHolder.Callback width, height, metrics.xdpi, - metrics.ydpi); + metrics.ydpi, + metrics.scaledDensity); if (!m_started) return; diff --git a/src/plugins/platforms/android/src/androidjnimain.cpp b/src/plugins/platforms/android/src/androidjnimain.cpp index ae94e75e34..36d95b0816 100644 --- a/src/plugins/platforms/android/src/androidjnimain.cpp +++ b/src/plugins/platforms/android/src/androidjnimain.cpp @@ -123,6 +123,7 @@ static QAndroidPlatformIntegration *m_androidPlatformIntegration = 0; static int m_desktopWidthPixels = 0; static int m_desktopHeightPixels = 0; +static double m_scaledDensity = 0; static volatile bool m_pauseApplication; @@ -287,6 +288,11 @@ namespace QtAndroid return m_desktopHeightPixels; } + double scaledDensity() + { + return m_scaledDensity; + } + JavaVM *javaVM() { return m_javaVM; @@ -623,10 +629,11 @@ static void destroySurface(JNIEnv *env, jobject /*thiz*/) static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/, jint /*widthPixels*/, jint /*heightPixels*/, jint desktopWidthPixels, jint desktopHeightPixels, - jdouble xdpi, jdouble ydpi) + jdouble xdpi, jdouble ydpi, jdouble scaledDensity) { m_desktopWidthPixels = desktopWidthPixels; m_desktopHeightPixels = desktopHeightPixels; + m_scaledDensity = scaledDensity; if (!m_androidPlatformIntegration) { QAndroidPlatformIntegration::setDefaultDisplayMetrics(desktopWidthPixels,desktopHeightPixels, @@ -687,7 +694,7 @@ static JNINativeMethod methods[] = { {"resumeQtApp", "()V", (void *)resumeQtApp}, {"quitQtAndroidPlugin", "()V", (void *)quitQtAndroidPlugin}, {"terminateQt", "()V", (void *)terminateQt}, - {"setDisplayMetrics", "(IIIIDD)V", (void *)setDisplayMetrics}, + {"setDisplayMetrics", "(IIIIDDD)V", (void *)setDisplayMetrics}, {"setSurface", "(Ljava/lang/Object;)V", (void *)setSurface}, {"destroySurface", "()V", (void *)destroySurface}, {"lockSurface", "()V", (void *)lockSurface}, diff --git a/src/plugins/platforms/android/src/androidjnimain.h b/src/plugins/platforms/android/src/androidjnimain.h index 618bd87cdb..f75df55e02 100644 --- a/src/plugins/platforms/android/src/androidjnimain.h +++ b/src/plugins/platforms/android/src/androidjnimain.h @@ -81,6 +81,7 @@ namespace QtAndroid QWindow *topLevelWindowAt(const QPoint &globalPos); int desktopWidthPixels(); int desktopHeightPixels(); + double scaledDensity(); JavaVM *javaVM(); jclass findClass(const QString &className, JNIEnv *env); AAssetManager *assetManager(); diff --git a/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp b/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp index cd415843a7..4734d47eb3 100644 --- a/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp +++ b/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp @@ -56,6 +56,7 @@ public: EGLNativeDisplayType platformDisplay() const; QSize screenSize() const; QSizeF physicalScreenSize() const; + QDpi logicalDpi() const; int screenDepth() const; QSurfaceFormat surfaceFormatFor(const QSurfaceFormat &inputFormat) const; EGLNativeWindowType createNativeWindow(const QSize &size, const QSurfaceFormat &format); @@ -86,6 +87,12 @@ QSizeF QEglFSAndroidHooks::physicalScreenSize() const return QSizeF(QAndroidPlatformIntegration::m_defaultPhysicalSizeWidth, QAndroidPlatformIntegration::m_defaultPhysicalSizeHeight); } +QDpi QEglFSAndroidHooks::logicalDpi() const +{ + qreal lDpi = QtAndroid::scaledDensity() * 100; + return QDpi(lDpi, lDpi); +} + EGLNativeWindowType QEglFSAndroidHooks::createNativeWindow(const QSize &size, const QSurfaceFormat &format) { diff --git a/src/plugins/platforms/android/src/raster/qandroidplatformscreen.cpp b/src/plugins/platforms/android/src/raster/qandroidplatformscreen.cpp index 2779d7cffd..409c833db3 100644 --- a/src/plugins/platforms/android/src/raster/qandroidplatformscreen.cpp +++ b/src/plugins/platforms/android/src/raster/qandroidplatformscreen.cpp @@ -69,3 +69,9 @@ QRegion QAndroidPlatformScreen::doRedraw() QtAndroid::flushImage(mGeometry.topLeft(), *mScreenImage, touched.boundingRect()); return touched; } + +QDpi QAndroidPlatformScreen::logicalDpi() const +{ + qreal lDpi = QtAndroid::scaledDensity() * 100; + return QDpi(lDpi, lDpi); +} diff --git a/src/plugins/platforms/android/src/raster/qandroidplatformscreen.h b/src/plugins/platforms/android/src/raster/qandroidplatformscreen.h index df08e43af4..cfd503d611 100644 --- a/src/plugins/platforms/android/src/raster/qandroidplatformscreen.h +++ b/src/plugins/platforms/android/src/raster/qandroidplatformscreen.h @@ -50,6 +50,7 @@ class QAndroidPlatformScreen: public QFbScreen public: QAndroidPlatformScreen(); void topWindowChanged(QWindow *w); + QDpi logicalDpi() const; public slots: QRegion doRedraw(); -- cgit v1.2.3