Changeset 260827 in webkit
- Timestamp:
- Apr 28, 2020 8:25:11 AM (4 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r260824 r260827 1 2020-04-28 Zalan Bujtas <zalan@apple.com> 2 3 [LFC] Introduce FormattingContext::ConstraintsForOutOfFlowContent 4 https://bugs.webkit.org/show_bug.cgi?id=211125 5 6 Reviewed by Antti Koivisto. 7 8 Horizontal and vertical out-of-flow constraints are always computed and used in pairs. 9 10 * layout/FormattingContext.cpp: 11 (WebCore::Layout::FormattingContext::computeOutOfFlowHorizontalGeometry): 12 (WebCore::Layout::FormattingContext::computeOutOfFlowVerticalGeometry): 13 (WebCore::Layout::FormattingContext::layoutOutOfFlowContent): 14 * layout/FormattingContext.h: 15 * layout/FormattingContextGeometry.cpp: 16 (WebCore::Layout::FormattingContext::Geometry::constraintsForOutOfFlowContent): 17 (WebCore::Layout::FormattingContext::Geometry::horizontalConstraintsForOutOfFlow): Deleted. 18 (WebCore::Layout::FormattingContext::Geometry::verticalConstraintsForOutOfFlow): Deleted. 19 * layout/LayoutContext.cpp: 20 (WebCore::Layout::LayoutContext::layoutFormattingContextSubtree): 21 * layout/LayoutUnits.h: 22 * layout/blockformatting/BlockFormattingContext.cpp: 23 (WebCore::Layout::BlockFormattingContext::layoutInFlowContent): 24 * layout/inlineformatting/InlineFormattingContext.cpp: 25 (WebCore::Layout::InlineFormattingContext::layoutInFlowContent): 26 1 27 2020-04-28 Zalan Bujtas <zalan@apple.com> 2 28 -
trunk/Source/WebCore/layout/FormattingContext.cpp
r260824 r260827 70 70 } 71 71 72 void FormattingContext::computeOutOfFlowHorizontalGeometry(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const VerticalConstraints& verticalConstraints)72 void FormattingContext::computeOutOfFlowHorizontalGeometry(const Box& layoutBox, const ConstraintsForOutOfFlowContent& constraints) 73 73 { 74 74 ASSERT(layoutBox.isOutOfFlowPositioned()); 75 75 auto compute = [&](Optional<LayoutUnit> usedWidth) { 76 return geometry().outOfFlowHorizontalGeometry(layoutBox, horizontalConstraints, verticalConstraints, { usedWidth, { } });76 return geometry().outOfFlowHorizontalGeometry(layoutBox, constraints.horizontal, constraints.vertical, { usedWidth, { } }); 77 77 }; 78 78 79 auto containingBlockWidth = horizontalConstraints.logicalWidth;79 auto containingBlockWidth = constraints.horizontal.logicalWidth; 80 80 auto horizontalGeometry = compute({ }); 81 81 if (auto maxWidth = geometry().computedMaxWidth(layoutBox, containingBlockWidth)) { … … 98 98 } 99 99 100 void FormattingContext::computeOutOfFlowVerticalGeometry(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const VerticalConstraints& verticalConstraints)100 void FormattingContext::computeOutOfFlowVerticalGeometry(const Box& layoutBox, const ConstraintsForOutOfFlowContent& constraints) 101 101 { 102 102 ASSERT(layoutBox.isOutOfFlowPositioned()); 103 103 auto compute = [&](Optional<LayoutUnit> usedHeight) { 104 return geometry().outOfFlowVerticalGeometry(layoutBox, horizontalConstraints, verticalConstraints, { usedHeight });104 return geometry().outOfFlowVerticalGeometry(layoutBox, constraints.horizontal, constraints.vertical, { usedHeight }); 105 105 }; 106 106 107 auto containingBlockHeight = * verticalConstraints.logicalHeight;107 auto containingBlockHeight = *constraints.vertical.logicalHeight; 108 108 auto verticalGeometry = compute({ }); 109 109 if (auto maxHeight = geometry().computedMaxHeight(layoutBox, containingBlockHeight)) { … … 134 134 } 135 135 136 void FormattingContext::layoutOutOfFlowContent(InvalidationState& invalidationState, const OutOfFlowHorizontalConstraints& rootHorizontalConstraints, const VerticalConstraints& rootVerticalConstraints)136 void FormattingContext::layoutOutOfFlowContent(InvalidationState& invalidationState, const ConstraintsForOutOfFlowContent& constraints) 137 137 { 138 138 LOG_WITH_STREAM(FormattingContextLayout, stream << "Start: layout out-of-flow content -> context: " << &layoutState() << " root: " << &root()); … … 140 140 collectOutOfFlowDescendantsIfNeeded(); 141 141 142 auto horizontalConstraintsForLayoutBox = [&] (const auto& outOfFlowBox) {142 auto constraintsForLayoutBox = [&] (const auto& outOfFlowBox) { 143 143 auto& containingBlock = outOfFlowBox.containingBlock(); 144 if (&containingBlock == &root()) 145 return rootHorizontalConstraints; 146 return Geometry::horizontalConstraintsForOutOfFlow(geometryForBox(containingBlock)); 147 }; 148 149 auto verticalConstraintsForLayoutBox = [&] (const auto& outOfFlowBox) { 150 auto& containingBlock = outOfFlowBox.containingBlock(); 151 if (&containingBlock == &root()) 152 return rootVerticalConstraints; 153 return Geometry::verticalConstraintsForOutOfFlow(geometryForBox(containingBlock)); 144 return &containingBlock == &root() ? constraints : Geometry::constraintsForOutOfFlowContent(geometryForBox(containingBlock)); 154 145 }; 155 146 … … 159 150 continue; 160 151 161 auto outOfFlowHorizontalConstraints = horizontalConstraintsForLayoutBox(*outOfFlowBox);162 auto horizontalConstraintsForBorderAndPadding = HorizontalConstraints { outOfFlowHorizontalConstraints.value.logicalLeft, outOfFlowHorizontalConstraints.borderAndPaddingSpecificWidth};152 auto containingBlockConstraints = constraintsForLayoutBox(*outOfFlowBox); 153 auto horizontalConstraintsForBorderAndPadding = HorizontalConstraints { containingBlockConstraints.horizontal.logicalLeft, containingBlockConstraints.borderAndPaddingConstraints }; 163 154 computeBorderAndPadding(*outOfFlowBox, horizontalConstraintsForBorderAndPadding); 164 155 165 auto horizontalConstraints = outOfFlowHorizontalConstraints.value; 166 auto verticalConstraints = verticalConstraintsForLayoutBox(*outOfFlowBox); 167 computeOutOfFlowHorizontalGeometry(*outOfFlowBox, horizontalConstraints, verticalConstraints); 156 computeOutOfFlowHorizontalGeometry(*outOfFlowBox, containingBlockConstraints); 168 157 if (is<ContainerBox>(*outOfFlowBox)) { 169 158 auto& containerBox = downcast<ContainerBox>(*outOfFlowBox); … … 174 163 formattingContext->layoutInFlowContent(invalidationState, Geometry::constraintsForInFlowContent(containerDisplayBox)); 175 164 } 176 computeOutOfFlowVerticalGeometry(containerBox, horizontalConstraints, verticalConstraints);165 computeOutOfFlowVerticalGeometry(containerBox, containingBlockConstraints); 177 166 if (containerBox.hasChild()) { 178 auto horizontalConstraintsForOutOfFlowContent = Geometry::horizontalConstraintsForOutOfFlow(containerDisplayBox);179 auto verticalConstraintsForOutOfFlowContent = Geometry::verticalConstraintsForOutOfFlow(containerDisplayBox);180 167 auto formattingContext = LayoutContext::createFormattingContext(containerBox, layoutState()); 181 formattingContext->layoutOutOfFlowContent(invalidationState, horizontalConstraintsForOutOfFlowContent, verticalConstraintsForOutOfFlowContent);168 formattingContext->layoutOutOfFlowContent(invalidationState, Geometry::constraintsForOutOfFlowContent(containerDisplayBox)); 182 169 } 183 170 } else 184 computeOutOfFlowVerticalGeometry(*outOfFlowBox, horizontalConstraints, verticalConstraints);171 computeOutOfFlowVerticalGeometry(*outOfFlowBox, containingBlockConstraints); 185 172 } 186 173 LOG_WITH_STREAM(FormattingContextLayout, stream << "End: layout out-of-flow content -> context: " << &layoutState() << " root: " << &root()); -
trunk/Source/WebCore/layout/FormattingContext.h
r260824 r260827 71 71 }; 72 72 virtual void layoutInFlowContent(InvalidationState&, const ConstraintsForInFlowContent&) = 0; 73 void layoutOutOfFlowContent(InvalidationState&, const OutOfFlowHorizontalConstraints&, const VerticalConstraints&); 73 74 struct ConstraintsForOutOfFlowContent { 75 HorizontalConstraints horizontal; 76 VerticalConstraints vertical; 77 // Borders and paddings are resolved against the containing block's content box as if the box was an in-flow box. 78 LayoutUnit borderAndPaddingConstraints; 79 }; 80 void layoutOutOfFlowContent(InvalidationState&, const ConstraintsForOutOfFlowContent&); 74 81 75 82 struct IntrinsicWidthConstraints { … … 151 158 LayoutUnit contentHeightForFormattingContextRoot(const Box&) const; 152 159 153 static OutOfFlowHorizontalConstraints horizontalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry); 154 static VerticalConstraints verticalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry); 155 static FormattingContext::ConstraintsForInFlowContent constraintsForInFlowContent(const Display::Box& containingBlockGeometry); 160 static ConstraintsForOutOfFlowContent constraintsForOutOfFlowContent(const Display::Box& containingBlockGeometry); 161 static ConstraintsForInFlowContent constraintsForInFlowContent(const Display::Box& containingBlockGeometry); 156 162 157 163 protected: … … 205 211 private: 206 212 void collectOutOfFlowDescendantsIfNeeded(); 207 void computeOutOfFlowVerticalGeometry(const Box&, const HorizontalConstraints&, const VerticalConstraints&);208 void computeOutOfFlowHorizontalGeometry(const Box&, const HorizontalConstraints&, const VerticalConstraints&);213 void computeOutOfFlowVerticalGeometry(const Box&, const ConstraintsForOutOfFlowContent&); 214 void computeOutOfFlowHorizontalGeometry(const Box&, const ConstraintsForOutOfFlowContent&); 209 215 210 216 WeakPtr<const ContainerBox> m_root; -
trunk/Source/WebCore/layout/FormattingContextGeometry.cpp
r260824 r260827 1099 1099 } 1100 1100 1101 OutOfFlowHorizontalConstraints FormattingContext::Geometry::horizontalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry) 1102 { 1103 return OutOfFlowHorizontalConstraints { 1104 HorizontalConstraints { containingBlockGeometry.paddingBoxLeft(), containingBlockGeometry.paddingBoxWidth() }, 1101 FormattingContext::ConstraintsForOutOfFlowContent FormattingContext::Geometry::constraintsForOutOfFlowContent(const Display::Box& containingBlockGeometry) 1102 { 1103 return { 1104 { containingBlockGeometry.paddingBoxLeft(), containingBlockGeometry.paddingBoxWidth() }, 1105 { containingBlockGeometry.paddingBoxTop(), containingBlockGeometry.paddingBoxHeight() }, 1105 1106 containingBlockGeometry.contentBoxWidth() }; 1106 1107 } 1107 1108 1108 VerticalConstraints FormattingContext::Geometry::verticalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry)1109 {1110 return VerticalConstraints { containingBlockGeometry.paddingBoxTop(), containingBlockGeometry.paddingBoxHeight() };1111 }1112 1113 1109 FormattingContext::ConstraintsForInFlowContent FormattingContext::Geometry::constraintsForInFlowContent(const Display::Box& containingBlockGeometry) 1114 1110 { -
trunk/Source/WebCore/layout/LayoutContext.cpp
r260824 r260827 108 108 // It also means that the formattingContextRoot has to have a valid/clean geometry at this point. 109 109 { 110 auto horizontalConstraints = OutOfFlowHorizontalConstraints { HorizontalConstraints { displayBox.paddingBoxLeft(), displayBox.paddingBoxWidth() }, displayBox.contentBoxWidth() };111 auto verticalConstraints = VerticalConstraints { displayBox.paddingBoxTop(), displayBox.paddingBoxHeight() };112 formattingContext->layoutOutOfFlowContent(invalidationState, horizontalConstraints, verticalConstraints);110 auto constraints = FormattingContext::ConstraintsForOutOfFlowContent { { displayBox.paddingBoxLeft(), displayBox.paddingBoxWidth() }, 111 { displayBox.paddingBoxTop(), displayBox.paddingBoxHeight() }, displayBox.contentBoxWidth() }; 112 formattingContext->layoutOutOfFlowContent(invalidationState, constraints); 113 113 } 114 114 } -
trunk/Source/WebCore/layout/LayoutUnits.h
r260396 r260827 162 162 }; 163 163 164 struct OutOfFlowHorizontalConstraints {165 HorizontalConstraints value;166 // Borders and paddings are resolved against the containing block's content box as if the box was an in-flow box.167 LayoutUnit borderAndPaddingSpecificWidth;168 };169 170 164 struct VerticalConstraints { 171 165 LayoutUnit logicalTop; -
trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp
r260824 r260827 153 153 if (is<ContainerBox>(layoutBox) && downcast<ContainerBox>(layoutBox).hasChild()) { 154 154 auto& containerBox = downcast<ContainerBox>(layoutBox); 155 auto& rootDisplayBox = geometryForBox(containerBox); 156 auto horizontalConstraintsForOutOfFlowContent = Geometry::horizontalConstraintsForOutOfFlow(rootDisplayBox); 157 auto verticalConstraintsForOutOfFlowContent = Geometry::verticalConstraintsForOutOfFlow(rootDisplayBox); 158 LayoutContext::createFormattingContext(containerBox, layoutState())->layoutOutOfFlowContent(invalidationState, horizontalConstraintsForOutOfFlowContent, verticalConstraintsForOutOfFlowContent); 155 LayoutContext::createFormattingContext(containerBox, layoutState())->layoutOutOfFlowContent(invalidationState, Geometry::constraintsForOutOfFlowContent(geometryForBox(containerBox))); 159 156 } 160 157 } -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp
r260824 r260827 104 104 computeHeightAndMargin(containerBox, constraints.horizontal); 105 105 if (containerBox.hasChild()) { 106 auto horizontalConstraintsForOutOfFlow = Geometry::horizontalConstraintsForOutOfFlow(formattingRootDisplayBox);107 auto verticalConstraintsForOutOfFlow = Geometry::verticalConstraintsForOutOfFlow(formattingRootDisplayBox);108 106 auto formattingContext = LayoutContext::createFormattingContext(containerBox, layoutState()); 109 formattingContext->layoutOutOfFlowContent(invalidationState, horizontalConstraintsForOutOfFlow, verticalConstraintsForOutOfFlow);107 formattingContext->layoutOutOfFlowContent(invalidationState, Geometry::constraintsForOutOfFlowContent(formattingRootDisplayBox)); 110 108 } 111 109 } else {
Note: See TracChangeset
for help on using the changeset viewer.