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 |