| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights |
| 3 * reserved. | 3 * reserved. |
| 4 * | 4 * |
| 5 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 5 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
| 6 * | 6 * |
| 7 * Other contributors: | 7 * Other contributors: |
| 8 * Robert O'Callahan <roc+@cs.cmu.edu> | 8 * Robert O'Callahan <roc+@cs.cmu.edu> |
| 9 * David Baron <dbaron@fas.harvard.edu> | 9 * David Baron <dbaron@fas.harvard.edu> |
| 10 * Christian Biesinger <cbiesinger@web.de> | 10 * Christian Biesinger <cbiesinger@web.de> |
| (...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 794 localPoint.moveBy(toLayoutBox(curr)->physicalLocation()); | 794 localPoint.moveBy(toLayoutBox(curr)->physicalLocation()); |
| 795 } | 795 } |
| 796 curr = curr->container(); | 796 curr = curr->container(); |
| 797 } | 797 } |
| 798 if (curr && curr->isTableRow()) { | 798 if (curr && curr->isTableRow()) { |
| 799 // Put ourselves into the row coordinate space. | 799 // Put ourselves into the row coordinate space. |
| 800 localPoint.moveBy(-toLayoutBox(curr)->physicalLocation()); | 800 localPoint.moveBy(-toLayoutBox(curr)->physicalLocation()); |
| 801 } | 801 } |
| 802 } | 802 } |
| 803 | 803 |
| 804 // Subtract our parent's scroll offset. | 804 if (PaintLayer* containingLayer = this->containingLayer()) { |
| 805 if (PaintLayer* containingLayer = | |
| 806 layoutObject()->isOutOfFlowPositioned() | |
| 807 ? containingLayerForOutOfFlowPositioned() | |
| 808 : nullptr) { | |
| 809 // For positioned layers, we subtract out the enclosing positioned layer's | |
| 810 // scroll offset. | |
| 811 if (containingLayer->layoutObject()->hasOverflowClip()) { | 805 if (containingLayer->layoutObject()->hasOverflowClip()) { |
| 806 // Subtract our container's scroll offset. |
| 812 IntSize offset = containingLayer->layoutBox()->scrolledContentOffset(); | 807 IntSize offset = containingLayer->layoutBox()->scrolledContentOffset(); |
| 813 localPoint -= offset; | 808 localPoint -= offset; |
| 814 } | 809 } else if (layoutObject()->isAbsolutePositioned() && |
| 815 | 810 containingLayer->layoutObject()->isInFlowPositioned() && |
| 816 if (containingLayer->layoutObject()->isInFlowPositioned() && | 811 containingLayer->layoutObject()->isLayoutInline()) { |
| 817 containingLayer->layoutObject()->isLayoutInline()) { | 812 // Adjust offset for absolute under in-flow positioned inline. |
| 818 LayoutSize offset = | 813 LayoutSize offset = |
| 819 toLayoutInline(containingLayer->layoutObject()) | 814 toLayoutInline(containingLayer->layoutObject()) |
| 820 ->offsetForInFlowPositionedInline(*toLayoutBox(layoutObject())); | 815 ->offsetForInFlowPositionedInline(*toLayoutBox(layoutObject())); |
| 821 localPoint += offset; | 816 localPoint += offset; |
| 822 } | 817 } |
| 823 } else if (parent() && parent()->layoutObject()->hasOverflowClip()) { | |
| 824 IntSize scrollOffset = parent()->layoutBox()->scrolledContentOffset(); | |
| 825 localPoint -= scrollOffset; | |
| 826 } | 818 } |
| 827 | 819 |
| 828 if (layoutObject()->isInFlowPositioned()) { | 820 if (layoutObject()->isInFlowPositioned()) { |
| 829 LayoutSize newOffset = layoutObject()->offsetForInFlowPosition(); | 821 LayoutSize newOffset = layoutObject()->offsetForInFlowPosition(); |
| 830 if (m_rareData || !newOffset.isZero()) | 822 if (m_rareData || !newOffset.isZero()) |
| 831 ensureRareData().offsetForInFlowPosition = newOffset; | 823 ensureRareData().offsetForInFlowPosition = newOffset; |
| 832 localPoint.move(newOffset); | 824 localPoint.move(newOffset); |
| 833 } else if (m_rareData) { | 825 } else if (m_rareData) { |
| 834 m_rareData->offsetForInFlowPosition = LayoutSize(); | 826 m_rareData->offsetForInFlowPosition = LayoutSize(); |
| 835 } | 827 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 863 | 855 |
| 864 const LayoutRect borderBox = toLayoutBox(layoutObject())->borderBoxRect(); | 856 const LayoutRect borderBox = toLayoutBox(layoutObject())->borderBoxRect(); |
| 865 const ComputedStyle& style = layoutObject()->styleRef(); | 857 const ComputedStyle& style = layoutObject()->styleRef(); |
| 866 | 858 |
| 867 return FloatPoint(floatValueForLength(style.perspectiveOriginX(), | 859 return FloatPoint(floatValueForLength(style.perspectiveOriginX(), |
| 868 borderBox.width().toFloat()), | 860 borderBox.width().toFloat()), |
| 869 floatValueForLength(style.perspectiveOriginY(), | 861 floatValueForLength(style.perspectiveOriginY(), |
| 870 borderBox.height().toFloat())); | 862 borderBox.height().toFloat())); |
| 871 } | 863 } |
| 872 | 864 |
| 873 PaintLayer* PaintLayer::containingLayerForOutOfFlowPositioned( | 865 PaintLayer* PaintLayer::containingLayer(const PaintLayer* ancestor, |
| 874 const PaintLayer* ancestor, | 866 bool* skippedAncestor) const { |
| 875 bool* skippedAncestor) const { | |
| 876 // If we have specified an ancestor, surely the caller needs to know whether | 867 // If we have specified an ancestor, surely the caller needs to know whether |
| 877 // we skipped it. | 868 // we skipped it. |
| 878 DCHECK(!ancestor || skippedAncestor); | 869 DCHECK(!ancestor || skippedAncestor); |
| 879 if (skippedAncestor) | 870 if (skippedAncestor) |
| 880 *skippedAncestor = false; | 871 *skippedAncestor = false; |
| 881 if (layoutObject()->style()->position() == FixedPosition) { | 872 |
| 873 LayoutObject* layoutObject = this->layoutObject(); |
| 874 if (layoutObject->isColumnSpanAll() || |
| 875 layoutObject->isFloatingWithNonContainingBlockParent()) { |
| 876 Optional<LayoutObject::AncestorSkipInfo> skipInfo; |
| 877 if (skippedAncestor) |
| 878 skipInfo.emplace(ancestor->layoutObject()); |
| 879 if (auto containingBlock = layoutObject->containingBlock( |
| 880 skippedAncestor ? &*skipInfo : nullptr)) { |
| 881 if (skippedAncestor && skipInfo->ancestorSkipped()) |
| 882 *skippedAncestor = true; |
| 883 return containingBlock->enclosingLayer(); |
| 884 } |
| 885 return nullptr; |
| 886 } |
| 887 |
| 888 if (layoutObject->isOutOfFlowPositioned()) { |
| 889 auto canContainThisLayer = |
| 890 layoutObject->isFixedPositioned() |
| 891 ? &LayoutObject::canContainFixedPositionObjects |
| 892 : &LayoutObject::canContainAbsolutePositionObjects; |
| 893 |
| 882 PaintLayer* curr = parent(); | 894 PaintLayer* curr = parent(); |
| 883 while (curr && !curr->layoutObject()->canContainFixedPositionObjects()) { | 895 while (curr && !(curr->layoutObject()->*canContainThisLayer)()) { |
| 884 if (skippedAncestor && curr == ancestor) | 896 if (skippedAncestor && curr == ancestor) |
| 885 *skippedAncestor = true; | 897 *skippedAncestor = true; |
| 886 curr = curr->parent(); | 898 curr = curr->parent(); |
| 887 } | 899 } |
| 888 | |
| 889 return curr; | 900 return curr; |
| 890 } | 901 } |
| 891 | 902 |
| 892 PaintLayer* curr = parent(); | 903 return parent(); |
| 893 while (curr && !curr->layoutObject()->canContainAbsolutePositionObjects()) { | |
| 894 if (skippedAncestor && curr == ancestor) | |
| 895 *skippedAncestor = true; | |
| 896 curr = curr->parent(); | |
| 897 } | |
| 898 | |
| 899 return curr; | |
| 900 } | 904 } |
| 901 | 905 |
| 902 PaintLayer* PaintLayer::enclosingTransformedAncestor() const { | 906 PaintLayer* PaintLayer::enclosingTransformedAncestor() const { |
| 903 PaintLayer* curr = parent(); | 907 PaintLayer* curr = parent(); |
| 904 while (curr && !curr->isRootLayer() && !curr->transform()) | 908 while (curr && !curr->isRootLayer() && !curr->transform()) |
| 905 curr = curr->parent(); | 909 curr = curr->parent(); |
| 906 | 910 |
| 907 return curr; | 911 return curr; |
| 908 } | 912 } |
| 909 | 913 |
| 910 LayoutPoint PaintLayer::computeOffsetFromTransformedAncestor() const { | 914 LayoutPoint PaintLayer::computeOffsetFromTransformedAncestor() const { |
| 911 TransformState transformState(TransformState::ApplyTransformDirection, | 915 TransformState transformState(TransformState::ApplyTransformDirection, |
| 912 FloatPoint()); | 916 FloatPoint()); |
| 913 layoutObject()->mapLocalToAncestor( | 917 layoutObject()->mapLocalToAncestor( |
| 914 transformAncestor() ? transformAncestor()->layoutObject() : nullptr, | 918 transformAncestor() ? transformAncestor()->layoutObject() : nullptr, |
| 915 transformState, 0); | 919 transformState, 0); |
| 916 transformState.flatten(); | 920 transformState.flatten(); |
| 917 return LayoutPoint(transformState.lastPlanarPoint()); | 921 return LayoutPoint(transformState.lastPlanarPoint()); |
| 918 } | 922 } |
| 919 | 923 |
| 920 PaintLayer* PaintLayer::compositingContainer() const { | 924 PaintLayer* PaintLayer::compositingContainer() const { |
| 921 if (!stackingNode()->isStacked()) { | 925 if (!stackingNode()->isStacked()) |
| 922 // Floats have special painting order, which has complicated semantics. | 926 return containingLayer(); |
| 923 // See the comments around FloatObject::setShouldPaint. | |
| 924 if (m_layoutObject->isFloating() && m_layoutObject->parent() && | |
| 925 !m_layoutObject->parent()->isLayoutBlockFlow()) | |
| 926 return m_layoutObject->containingBlock()->enclosingLayer(); | |
| 927 | |
| 928 return parent(); | |
| 929 } | |
| 930 if (PaintLayerStackingNode* ancestorStackingNode = | 927 if (PaintLayerStackingNode* ancestorStackingNode = |
| 931 stackingNode()->ancestorStackingContextNode()) | 928 stackingNode()->ancestorStackingContextNode()) |
| 932 return ancestorStackingNode->layer(); | 929 return ancestorStackingNode->layer(); |
| 933 return nullptr; | 930 return nullptr; |
| 934 } | 931 } |
| 935 | 932 |
| 936 bool PaintLayer::isPaintInvalidationContainer() const { | 933 bool PaintLayer::isPaintInvalidationContainer() const { |
| 937 return compositingState() == PaintsIntoOwnBacking || | 934 return compositingState() == PaintsIntoOwnBacking || |
| 938 compositingState() == PaintsIntoGroupedBacking; | 935 compositingState() == PaintsIntoGroupedBacking; |
| 939 } | 936 } |
| (...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1401 } | 1398 } |
| 1402 | 1399 |
| 1403 // Returns the layer reached on the walk up towards the ancestor. | 1400 // Returns the layer reached on the walk up towards the ancestor. |
| 1404 static inline const PaintLayer* accumulateOffsetTowardsAncestor( | 1401 static inline const PaintLayer* accumulateOffsetTowardsAncestor( |
| 1405 const PaintLayer* layer, | 1402 const PaintLayer* layer, |
| 1406 const PaintLayer* ancestorLayer, | 1403 const PaintLayer* ancestorLayer, |
| 1407 LayoutPoint& location) { | 1404 LayoutPoint& location) { |
| 1408 DCHECK(ancestorLayer != layer); | 1405 DCHECK(ancestorLayer != layer); |
| 1409 | 1406 |
| 1410 const LayoutBoxModelObject* layoutObject = layer->layoutObject(); | 1407 const LayoutBoxModelObject* layoutObject = layer->layoutObject(); |
| 1411 EPosition position = layoutObject->style()->position(); | |
| 1412 | 1408 |
| 1413 if (position == FixedPosition && | 1409 if (layoutObject->isFixedPositioned() && |
| 1414 (!ancestorLayer || ancestorLayer == layoutObject->view()->layer())) { | 1410 (!ancestorLayer || ancestorLayer == layoutObject->view()->layer())) { |
| 1415 // If the fixed layer's container is the root, just add in the offset of the | 1411 // If the fixed layer's container is the root, just add in the offset of the |
| 1416 // view. We can obtain this by calling localToAbsolute() on the LayoutView. | 1412 // view. We can obtain this by calling localToAbsolute() on the LayoutView. |
| 1417 FloatPoint absPos = layoutObject->localToAbsolute(); | 1413 FloatPoint absPos = layoutObject->localToAbsolute(); |
| 1418 location += LayoutSize(absPos.x(), absPos.y()); | 1414 location += LayoutSize(absPos.x(), absPos.y()); |
| 1419 return ancestorLayer; | 1415 return ancestorLayer; |
| 1420 } | 1416 } |
| 1421 | 1417 |
| 1422 PaintLayer* parentLayer = nullptr; | 1418 bool foundAncestorFirst; |
| 1423 if (position == AbsolutePosition || position == FixedPosition || | 1419 PaintLayer* containingLayer = |
| 1424 (layoutObject->isFloating() && layoutObject->parent() && | 1420 layer->containingLayer(ancestorLayer, &foundAncestorFirst); |
| 1425 !layoutObject->parent()->isLayoutBlockFlow())) { | |
| 1426 bool foundAncestorFirst = false; | |
| 1427 if (layoutObject->isFloating()) { | |
| 1428 Optional<LayoutObject::AncestorSkipInfo> skipInfo; | |
| 1429 if (ancestorLayer) | |
| 1430 skipInfo.emplace(ancestorLayer->layoutObject()); | |
| 1431 if (auto* containingBlock = layoutObject->containingBlock( | |
| 1432 ancestorLayer ? &*skipInfo : nullptr)) { | |
| 1433 parentLayer = containingBlock->enclosingLayer(); | |
| 1434 foundAncestorFirst = ancestorLayer && skipInfo->ancestorSkipped(); | |
| 1435 } | |
| 1436 } else { | |
| 1437 parentLayer = layer->containingLayerForOutOfFlowPositioned( | |
| 1438 ancestorLayer, &foundAncestorFirst); | |
| 1439 } | |
| 1440 | 1421 |
| 1441 if (foundAncestorFirst) { | 1422 if (foundAncestorFirst) { |
| 1442 // Found ancestorLayer before the container of the out-of-flow object, so | 1423 // Found ancestorLayer before the containing layer, so compute offset of |
| 1443 // compute offset of both relative to the container and subtract. | 1424 // both relative to the container and subtract. |
| 1425 LayoutPoint thisCoords; |
| 1426 layer->convertToLayerCoords(containingLayer, thisCoords); |
| 1444 | 1427 |
| 1445 LayoutPoint thisCoords; | 1428 LayoutPoint ancestorCoords; |
| 1446 layer->convertToLayerCoords(parentLayer, thisCoords); | 1429 ancestorLayer->convertToLayerCoords(containingLayer, ancestorCoords); |
| 1447 | 1430 |
| 1448 LayoutPoint ancestorCoords; | 1431 location += (thisCoords - ancestorCoords); |
| 1449 ancestorLayer->convertToLayerCoords(parentLayer, ancestorCoords); | 1432 return ancestorLayer; |
| 1450 | |
| 1451 location += (thisCoords - ancestorCoords); | |
| 1452 return ancestorLayer; | |
| 1453 } | |
| 1454 } else if (layoutObject->isColumnSpanAll()) { | |
| 1455 LayoutBlock* multicolContainer = layoutObject->containingBlock(); | |
| 1456 DCHECK(toLayoutBlockFlow(multicolContainer)->multiColumnFlowThread()); | |
| 1457 parentLayer = multicolContainer->layer(); | |
| 1458 DCHECK(parentLayer); | |
| 1459 } else { | |
| 1460 parentLayer = layer->parent(); | |
| 1461 } | 1433 } |
| 1462 | 1434 |
| 1463 if (!parentLayer) | 1435 if (!containingLayer) |
| 1464 return nullptr; | 1436 return nullptr; |
| 1465 | 1437 |
| 1466 location += layer->location(); | 1438 location += layer->location(); |
| 1467 return parentLayer; | 1439 return containingLayer; |
| 1468 } | 1440 } |
| 1469 | 1441 |
| 1470 void PaintLayer::convertToLayerCoords(const PaintLayer* ancestorLayer, | 1442 void PaintLayer::convertToLayerCoords(const PaintLayer* ancestorLayer, |
| 1471 LayoutPoint& location) const { | 1443 LayoutPoint& location) const { |
| 1472 if (ancestorLayer == this) | 1444 if (ancestorLayer == this) |
| 1473 return; | 1445 return; |
| 1474 | 1446 |
| 1475 const PaintLayer* currLayer = this; | 1447 const PaintLayer* currLayer = this; |
| 1476 while (currLayer && currLayer != ancestorLayer) | 1448 while (currLayer && currLayer != ancestorLayer) |
| 1477 currLayer = | 1449 currLayer = |
| (...skipping 1743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3221 } | 3193 } |
| 3222 | 3194 |
| 3223 void showLayerTree(const blink::LayoutObject* layoutObject) { | 3195 void showLayerTree(const blink::LayoutObject* layoutObject) { |
| 3224 if (!layoutObject) { | 3196 if (!layoutObject) { |
| 3225 LOG(INFO) << "Cannot showLayerTree. Root is (nil)"; | 3197 LOG(INFO) << "Cannot showLayerTree. Root is (nil)"; |
| 3226 return; | 3198 return; |
| 3227 } | 3199 } |
| 3228 showLayerTree(layoutObject->enclosingLayer()); | 3200 showLayerTree(layoutObject->enclosingLayer()); |
| 3229 } | 3201 } |
| 3230 #endif | 3202 #endif |
| OLD | NEW |