Chromium Code Reviews| 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_box.h" | 5 #include "core/layout/ng/ng_box.h" |
| 6 | 6 |
| 7 #include "core/layout/LayoutBlockFlow.h" | 7 #include "core/layout/LayoutBlockFlow.h" |
| 8 #include "core/layout/ng/layout_ng_block_flow.h" | 8 #include "core/layout/ng/layout_ng_block_flow.h" |
| 9 #include "core/layout/ng/ng_block_layout_algorithm.h" | 9 #include "core/layout/ng/ng_block_layout_algorithm.h" |
| 10 #include "core/layout/ng/ng_constraint_space_builder.h" | |
| 10 #include "core/layout/ng/ng_constraint_space.h" | 11 #include "core/layout/ng/ng_constraint_space.h" |
| 11 #include "core/layout/ng/ng_direction.h" | 12 #include "core/layout/ng/ng_direction.h" |
| 12 #include "core/layout/ng/ng_fragment.h" | 13 #include "core/layout/ng/ng_fragment.h" |
| 13 #include "core/layout/ng/ng_fragment_builder.h" | 14 #include "core/layout/ng/ng_fragment_builder.h" |
| 14 #include "core/layout/ng/ng_length_utils.h" | 15 #include "core/layout/ng/ng_length_utils.h" |
| 15 #include "core/layout/ng/ng_writing_mode.h" | 16 #include "core/layout/ng/ng_writing_mode.h" |
| 16 | 17 |
| 17 namespace blink { | 18 namespace blink { |
| 18 | 19 |
| 19 NGBox::NGBox(LayoutObject* layout_object) | 20 NGBox::NGBox(LayoutObject* layout_object) |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 56 fragment_ = RunOldLayout(*constraint_space); | 57 fragment_ = RunOldLayout(*constraint_space); |
| 57 } | 58 } |
| 58 *out = new NGFragment(constraint_space->WritingMode(), | 59 *out = new NGFragment(constraint_space->WritingMode(), |
| 59 FromPlatformDirection(Style()->direction()), | 60 FromPlatformDirection(Style()->direction()), |
| 60 fragment_.get()); | 61 fragment_.get()); |
| 61 // Reset algorithm for future use | 62 // Reset algorithm for future use |
| 62 algorithm_ = nullptr; | 63 algorithm_ = nullptr; |
| 63 return true; | 64 return true; |
| 64 } | 65 } |
| 65 | 66 |
| 67 bool NGBox::ComputeOrSynthesizeMinAndMaxContentSizes( | |
|
atotic
2016/11/01 21:56:02
This routine name is 41 chars long, 1/2 of our lin
cbiesinger
2016/11/02 20:18:08
Ok, I renamed it back to ComputeMinAndMaxContentSi
| |
| 68 MinAndMaxContentSizes* sizes) { | |
| 69 if (!algorithm_) { | |
| 70 NGConstraintSpaceBuilder builder( | |
| 71 FromPlatformWritingMode(Style()->getWritingMode())); | |
| 72 | |
| 73 builder.SetContainerSize(NGLogicalSize(LayoutUnit(), LayoutUnit())); | |
| 74 // TODO(layoutng): Use builder.ToConstraintSpace.ToLogicalConstraintSpace | |
| 75 // once | |
| 76 // that's available. | |
| 77 NGConstraintSpace* constraint_space = new NGConstraintSpace( | |
| 78 FromPlatformWritingMode(Style()->getWritingMode()), | |
| 79 FromPlatformDirection(Style()->direction()), | |
| 80 builder.ToConstraintSpace()); | |
| 81 | |
| 82 algorithm_ = | |
|
atotic
2016/11/01 21:56:02
algorithm_ is used in 2 functions (Layout & MinMax
cbiesinger
2016/11/02 20:18:08
OK -- I will do that for now. Once we have the sta
| |
| 83 new NGBlockLayoutAlgorithm(Style(), FirstChild(), constraint_space); | |
| 84 } | |
| 85 // TODO(cbiesinger): For orthogonal children, we need to always synthesize. | |
| 86 NGLayoutAlgorithm::MinAndMaxState state = | |
| 87 algorithm_->ComputeMinAndMaxContentSizes(sizes); | |
| 88 if (state == NGLayoutAlgorithm::Success) | |
| 89 return true; | |
| 90 if (state == NGLayoutAlgorithm::Pending) | |
| 91 return false; | |
| 92 DCHECK_EQ(state, NGLayoutAlgorithm::NotImplemented); | |
| 93 | |
| 94 // TODO(cbiesinger): Replace the loops below with a state machine like in | |
| 95 // Layout. | |
| 96 | |
| 97 // Have to synthesize this value. | |
| 98 NGPhysicalFragment* physical_fragment; | |
| 99 while (!algorithm_->Layout(&physical_fragment)) | |
| 100 continue; | |
| 101 NGFragment* fragment = new NGFragment( | |
| 102 FromPlatformWritingMode(Style()->getWritingMode()), | |
| 103 FromPlatformDirection(Style()->direction()), physical_fragment); | |
| 104 | |
| 105 sizes->min_content = fragment->InlineOverflow(); | |
| 106 | |
| 107 // Now, redo with infinite space for max_content | |
| 108 NGConstraintSpaceBuilder builder( | |
| 109 FromPlatformWritingMode(Style()->getWritingMode())); | |
| 110 builder.SetContainerSize(NGLogicalSize(LayoutUnit::max(), LayoutUnit())); | |
| 111 NGConstraintSpace* constraint_space = new NGConstraintSpace( | |
| 112 FromPlatformWritingMode(Style()->getWritingMode()), | |
| 113 FromPlatformDirection(Style()->direction()), builder.ToConstraintSpace()); | |
| 114 | |
| 115 algorithm_ = | |
| 116 new NGBlockLayoutAlgorithm(Style(), FirstChild(), constraint_space); | |
| 117 while (!algorithm_->Layout(&physical_fragment)) | |
| 118 continue; | |
| 119 | |
| 120 fragment = new NGFragment(FromPlatformWritingMode(Style()->getWritingMode()), | |
| 121 FromPlatformDirection(Style()->direction()), | |
| 122 physical_fragment); | |
| 123 sizes->max_content = fragment->InlineOverflow(); | |
| 124 return true; | |
| 125 } | |
| 126 | |
| 66 const ComputedStyle* NGBox::Style() const { | 127 const ComputedStyle* NGBox::Style() const { |
| 67 if (style_) | 128 if (style_) |
| 68 return style_.get(); | 129 return style_.get(); |
| 69 DCHECK(layout_box_); | 130 DCHECK(layout_box_); |
| 70 return layout_box_->style(); | 131 return layout_box_->style(); |
| 71 } | 132 } |
| 72 | 133 |
| 73 NGBox* NGBox::NextSibling() { | 134 NGBox* NGBox::NextSibling() { |
| 74 if (!next_sibling_) { | 135 if (!next_sibling_) { |
| 75 LayoutObject* next_sibling = | 136 LayoutObject* next_sibling = |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 90 } | 151 } |
| 91 | 152 |
| 92 void NGBox::SetNextSibling(NGBox* sibling) { | 153 void NGBox::SetNextSibling(NGBox* sibling) { |
| 93 next_sibling_ = sibling; | 154 next_sibling_ = sibling; |
| 94 } | 155 } |
| 95 | 156 |
| 96 void NGBox::SetFirstChild(NGBox* child) { | 157 void NGBox::SetFirstChild(NGBox* child) { |
| 97 first_child_ = child; | 158 first_child_ = child; |
| 98 } | 159 } |
| 99 | 160 |
| 161 DEFINE_TRACE(NGBox) { | |
| 162 visitor->trace(algorithm_); | |
| 163 visitor->trace(fragment_); | |
| 164 visitor->trace(next_sibling_); | |
| 165 visitor->trace(first_child_); | |
| 166 } | |
| 167 | |
| 100 void NGBox::PositionUpdated() { | 168 void NGBox::PositionUpdated() { |
| 101 if (!layout_box_) | 169 if (!layout_box_) |
| 102 return; | 170 return; |
| 103 DCHECK(layout_box_->parent()) << "Should be called on children only."; | 171 DCHECK(layout_box_->parent()) << "Should be called on children only."; |
| 104 | 172 |
| 105 layout_box_->setX(fragment_->LeftOffset()); | 173 layout_box_->setX(fragment_->LeftOffset()); |
| 106 layout_box_->setY(fragment_->TopOffset()); | 174 layout_box_->setY(fragment_->TopOffset()); |
| 107 | 175 |
| 108 if (layout_box_->isFloating() && layout_box_->parent()->isLayoutBlockFlow()) { | 176 if (layout_box_->isFloating() && layout_box_->parent()->isLayoutBlockFlow()) { |
| 109 FloatingObject* floating_object = toLayoutBlockFlow(layout_box_->parent()) | 177 FloatingObject* floating_object = toLayoutBlockFlow(layout_box_->parent()) |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 179 .SetBlockSize(layout_box_->logicalHeight()) | 247 .SetBlockSize(layout_box_->logicalHeight()) |
| 180 .SetDirection(FromPlatformDirection(layout_box_->styleRef().direction())) | 248 .SetDirection(FromPlatformDirection(layout_box_->styleRef().direction())) |
| 181 .SetWritingMode( | 249 .SetWritingMode( |
| 182 FromPlatformWritingMode(layout_box_->styleRef().getWritingMode())) | 250 FromPlatformWritingMode(layout_box_->styleRef().getWritingMode())) |
| 183 .SetInlineOverflow(overflow.width()) | 251 .SetInlineOverflow(overflow.width()) |
| 184 .SetBlockOverflow(overflow.height()); | 252 .SetBlockOverflow(overflow.height()); |
| 185 return builder.ToFragment(); | 253 return builder.ToFragment(); |
| 186 } | 254 } |
| 187 | 255 |
| 188 } // namespace blink | 256 } // namespace blink |
| OLD | NEW |