Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(255)

Side by Side Diff: Source/core/layout/compositing/CompositedDeprecatedPaintLayerMapping.cpp

Issue 1114543004: Avoid creating ancestor clipping layers for scroll children (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Adding a layout test. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/layout/compositing/CompositedDeprecatedPaintLayerMapping.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 } 350 }
351 } 351 }
352 352
353 void CompositedDeprecatedPaintLayerMapping::updateCompositingReasons() 353 void CompositedDeprecatedPaintLayerMapping::updateCompositingReasons()
354 { 354 {
355 // All other layers owned by this mapping will have the same compositing rea son 355 // All other layers owned by this mapping will have the same compositing rea son
356 // for their lifetime, so they are initialized only when created. 356 // for their lifetime, so they are initialized only when created.
357 m_graphicsLayer->setCompositingReasons(m_owningLayer.compositingReasons()); 357 m_graphicsLayer->setCompositingReasons(m_owningLayer.compositingReasons());
358 } 358 }
359 359
360 bool CompositedDeprecatedPaintLayerMapping::owningLayerClippedByLayerNotAboveCom positedAncestor() 360 bool CompositedDeprecatedPaintLayerMapping::owningLayerClippedByLayerNotAboveCom positedAncestor(DeprecatedPaintLayer* scrollParent)
361 { 361 {
362 if (!m_owningLayer.parent()) 362 if (!m_owningLayer.parent())
363 return false; 363 return false;
364 364
365 const DeprecatedPaintLayer* compositingAncestor = m_owningLayer.enclosingLay erWithCompositedDeprecatedPaintLayerMapping(ExcludeSelf); 365 const DeprecatedPaintLayer* compositingAncestor = m_owningLayer.enclosingLay erWithCompositedDeprecatedPaintLayerMapping(ExcludeSelf);
366 if (!compositingAncestor) 366 if (!compositingAncestor)
367 return false; 367 return false;
368 368
369 const LayoutObject* clippingContainer = m_owningLayer.clippingContainer(); 369 const LayoutObject* clippingContainer = m_owningLayer.clippingContainer();
370 if (!clippingContainer) 370 if (!clippingContainer)
371 return false; 371 return false;
372 372
373 if (clippingContainer->enclosingLayer() == scrollParent)
374 return false;
375
373 if (compositingAncestor->layoutObject()->isDescendantOf(clippingContainer)) 376 if (compositingAncestor->layoutObject()->isDescendantOf(clippingContainer))
374 return false; 377 return false;
375 378
376 // We ignore overflow clip here; we want composited overflow content to 379 // We ignore overflow clip here; we want composited overflow content to
377 // behave as if it lives in an unclipped universe so it can prepaint, etc. 380 // behave as if it lives in an unclipped universe so it can prepaint, etc.
378 // This means that we need to check if we are actually clipped before 381 // This means that we need to check if we are actually clipped before
379 // setting up m_ancestorClippingLayer otherwise 382 // setting up m_ancestorClippingLayer otherwise
380 // updateAncestorClippingLayerGeometry will fail as the clip rect will be 383 // updateAncestorClippingLayerGeometry will fail as the clip rect will be
381 // infinite. 384 // infinite.
382 // FIXME: this should use cached clip rects, but this sometimes give 385 // FIXME: this should use cached clip rects, but this sometimes give
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 if (m_owningLayer.needsCompositedScrolling()) 422 if (m_owningLayer.needsCompositedScrolling())
420 needsDescendantsClippingLayer = false; 423 needsDescendantsClippingLayer = false;
421 424
422 DeprecatedPaintLayer* scrollParent = compositor->preferCompositingToLCDTextE nabled() ? m_owningLayer.scrollParent() : 0; 425 DeprecatedPaintLayer* scrollParent = compositor->preferCompositingToLCDTextE nabled() ? m_owningLayer.scrollParent() : 0;
423 426
424 // This is required because compositing layers are parented according to the z-order hierarchy, yet 427 // This is required because compositing layers are parented according to the z-order hierarchy, yet
425 // clipping goes down the layoutObject hierarchy. Thus, a DeprecatedPaintLay er can be clipped by a 428 // clipping goes down the layoutObject hierarchy. Thus, a DeprecatedPaintLay er can be clipped by a
426 // DeprecatedPaintLayer that is an ancestor in the layoutObject hierarchy, b ut a sibling in the z-order 429 // DeprecatedPaintLayer that is an ancestor in the layoutObject hierarchy, b ut a sibling in the z-order
427 // hierarchy. Further, that sibling need not be composited at all. In such s cenarios, an ancestor 430 // hierarchy. Further, that sibling need not be composited at all. In such s cenarios, an ancestor
428 // clipping layer is necessary to apply the composited clip for this layer. 431 // clipping layer is necessary to apply the composited clip for this layer.
429 bool needsAncestorClip = owningLayerClippedByLayerNotAboveCompositedAncestor (); 432 bool needsAncestorClip = owningLayerClippedByLayerNotAboveCompositedAncestor (scrollParent);
430
431 if (scrollParent) {
432 // If our containing block is our ancestor scrolling layer, then we'll a lready be clipped
433 // to it via our scroll parent and we don't need an ancestor clipping la yer.
434 if (m_owningLayer.layoutObject()->containingBlock()->enclosingLayer() == m_owningLayer.ancestorScrollingLayer())
435 needsAncestorClip = false;
436 }
437 433
438 if (updateClippingLayers(needsAncestorClip, needsDescendantsClippingLayer)) 434 if (updateClippingLayers(needsAncestorClip, needsDescendantsClippingLayer))
439 layerConfigChanged = true; 435 layerConfigChanged = true;
440 436
441 bool scrollingConfigChanged = false; 437 bool scrollingConfigChanged = false;
442 if (updateScrollingLayers(m_owningLayer.needsCompositedScrolling())) { 438 if (updateScrollingLayers(m_owningLayer.needsCompositedScrolling())) {
443 layerConfigChanged = true; 439 layerConfigChanged = true;
444 scrollingConfigChanged = true; 440 scrollingConfigChanged = true;
445 } 441 }
446 442
447 if (updateOverflowControlsLayers(requiresHorizontalScrollbarLayer(), require sVerticalScrollbarLayer(), requiresScrollCornerLayer(), needsAncestorClip)) 443 if (updateOverflowControlsLayers(requiresHorizontalScrollbarLayer(), require sVerticalScrollbarLayer(), requiresScrollCornerLayer(), needsAncestorClip))
448 layerConfigChanged = true; 444 layerConfigChanged = true;
449 445
450 bool hasPerspective = false; 446 bool hasPerspective = false;
451 // FIXME: Can |style| be really null that late in the DocumentCycle? 447 // FIXME: Can |style| be really null that late in the DocumentCycle?
452 if (const ComputedStyle* style = layoutObject->style()) 448 if (const ComputedStyle* style = layoutObject->style())
453 hasPerspective = style->hasPerspective(); 449 hasPerspective = style->hasPerspective();
454 bool needsChildTransformLayer = hasPerspective && layoutObject->isBox(); 450 bool needsChildTransformLayer = hasPerspective && layoutObject->isBox();
455 if (updateChildTransformLayer(needsChildTransformLayer)) 451 if (updateChildTransformLayer(needsChildTransformLayer))
456 layerConfigChanged = true; 452 layerConfigChanged = true;
457 453
458 if (updateSquashingLayers(!m_squashedLayers.isEmpty())) 454 if (updateSquashingLayers(!m_squashedLayers.isEmpty()))
459 layerConfigChanged = true; 455 layerConfigChanged = true;
460 456
461 updateScrollParent(scrollParent); 457 updateScrollParent(scrollParent);
462 updateClipParent(); 458 updateClipParent(scrollParent);
463 459
464 if (layerConfigChanged) 460 if (layerConfigChanged)
465 updateInternalHierarchy(); 461 updateInternalHierarchy();
466 462
467 if (scrollingConfigChanged) { 463 if (scrollingConfigChanged) {
468 if (layoutObject->view()) 464 if (layoutObject->view())
469 compositor->scrollingLayerDidChange(&m_owningLayer); 465 compositor->scrollingLayerDidChange(&m_owningLayer);
470 } 466 }
471 467
472 // A mask layer is not part of the hierarchy proper, it's an auxiliary layer 468 // A mask layer is not part of the hierarchy proper, it's an auxiliary layer
(...skipping 1148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1621 if (!layer) 1617 if (!layer)
1622 return; 1618 return;
1623 1619
1624 // Only the topmost layer has a scroll parent. All other layers have a null scroll parent. 1620 // Only the topmost layer has a scroll parent. All other layers have a null scroll parent.
1625 if (layer != topmostLayer) 1621 if (layer != topmostLayer)
1626 clipParent = 0; 1622 clipParent = 0;
1627 1623
1628 scrollingCoordinator->updateClipParentForGraphicsLayer(layer, clipParent); 1624 scrollingCoordinator->updateClipParentForGraphicsLayer(layer, clipParent);
1629 } 1625 }
1630 1626
1631 void CompositedDeprecatedPaintLayerMapping::updateClipParent() 1627 void CompositedDeprecatedPaintLayerMapping::updateClipParent(DeprecatedPaintLaye r* scrollParent)
1632 { 1628 {
1633 if (owningLayerClippedByLayerNotAboveCompositedAncestor()) 1629 if (owningLayerClippedByLayerNotAboveCompositedAncestor(scrollParent))
1634 return; 1630 return;
1635 1631
1636 DeprecatedPaintLayer* clipParent = m_owningLayer.clipParent(); 1632 DeprecatedPaintLayer* clipParent = m_owningLayer.clipParent();
1637 if (clipParent) 1633 if (clipParent)
1638 clipParent = clipParent->enclosingLayerWithCompositedDeprecatedPaintLaye rMapping(IncludeSelf); 1634 clipParent = clipParent->enclosingLayerWithCompositedDeprecatedPaintLaye rMapping(IncludeSelf);
1639 1635
1640 if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLay er(m_owningLayer)) { 1636 if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLay er(m_owningLayer)) {
1641 GraphicsLayer* topmostLayer = childForSuperlayers(); 1637 GraphicsLayer* topmostLayer = childForSuperlayers();
1642 updateClipParentForGraphicsLayer(m_squashingContainmentLayer.get(), topm ostLayer, clipParent, scrollingCoordinator); 1638 updateClipParentForGraphicsLayer(m_squashingContainmentLayer.get(), topm ostLayer, clipParent, scrollingCoordinator);
1643 updateClipParentForGraphicsLayer(m_ancestorClippingLayer.get(), topmostL ayer, clipParent, scrollingCoordinator); 1639 updateClipParentForGraphicsLayer(m_ancestorClippingLayer.get(), topmostL ayer, clipParent, scrollingCoordinator);
(...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after
2342 } else if (graphicsLayer == m_scrollingBlockSelectionLayer.get()) { 2338 } else if (graphicsLayer == m_scrollingBlockSelectionLayer.get()) {
2343 name = "Scrolling Block Selection Layer"; 2339 name = "Scrolling Block Selection Layer";
2344 } else { 2340 } else {
2345 ASSERT_NOT_REACHED(); 2341 ASSERT_NOT_REACHED();
2346 } 2342 }
2347 2343
2348 return name; 2344 return name;
2349 } 2345 }
2350 2346
2351 } // namespace blink 2347 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/layout/compositing/CompositedDeprecatedPaintLayerMapping.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698