From 3f5a59accc76e98366ff47cf52eb766a8d7100ed Mon Sep 17 00:00:00 2001 From: John Reck Date: Thu, 27 Sep 2012 16:31:15 -0700 Subject: [PATCH] Fix perf regression from scale/density mismatch Bug: 7242941 Change-Id: I8a45e8ae589cecc6215566b995003b9eefb7827e --- core/java/android/webkit/BrowserFrame.java | 2 +- core/java/android/webkit/WebViewClassic.java | 4 ++-- core/java/android/webkit/WebViewCore.java | 14 ++++++++++---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java index fea427d17f68b..4dbca23c92774 100644 --- a/core/java/android/webkit/BrowserFrame.java +++ b/core/java/android/webkit/BrowserFrame.java @@ -1025,7 +1025,7 @@ class BrowserFrame extends Handler { } private float density() { - return mContext.getResources().getDisplayMetrics().density; + return WebViewCore.getFixedDisplayDensity(mContext); } /** diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java index 1c47615376be4..d68511c453350 100644 --- a/core/java/android/webkit/WebViewClassic.java +++ b/core/java/android/webkit/WebViewClassic.java @@ -1664,7 +1664,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc mTouchSlopSquare = slop * slop; slop = configuration.getScaledDoubleTapSlop(); mDoubleTapSlopSquare = slop * slop; - final float density = mContext.getResources().getDisplayMetrics().density; + final float density = WebViewCore.getFixedDisplayDensity(mContext); // use one line height, 16 based on our current default font, for how // far we allow a touch be away from the edge of a link mNavSlop = (int) (16 * density); @@ -1809,7 +1809,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc } /* package */ void adjustDefaultZoomDensity(int zoomDensity) { - final float density = mContext.getResources().getDisplayMetrics().density + final float density = WebViewCore.getFixedDisplayDensity(mContext) * 100 / zoomDensity; updateDefaultZoomDensity(density); } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 33fe834dda21f..3fb3ec62c4355 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -2479,6 +2479,13 @@ public final class WebViewCore { setupViewport(true); } + static float getFixedDisplayDensity(Context context) { + // We make bad assumptions about multiplying and dividing density by 100, + // force them to be true with this hack + float density = context.getResources().getDisplayMetrics().density; + return ((int) (density * 100)) / 100.0f; + } + private void setupViewport(boolean updateViewState) { if (mWebViewClassic == null || mSettings == null) { // We've been destroyed or are being destroyed, return early @@ -2523,14 +2530,13 @@ public final class WebViewCore { // adjust the default scale to match the densityDpi float adjust = 1.0f; if (mViewportDensityDpi == -1) { - adjust = mContext.getResources().getDisplayMetrics().density; + adjust = getFixedDisplayDensity(mContext); } else if (mViewportDensityDpi > 0) { adjust = (float) mContext.getResources().getDisplayMetrics().densityDpi / mViewportDensityDpi; + adjust = ((int) (adjust * 100)) / 100.0f; } - // We make bad assumptions about multiplying and dividing by 100, force - // them to be true with this hack - adjust = ((int) (adjust * 100)) / 100.0f; + // Remove any update density messages in flight. // If the density is indeed different from WebView's default scale, // a new message will be queued.