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

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

Issue 2655783006: Top down version of algorithm to position margins and floats in LayoutNG (Closed)
Patch Set: git rebase-update Created 3 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/layout/ng/ng_layout_opportunity_iterator.h" 5 #include "core/layout/ng/ng_layout_opportunity_iterator.h"
6 6
7 #include "core/layout/ng/ng_units.h" 7 #include "core/layout/ng/ng_units.h"
8 #include "wtf/NonCopyingSort.h" 8 #include "wtf/NonCopyingSort.h"
9 9
10 namespace blink { 10 namespace blink {
11 namespace { 11 namespace {
12 12
13 // Collects all opportunities from leaves of Layout Opportunity spatial tree. 13 // Collects all opportunities from leaves of Layout Opportunity spatial tree.
14 void CollectAllOpportunities(const NGLayoutOpportunityTreeNode* node, 14 void CollectAllOpportunities(const NGLayoutOpportunityTreeNode* node,
15 NGLayoutOpportunities& opportunities) { 15 NGLayoutOpportunities& opportunities) {
16 if (!node) 16 if (!node)
17 return; 17 return;
18 if (node->IsLeafNode()) 18 if (node->IsLeafNode())
19 opportunities.push_back(node->opportunity); 19 opportunities.push_back(node->opportunity);
20 CollectAllOpportunities(node->left, opportunities); 20 CollectAllOpportunities(node->left, opportunities);
21 CollectAllOpportunities(node->bottom, opportunities); 21 CollectAllOpportunities(node->bottom, opportunities);
22 CollectAllOpportunities(node->right, opportunities); 22 CollectAllOpportunities(node->right, opportunities);
23 } 23 }
24 24
25 // Creates layout opportunity from the provided space and the origin point. 25 // Creates layout opportunity from the provided space and the origin point.
26 NGLayoutOpportunity CreateLayoutOpportunityFromConstraintSpace( 26 NGLayoutOpportunity CreateLayoutOpportunityFromConstraintSpace(
27 const NGConstraintSpace& space, 27 const NGConstraintSpace& space,
28 const NGLogicalOffset& origin_point) { 28 const NGLogicalOffset& origin_point) {
29 NGLayoutOpportunity opportunity; 29 NGLayoutOpportunity opportunity;
30 opportunity.offset = space.Offset(); 30 // TODO(glebl): Perhaps fix other methods (e.g IsContained) instead of using
31 opportunity.size = space.AvailableSize(); 31 // INT_MAX here.
32 opportunity.size.block_size = space.AvailableSize().block_size >= 0
33 ? space.AvailableSize().block_size
34 : LayoutUnit(INT_MAX);
35 opportunity.size.inline_size = space.AvailableSize().inline_size >= 0
36 ? space.AvailableSize().inline_size
37 : LayoutUnit(INT_MAX);
32 38
33 // adjust to the origin_point. 39 // adjust to the origin_point.
34 opportunity.offset += origin_point; 40 opportunity.offset += origin_point;
35 opportunity.size.inline_size -= origin_point.inline_offset;
36 opportunity.size.block_size -= origin_point.block_offset;
37 return opportunity; 41 return opportunity;
38 } 42 }
39 43
40 // Whether 2 edges overlap with each other. 44 // Whether 2 edges overlap with each other.
41 bool IsOverlapping(const NGEdge& edge1, const NGEdge& edge2) { 45 bool IsOverlapping(const NGEdge& edge1, const NGEdge& edge2) {
42 return std::max(edge1.start, edge2.start) <= std::min(edge1.end, edge2.end); 46 return std::max(edge1.start, edge2.start) <= std::min(edge1.end, edge2.end);
43 } 47 }
44 48
45 // Creates the *BOTTOM* positioned Layout Opportunity tree node by splitting 49 // Creates the *BOTTOM* positioned Layout Opportunity tree node by splitting
46 // the parent node with the exclusion. 50 // the parent node with the exclusion.
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 return true; 210 return true;
207 } 211 }
208 if (rhs.offset.inline_offset < lhs.offset.inline_offset) { 212 if (rhs.offset.inline_offset < lhs.offset.inline_offset) {
209 return false; 213 return false;
210 } 214 }
211 215
212 // TOP and LEFT are the same -> Sort by width 216 // TOP and LEFT are the same -> Sort by width
213 return rhs.size.inline_size < lhs.size.inline_size; 217 return rhs.size.inline_size < lhs.size.inline_size;
214 } 218 }
215 219
216 void RunPreconditionChecks(
217 const NGConstraintSpace& space,
218 const WTF::Optional<NGLogicalOffset>& opt_origin_point,
219 const WTF::Optional<NGLogicalOffset>& opt_leader_point) {
220 if (opt_origin_point) {
221 NGLogicalOffset origin_point = opt_origin_point.value();
222 DCHECK_GE(origin_point, space.Offset())
223 << "Origin point " << origin_point
224 << " should lay below the constraint space's offset " << space.Offset();
225 }
226
227 if (opt_leader_point) {
228 NGLogicalOffset leader_point = opt_leader_point.value();
229 DCHECK_GE(leader_point, space.Offset())
230 << "Leader point " << leader_point
231 << " should lay below the constraint space's offset " << space.Offset();
232 }
233 }
234
235 NGExclusion ToLeaderExclusion(const NGLogicalOffset& origin_point, 220 NGExclusion ToLeaderExclusion(const NGLogicalOffset& origin_point,
236 const NGLogicalOffset& leader_point) { 221 const NGLogicalOffset& leader_point) {
237 LayoutUnit inline_size = 222 LayoutUnit inline_size =
238 leader_point.inline_offset - origin_point.inline_offset; 223 leader_point.inline_offset - origin_point.inline_offset;
239 LayoutUnit block_size = leader_point.block_offset - origin_point.block_offset; 224 LayoutUnit block_size = leader_point.block_offset - origin_point.block_offset;
240 225
241 NGExclusion leader_exclusion; 226 NGExclusion leader_exclusion;
242 leader_exclusion.rect.offset = origin_point; 227 leader_exclusion.rect.offset = origin_point;
243 leader_exclusion.rect.size = {inline_size, block_size}; 228 leader_exclusion.rect.size = {inline_size, block_size};
244 return leader_exclusion; 229 return leader_exclusion;
245 } 230 }
246 231
247 } // namespace 232 } // namespace
248 233
249 NGLayoutOpportunityIterator::NGLayoutOpportunityIterator( 234 NGLayoutOpportunityIterator::NGLayoutOpportunityIterator(
250 NGConstraintSpace* space, 235 NGConstraintSpace* space,
251 const WTF::Optional<NGLogicalOffset>& opt_origin_point, 236 const WTF::Optional<NGLogicalOffset>& opt_origin_point,
252 const WTF::Optional<NGLogicalOffset>& opt_leader_point) 237 const WTF::Optional<NGLogicalOffset>& opt_leader_point)
253 : constraint_space_(space) { 238 : constraint_space_(space) {
254 RunPreconditionChecks(*space, opt_origin_point, opt_leader_point);
255
256 // TODO(chrome-layout-team): Combine exclusions that shadow each other. 239 // TODO(chrome-layout-team): Combine exclusions that shadow each other.
257 auto& exclusions = constraint_space_->Exclusions(); 240 auto& exclusions = constraint_space_->Exclusions();
258 DCHECK(std::is_sorted(exclusions->storage.begin(), exclusions->storage.end(), 241 DCHECK(std::is_sorted(exclusions->storage.begin(), exclusions->storage.end(),
259 &CompareNGExclusionsByTopAsc)) 242 &CompareNGExclusionsByTopAsc))
260 << "Exclusions are expected to be sorted by TOP"; 243 << "Exclusions are expected to be sorted by TOP";
261 244
262 NGLogicalOffset origin_point = 245 NGLogicalOffset origin_point =
263 opt_origin_point ? opt_origin_point.value() : NGLogicalOffset(); 246 opt_origin_point ? opt_origin_point.value() : NGLogicalOffset();
264 NGLayoutOpportunity initial_opportunity = 247 NGLayoutOpportunity initial_opportunity =
265 CreateLayoutOpportunityFromConstraintSpace(*space, origin_point); 248 CreateLayoutOpportunityFromConstraintSpace(*space, origin_point);
(...skipping 19 matching lines...) Expand all
285 268
286 const NGLayoutOpportunity NGLayoutOpportunityIterator::Next() { 269 const NGLayoutOpportunity NGLayoutOpportunityIterator::Next() {
287 if (opportunity_iter_ == opportunities_.end()) 270 if (opportunity_iter_ == opportunities_.end())
288 return NGLayoutOpportunity(); 271 return NGLayoutOpportunity();
289 auto* opportunity = opportunity_iter_; 272 auto* opportunity = opportunity_iter_;
290 opportunity_iter_++; 273 opportunity_iter_++;
291 return NGLayoutOpportunity(*opportunity); 274 return NGLayoutOpportunity(*opportunity);
292 } 275 }
293 276
294 } // namespace blink 277 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698