OSDN Git Service

If we have a bad framework inval rect, request entire screen redraw
authorChris Craik <ccraik@google.com>
Fri, 23 Sep 2011 20:35:27 +0000 (13:35 -0700)
committerChris Craik <ccraik@google.com>
Fri, 23 Sep 2011 20:35:27 +0000 (13:35 -0700)
bug:5365139

This problem is occurring because we convert webkit invals to framework ones,
but webkit invals don't account for stolen/discarded tiles/textures.

This is just a temporary fix, see also bug:5321078 which describes the root of
the problem.

Change-Id: I6d823315dba8d669171c9c7c9ed3ca20fbed07ae

Source/WebCore/platform/graphics/android/GLWebViewState.cpp

index 55419f4..a7d7780 100644 (file)
@@ -599,12 +599,7 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect,
             TilesManager::instance()->setInvertedScreenSwitch(false);
         }
 
-        if (fullScreenInval) {
-            invalRect->setX(0);
-            invalRect->setY(0);
-            invalRect->setWidth(0);
-            invalRect->setHeight(0);
-        } else {
+        if (!fullScreenInval) {
             FloatRect frameworkInval = TilesManager::instance()->shader()->rectInInvScreenCoord(
                     m_frameworkInval);
             // Inflate the invalidate rect to avoid precision lost.
@@ -621,6 +616,18 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect,
 
             XLOG("invalRect(%d, %d, %d, %d)", inval.x(),
                     inval.y(), inval.width(), inval.height());
+
+            if (!invalRect->intersects(rect)) {
+                // invalidate is occurring offscreen, do full inval to guarantee redraw
+                fullScreenInval = true;
+            }
+        }
+
+        if (fullScreenInval) {
+            invalRect->setX(0);
+            invalRect->setY(0);
+            invalRect->setWidth(0);
+            invalRect->setHeight(0);
         }
     } else {
         resetFrameworkInval();