| Index: third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc
|
| diff --git a/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc b/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc
|
| index dfcb0b331022510d3459f4b17726951b5d16e209..d667a86f83e9ef4eebe4f4ed64defff1f7d2a612 100644
|
| --- a/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc
|
| +++ b/third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc
|
| @@ -43,18 +43,6 @@ bool IsOverlapping(const NGEdge& edge1, const NGEdge& edge2) {
|
| return std::max(edge1.start, edge2.start) <= std::min(edge1.end, edge2.end);
|
| }
|
|
|
| -// Whether the exclusion is out of bounds of the LayoutNG constraint space.
|
| -bool IsExclusionWithinSpace(const NGLayoutOpportunity& opportunity,
|
| - const NGExclusion& exclusion) {
|
| - LayoutUnit left = opportunity.offset.inline_offset;
|
| - LayoutUnit top = opportunity.offset.block_offset;
|
| - LayoutUnit right = left + opportunity.size.inline_size;
|
| - LayoutUnit bottom = top + opportunity.size.block_size;
|
| -
|
| - return !(exclusion.Right() <= left || exclusion.Bottom() <= top ||
|
| - exclusion.Left() >= right || exclusion.Top() >= bottom);
|
| -}
|
| -
|
| // Creates the *BOTTOM* positioned Layout Opportunity tree node by splitting
|
| // the parent node with the exclusion.
|
| //
|
| @@ -63,18 +51,18 @@ bool IsExclusionWithinSpace(const NGLayoutOpportunity& opportunity,
|
| // @return New node or nullptr if the new block size == 0.
|
| NGLayoutOpportunityTreeNode* CreateBottomNGLayoutOpportunityTreeNode(
|
| const NGLayoutOpportunityTreeNode* parent_node,
|
| - const NGExclusion& exclusion) {
|
| + const NGLogicalRect& exclusion) {
|
| const NGLayoutOpportunity& parent_opportunity = parent_node->opportunity;
|
| - LayoutUnit left = parent_opportunity.offset.inline_offset;
|
| - LayoutUnit top = exclusion.Bottom();
|
| - LayoutUnit right = left + parent_opportunity.size.inline_size;
|
| - LayoutUnit bottom = parent_opportunity.offset.block_offset +
|
| - parent_opportunity.size.block_size;
|
| -
|
| - NGEdge exclusion_edge = {exclusion.Left(), exclusion.Right()};
|
| - LayoutUnit block_size = bottom - top;
|
| - if (block_size > 0) {
|
| - NGLayoutOpportunity opportunity(left, top, right - left, block_size);
|
| + LayoutUnit bottom_opportunity_block_size =
|
| + parent_opportunity.BlockEndOffset() - exclusion.BlockEndOffset();
|
| + if (bottom_opportunity_block_size > 0) {
|
| + NGLayoutOpportunity opportunity;
|
| + opportunity.offset.inline_offset = parent_opportunity.InlineStartOffset();
|
| + opportunity.offset.block_offset = exclusion.BlockEndOffset();
|
| + opportunity.size.inline_size = parent_opportunity.InlineSize();
|
| + opportunity.size.block_size = bottom_opportunity_block_size;
|
| + NGEdge exclusion_edge = {/* start */ exclusion.InlineStartOffset(),
|
| + /* end */ exclusion.InlineEndOffset()};
|
| return new NGLayoutOpportunityTreeNode(opportunity, exclusion_edge);
|
| }
|
| return nullptr;
|
| @@ -89,18 +77,21 @@ NGLayoutOpportunityTreeNode* CreateBottomNGLayoutOpportunityTreeNode(
|
| // exclusion edge doesn't limit the new node's constraint space.
|
| NGLayoutOpportunityTreeNode* CreateLeftNGLayoutOpportunityTreeNode(
|
| const NGLayoutOpportunityTreeNode* parent_node,
|
| - const NGExclusion& exclusion) {
|
| + const NGLogicalRect& exclusion) {
|
| const NGLayoutOpportunity& parent_opportunity = parent_node->opportunity;
|
| - LayoutUnit left = parent_opportunity.offset.inline_offset;
|
| - LayoutUnit top = parent_opportunity.offset.block_offset;
|
| - LayoutUnit right = exclusion.Left();
|
| - LayoutUnit bottom = top + parent_opportunity.size.block_size;
|
| -
|
| - NGEdge node_edge = {left, right};
|
| - LayoutUnit inline_size = right - left;
|
| - if (inline_size > 0 &&
|
| +
|
| + LayoutUnit left_opportunity_inline_size =
|
| + exclusion.InlineStartOffset() - parent_opportunity.InlineStartOffset();
|
| + NGEdge node_edge = {/* start */ parent_opportunity.InlineStartOffset(),
|
| + /* end */ exclusion.InlineStartOffset()};
|
| +
|
| + if (left_opportunity_inline_size > 0 &&
|
| IsOverlapping(parent_node->exclusion_edge, node_edge)) {
|
| - NGLayoutOpportunity opportunity(left, top, inline_size, bottom - top);
|
| + NGLayoutOpportunity opportunity;
|
| + opportunity.offset.inline_offset = parent_opportunity.InlineStartOffset();
|
| + opportunity.offset.block_offset = parent_opportunity.BlockStartOffset();
|
| + opportunity.size.inline_size = left_opportunity_inline_size;
|
| + opportunity.size.block_size = parent_opportunity.BlockSize();
|
| return new NGLayoutOpportunityTreeNode(opportunity);
|
| }
|
| return nullptr;
|
| @@ -115,19 +106,20 @@ NGLayoutOpportunityTreeNode* CreateLeftNGLayoutOpportunityTreeNode(
|
| // exclusion edge doesn't limit the new node's constraint space.
|
| NGLayoutOpportunityTreeNode* CreateRightNGLayoutOpportunityTreeNode(
|
| const NGLayoutOpportunityTreeNode* parent_node,
|
| - const NGExclusion& exclusion) {
|
| + const NGLogicalRect& exclusion) {
|
| const NGLayoutOpportunity& parent_opportunity = parent_node->opportunity;
|
| - LayoutUnit left = exclusion.Right();
|
| - LayoutUnit top = parent_opportunity.offset.block_offset;
|
| - LayoutUnit right = parent_opportunity.offset.inline_offset +
|
| - parent_opportunity.size.inline_size;
|
| - LayoutUnit bottom = top + parent_opportunity.size.block_size;
|
| -
|
| - NGEdge node_edge = {left, right};
|
| - LayoutUnit inline_size = right - left;
|
| - if (inline_size > 0 &&
|
| +
|
| + NGEdge node_edge = {/* start */ exclusion.InlineEndOffset(),
|
| + /* end */ parent_opportunity.InlineEndOffset()};
|
| + LayoutUnit right_opportunity_inline_size =
|
| + parent_opportunity.InlineEndOffset() - exclusion.InlineEndOffset();
|
| + if (right_opportunity_inline_size > 0 &&
|
| IsOverlapping(parent_node->exclusion_edge, node_edge)) {
|
| - NGLayoutOpportunity opportunity(left, top, inline_size, bottom - top);
|
| + NGLayoutOpportunity opportunity;
|
| + opportunity.offset.inline_offset = exclusion.InlineEndOffset();
|
| + opportunity.offset.block_offset = parent_opportunity.BlockStartOffset();
|
| + opportunity.size.inline_size = right_opportunity_inline_size;
|
| + opportunity.size.block_size = parent_opportunity.BlockSize();
|
| return new NGLayoutOpportunityTreeNode(opportunity);
|
| }
|
| return nullptr;
|
| @@ -136,33 +128,34 @@ NGLayoutOpportunityTreeNode* CreateRightNGLayoutOpportunityTreeNode(
|
| // Gets/Creates the "TOP" positioned constraint space by splitting
|
| // the parent node with the exclusion.
|
| //
|
| -// @param parent_node Node that needs to be split.
|
| +// @param parent_opportunity Parent opportunity that is being split.
|
| // @param exclusion Exclusion existed in the parent node constraint space.
|
| // @return New node or nullptr if the new block size == 0.
|
| -NGLayoutOpportunity GetTopSpace(const NGLayoutOpportunity& rect,
|
| - const NGExclusion& exclusion) {
|
| - LayoutUnit left = rect.offset.inline_offset;
|
| - LayoutUnit top = rect.offset.block_offset;
|
| - LayoutUnit right = left + rect.size.inline_size;
|
| - LayoutUnit bottom = exclusion.Top();
|
| -
|
| - LayoutUnit block_size = bottom - top;
|
| - if (block_size > 0)
|
| - return NGLayoutOpportunity(left, top, right - left, block_size);
|
| -
|
| +NGLayoutOpportunity GetTopSpace(const NGLayoutOpportunity& parent_opportunity,
|
| + const NGLogicalRect& exclusion) {
|
| + LayoutUnit top_opportunity_block_size =
|
| + exclusion.BlockStartOffset() - parent_opportunity.BlockStartOffset();
|
| + if (top_opportunity_block_size > 0) {
|
| + NGLayoutOpportunity opportunity;
|
| + opportunity.offset.inline_offset = parent_opportunity.InlineStartOffset();
|
| + opportunity.offset.block_offset = parent_opportunity.BlockStartOffset();
|
| + opportunity.size.inline_size = parent_opportunity.InlineSize();
|
| + opportunity.size.block_size = top_opportunity_block_size;
|
| + return opportunity;
|
| + }
|
| return NGLayoutOpportunity();
|
| }
|
|
|
| // Inserts the exclusion into the Layout Opportunity tree.
|
| void InsertExclusion(NGLayoutOpportunityTreeNode* node,
|
| - const NGExclusion* exclusion,
|
| + const NGLogicalRect* exclusion,
|
| NGLayoutOpportunities& opportunities) {
|
| // Base case: there is no node.
|
| if (!node)
|
| return;
|
|
|
| // Base case: exclusion is not in the node's constraint space.
|
| - if (!IsExclusionWithinSpace(node->opportunity, *exclusion))
|
| + if (!exclusion->IsWithin(node->opportunity))
|
| return;
|
|
|
| if (node->exclusion) {
|
| @@ -186,9 +179,10 @@ void InsertExclusion(NGLayoutOpportunityTreeNode* node,
|
| }
|
|
|
| // Compares exclusions by their top position.
|
| -bool CompareNGExclusionsByTopAsc(const Member<const NGExclusion>& lhs,
|
| - const Member<const NGExclusion>& rhs) {
|
| - return rhs->Top() > lhs->Top();
|
| +bool CompareNGExclusionsByTopAsc(
|
| + const std::unique_ptr<const NGLogicalRect>& lhs,
|
| + const std::unique_ptr<const NGLogicalRect>& rhs) {
|
| + return rhs->offset.block_offset > lhs->offset.block_offset;
|
| }
|
|
|
| // Compares Layout Opportunities by Start Point.
|
| @@ -224,7 +218,7 @@ NGLayoutOpportunityIterator::NGLayoutOpportunityIterator(
|
| const NGLogicalOffset leader_point)
|
| : constraint_space_(space), leader_point_(leader_point) {
|
| // TODO(chrome-layout-team): Combine exclusions that shadow each other.
|
| - auto exclusions = constraint_space_->PhysicalSpace()->Exclusions();
|
| + auto& exclusions = constraint_space_->PhysicalSpace()->Exclusions();
|
| DCHECK(std::is_sorted(exclusions.begin(), exclusions.end(),
|
| &CompareNGExclusionsByTopAsc))
|
| << "Exclusions are expected to be sorted by TOP";
|
| @@ -233,8 +227,9 @@ NGLayoutOpportunityIterator::NGLayoutOpportunityIterator(
|
| CreateLayoutOpportunityFromConstraintSpace(*space, origin_point);
|
| opportunity_tree_root_ = new NGLayoutOpportunityTreeNode(initial_opportunity);
|
|
|
| - for (const auto exclusion : exclusions) {
|
| - InsertExclusion(MutableOpportunityTreeRoot(), exclusion, opportunities_);
|
| + for (const auto& exclusion : exclusions) {
|
| + InsertExclusion(MutableOpportunityTreeRoot(), exclusion.get(),
|
| + opportunities_);
|
| }
|
| CollectAllOpportunities(OpportunityTreeRoot(), opportunities_);
|
| std::sort(opportunities_.begin(), opportunities_.end(),
|
|
|