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

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

Issue 2322293002: [LayoutNG] Split LayoutOpportunityIterator into separate file (Closed)
Patch Set: Patch for landing Created 4 years, 3 months 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_constraint_space.cc
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.cc b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.cc
index c88c9aafa9ce840546bb9652ed1c20b9029fd32d..676ad16d00ea592851e80e1fe1a56db102da2bf4 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.cc
@@ -6,9 +6,8 @@
#include "core/layout/LayoutBlock.h"
#include "core/layout/LayoutView.h"
+#include "core/layout/ng/ng_layout_opportunity_iterator.h"
#include "core/layout/ng/ng_units.h"
-#include "wtf/NonCopyingSort.h"
-#include <climits>
namespace blink {
@@ -171,139 +170,4 @@ String NGConstraintSpace::toString() const {
size_.block_size.toString().ascii().data());
}
-static inline bool AscendingTopCompare(const NGExclusion& a,
- const NGExclusion& b) {
- return a.Top() > b.Top();
-}
-
-NGLayoutOpportunityIterator::NGLayoutOpportunityIterator(
- NGConstraintSpace* space,
- unsigned clear,
- bool for_inline_or_bfc)
- : constraint_space_(space),
- clear_(clear),
- for_inline_or_bfc_(for_inline_or_bfc),
- current_exclusion_idx_(0) {
- for (const auto& item : constraint_space_->PhysicalSpace()->Exclusions())
- filtered_exclusions_.append(item);
-
- nonCopyingSort(filtered_exclusions_.begin(), filtered_exclusions_.end(),
- AscendingTopCompare);
-
- // TODO(eae): Set based on offset.
- LayoutUnit left;
- LayoutUnit top;
-
- unsigned i = filtered_exclusions_.size();
- while (i--) {
- const NGExclusion& exclusion = filtered_exclusions_[i];
-
- // Remove items above OR to the left of the start offset as they have no
- // effect on layout opportunities within this view.
- if (exclusion.Right() <= left || exclusion.Bottom() <= top) {
- filtered_exclusions_.remove(i);
- continue;
- }
-
- // Remove items below AND to the right of the current exclusions as they're
- // occluded and won't affect the layout opportunities.
- for (unsigned j = filtered_exclusions_.size() - 1; j > i; j--) {
- const NGExclusion& item = filtered_exclusions_[j];
- if (item.Top() > exclusion.Top() && item.Left() > exclusion.Left())
- filtered_exclusions_.remove(j);
- }
- }
-}
-
-NGConstraintSpace* NGLayoutOpportunityIterator::Next() {
- if (current_opportunities_.isEmpty() &&
- current_exclusion_idx_ < filtered_exclusions_.size()) {
- computeForExclusion(current_exclusion_idx_);
- current_exclusion_idx_++;
- }
-
- if (!current_opportunities_.isEmpty()) {
- NGConstraintSpace* opportunity = current_opportunities_.last();
- current_opportunities_.removeLast();
- return opportunity;
- }
-
- if (filtered_exclusions_.isEmpty() && current_exclusion_idx_ == 0) {
- current_exclusion_idx_++;
- return new NGConstraintSpace(constraint_space_->WritingMode(),
- constraint_space_->PhysicalSpace());
- }
-
- return nullptr;
-}
-
-static inline bool DescendingWidthCompare(const NGConstraintSpace* a,
- const NGConstraintSpace* b) {
- return a->Size().inline_size > b->Size().inline_size;
-}
-
-void NGLayoutOpportunityIterator::computeForExclusion(unsigned index) {
- current_opportunities_.clear();
-
- // TODO(eae): Set based on index.
- LayoutUnit left;
- LayoutUnit top;
-
- // TODO(eae): Writing modes.
- LayoutUnit right = constraint_space_->Size().inline_size;
- LayoutUnit bottom = constraint_space_->Size().block_size;
-
- // TODO(eae): Filter based on clear_ and for_inline_or_bfc_. Return early for
- // now to make it clear neither are supported yet.
- if (clear_ != NGClearNone || !for_inline_or_bfc_)
- return;
-
- // Compute opportunity for the full width from the start position to the right
- // edge of the NGConstraintSpace.
- LayoutUnit opportunityHeight = heightForOpportunity(left, top, right, bottom);
- if (opportunityHeight && right > left)
- addLayoutOpportunity(left, top, right - left, opportunityHeight);
-
- // Compute the maximum available height between the current position and the
- // left edge of each exclusion. The distance between the current horizontal
- // position and the left edge of the exclusion determines the width of the
- // opportunity.
- for (const NGExclusion& exclusion : filtered_exclusions_) {
- opportunityHeight =
- heightForOpportunity(left, top, exclusion.Left(), bottom);
- if (opportunityHeight && exclusion.Left() > left)
- addLayoutOpportunity(left, top, exclusion.Left() - left,
- opportunityHeight);
- }
-
- nonCopyingSort(current_opportunities_.begin(), current_opportunities_.end(),
- DescendingWidthCompare);
-}
-
-// For the given 2D range (opportunity), this will return a height which makes
-// it bounded by the highest exclusion in the filtered exclusion list within the
-// range. Returns 0-height for an invalid opportunity (which has zero area).
-LayoutUnit NGLayoutOpportunityIterator::heightForOpportunity(
- LayoutUnit left,
- LayoutUnit top,
- LayoutUnit right,
- LayoutUnit bottom) {
- LayoutUnit lowestBottom = bottom;
- for (const NGExclusion& exclusion : filtered_exclusions_) {
- if (exclusion.Left() < right && exclusion.Right() > left &&
- exclusion.Bottom() > top && exclusion.Top() <= lowestBottom)
- lowestBottom = exclusion.Top();
- }
- return std::max(lowestBottom - top, LayoutUnit());
-}
-
-void NGLayoutOpportunityIterator::addLayoutOpportunity(LayoutUnit left,
- LayoutUnit top,
- LayoutUnit right,
- LayoutUnit bottom) {
- current_opportunities_.append(
- new NGConstraintSpace(*constraint_space_, NGLogicalOffset(left, top),
- NGLogicalSize(right - left, bottom - top)));
-}
-
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698