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

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

Issue 2782603003: Add NGColumnLayoutAlgorithm skeleton implementation. (Closed)
Patch Set: update TestExpectations Created 3 years, 8 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_block_layout_algorithm.h" 5 #include "core/layout/ng/ng_block_layout_algorithm.h"
6 6
7 #include "core/layout/ng/ng_absolute_utils.h" 7 #include "core/layout/ng/ng_absolute_utils.h"
8 #include "core/layout/ng/ng_block_break_token.h"
9 #include "core/layout/ng/ng_block_child_iterator.h" 8 #include "core/layout/ng/ng_block_child_iterator.h"
10 #include "core/layout/ng/ng_box_fragment.h" 9 #include "core/layout/ng/ng_box_fragment.h"
11 #include "core/layout/ng/ng_constraint_space.h" 10 #include "core/layout/ng/ng_constraint_space.h"
12 #include "core/layout/ng/ng_constraint_space_builder.h" 11 #include "core/layout/ng/ng_constraint_space_builder.h"
13 #include "core/layout/ng/ng_floats_utils.h" 12 #include "core/layout/ng/ng_floats_utils.h"
14 #include "core/layout/ng/ng_fragment.h" 13 #include "core/layout/ng/ng_fragment.h"
15 #include "core/layout/ng/ng_fragment_builder.h" 14 #include "core/layout/ng/ng_fragment_builder.h"
16 #include "core/layout/ng/ng_inline_node.h" 15 #include "core/layout/ng/ng_inline_node.h"
17 #include "core/layout/ng/ng_layout_opportunity_iterator.h" 16 #include "core/layout/ng/ng_layout_opportunity_iterator.h"
18 #include "core/layout/ng/ng_length_utils.h" 17 #include "core/layout/ng/ng_length_utils.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 51
53 // Whether we've run out of space in this flow. If so, there will be no work 52 // Whether we've run out of space in this flow. If so, there will be no work
54 // left to do for this block in this fragmentainer. 53 // left to do for this block in this fragmentainer.
55 bool IsOutOfSpace(const NGConstraintSpace& space, LayoutUnit content_size) { 54 bool IsOutOfSpace(const NGConstraintSpace& space, LayoutUnit content_size) {
56 return space.HasBlockFragmentation() && 55 return space.HasBlockFragmentation() &&
57 content_size >= space.FragmentainerSpaceAvailable(); 56 content_size >= space.FragmentainerSpaceAvailable();
58 } 57 }
59 58
60 } // namespace 59 } // namespace
61 60
62 NGBlockLayoutAlgorithm::NGBlockLayoutAlgorithm( 61 NGBlockLayoutAlgorithm::NGBlockLayoutAlgorithm(NGBlockNode* node,
63 NGBlockNode* node, 62 NGConstraintSpace* space,
64 NGConstraintSpace* constraint_space, 63 NGBlockBreakToken* break_token)
65 NGBlockBreakToken* break_token) 64 : NGLayoutAlgorithm(node, space, break_token),
66 : node_(node),
67 constraint_space_(constraint_space),
68 break_token_(break_token),
69 builder_(NGPhysicalFragment::kFragmentBox, node), 65 builder_(NGPhysicalFragment::kFragmentBox, node),
70 space_builder_(constraint_space_) {} 66 space_builder_(constraint_space_) {}
71 67
72 Optional<MinMaxContentSize> NGBlockLayoutAlgorithm::ComputeMinMaxContentSize() 68 Optional<MinMaxContentSize> NGBlockLayoutAlgorithm::ComputeMinMaxContentSize()
73 const { 69 const {
74 MinMaxContentSize sizes; 70 MinMaxContentSize sizes;
75 71
76 // Size-contained elements don't consider their contents for intrinsic sizing. 72 // Size-contained elements don't consider their contents for intrinsic sizing.
77 if (Style().containsSize()) 73 if (Style().containsSize())
78 return sizes; 74 return sizes;
79 75
80 // TODO: handle floats & orthogonal children. 76 // TODO: handle floats & orthogonal children.
81 for (NGLayoutInputNode* node = node_->FirstChild(); node; 77 for (NGLayoutInputNode* node = Node()->FirstChild(); node;
82 node = node->NextSibling()) { 78 node = node->NextSibling()) {
83 MinMaxContentSize child_sizes; 79 MinMaxContentSize child_sizes;
84 if (node->Type() == NGLayoutInputNode::kLegacyInline) { 80 if (node->Type() == NGLayoutInputNode::kLegacyInline) {
85 // From |NGBlockLayoutAlgorithm| perspective, we can handle |NGInlineNode| 81 // From |NGBlockLayoutAlgorithm| perspective, we can handle |NGInlineNode|
86 // almost the same as |NGBlockNode|, because an |NGInlineNode| includes 82 // almost the same as |NGBlockNode|, because an |NGInlineNode| includes
87 // all inline nodes following |node| and their descendants, and produces 83 // all inline nodes following |node| and their descendants, and produces
88 // an anonymous box that contains all line boxes. 84 // an anonymous box that contains all line boxes.
89 // |NextSibling| returns the next block sibling, or nullptr, skipping all 85 // |NextSibling| returns the next block sibling, or nullptr, skipping all
90 // following inline siblings and descendants. 86 // following inline siblings and descendants.
91 child_sizes = toNGInlineNode(node)->ComputeMinMaxContentSize(); 87 child_sizes = toNGInlineNode(node)->ComputeMinMaxContentSize();
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 space_builder_ 154 space_builder_
159 .SetAvailableSize( 155 .SetAvailableSize(
160 NGLogicalSize(adjusted_inline_size, adjusted_block_size)) 156 NGLogicalSize(adjusted_inline_size, adjusted_block_size))
161 .SetPercentageResolutionSize( 157 .SetPercentageResolutionSize(
162 NGLogicalSize(adjusted_inline_size, adjusted_block_size)); 158 NGLogicalSize(adjusted_inline_size, adjusted_block_size));
163 159
164 builder_.SetDirection(constraint_space_->Direction()); 160 builder_.SetDirection(constraint_space_->Direction());
165 builder_.SetWritingMode(constraint_space_->WritingMode()); 161 builder_.SetWritingMode(constraint_space_->WritingMode());
166 builder_.SetInlineSize(inline_size).SetBlockSize(block_size); 162 builder_.SetInlineSize(inline_size).SetBlockSize(block_size);
167 163
168 NGBlockChildIterator child_iterator(node_->FirstChild(), break_token_); 164 NGBlockChildIterator child_iterator(Node()->FirstChild(), BreakToken());
169 NGBlockChildIterator::Entry entry = child_iterator.NextChild(); 165 NGBlockChildIterator::Entry entry = child_iterator.NextChild();
170 NGLayoutInputNode* child = entry.node; 166 NGLayoutInputNode* child = entry.node;
171 NGBreakToken* child_break_token = entry.token; 167 NGBreakToken* child_break_token = entry.token;
172 168
173 // If we are resuming from a break token our start border and padding is 169 // If we are resuming from a break token our start border and padding is
174 // within a previous fragment. 170 // within a previous fragment.
175 content_size_ = break_token_ ? LayoutUnit() : border_and_padding_.block_start; 171 content_size_ = BreakToken() ? LayoutUnit() : border_and_padding_.block_start;
176 172
177 curr_margin_strut_ = ConstraintSpace().MarginStrut(); 173 curr_margin_strut_ = ConstraintSpace().MarginStrut();
178 curr_bfc_offset_ = ConstraintSpace().BfcOffset(); 174 curr_bfc_offset_ = ConstraintSpace().BfcOffset();
179 175
180 // Margins collapsing: 176 // Margins collapsing:
181 // Do not collapse margins between parent and its child if there is 177 // Do not collapse margins between parent and its child if there is
182 // border/padding between them. 178 // border/padding between them.
183 if (border_and_padding_.block_start) { 179 if (border_and_padding_.block_start) {
184 curr_bfc_offset_.block_offset += curr_margin_strut_.Sum(); 180 curr_bfc_offset_.block_offset += curr_margin_strut_.Sum();
185 UpdateFragmentBfcOffset(curr_bfc_offset_); 181 UpdateFragmentBfcOffset(curr_bfc_offset_);
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 max_inline_size_ = 404 max_inline_size_ =
409 std::max(max_inline_size_, fragment.InlineSize() + 405 std::max(max_inline_size_, fragment.InlineSize() +
410 curr_child_margins_.InlineSum() + 406 curr_child_margins_.InlineSum() +
411 border_and_padding_.InlineSum()); 407 border_and_padding_.InlineSum());
412 408
413 builder_.AddChild(layout_result, logical_offset); 409 builder_.AddChild(layout_result, logical_offset);
414 } 410 }
415 411
416 void NGBlockLayoutAlgorithm::FinalizeForFragmentation() { 412 void NGBlockLayoutAlgorithm::FinalizeForFragmentation() {
417 LayoutUnit used_block_size = 413 LayoutUnit used_block_size =
418 break_token_ ? break_token_->UsedBlockSize() : LayoutUnit(); 414 BreakToken() ? BreakToken()->UsedBlockSize() : LayoutUnit();
419 LayoutUnit block_size = ComputeBlockSizeForFragment( 415 LayoutUnit block_size = ComputeBlockSizeForFragment(
420 ConstraintSpace(), Style(), used_block_size + content_size_); 416 ConstraintSpace(), Style(), used_block_size + content_size_);
421 417
422 block_size -= used_block_size; 418 block_size -= used_block_size;
423 DCHECK_GE(block_size, LayoutUnit()) 419 DCHECK_GE(block_size, LayoutUnit())
424 << "Adding and subtracting the used_block_size shouldn't leave the " 420 << "Adding and subtracting the used_block_size shouldn't leave the "
425 "block_size for this fragment smaller than zero."; 421 "block_size for this fragment smaller than zero.";
426 422
427 DCHECK(builder_.BfcOffset()) << "We must have our BfcOffset by this point " 423 DCHECK(builder_.BfcOffset()) << "We must have our BfcOffset by this point "
428 "to determine the space left in the flow."; 424 "to determine the space left in the flow.";
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 // started handling the fragmentation for floats. 511 // started handling the fragmentation for floats.
516 space_builder_.SetBfcOffset(NGLogicalOffset()); 512 space_builder_.SetBfcOffset(NGLogicalOffset());
517 } 513 }
518 } 514 }
519 space_builder_.SetFragmentainerSpaceAvailable(space_available); 515 space_builder_.SetFragmentainerSpaceAvailable(space_available);
520 516
521 return space_builder_.ToConstraintSpace( 517 return space_builder_.ToConstraintSpace(
522 FromPlatformWritingMode(child_style.getWritingMode())); 518 FromPlatformWritingMode(child_style.getWritingMode()));
523 } 519 }
524 } // namespace blink 520 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698