Changeset 56941 in webkit
- Timestamp:
- Apr 1, 2010 3:21:20 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 8 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r56934 r56941 1 2010-04-01 James Robinson <jamesr@chromium.org> 2 3 Reviewed by Simon Fraser. 4 5 Mapping from local to container coord space in updateLayerPositions is quadratic 6 https://bugs.webkit.org/show_bug.cgi?id=33520 7 8 These tests move layers around in various ways to test that the offset caching in 9 updateLayerPositions() is correct. 10 11 * fast/layers/nested-layers-1-expected.txt: Added. 12 * fast/layers/nested-layers-1.html: Added. 13 * fast/layers/nested-layers-2-expected.txt: Added. 14 * fast/layers/nested-layers-2.html: Added. 15 * fast/layers/nested-layers-3-expected.txt: Added. 16 * fast/layers/nested-layers-3.html: Added. 17 * fast/layers/nested-layers-4-expected.txt: Added. 18 * fast/layers/nested-layers-4.html: Added. 19 1 20 2010-04-01 Chris Marrin <cmarrin@apple.com> 2 21 -
trunk/WebCore/ChangeLog
r56940 r56941 1 2010-04-01 James Robinson <jamesr@chromium.org> 2 3 Reviewed by Simon Fraser. 4 5 Keeps a transient optimistic offset to the root in RenderLayer::updateLayerPositions 6 https://bugs.webkit.org/show_bug.cgi?id=33520 7 8 RenderLayer::updateLayerPositions() makes a recursive walk through all RenderLayers and updates the repaint rectangles on each. 9 These rectangles have to be calculated in the repaint container's coordinates using RenderObject::mapLocalToContainer to walk 10 up to the repaint container. This patch keeps track of the offset to the root and uses that offset instead of walking back up to 11 the root every time. 12 13 Tests: fast/layers/nested-layers-1.html 14 fast/layers/nested-layers-2.html 15 fast/layers/nested-layers-3.html 16 fast/layers/nested-layers-4.html 17 18 * page/FrameView.cpp: 19 (WebCore::FrameView::layout): 20 * rendering/RenderBox.cpp: 21 (WebCore::RenderBox::outlineBoundsForRepaint): 22 * rendering/RenderBox.h: 23 * rendering/RenderLayer.cpp: 24 (WebCore::RenderLayer::updateLayerPositions): 25 * rendering/RenderLayer.h: 26 * rendering/RenderObject.h: 27 (WebCore::RenderObject::outlineBoundsForRepaint): 28 * rendering/RenderSVGModelObject.cpp: 29 (WebCore::RenderSVGModelObject::outlineBoundsForRepaint): 30 * rendering/RenderSVGModelObject.h: 31 1 32 2010-04-01 Daniel Bates <dbates@rim.com> 2 33 -
trunk/WebCore/page/FrameView.cpp
r56856 r56941 739 739 // Now update the positions of all layers. 740 740 beginDeferredRepaints(); 741 IntPoint cachedOffset; 741 742 layer->updateLayerPositions((m_doFullRepaint ? RenderLayer::DoFullRepaint : 0) 742 743 | RenderLayer::CheckForRepaint 743 744 | RenderLayer::IsCompositingUpdateRoot 744 | RenderLayer::UpdateCompositingLayers); 745 | RenderLayer::UpdateCompositingLayers, 746 subtree ? 0 : &cachedOffset); 745 747 endDeferredRepaints(); 746 748 -
trunk/WebCore/rendering/RenderBox.cpp
r55890 r56941 326 326 } 327 327 328 IntRect RenderBox::outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer ) const328 IntRect RenderBox::outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer, IntPoint* cachedOffsetToRepaintContainer) const 329 329 { 330 330 IntRect box = borderBoundingBox(); 331 331 adjustRectForOutlineAndShadow(box); 332 332 333 FloatQuad containerRelativeQuad = localToContainerQuad(FloatRect(box), repaintContainer); 333 FloatQuad containerRelativeQuad = FloatRect(box); 334 if (cachedOffsetToRepaintContainer) 335 containerRelativeQuad.move(cachedOffsetToRepaintContainer->x(), cachedOffsetToRepaintContainer->y()); 336 else 337 containerRelativeQuad = localToContainerQuad(containerRelativeQuad, repaintContainer); 338 334 339 box = containerRelativeQuad.enclosingBoundingBox(); 335 340 -
trunk/WebCore/rendering/RenderBox.h
r56831 r56941 74 74 75 75 // Bounds of the outline box in absolute coords. Respects transforms 76 virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/ ) const;76 virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/, IntPoint* cachedOffsetToRepaintContainer) const; 77 77 virtual void addFocusRingRects(Vector<IntRect>&, int tx, int ty); 78 78 -
trunk/WebCore/rendering/RenderLayer.cpp
r56825 r56941 246 246 } 247 247 248 void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags )248 void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags, IntPoint* cachedOffset) 249 249 { 250 250 if (flags & DoFullRepaint) { … … 260 260 } 261 261 262 262 263 updateLayerPosition(); // For relpositioned layers or non-positioned layers, 263 264 // we need to keep in sync, since we may have shifted relative 264 265 // to our parent layer. 266 IntPoint oldCachedOffset; 267 if (cachedOffset) { 268 // We can't cache our offset to the repaint container if the mapping is anything more complex than a simple translation 269 bool disableOffsetCache = renderer()->isSVGRoot() || renderer()->hasColumns() || renderer()->hasTransform() || isComposited(); 270 if (disableOffsetCache) 271 cachedOffset = 0; // If our cached offset is invalid make sure it's not passed to any of our children 272 else { 273 oldCachedOffset = *cachedOffset; 274 // Frequently our parent layer's renderer will be the same as our renderer's containing block. In that case, 275 // we just update the cache using our offset to our parent (which is m_x / m_y). Otherwise, regenerated cached 276 // offsets to the root from the render tree. 277 if (!m_parent || m_parent->renderer() == renderer()->containingBlock()) 278 cachedOffset->move(m_x, m_y); // Fast case 279 else { 280 int x = 0; 281 int y = 0; 282 convertToLayerCoords(root(), x, y); 283 *cachedOffset = IntPoint(x, y); 284 } 285 } 286 } 265 287 266 288 int x = 0; 267 289 int y = 0; 268 convertToLayerCoords(root(), x, y); 290 if (cachedOffset) { 291 x += cachedOffset->x(); 292 y += cachedOffset->y(); 293 #ifndef NDEBUG 294 int nonCachedX = 0; 295 int nonCachedY = 0; 296 convertToLayerCoords(root(), nonCachedX, nonCachedY); 297 ASSERT(x == nonCachedX); 298 ASSERT(y == nonCachedY); 299 #endif 300 } else 301 convertToLayerCoords(root(), x, y); 269 302 positionOverflowControls(x, y); 270 303 … … 282 315 RenderBoxModelObject* repaintContainer = renderer()->containerForRepaint(); 283 316 IntRect newRect = renderer()->clippedOverflowRectForRepaint(repaintContainer); 284 IntRect newOutlineBox = renderer()->outlineBoundsForRepaint(repaintContainer); 317 IntRect newOutlineBox = renderer()->outlineBoundsForRepaint(repaintContainer, cachedOffset); 318 ASSERT(newOutlineBox == renderer()->outlineBoundsForRepaint(repaintContainer, 0)); 285 319 if (flags & CheckForRepaint) { 286 320 if (view && !view->printing()) { … … 314 348 315 349 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) 316 child->updateLayerPositions(flags );350 child->updateLayerPositions(flags, cachedOffset); 317 351 318 352 #if USE(ACCELERATED_COMPOSITING) … … 324 358 if (m_marquee) 325 359 m_marquee->updateMarqueePosition(); 360 361 if (cachedOffset) 362 *cachedOffset = oldCachedOffset; 326 363 } 327 364 -
trunk/WebCore/rendering/RenderLayer.h
r55090 r56941 306 306 }; 307 307 typedef unsigned UpdateLayerPositionsFlags; 308 void updateLayerPositions(UpdateLayerPositionsFlags = DoFullRepaint | IsCompositingUpdateRoot | UpdateCompositingLayers );308 void updateLayerPositions(UpdateLayerPositionsFlags = DoFullRepaint | IsCompositingUpdateRoot | UpdateCompositingLayers, IntPoint* cachedOffset = 0); 309 309 310 310 void updateTransform(); -
trunk/WebCore/rendering/RenderObject.h
r56831 r56941 794 794 void arenaDelete(RenderArena*, void* objectBase); 795 795 796 virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/ ) const { return IntRect(); }796 virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/, IntPoint* /*cachedOffsetToRepaintContainer*/ = 0) const { return IntRect(); } 797 797 798 798 class LayoutRepainter { -
trunk/WebCore/rendering/RenderSVGModelObject.cpp
r54991 r56941 64 64 // FIXME: This may also need to move into SVGRenderBase as the RenderBox version depends 65 65 // on borderBoundingBox() which SVG RenderBox subclases (like SVGRenderBlock) do not implement. 66 IntRect RenderSVGModelObject::outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer ) const66 IntRect RenderSVGModelObject::outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer, IntPoint*) const 67 67 { 68 68 IntRect box = enclosingIntRect(repaintRectInLocalCoordinates()); -
trunk/WebCore/rendering/RenderSVGModelObject.h
r54991 r56941 56 56 virtual IntRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer); 57 57 virtual void computeRectForRepaint(RenderBoxModelObject* repaintContainer, IntRect&, bool fixed = false); 58 virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer ) const;58 virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer, IntPoint*) const; 59 59 60 60 virtual void absoluteRects(Vector<IntRect>& rects, int tx, int ty);
Note: See TracChangeset
for help on using the changeset viewer.