diff options
author | Teng-Hui Zhu <ztenghui@google.com> | 2011-04-04 17:22:51 -0700 |
---|---|---|
committer | Teng-Hui Zhu <ztenghui@google.com> | 2011-04-05 11:27:32 -0700 |
commit | bc235f4153cd55951a65bfcda6dc4b6c655d8cad (patch) | |
tree | d827e0e130a8e4fb7d048be2b95c46bd3ea41afd | |
parent | ca84feebe782358e319da8bd13938179e941f9b4 (diff) | |
download | external_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.cpp | 31 |
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); |