From bc235f4153cd55951a65bfcda6dc4b6c655d8cad Mon Sep 17 00:00:00 2001 From: Teng-Hui Zhu Date: Mon, 4 Apr 2011 17:22:51 -0700 Subject: 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 --- WebCore/platform/graphics/android/BaseTile.cpp | 31 ++++++++++++++++---------- 1 file changed, 19 insertions(+), 12 deletions(-) (limited to 'WebCore/platform/graphics/android/BaseTile.cpp') 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(realTileRect.fLeft) % static_cast(tileWidth); -- cgit v1.1