| 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_length_utils.h" | 5 #include "core/layout/ng/ng_length_utils.h" |
| 6 | 6 |
| 7 #include "core/layout/ng/ng_constraint_space.h" | 7 #include "core/layout/ng/ng_constraint_space.h" |
| 8 #include "core/style/ComputedStyle.h" | 8 #include "core/style/ComputedStyle.h" |
| 9 #include "platform/LayoutUnit.h" | 9 #include "platform/LayoutUnit.h" |
| 10 #include "platform/Length.h" | 10 #include "platform/Length.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 // TODO(layout-ng): Handle min/max/fit-content | 62 // TODO(layout-ng): Handle min/max/fit-content |
| 63 DCHECK(!length.isMaxSizeNone()); | 63 DCHECK(!length.isMaxSizeNone()); |
| 64 DCHECK_GE(constraintSpace.ContainerSize().inline_size, LayoutUnit()); | 64 DCHECK_GE(constraintSpace.ContainerSize().inline_size, LayoutUnit()); |
| 65 | 65 |
| 66 if (type == LengthResolveType::MinSize && length.isAuto()) | 66 if (type == LengthResolveType::MinSize && length.isAuto()) |
| 67 return LayoutUnit(); | 67 return LayoutUnit(); |
| 68 | 68 |
| 69 if (type == LengthResolveType::MarginBorderPaddingSize && length.isAuto()) | 69 if (type == LengthResolveType::MarginBorderPaddingSize && length.isAuto()) |
| 70 return LayoutUnit(); | 70 return LayoutUnit(); |
| 71 | 71 |
| 72 // We don't need this when we're resolving margin/border/padding; skip |
| 73 // computing it as an optimization and to simplify the code below. |
| 74 NGBoxStrut border_and_padding; |
| 75 if (type != LengthResolveType::MarginBorderPaddingSize) { |
| 76 border_and_padding = |
| 77 computeBorders(style) + computePadding(constraintSpace, style); |
| 78 } |
| 72 LayoutUnit container_size = constraintSpace.ContainerSize().inline_size; | 79 LayoutUnit container_size = constraintSpace.ContainerSize().inline_size; |
| 73 switch (length.type()) { | 80 switch (length.type()) { |
| 74 case Auto: | 81 case Auto: |
| 75 case FillAvailable: { | 82 case FillAvailable: { |
| 76 NGBoxStrut margins = | 83 NGBoxStrut margins = |
| 77 computeMargins(constraintSpace, style, | 84 computeMargins(constraintSpace, style, |
| 78 FromPlatformWritingMode(style.getWritingMode()), | 85 FromPlatformWritingMode(style.getWritingMode()), |
| 79 FromPlatformDirection(style.direction())); | 86 FromPlatformDirection(style.direction())); |
| 80 return container_size - margins.InlineSum(); | 87 return std::max(border_and_padding.InlineSum(), |
| 88 container_size - margins.InlineSum()); |
| 81 } | 89 } |
| 82 case Percent: | 90 case Percent: |
| 83 case Fixed: | 91 case Fixed: |
| 84 case Calculated: { | 92 case Calculated: { |
| 85 // TODO(layout-ng): adjust for border-box | |
| 86 LayoutUnit value = valueForLength(length, container_size); | 93 LayoutUnit value = valueForLength(length, container_size); |
| 87 if (style.boxSizing() == BoxSizingContentBox && | 94 if (style.boxSizing() == BoxSizingContentBox) { |
| 88 type != LengthResolveType::MarginBorderPaddingSize) { | |
| 89 NGBoxStrut border_and_padding = | |
| 90 computeBorders(style) + computePadding(constraintSpace, style); | |
| 91 value += border_and_padding.InlineSum(); | 95 value += border_and_padding.InlineSum(); |
| 96 } else { |
| 97 value = std::max(border_and_padding.InlineSum(), value); |
| 92 } | 98 } |
| 93 return value; | 99 return value; |
| 94 } | 100 } |
| 95 case MinContent: | 101 case MinContent: |
| 96 case MaxContent: | 102 case MaxContent: |
| 97 case FitContent: | 103 case FitContent: |
| 98 // TODO(layout-ng): implement | 104 // TODO(layout-ng): implement |
| 99 return LayoutUnit(); | 105 return border_and_padding.InlineSum(); |
| 100 case DeviceWidth: | 106 case DeviceWidth: |
| 101 case DeviceHeight: | 107 case DeviceHeight: |
| 102 case ExtendToZoom: | 108 case ExtendToZoom: |
| 103 NOTREACHED() << "These should only be used for viewport definitions"; | 109 NOTREACHED() << "These should only be used for viewport definitions"; |
| 104 case MaxSizeNone: | 110 case MaxSizeNone: |
| 105 default: | 111 default: |
| 106 NOTREACHED(); | 112 NOTREACHED(); |
| 107 return LayoutUnit(); | 113 return border_and_padding.InlineSum(); |
| 108 } | 114 } |
| 109 } | 115 } |
| 110 | 116 |
| 111 LayoutUnit resolveBlockLength(const NGConstraintSpace& constraintSpace, | 117 LayoutUnit resolveBlockLength(const NGConstraintSpace& constraintSpace, |
| 112 const ComputedStyle& style, | 118 const ComputedStyle& style, |
| 113 const Length& length, | 119 const Length& length, |
| 114 LayoutUnit contentSize, | 120 LayoutUnit contentSize, |
| 115 LengthResolveType type) { | 121 LengthResolveType type) { |
| 116 DCHECK(!length.isMaxSizeNone()); | 122 DCHECK(!length.isMaxSizeNone()); |
| 117 DCHECK(type != LengthResolveType::MarginBorderPaddingSize); | 123 DCHECK(type != LengthResolveType::MarginBorderPaddingSize); |
| 118 | 124 |
| 119 if (type == LengthResolveType::MinSize && length.isAuto()) | 125 if (type == LengthResolveType::MinSize && length.isAuto()) |
| 120 return LayoutUnit(); | 126 return LayoutUnit(); |
| 121 | 127 |
| 122 // Make sure that indefinite percentages resolve to NGSizeIndefinite, not to | 128 // Make sure that indefinite percentages resolve to NGSizeIndefinite, not to |
| 123 // a random negative number. | 129 // a random negative number. |
| 124 if (length.isPercentOrCalc() && | 130 if (length.isPercentOrCalc() && |
| 125 constraintSpace.ContainerSize().block_size == NGSizeIndefinite) | 131 constraintSpace.ContainerSize().block_size == NGSizeIndefinite) |
| 126 return contentSize; | 132 return contentSize; |
| 127 | 133 |
| 134 // We don't need this when we're resolving margin/border/padding; skip |
| 135 // computing it as an optimization and to simplify the code below. |
| 136 NGBoxStrut border_and_padding; |
| 137 if (type != LengthResolveType::MarginBorderPaddingSize) { |
| 138 border_and_padding = |
| 139 computeBorders(style) + computePadding(constraintSpace, style); |
| 140 } |
| 128 LayoutUnit container_size = constraintSpace.ContainerSize().block_size; | 141 LayoutUnit container_size = constraintSpace.ContainerSize().block_size; |
| 129 switch (length.type()) { | 142 switch (length.type()) { |
| 130 case FillAvailable: { | 143 case FillAvailable: { |
| 131 NGBoxStrut margins = | 144 NGBoxStrut margins = |
| 132 computeMargins(constraintSpace, style, | 145 computeMargins(constraintSpace, style, |
| 133 FromPlatformWritingMode(style.getWritingMode()), | 146 FromPlatformWritingMode(style.getWritingMode()), |
| 134 FromPlatformDirection(style.direction())); | 147 FromPlatformDirection(style.direction())); |
| 135 return container_size - margins.BlockSum(); | 148 return std::max(border_and_padding.BlockSum(), |
| 149 container_size - margins.BlockSum()); |
| 136 } | 150 } |
| 137 case Percent: | 151 case Percent: |
| 138 case Fixed: | 152 case Fixed: |
| 139 case Calculated: { | 153 case Calculated: { |
| 140 // TODO(layout-ng): adjust for border-box | |
| 141 LayoutUnit value = valueForLength(length, container_size); | 154 LayoutUnit value = valueForLength(length, container_size); |
| 142 if (style.boxSizing() == BoxSizingContentBox && | 155 if (style.boxSizing() == BoxSizingContentBox) { |
| 143 type != LengthResolveType::MarginBorderPaddingSize) { | |
| 144 NGBoxStrut border_and_padding = | |
| 145 computeBorders(style) + computePadding(constraintSpace, style); | |
| 146 value += border_and_padding.BlockSum(); | 156 value += border_and_padding.BlockSum(); |
| 157 } else { |
| 158 value = std::max(border_and_padding.BlockSum(), value); |
| 147 } | 159 } |
| 148 return value; | 160 return value; |
| 149 } | 161 } |
| 150 case Auto: | 162 case Auto: |
| 151 case MinContent: | 163 case MinContent: |
| 152 case MaxContent: | 164 case MaxContent: |
| 153 case FitContent: | 165 case FitContent: |
| 166 // Due to how contentSize is calculated, it should always include border |
| 167 // and padding. |
| 168 if (contentSize != LayoutUnit(-1)) |
| 169 DCHECK_GE(contentSize, border_and_padding.BlockSum()); |
| 154 return contentSize; | 170 return contentSize; |
| 155 case DeviceWidth: | 171 case DeviceWidth: |
| 156 case DeviceHeight: | 172 case DeviceHeight: |
| 157 case ExtendToZoom: | 173 case ExtendToZoom: |
| 158 NOTREACHED() << "These should only be used for viewport definitions"; | 174 NOTREACHED() << "These should only be used for viewport definitions"; |
| 159 case MaxSizeNone: | 175 case MaxSizeNone: |
| 160 default: | 176 default: |
| 161 NOTREACHED(); | 177 NOTREACHED(); |
| 162 return LayoutUnit(); | 178 return border_and_padding.BlockSum(); |
| 163 } | 179 } |
| 164 } | 180 } |
| 165 | 181 |
| 166 LayoutUnit computeInlineSizeForFragment( | 182 LayoutUnit computeInlineSizeForFragment( |
| 167 const NGConstraintSpace& constraintSpace, | 183 const NGConstraintSpace& constraintSpace, |
| 168 const ComputedStyle& style) { | 184 const ComputedStyle& style) { |
| 169 if (constraintSpace.FixedInlineSize()) | 185 if (constraintSpace.FixedInlineSize()) |
| 170 return constraintSpace.ContainerSize().inline_size; | 186 return constraintSpace.ContainerSize().inline_size; |
| 171 | 187 |
| 172 LayoutUnit extent = | 188 LayoutUnit extent = |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 padding.block_start = | 277 padding.block_start = |
| 262 resolveInlineLength(constraintSpace, style, style.paddingBefore(), | 278 resolveInlineLength(constraintSpace, style, style.paddingBefore(), |
| 263 LengthResolveType::MarginBorderPaddingSize); | 279 LengthResolveType::MarginBorderPaddingSize); |
| 264 padding.block_end = | 280 padding.block_end = |
| 265 resolveInlineLength(constraintSpace, style, style.paddingAfter(), | 281 resolveInlineLength(constraintSpace, style, style.paddingAfter(), |
| 266 LengthResolveType::MarginBorderPaddingSize); | 282 LengthResolveType::MarginBorderPaddingSize); |
| 267 return padding; | 283 return padding; |
| 268 } | 284 } |
| 269 | 285 |
| 270 } // namespace blink | 286 } // namespace blink |
| OLD | NEW |