| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010 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 640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 RenderLayerModelObject* repaintContainer = layer->renderer()->containerForRe
paint(); | 651 RenderLayerModelObject* repaintContainer = layer->renderer()->containerForRe
paint(); |
| 652 if (!repaintContainer) | 652 if (!repaintContainer) |
| 653 repaintContainer = m_renderView; | 653 repaintContainer = m_renderView; |
| 654 | 654 |
| 655 layer->repainter().repaintIncludingNonCompositingDescendants(repaintContaine
r); | 655 layer->repainter().repaintIncludingNonCompositingDescendants(repaintContaine
r); |
| 656 } | 656 } |
| 657 | 657 |
| 658 // This method assumes that layout is up-to-date, unlike repaintOnCompositingCha
nge(). | 658 // This method assumes that layout is up-to-date, unlike repaintOnCompositingCha
nge(). |
| 659 void RenderLayerCompositor::repaintInCompositedAncestor(RenderLayer* layer, cons
t LayoutRect& rect) | 659 void RenderLayerCompositor::repaintInCompositedAncestor(RenderLayer* layer, cons
t LayoutRect& rect) |
| 660 { | 660 { |
| 661 RenderLayer* compositedAncestor = layer->enclosingCompositingLayerForRepaint
(false /*exclude self*/); | 661 RenderLayer* compositedAncestor = layer->enclosingCompositingLayerForRepaint
(ExcludeSelf); |
| 662 if (compositedAncestor) { | 662 if (compositedAncestor) { |
| 663 // FIXME: make sure repaintRect is computed correctly for squashed scena
rio | 663 // FIXME: make sure repaintRect is computed correctly for squashed scena
rio |
| 664 LayoutPoint offset; | 664 LayoutPoint offset; |
| 665 layer->convertToLayerCoords(compositedAncestor, offset); | 665 layer->convertToLayerCoords(compositedAncestor, offset); |
| 666 | 666 |
| 667 LayoutRect repaintRect = rect; | 667 LayoutRect repaintRect = rect; |
| 668 repaintRect.moveBy(offset); | 668 repaintRect.moveBy(offset); |
| 669 | 669 |
| 670 if (compositedAncestor->compositingState() == PaintsIntoOwnBacking) { | 670 if (compositedAncestor->compositingState() == PaintsIntoOwnBacking) { |
| 671 compositedAncestor->repainter().setBackingNeedsRepaintInRect(repaint
Rect); | 671 compositedAncestor->repainter().setBackingNeedsRepaintInRect(repaint
Rect); |
| (...skipping 1226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1898 bool RenderLayerCompositor::requiresCompositingForOverflowScrollingParent(const
RenderLayer* layer) const | 1898 bool RenderLayerCompositor::requiresCompositingForOverflowScrollingParent(const
RenderLayer* layer) const |
| 1899 { | 1899 { |
| 1900 return !!layer->scrollParent(); | 1900 return !!layer->scrollParent(); |
| 1901 } | 1901 } |
| 1902 | 1902 |
| 1903 bool RenderLayerCompositor::requiresCompositingForOutOfFlowClipping(const Render
Layer* layer) const | 1903 bool RenderLayerCompositor::requiresCompositingForOutOfFlowClipping(const Render
Layer* layer) const |
| 1904 { | 1904 { |
| 1905 return layer->compositorDrivenAcceleratedScrollingEnabled() && layer->isUncl
ippedDescendant(); | 1905 return layer->compositorDrivenAcceleratedScrollingEnabled() && layer->isUncl
ippedDescendant(); |
| 1906 } | 1906 } |
| 1907 | 1907 |
| 1908 static bool isViewportConstrainedFixedOrStickyLayer(const RenderLayer* layer) |
| 1909 { |
| 1910 if (layer->renderer()->isStickyPositioned()) |
| 1911 return !layer->enclosingOverflowClipLayer(false); |
| 1912 |
| 1913 if (layer->renderer()->style()->position() != FixedPosition) |
| 1914 return false; |
| 1915 |
| 1916 for (const RenderLayerStackingNode* stackingContainer = layer->stackingNode(
); stackingContainer; |
| 1917 stackingContainer = stackingContainer->ancestorStackingContainerNode())
{ |
| 1918 if (stackingContainer->layer()->compositingState() != NotComposited |
| 1919 && stackingContainer->layer()->renderer()->style()->position() == Fi
xedPosition) |
| 1920 return false; |
| 1921 } |
| 1922 |
| 1923 return true; |
| 1924 } |
| 1925 |
| 1908 bool RenderLayerCompositor::requiresCompositingForPosition(RenderObject* rendere
r, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason
* viewportConstrainedNotCompositedReason) const | 1926 bool RenderLayerCompositor::requiresCompositingForPosition(RenderObject* rendere
r, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason
* viewportConstrainedNotCompositedReason) const |
| 1909 { | 1927 { |
| 1910 // position:fixed elements that create their own stacking context (e.g. have
an explicit z-index, | 1928 // position:fixed elements that create their own stacking context (e.g. have
an explicit z-index, |
| 1911 // opacity, transform) can get their own composited layer. A stacking contex
t is required otherwise | 1929 // opacity, transform) can get their own composited layer. A stacking contex
t is required otherwise |
| 1912 // z-index and clipping will be broken. | 1930 // z-index and clipping will be broken. |
| 1913 if (!renderer->isPositioned()) | 1931 if (!renderer->isPositioned()) |
| 1914 return false; | 1932 return false; |
| 1915 | 1933 |
| 1916 EPosition position = renderer->style()->position(); | 1934 EPosition position = renderer->style()->position(); |
| 1917 bool isFixed = renderer->isOutOfFlowPositioned() && position == FixedPositio
n; | 1935 bool isFixed = renderer->isOutOfFlowPositioned() && position == FixedPositio
n; |
| 1918 if (isFixed && !layer->stackingNode()->isStackingContainer()) | 1936 if (isFixed && !layer->stackingNode()->isStackingContainer()) |
| 1919 return false; | 1937 return false; |
| 1920 | 1938 |
| 1921 bool isSticky = renderer->isInFlowPositioned() && position == StickyPosition
; | 1939 bool isSticky = renderer->isInFlowPositioned() && position == StickyPosition
; |
| 1922 if (!isFixed && !isSticky) | 1940 if (!isFixed && !isSticky) |
| 1923 return false; | 1941 return false; |
| 1924 | 1942 |
| 1925 // FIXME: acceleratedCompositingForFixedPositionEnabled should probably be r
enamed acceleratedCompositingForViewportConstrainedPositionEnabled(). | 1943 // FIXME: acceleratedCompositingForFixedPositionEnabled should probably be r
enamed acceleratedCompositingForViewportConstrainedPositionEnabled(). |
| 1926 if (Settings* settings = m_renderView->document().settings()) { | 1944 if (Settings* settings = m_renderView->document().settings()) { |
| 1927 if (!settings->acceleratedCompositingForFixedPositionEnabled()) | 1945 if (!settings->acceleratedCompositingForFixedPositionEnabled()) |
| 1928 return false; | 1946 return false; |
| 1929 } | 1947 } |
| 1930 | 1948 |
| 1931 if (isSticky) | 1949 if (isSticky) |
| 1932 return true; | 1950 return isViewportConstrainedFixedOrStickyLayer(layer); |
| 1933 | 1951 |
| 1934 RenderObject* container = renderer->container(); | 1952 RenderObject* container = renderer->container(); |
| 1935 // If the renderer is not hooked up yet then we have to wait until it is. | 1953 // If the renderer is not hooked up yet then we have to wait until it is. |
| 1936 if (!container) { | 1954 if (!container) { |
| 1937 m_needsToRecomputeCompositingRequirements = true; | 1955 m_needsToRecomputeCompositingRequirements = true; |
| 1938 return false; | 1956 return false; |
| 1939 } | 1957 } |
| 1940 | 1958 |
| 1941 // Don't promote fixed position elements that are descendants of a non-view
container, e.g. transformed elements. | 1959 // Don't promote fixed position elements that are descendants of a non-view
container, e.g. transformed elements. |
| 1942 // They will stay fixed wrt the container rather than the enclosing frame. | 1960 // They will stay fixed wrt the container rather than the enclosing frame. |
| (...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2443 | 2461 |
| 2444 RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), AllChildren
); | 2462 RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), AllChildren
); |
| 2445 while (RenderLayerStackingNode* curNode = iterator.next()) { | 2463 while (RenderLayerStackingNode* curNode = iterator.next()) { |
| 2446 if (layerHas3DContent(curNode->layer())) | 2464 if (layerHas3DContent(curNode->layer())) |
| 2447 return true; | 2465 return true; |
| 2448 } | 2466 } |
| 2449 | 2467 |
| 2450 return false; | 2468 return false; |
| 2451 } | 2469 } |
| 2452 | 2470 |
| 2453 static bool isRootmostFixedOrStickyLayer(RenderLayer* layer) | |
| 2454 { | |
| 2455 if (layer->renderer()->isStickyPositioned()) | |
| 2456 return true; | |
| 2457 | |
| 2458 if (layer->renderer()->style()->position() != FixedPosition) | |
| 2459 return false; | |
| 2460 | |
| 2461 for (RenderLayerStackingNode* stackingContainerNode = layer->stackingNode()-
>ancestorStackingContainerNode(); stackingContainerNode; stackingContainerNode =
stackingContainerNode->ancestorStackingContainerNode()) { | |
| 2462 if (stackingContainerNode->layer()->hasCompositedLayerMapping() && stack
ingContainerNode->layer()->renderer()->style()->position() == FixedPosition) | |
| 2463 return false; | |
| 2464 } | |
| 2465 | |
| 2466 return true; | |
| 2467 } | |
| 2468 | |
| 2469 void RenderLayerCompositor::updateViewportConstraintStatus(RenderLayer* layer) | 2471 void RenderLayerCompositor::updateViewportConstraintStatus(RenderLayer* layer) |
| 2470 { | 2472 { |
| 2471 if (isRootmostFixedOrStickyLayer(layer)) | 2473 if (isViewportConstrainedFixedOrStickyLayer(layer)) |
| 2472 addViewportConstrainedLayer(layer); | 2474 addViewportConstrainedLayer(layer); |
| 2473 else | 2475 else |
| 2474 removeViewportConstrainedLayer(layer); | 2476 removeViewportConstrainedLayer(layer); |
| 2475 } | 2477 } |
| 2476 | 2478 |
| 2477 void RenderLayerCompositor::addViewportConstrainedLayer(RenderLayer* layer) | 2479 void RenderLayerCompositor::addViewportConstrainedLayer(RenderLayer* layer) |
| 2478 { | 2480 { |
| 2479 m_viewportConstrainedLayers.add(layer); | 2481 m_viewportConstrainedLayers.add(layer); |
| 2480 } | 2482 } |
| 2481 | 2483 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2521 // If top and bottom are auto, use top. | 2523 // If top and bottom are auto, use top. |
| 2522 if (style->top().isAuto() && style->bottom().isAuto()) | 2524 if (style->top().isAuto() && style->bottom().isAuto()) |
| 2523 constraints.addAnchorEdge(ViewportConstraints::AnchorEdgeTop); | 2525 constraints.addAnchorEdge(ViewportConstraints::AnchorEdgeTop); |
| 2524 | 2526 |
| 2525 return constraints; | 2527 return constraints; |
| 2526 } | 2528 } |
| 2527 | 2529 |
| 2528 StickyPositionViewportConstraints RenderLayerCompositor::computeStickyViewportCo
nstraints(RenderLayer* layer) const | 2530 StickyPositionViewportConstraints RenderLayerCompositor::computeStickyViewportCo
nstraints(RenderLayer* layer) const |
| 2529 { | 2531 { |
| 2530 ASSERT(layer->hasCompositedLayerMapping()); | 2532 ASSERT(layer->hasCompositedLayerMapping()); |
| 2533 // We should never get here for stickies constrained by an enclosing clippin
g layer. |
| 2534 ASSERT(!layer->enclosingOverflowClipLayer(false)); |
| 2531 | 2535 |
| 2532 FrameView* frameView = m_renderView->frameView(); | 2536 FrameView* frameView = m_renderView->frameView(); |
| 2533 LayoutRect viewportRect = frameView->viewportConstrainedVisibleContentRect()
; | 2537 LayoutRect viewportRect = frameView->viewportConstrainedVisibleContentRect()
; |
| 2534 | 2538 |
| 2535 StickyPositionViewportConstraints constraints; | 2539 StickyPositionViewportConstraints constraints; |
| 2536 | 2540 |
| 2537 RenderBoxModelObject* renderer = toRenderBoxModelObject(layer->renderer()); | 2541 RenderBoxModelObject* renderer = toRenderBoxModelObject(layer->renderer()); |
| 2538 | 2542 |
| 2539 renderer->computeStickyPositionConstraints(constraints, viewportRect); | 2543 renderer->computeStickyPositionConstraints(constraints, viewportRect); |
| 2540 | 2544 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2588 } else if (graphicsLayer == m_scrollLayer.get()) { | 2592 } else if (graphicsLayer == m_scrollLayer.get()) { |
| 2589 name = "Frame Scrolling Layer"; | 2593 name = "Frame Scrolling Layer"; |
| 2590 } else { | 2594 } else { |
| 2591 ASSERT_NOT_REACHED(); | 2595 ASSERT_NOT_REACHED(); |
| 2592 } | 2596 } |
| 2593 | 2597 |
| 2594 return name; | 2598 return name; |
| 2595 } | 2599 } |
| 2596 | 2600 |
| 2597 } // namespace WebCore | 2601 } // namespace WebCore |
| OLD | NEW |