Exclude scrollbars from the dirty rect passed to the document
authormitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Apr 2011 18:13:24 +0000 (18:13 +0000)
committermitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Apr 2011 18:13:24 +0000 (18:13 +0000)
https://bugs.webkit.org/show_bug.cgi?id=59206

Reviewed by Sam Weinig.

No test added because functionality is unchanged.

* platform/ScrollView.cpp:
(WebCore::ScrollView::paint): Compute a clip rectangle (analogous to the frame of the clip view
in an NSScrollView) by subtracting non-overlay scrollbars, and intersect the document dirty rect
with it. If the result is empty, avoid calling paintContents().

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@84649 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/ScrollView.cpp

index a06c1f3..8029043 100644 (file)
@@ -1,3 +1,17 @@
+2011-04-22  Dan Bernstein  <mitz@apple.com>
+
+        Reviewed by Sam Weinig.
+
+        Exclude scrollbars from the dirty rect passed to the document
+        https://bugs.webkit.org/show_bug.cgi?id=59206
+
+        No test added because functionality is unchanged.
+
+        * platform/ScrollView.cpp:
+        (WebCore::ScrollView::paint): Compute a clip rectangle (analogous to the frame of the clip view
+        in an NSScrollView) by subtracting non-overlay scrollbars, and intersect the document dirty rect
+        with it. If the result is empty, avoid calling paintContents().
+
 2011-04-22  Jer Noble  <jer.noble@apple.com>
 
         Reviewed by Maciej Stachowiak.
index 74931f9..85c60c2 100644 (file)
@@ -988,11 +988,17 @@ void ScrollView::paint(GraphicsContext* context, const IntRect& rect)
 
     // If we encounter any overlay scrollbars as we paint, this will be set to true.
     m_containsScrollableAreaWithOverlayScrollbars = false;
-    
+
+    IntRect clipRect = frameRect();
+    if (verticalScrollbar() && !verticalScrollbar()->isOverlayScrollbar())
+        clipRect.setWidth(clipRect.width() - verticalScrollbar()->width());
+    if (horizontalScrollbar() && !horizontalScrollbar()->isOverlayScrollbar())
+        clipRect.setHeight(clipRect.height() - horizontalScrollbar()->height());
+
     IntRect documentDirtyRect = rect;
-    documentDirtyRect.intersect(frameRect());
+    documentDirtyRect.intersect(clipRect);
 
-    {
+    if (!documentDirtyRect.isEmpty()) {
         GraphicsContextStateSaver stateSaver(*context);
 
         context->translate(x(), y());