Changeset 31858 in webkit
- Timestamp:
- Apr 13, 2008 11:23:50 PM (16 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r31857 r31858 1 2008-04-13 David Hyatt <hyatt@apple.com> 2 3 Fix for bug 18466, WebKit exhibits slow performance on Opera DHTML benchmark. Improve layout's rect 4 invalidation code to only invalidate a single unioned rect once enough individual little rects have 5 been detected. 6 7 Reviewed by olliej 8 9 * page/FrameView.cpp: 10 (WebCore::FrameViewPrivate::reset): 11 (WebCore::FrameView::layout): 12 (WebCore::FrameView::repaintRectangle): 13 (WebCore::FrameView::beginDeferredRepaints): 14 (WebCore::FrameView::endDeferredRepaints): 15 * page/FrameView.h: 16 1 17 2008-04-13 Eric Seidel <eric@webkit.org> 2 18 -
trunk/WebCore/page/FrameView.cpp
r31268 r31858 94 94 lastLayoutSize = IntSize(); 95 95 lastZoomFactor = 1.0f; 96 m_deferringRepaints = 0; 97 m_repaintCount = 0; 98 m_repaintRect = IntRect(); 99 m_repaintRects.clear(); 96 100 } 97 101 … … 134 138 bool m_wasScrolledByUser; 135 139 bool m_inProgrammaticScroll; 140 141 unsigned m_deferringRepaints; 142 unsigned m_repaintCount; 143 IntRect m_repaintRect; 144 Vector<IntRect> m_repaintRects; 136 145 }; 137 146 … … 467 476 if (subtree) 468 477 root->view()->pushLayoutState(root); 478 469 479 d->midLayout = true; 480 beginDeferredRepaints(); 470 481 root->layout(); 482 endDeferredRepaints(); 471 483 d->midLayout = false; 484 472 485 if (subtree) 473 486 root->view()->popLayoutState(); … … 482 495 483 496 // Now update the positions of all layers. 497 beginDeferredRepaints(); 484 498 layer->updateLayerPositions(d->doFullRepaint); 485 499 endDeferredRepaints(); 500 486 501 d->layoutCount++; 487 502 … … 694 709 } 695 710 711 const unsigned cRepaintRectUnionThreshold = 25; 712 696 713 void FrameView::repaintRectangle(const IntRect& r, bool immediate) 697 714 { 715 if (d->m_deferringRepaints && !immediate) { 716 IntRect visibleContent = enclosingIntRect(visibleContentRect()); 717 visibleContent.intersect(r); 718 if (!visibleContent.isEmpty()) { 719 d->m_repaintCount++; 720 d->m_repaintRect.unite(r); 721 if (d->m_repaintCount == cRepaintRectUnionThreshold) 722 d->m_repaintRects.clear(); 723 else if (d->m_repaintCount < cRepaintRectUnionThreshold) 724 d->m_repaintRects.append(r); 725 } 726 return; 727 } 728 698 729 updateContents(r, immediate); 730 } 731 732 void FrameView::beginDeferredRepaints() 733 { 734 Page* page = m_frame->page(); 735 if (page->mainFrame() != m_frame) 736 return page->mainFrame()->view()->beginDeferredRepaints(); 737 738 d->m_deferringRepaints++; 739 d->m_repaintCount = 0; 740 d->m_repaintRect = IntRect(); 741 d->m_repaintRects.clear(); 742 } 743 744 745 void FrameView::endDeferredRepaints() 746 { 747 Page* page = m_frame->page(); 748 if (page->mainFrame() != m_frame) 749 return page->mainFrame()->view()->endDeferredRepaints(); 750 751 ASSERT(d->m_deferringRepaints > 0); 752 if (--d->m_deferringRepaints == 0) { 753 if (d->m_repaintCount >= cRepaintRectUnionThreshold) 754 repaintRectangle(d->m_repaintRect, false); 755 else { 756 unsigned size = d->m_repaintRects.size(); 757 for (unsigned i = 0; i < size; i++) 758 repaintRectangle(d->m_repaintRects[i], false); 759 d->m_repaintRects.clear(); 760 } 761 } 699 762 } 700 763 -
trunk/WebCore/page/FrameView.h
r31250 r31858 122 122 void removeSlowRepaintObject(); 123 123 124 void beginDeferredRepaints(); 125 void endDeferredRepaints(); 126 124 127 void updateDashboardRegions(); 125 128 void updateControlTints();
Note: See TracChangeset
for help on using the changeset viewer.