summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Android (Google) Code Review <android-gerrit@google.com> 2009-09-15 13:19:56 -0400
committer Android (Google) Code Review <android-gerrit@google.com> 2009-09-15 13:19:56 -0400
commit5adeba4b7f63081257f9d0fb65127bdce0399c79 (patch)
treef3b928606473cd303c860abdf627213707638b57
parente80534ff59b2e62a0ddf4359147b81f5ba10de86 (diff)
parente9e86b8908a1dc51bccf7993332a22f5c8640006 (diff)
Merge change 25059 into eclair
* changes: special-case coordinate conversion when we are taking content coordinates to be invalidate. We need to round "out" these, to account for the slop in antialiasing, rather than using the existing routines that (correctly) round.
-rw-r--r--core/java/android/webkit/WebView.java49
1 files changed, 38 insertions, 11 deletions
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 2329e2194fe6..be3da121fb1f 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -1835,23 +1835,50 @@ public class WebView extends AbsoluteLayout
return contentToViewDimension(y) + getTitleHeight();
}
+ private Rect contentToViewRect(Rect x) {
+ return new Rect(contentToViewX(x.left), contentToViewY(x.top),
+ contentToViewX(x.right), contentToViewY(x.bottom));
+ }
+
+ /* To invalidate a rectangle in content coordinates, we need to transform
+ the rect into view coordinates, so we can then call invalidate(...).
+
+ Normally, we would just call contentToView[XY](...), which eventually
+ calls Math.round(coordinate * mActualScale). However, for invalidates,
+ we need to account for the slop that occurs with antialiasing. To
+ address that, we are a little more liberal in the size of the rect that
+ we invalidate.
+
+ This liberal calculation calls floor() for the top/left, and ceil() for
+ the bottom/right coordinates. This catches the possible extra pixels of
+ antialiasing that we might have missed with just round().
+ */
+
// Called by JNI to invalidate the View, given rectangle coordinates in
// content space
private void viewInvalidate(int l, int t, int r, int b) {
- invalidate(contentToViewX(l), contentToViewY(t), contentToViewX(r),
- contentToViewY(b));
+ final float scale = mActualScale;
+ final int dy = getTitleHeight();
+ invalidate((int)Math.floor(l * scale),
+ (int)Math.floor(t * scale) + dy,
+ (int)Math.ceil(r * scale),
+ (int)Math.ceil(b * scale) + dy);
}
// Called by JNI to invalidate the View after a delay, given rectangle
// coordinates in content space
private void viewInvalidateDelayed(long delay, int l, int t, int r, int b) {
- postInvalidateDelayed(delay, contentToViewX(l), contentToViewY(t),
- contentToViewX(r), contentToViewY(b));
+ final float scale = mActualScale;
+ final int dy = getTitleHeight();
+ postInvalidateDelayed(delay,
+ (int)Math.floor(l * scale),
+ (int)Math.floor(t * scale) + dy,
+ (int)Math.ceil(r * scale),
+ (int)Math.ceil(b * scale) + dy);
}
- private Rect contentToView(Rect x) {
- return new Rect(contentToViewX(x.left), contentToViewY(x.top)
- , contentToViewX(x.right), contentToViewY(x.bottom));
+ private void invalidateContentRect(Rect r) {
+ viewInvalidate(r.left, r.top, r.right, r.bottom);
}
// stop the scroll animation, and don't let a subsequent fling add
@@ -2771,7 +2798,7 @@ public class WebView extends AbsoluteLayout
contentToViewDimension(
nativeFocusCandidateTextSize()));
Rect bounds = nativeFocusCandidateNodeBounds();
- Rect vBox = contentToView(bounds);
+ Rect vBox = contentToViewRect(bounds);
mWebTextView.setRect(vBox.left, vBox.top, vBox.width(),
vBox.height());
// If it is a password field, start drawing the
@@ -3365,7 +3392,7 @@ public class WebView extends AbsoluteLayout
Selection.setSelection(spannable, start, end);
}
} else {
- Rect vBox = contentToView(bounds);
+ Rect vBox = contentToViewRect(bounds);
mWebTextView.setRect(vBox.left, vBox.top, vBox.width(),
vBox.height());
mWebTextView.setGravity(nativeFocusCandidateIsRtlText() ?
@@ -5286,7 +5313,7 @@ public class WebView extends AbsoluteLayout
Log.v(LOGTAG, "NEW_PICTURE_MSG_ID {" +
b.left+","+b.top+","+b.right+","+b.bottom+"}");
}
- invalidate(contentToView(draw.mInvalRegion.getBounds()));
+ invalidateContentRect(draw.mInvalRegion.getBounds());
if (mPictureListener != null) {
mPictureListener.onNewPicture(WebView.this, capturePicture());
}
@@ -5785,7 +5812,7 @@ public class WebView extends AbsoluteLayout
}
Rect contentCursorRingBounds = nativeGetCursorRingBounds();
if (contentCursorRingBounds.isEmpty()) return keyHandled;
- Rect viewCursorRingBounds = contentToView(contentCursorRingBounds);
+ Rect viewCursorRingBounds = contentToViewRect(contentCursorRingBounds);
Rect visRect = new Rect();
calcOurVisibleRect(visRect);
Rect outset = new Rect(visRect);