2011-01-14 Anders Carlsson <andersca@apple.com>
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 15 Jan 2011 01:18:58 +0000 (01:18 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 15 Jan 2011 01:18:58 +0000 (01:18 +0000)
        Reviewed by Sam Weinig.

        Implement the "should paint bounds instead of indiviual rects" algorithm from WebKit1
        https://bugs.webkit.org/show_bug.cgi?id=52499

        * WebProcess/WebPage/DrawingAreaImpl.cpp:
        (WebKit::shouldPaintBoundsRect):
        Port code from -[WebView _mustDrawUnionedRect:singleRects:count:].

        (WebKit::DrawingAreaImpl::display):
        If shouldPaintBoundsRect returns true, clear the rects vector and append the bounds rect.

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

WebKit2/ChangeLog
WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp

index 8c26b4a..013432f 100644 (file)
@@ -1,3 +1,17 @@
+2011-01-14  Anders Carlsson  <andersca@apple.com>
+
+        Reviewed by Sam Weinig.
+
+        Implement the "should paint bounds instead of indiviual rects" algorithm from WebKit1
+        https://bugs.webkit.org/show_bug.cgi?id=52499
+
+        * WebProcess/WebPage/DrawingAreaImpl.cpp:
+        (WebKit::shouldPaintBoundsRect):
+        Port code from -[WebView _mustDrawUnionedRect:singleRects:count:].
+
+        (WebKit::DrawingAreaImpl::display):
+        If shouldPaintBoundsRect returns true, clear the rects vector and append the bounds rect.
+
 2011-01-14  Brian Weinstein  <bweinstein@apple.com>
 
         Reviewed by Geoff Garen.
index 1e477a2..06d10e4 100644 (file)
@@ -68,8 +68,8 @@ void DrawingAreaImpl::setNeedsDisplay(const IntRect& rect)
 void DrawingAreaImpl::scroll(const IntRect& scrollRect, const IntSize& scrollDelta)
 {
     if (!m_scrollRect.isEmpty() && scrollRect != m_scrollRect) {
-        unsigned long long scrollArea = scrollRect.width() * scrollRect.height();
-        unsigned long long currentScrollArea = m_scrollRect.width() * m_scrollRect.height();
+        unsigned scrollArea = scrollRect.width() * scrollRect.height();
+        unsigned currentScrollArea = m_scrollRect.width() * m_scrollRect.height();
 
         if (currentScrollArea >= scrollArea) {
             // The rect being scrolled is at least as large as the rect we'd like to scroll.
@@ -178,6 +178,27 @@ void DrawingAreaImpl::display()
     m_isWaitingForDidUpdate = true;
 }
 
+static bool shouldPaintBoundsRect(const IntRect& bounds, const Vector<IntRect>& rects)
+{
+    const size_t rectThreshold = 10;
+    const float wastedSpaceThreshold = 0.75f;
+
+    if (rects.size() <= 1 || rects.size() > rectThreshold)
+        return true;
+
+    // Attempt to guess whether or not we should use the region bounds rect or the individual rects.
+    // We do this by computing the percentage of "wasted space" in the bounds.  If that wasted space
+    // is too large, then we will do individual rect painting instead.
+    unsigned boundsArea = bounds.width() * bounds.height();
+    unsigned rectsArea = 0;
+    for (size_t i = 0; i < rects.size(); ++i)
+        rectsArea += rects[i].width() * rects[i].height();
+
+    float wastedSpace = 1 - (rectsArea / boundsArea);
+
+    return wastedSpace <= wastedSpaceThreshold;
+}
+
 void DrawingAreaImpl::display(UpdateInfo& updateInfo)
 {
     // FIXME: It would be better if we could avoid painting altogether when there is a custom representation.
@@ -187,6 +208,11 @@ void DrawingAreaImpl::display(UpdateInfo& updateInfo)
     IntRect bounds = m_dirtyRegion.bounds();
     Vector<IntRect> rects = m_dirtyRegion.rects();
 
+    if (shouldPaintBoundsRect(bounds, rects)) {
+        rects.clear();
+        rects.append(bounds);
+    }
+        
     m_dirtyRegion = Region();
     m_scrollRect = IntRect();
     m_scrollDelta = IntSize();