Reviewed by Maciej.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 6 Dec 2004 21:49:50 +0000 (21:49 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 6 Dec 2004 21:49:50 +0000 (21:49 +0000)
        - fixed <rdar://problem/3906327> Select All of a large document is slow (>15 secs on my machine for attached specimen)

        * kwq/KWQScrollView.mm: (QScrollView::updateContents): Intersect with visibleRect before calling through
        to NSView to dirty; NSView could also be more efficient in this case (I filed 3906343).

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

WebCore/ChangeLog-2005-08-23
WebCore/kwq/KWQScrollView.mm

index 498486aee9f008994fc485474af974d44bbdb67d..33909483999f8012f9a7a0f5dcb721ffd56bc8e3 100644 (file)
@@ -1,3 +1,12 @@
+2004-12-06  Darin Adler  <darin@apple.com>
+
+        Reviewed by Maciej.
+
+        - fixed <rdar://problem/3906327> Select All of a large document is slow (>15 secs on my machine for attached specimen)
+
+        * kwq/KWQScrollView.mm: (QScrollView::updateContents): Intersect with visibleRect before calling through
+        to NSView to dirty; NSView could also be more efficient in this case (I filed 3906343).
+
 2004-12-06  John Sullivan  <sullivan@apple.com>
 
         Darin found what appears to be the real leak that we were falsely blaming
index f62900f5dd88a9b37e4b8c56f80360fb74e17c4a..222a4a2f9289e27d29aeec4ef7e8a2b8ab36ce88 100644 (file)
@@ -351,15 +351,23 @@ void QScrollView::updateContents(int x, int y, int w, int h, bool now)
 void QScrollView::updateContents(const QRect &rect, bool now)
 {
     KWQ_BLOCK_EXCEPTIONS;
-    NSView * view = getView();
+
+    NSView *view = getView();
 
     if ([view _KWQ_isScrollView])
         view = getDocumentView();
 
-    if (now)
-        [view displayRect: rect];
-    else
-        [view setNeedsDisplayInRect:rect];
+    // Checking for rect visibility is an important optimization for the case of
+    // Select All of a large document. AppKit does not do this check, and so ends
+    // up building a large complicated NSRegion if we don't perform the check.
+    NSRect dirtyRect = NSIntersectionRect(rect, [view visibleRect]);
+    if (!NSIsEmptyRect(dirtyRect)) {
+        if (now)
+            [view displayRect:dirtyRect];
+        else
+            [view setNeedsDisplayInRect:dirtyRect];
+    }
+
     KWQ_UNBLOCK_EXCEPTIONS;
 }