LayoutTests:
Reviewed by Darin and Hyatt.
- test and updated results for http://bugs.webkit.org/show_bug.cgi?id=13487
Implement O(1) absoluteClippedOverflowRect and absoluteOutlineBox during layout for a possible speed gain
* fast/repaint/bugzilla-3509-expected.checksum:
* fast/repaint/bugzilla-3509-expected.png:
* fast/repaint/intermediate-layout-position-clip-expected.checksum: Added.
* fast/repaint/intermediate-layout-position-clip-expected.png: Added.
* fast/repaint/intermediate-layout-position-clip-expected.txt: Added.
* fast/repaint/intermediate-layout-position-clip.html: Added.
* fast/repaint/intermediate-layout-position-expected.checksum:
* fast/repaint/intermediate-layout-position-expected.png:
WebCore:
Reviewed by Darin and Hyatt.
- http://bugs.webkit.org/show_bug.cgi?id=13487
Implement O(1) absoluteClippedOverflowRect and absoluteOutlineBox during layout for a possible speed gain
Test for a bug fixed by this patch: fast/repaint/intermediate-layout-position-clip.html
By keeping track of the total translation and clip during layout, absolutePosition and
computeAbsoluteRepaintRect become O(1).
* WebCore.pro: Added LayoutState.cpp
* WebCore.vcproj/WebCore/WebCore.vcproj: Added LayoutState.{cpp,h}
* WebCore.xcodeproj/project.pbxproj: Added LayoutState.{cpp,h}
* WebCoreSources.bkl: Added LayoutState.cpp
* page/FrameView.cpp:
(WebCore::FrameView::layout): When doing subtree layout, push an initial layout state for the
layout root.
* rendering/LayoutState.cpp: Added. A LayoutState corresponding to a box consists of the origin of
its coordinate system in view coordinates and possibly the clip rect, in view coordinates, which
applies to its children.
(WebCore::LayoutState::LayoutState):
(WebCore::LayoutState::destroy):
(WebCore::throw):
(WebCore::LayoutState::operator delete):
* rendering/LayoutState.h: Added.
(WebCore::LayoutState::LayoutState):
* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::layoutBlock): Factored out the "only positioned objects" case into
layoutOnlyPositionedObjects(). Added code to push/pop LayoutState, unless we have columns, in
which case we disable/enable LayoutState. Removed the translation by the layout delta
of the old absolute rects, since that is now integral to absoluteClippedOverflowRect() and
absoluteOutlineBox().
(WebCore::RenderBlock::layoutOnlyPositionedObjects): Added this helper function that checks for
and handles the case where only positioned objects need layout. Returns true in that case.
(WebCore::RenderBlock::repaintOverhangingFloats): Disabled LayoutState when repainting floats, since
they may belong to other containers.
(WebCore::RenderBlock::updateFirstLetter): Disabled LayoutState when adding and removing from the
first letter container, since it may be different than ourselves.
* rendering/RenderBlock.h:
* rendering/RenderBox.cpp:
(WebCore::RenderBox::setStyle): Minor cleanup: changed element()->document() to the equivalent document().
(WebCore::RenderBox::offsetForPositionedInContainer): Added. Factored out common code from
absolutePosition, computeAbsoluteRepaintRect and RenderLayer::updateLayerPosition into this function.
(WebCore::RenderBox::absolutePosition): Added an O(1) code path when this function is called during
layout (and LayoutState has not been disabled). Factored out some code into
offsetForPositionedInContainer.
(WebCore::RenderBox::absoluteClippedOverflowRect): Added the layout delta here, so callers don't need
to.
(WebCore::RenderBox::computeAbsoluteRepaintRect): Added an O(1) code path when this function is called
during layout (and LayoutState has not been disabled). Factored out some code into
offsetForPositionedInContainer.
* rendering/RenderContainer.cpp:
(WebCore::RenderContainer::layout): Added LayoutState push/pop.
* rendering/RenderFlexibleBox.cpp:
(WebCore::RenderFlexibleBox::layoutBlock): Factored out the "only positioned objects" case into
layoutOnlyPositionedObjects(). Added LayoutState push/pop. Removed the translation by the layout delta
of the old absolute rects, since that is now integral to absoluteClippedOverflowRect() and
absoluteOutlineBox().
* rendering/RenderFlow.cpp:
(WebCore::RenderFlow::absoluteClippedOverflowRect): Added an ASSERT.
* rendering/RenderForeignObject.cpp:
(WebCore::RenderForeignObject::layout): Disabled LayoutState because it is incompatible with arbitrary
affine transforms.
* rendering/RenderHTMLCanvas.cpp:
(WebCore::RenderHTMLCanvas::layout): Removed the translation by the layout delta of the old absolute
rects, since that is now integral to absoluteClippedOverflowRect() and absoluteOutlineBox().
* rendering/RenderImage.cpp:
(WebCore::RenderImage::layout): Ditto.
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::updateLayerPositions): Added ASSERTs. Factored out some code into
RenderBox::offsetForPositionedInContainer.
(WebCore::RenderLayer::updateScrollInfoAfterLayout): Disabled LayoutState around the call to
scrollToOffset.
* rendering/RenderListItem.cpp:
(WebCore::RenderListItem::updateMarkerLocation): Disabled LayoutState when moving the list marker, since
it can trigger repainting in other containers.
* rendering/RenderObject.cpp:
(WebCore::RenderObject::isRoot): Minor cleanup: changed element()->document() to the equivalent
document().
(WebCore::RenderObject::computeAbsoluteRepaintRect): Removed 'return' at the end of the function.
(WebCore::RenderObject::container): Reordered to avoid calling isText() twice.
(WebCore::RenderObject::absoluteOutlineBox): Added the layout delta here, so callers don't need to.
* rendering/RenderSVGContainer.cpp:
(WebCore::RenderSVGContainer::layout): Disabled LayoutState because it is incompatible with arbitrary
affine transforms.
* rendering/RenderTable.cpp:
(WebCore::RenderTable::layout): Factored out the "only positioned objects" case into
layoutOnlyPositionedObjects(). Added LayoutState push/pop. Removed the translation by the layout delta
of the old absolute rects, since that is now integral to absoluteClippedOverflowRect() and
absoluteOutlineBox().
* rendering/RenderTableCell.cpp:
(WebCore::RenderTableCell::absoluteClippedOverflowRect): Added the layout delta here, so callers
don't need to.
(WebCore::RenderTableCell::computeAbsoluteRepaintRect): For the O(1) code path, skipped the correction
for the parent row, because RenderTableRow doesn't push a translation into LayoutState.
(WebCore::RenderTableCell::absolutePosition): Ditto.
* rendering/RenderTableRow.cpp:
(WebCore::RenderTableRow::layout): Added LayoutState push/pop.
* rendering/RenderTableSection.cpp:
(WebCore::RenderTableSection::setCellWidths): Added LayoutState push/pop if cells are repainted or
receive layout.
(WebCore::RenderTableSection::calcRowHeight): Ditto.
(WebCore::RenderTableSection::layoutRows): Added LayoutState push/pop.
* rendering/RenderView.cpp:
(WebCore::RenderView::RenderView):
(WebCore::RenderView::layout): Added initial LayoutState setup for the layout.
(WebCore::RenderView::paintBoxDecorations): Minor cleanup: changed element()->document() to the
equivalent document().
(WebCore::RenderView::repaintViewRectangle): Ditto.
(WebCore::RenderView::pushLayoutState): Added. Pushes initial layout state for subtree layout.
* rendering/RenderView.h:
(WebCore::RenderView::pushLayoutState):
(WebCore::RenderView::popLayoutState):
(WebCore::RenderView::layoutState):
(WebCore::RenderView::disableLayoutState):
(WebCore::RenderView::enableLayoutState):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@21183 268f45cc-cd09-0410-ab3c-d52691b4dbfc
37 files changed