OLD | NEW |
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_node.h" | 5 #include "core/layout/ng/ng_block_node.h" |
6 | 6 |
7 #include "core/layout/LayoutBlockFlow.h" | 7 #include "core/layout/LayoutBlockFlow.h" |
8 #include "core/layout/api/LineLayoutAPIShim.h" | 8 #include "core/layout/api/LineLayoutAPIShim.h" |
9 #include "core/layout/line/InlineIterator.h" | 9 #include "core/layout/line/InlineIterator.h" |
10 #include "core/layout/ng/layout_ng_block_flow.h" | 10 #include "core/layout/ng/layout_ng_block_flow.h" |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 RefPtr<NGPhysicalFragment> NGBlockNode::Layout( | 79 RefPtr<NGPhysicalFragment> NGBlockNode::Layout( |
80 NGConstraintSpace* constraint_space) { | 80 NGConstraintSpace* constraint_space) { |
81 // Use the old layout code and synthesize a fragment. | 81 // Use the old layout code and synthesize a fragment. |
82 if (!CanUseNewLayout()) { | 82 if (!CanUseNewLayout()) { |
83 DCHECK(layout_box_); | 83 DCHECK(layout_box_); |
84 fragment_ = RunOldLayout(*constraint_space); | 84 fragment_ = RunOldLayout(*constraint_space); |
85 return fragment_; | 85 return fragment_; |
86 } | 86 } |
87 | 87 |
88 RefPtr<NGPhysicalFragment> fragment = | 88 RefPtr<NGPhysicalFragment> fragment = |
89 NGBlockLayoutAlgorithm(GetLayoutObject(), &Style(), FirstChild(), | 89 NGBlockLayoutAlgorithm(this, constraint_space, CurrentBreakToken()) |
90 constraint_space, CurrentBreakToken()) | |
91 .Layout(); | 90 .Layout(); |
92 | 91 |
93 fragment_ = toNGPhysicalBoxFragment(fragment.get()); | 92 fragment_ = toNGPhysicalBoxFragment(fragment.get()); |
94 CopyFragmentDataToLayoutBox(*constraint_space); | 93 CopyFragmentDataToLayoutBox(*constraint_space); |
95 return fragment_; | 94 return fragment_; |
96 } | 95 } |
97 | 96 |
98 MinAndMaxContentSizes NGBlockNode::ComputeMinAndMaxContentSizes() { | 97 MinAndMaxContentSizes NGBlockNode::ComputeMinAndMaxContentSizes() { |
99 MinAndMaxContentSizes sizes; | 98 MinAndMaxContentSizes sizes; |
100 if (!CanUseNewLayout()) { | 99 if (!CanUseNewLayout()) { |
(...skipping 13 matching lines...) Expand all Loading... |
114 return sizes; | 113 return sizes; |
115 } | 114 } |
116 | 115 |
117 NGConstraintSpace* constraint_space = | 116 NGConstraintSpace* constraint_space = |
118 NGConstraintSpaceBuilder( | 117 NGConstraintSpaceBuilder( |
119 FromPlatformWritingMode(Style().getWritingMode())) | 118 FromPlatformWritingMode(Style().getWritingMode())) |
120 .SetTextDirection(Style().direction()) | 119 .SetTextDirection(Style().direction()) |
121 .ToConstraintSpace(FromPlatformWritingMode(Style().getWritingMode())); | 120 .ToConstraintSpace(FromPlatformWritingMode(Style().getWritingMode())); |
122 | 121 |
123 // TODO(cbiesinger): For orthogonal children, we need to always synthesize. | 122 // TODO(cbiesinger): For orthogonal children, we need to always synthesize. |
124 NGBlockLayoutAlgorithm minmax_algorithm(layout_box_, &Style(), FirstChild(), | 123 NGBlockLayoutAlgorithm minmax_algorithm(this, constraint_space); |
125 constraint_space); | |
126 Optional<MinAndMaxContentSizes> maybe_sizes = | 124 Optional<MinAndMaxContentSizes> maybe_sizes = |
127 minmax_algorithm.ComputeMinAndMaxContentSizes(); | 125 minmax_algorithm.ComputeMinAndMaxContentSizes(); |
128 if (maybe_sizes.has_value()) | 126 if (maybe_sizes.has_value()) |
129 return *maybe_sizes; | 127 return *maybe_sizes; |
130 | 128 |
131 // Have to synthesize this value. | 129 // Have to synthesize this value. |
132 RefPtr<NGPhysicalFragment> physical_fragment = Layout(constraint_space); | 130 RefPtr<NGPhysicalFragment> physical_fragment = Layout(constraint_space); |
133 NGBoxFragment min_fragment(FromPlatformWritingMode(Style().getWritingMode()), | 131 NGBoxFragment min_fragment(FromPlatformWritingMode(Style().getWritingMode()), |
134 toNGPhysicalBoxFragment(physical_fragment.get())); | 132 toNGPhysicalBoxFragment(physical_fragment.get())); |
135 sizes.min_content = min_fragment.InlineOverflow(); | 133 sizes.min_content = min_fragment.InlineOverflow(); |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 } | 296 } |
299 | 297 |
300 if (layout_box_->isLayoutNGBlockFlow() && layout_box_->needsLayout()) { | 298 if (layout_box_->isLayoutNGBlockFlow() && layout_box_->needsLayout()) { |
301 toLayoutNGBlockFlow(layout_box_)->LayoutBlockFlow::layoutBlock(true); | 299 toLayoutNGBlockFlow(layout_box_)->LayoutBlockFlow::layoutBlock(true); |
302 } else { | 300 } else { |
303 layout_box_->forceLayout(); | 301 layout_box_->forceLayout(); |
304 } | 302 } |
305 LayoutRect overflow = layout_box_->layoutOverflowRect(); | 303 LayoutRect overflow = layout_box_->layoutOverflowRect(); |
306 // TODO(layout-ng): This does not handle writing modes correctly (for | 304 // TODO(layout-ng): This does not handle writing modes correctly (for |
307 // overflow) | 305 // overflow) |
308 NGFragmentBuilder builder(NGPhysicalFragment::kFragmentBox, layout_box_); | 306 NGFragmentBuilder builder(NGPhysicalFragment::kFragmentBox, this); |
309 builder.SetInlineSize(layout_box_->logicalWidth()) | 307 builder.SetInlineSize(layout_box_->logicalWidth()) |
310 .SetBlockSize(layout_box_->logicalHeight()) | 308 .SetBlockSize(layout_box_->logicalHeight()) |
311 .SetDirection(layout_box_->styleRef().direction()) | 309 .SetDirection(layout_box_->styleRef().direction()) |
312 .SetWritingMode( | 310 .SetWritingMode( |
313 FromPlatformWritingMode(layout_box_->styleRef().getWritingMode())) | 311 FromPlatformWritingMode(layout_box_->styleRef().getWritingMode())) |
314 .SetInlineOverflow(overflow.width()) | 312 .SetInlineOverflow(overflow.width()) |
315 .SetBlockOverflow(overflow.height()); | 313 .SetBlockOverflow(overflow.height()); |
316 return builder.ToBoxFragment(); | 314 return builder.ToBoxFragment(); |
317 } | 315 } |
318 | 316 |
319 void NGBlockNode::UseOldOutOfFlowPositioning() { | 317 void NGBlockNode::UseOldOutOfFlowPositioning() { |
320 DCHECK(layout_box_); | 318 DCHECK(layout_box_); |
321 DCHECK(layout_box_->isOutOfFlowPositioned()); | 319 DCHECK(layout_box_->isOutOfFlowPositioned()); |
322 layout_box_->containingBlock()->insertPositionedObject(layout_box_); | 320 layout_box_->containingBlock()->insertPositionedObject(layout_box_); |
323 } | 321 } |
324 | 322 |
325 // Save static position for legacy AbsPos layout. | 323 // Save static position for legacy AbsPos layout. |
326 void NGBlockNode::SaveStaticOffsetForLegacy(const NGLogicalOffset& offset) { | 324 void NGBlockNode::SaveStaticOffsetForLegacy(const NGLogicalOffset& offset) { |
327 DCHECK(layout_box_); | 325 DCHECK(layout_box_); |
328 DCHECK(layout_box_->isOutOfFlowPositioned()); | 326 DCHECK(layout_box_->isOutOfFlowPositioned()); |
329 DCHECK(layout_box_->layer()); | 327 DCHECK(layout_box_->layer()); |
330 layout_box_->layer()->setStaticBlockPosition(offset.block_offset); | 328 layout_box_->layer()->setStaticBlockPosition(offset.block_offset); |
331 layout_box_->layer()->setStaticInlinePosition(offset.inline_offset); | 329 layout_box_->layer()->setStaticInlinePosition(offset.inline_offset); |
332 } | 330 } |
333 | 331 |
334 } // namespace blink | 332 } // namespace blink |
OLD | NEW |