summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeng-Hui Zhu <ztenghui@google.com>2011-04-04 17:22:51 -0700
committerTeng-Hui Zhu <ztenghui@google.com>2011-04-05 11:27:32 -0700
commitbc235f4153cd55951a65bfcda6dc4b6c655d8cad (patch)
treed827e0e130a8e4fb7d048be2b95c46bd3ea41afd
parentca84feebe782358e319da8bd13938179e941f9b4 (diff)
downloadexternal_webkit-bc235f4153cd55951a65bfcda6dc4b6c655d8cad.zip
external_webkit-bc235f4153cd55951a65bfcda6dc4b6c655d8cad.tar.gz
external_webkit-bc235f4153cd55951a65bfcda6dc4b6c655d8cad.tar.bz2
Fix the precision loss issue
Instead of scaling the final rect to compare, scaling the dirtyrect. Because the dirtyrect will be discarded anyway. This can better preserve the precision the final rect. bug:4186567 Change-Id: Icade7a0b1ff13cd36791c7a3c0e2d624870fb44a
-rw-r--r--WebCore/platform/graphics/android/BaseTile.cpp31
1 files changed, 19 insertions, 12 deletions
diff --git a/WebCore/platform/graphics/android/BaseTile.cpp b/WebCore/platform/graphics/android/BaseTile.cpp
index 391e87b..690bc6a 100644
--- a/WebCore/platform/graphics/android/BaseTile.cpp
+++ b/WebCore/platform/graphics/android/BaseTile.cpp
@@ -312,23 +312,30 @@ void BaseTile::paintBitmap()
SkRect dirtyRect;
dirtyRect.set(cliperator.rect());
- SkRect tileRect;
- tileRect.fLeft = x * tileWidth / scale;
- tileRect.fTop = y * tileHeight / scale;
- tileRect.fRight = tileRect.fLeft + (tileWidth / scale);
- tileRect.fBottom = tileRect.fTop + (tileHeight / scale);
+ float left = x * tileWidth;
+ float top = y * tileHeight;
- if (!tileRect.intersect(dirtyRect)) {
+ // compute the rect to corresponds to pixels
+ SkRect realTileRect;
+ realTileRect.fLeft = left;
+ realTileRect.fTop = top;
+ realTileRect.fRight = left + tileWidth;
+ realTileRect.fBottom = top + tileHeight;
+
+ // scale the dirtyRect for intersect computation.
+ SkRect realDirtyRect = SkRect::MakeWH(dirtyRect.width() * scale,
+ dirtyRect.height() * scale);
+ realDirtyRect.offset(dirtyRect.fLeft * scale, dirtyRect.fTop * scale);
+
+ if (!realTileRect.intersect(realDirtyRect)) {
cliperator.next();
continue;
}
- // recompute the rect to corresponds to pixels
- SkRect realTileRect;
- realTileRect.fLeft = floorf(tileRect.fLeft * scale);
- realTileRect.fTop = floorf(tileRect.fTop * scale);
- realTileRect.fRight = ceilf(tileRect.fRight * scale);
- realTileRect.fBottom = ceilf(tileRect.fBottom * scale);
+ realTileRect.fLeft = floorf(realTileRect.fLeft);
+ realTileRect.fTop = floorf(realTileRect.fTop);
+ realTileRect.fRight = ceilf(realTileRect.fRight);
+ realTileRect.fBottom = ceilf(realTileRect.fBottom);
SkIRect finalRealRect;
finalRealRect.fLeft = static_cast<int>(realTileRect.fLeft) % static_cast<int>(tileWidth);