Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(485)

Unified Diff: third_party/WebKit/Source/core/layout/ng/ng_layout_opportunity_iterator.cc

Issue 2467803002: Revert of Use NGLogicalRect instead of NGExclusion for exclusions. (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 5eb1a7c78a601292445a6b44c4be74221492257c..dfcb0b331022510d3459f4b17726951b5d16e209 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,6 +43,18 @@
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.
//
@@ -51,18 +63,18 @@
// @return New node or nullptr if the new block size == 0.
NGLayoutOpportunityTreeNode* CreateBottomNGLayoutOpportunityTreeNode(
const NGLayoutOpportunityTreeNode* parent_node,
- const NGLogicalRect& exclusion) {
+ const NGExclusion& exclusion) {
const NGLayoutOpportunity& parent_opportunity = parent_node->opportunity;
- 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()};
+ 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);
return new NGLayoutOpportunityTreeNode(opportunity, exclusion_edge);
}
return nullptr;
@@ -77,21 +89,18 @@
// exclusion edge doesn't limit the new node's constraint space.
NGLayoutOpportunityTreeNode* CreateLeftNGLayoutOpportunityTreeNode(
const NGLayoutOpportunityTreeNode* parent_node,
- const NGLogicalRect& exclusion) {
+ const NGExclusion& exclusion) {
const NGLayoutOpportunity& parent_opportunity = parent_node->opportunity;
-
- 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 &&
+ 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 &&
IsOverlapping(parent_node->exclusion_edge, node_edge)) {
- 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();
+ NGLayoutOpportunity opportunity(left, top, inline_size, bottom - top);
return new NGLayoutOpportunityTreeNode(opportunity);
}
return nullptr;
@@ -106,20 +115,19 @@
// exclusion edge doesn't limit the new node's constraint space.
NGLayoutOpportunityTreeNode* CreateRightNGLayoutOpportunityTreeNode(
const NGLayoutOpportunityTreeNode* parent_node,
- const NGLogicalRect& exclusion) {
+ const NGExclusion& exclusion) {
const NGLayoutOpportunity& parent_opportunity = parent_node->opportunity;
-
- 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 &&
+ 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 &&
IsOverlapping(parent_node->exclusion_edge, node_edge)) {
- 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();
+ NGLayoutOpportunity opportunity(left, top, inline_size, bottom - top);
return new NGLayoutOpportunityTreeNode(opportunity);
}
return nullptr;
@@ -128,34 +136,33 @@
// Gets/Creates the "TOP" positioned constraint space by splitting
// the parent node with the exclusion.
//
-// @param parent_opportunity Parent opportunity that is being split.
+// @param parent_node Node that needs to be 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& 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;
- }
+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);
+
return NGLayoutOpportunity();
}
// Inserts the exclusion into the Layout Opportunity tree.
void InsertExclusion(NGLayoutOpportunityTreeNode* node,
- const NGLogicalRect* exclusion,
+ const NGExclusion* exclusion,
NGLayoutOpportunities& opportunities) {
// Base case: there is no node.
if (!node)
return;
// Base case: exclusion is not in the node's constraint space.
- if (!exclusion->IsContained(node->opportunity))
+ if (!IsExclusionWithinSpace(node->opportunity, *exclusion))
return;
if (node->exclusion) {
@@ -179,10 +186,9 @@
}
// Compares exclusions by their top position.
-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;
+bool CompareNGExclusionsByTopAsc(const Member<const NGExclusion>& lhs,
+ const Member<const NGExclusion>& rhs) {
+ return rhs->Top() > lhs->Top();
}
// Compares Layout Opportunities by Start Point.
@@ -218,7 +224,7 @@
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";
@@ -227,9 +233,8 @@
CreateLayoutOpportunityFromConstraintSpace(*space, origin_point);
opportunity_tree_root_ = new NGLayoutOpportunityTreeNode(initial_opportunity);
- for (const auto& exclusion : exclusions) {
- InsertExclusion(MutableOpportunityTreeRoot(), exclusion.get(),
- opportunities_);
+ for (const auto exclusion : exclusions) {
+ InsertExclusion(MutableOpportunityTreeRoot(), exclusion, opportunities_);
}
CollectAllOpportunities(OpportunityTreeRoot(), opportunities_);
std::sort(opportunities_.begin(), opportunities_.end(),

Powered by Google App Engine
This is Rietveld 408576698