| 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/layout/ng/ng_fragment.h" | 8 #include "core/layout/ng/ng_fragment.h" |
| 9 #include "core/style/ComputedStyle.h" | 9 #include "core/style/ComputedStyle.h" |
| 10 #include "platform/LayoutUnit.h" | 10 #include "platform/LayoutUnit.h" |
| 11 #include "platform/Length.h" | 11 #include "platform/Length.h" |
| 12 #include "wtf/Optional.h" | 12 #include "wtf/Optional.h" |
| 13 | 13 |
| 14 namespace blink { | 14 namespace blink { |
| 15 // TODO(layout-ng): | 15 // TODO(layout-ng): |
| 16 // - positioned and/or replaced calculations | 16 // - positioned and/or replaced calculations |
| 17 // - Take scrollbars into account | 17 // - Take scrollbars into account |
| 18 | 18 |
| 19 namespace { | |
| 20 | |
| 21 // Converts physical dimensions to logical ones per | |
| 22 // https://drafts.csswg.org/css-writing-modes-3/#logical-to-physical | |
| 23 // For now it's only used to calculate abstract values for margins. | |
| 24 NGBoxStrut ToLogicalDimensions(const NGPhysicalBoxStrut& physical_dim, | |
| 25 const NGWritingMode writing_mode, | |
| 26 const TextDirection direction) { | |
| 27 bool is_ltr = direction == LTR; | |
| 28 NGBoxStrut logical_dim; | |
| 29 switch (writing_mode) { | |
| 30 case VerticalRightLeft: | |
| 31 case SidewaysRightLeft: | |
| 32 logical_dim = {is_ltr ? physical_dim.top : physical_dim.bottom, | |
| 33 is_ltr ? physical_dim.bottom : physical_dim.top, | |
| 34 physical_dim.right, physical_dim.left}; | |
| 35 break; | |
| 36 case VerticalLeftRight: | |
| 37 logical_dim = {is_ltr ? physical_dim.top : physical_dim.bottom, | |
| 38 is_ltr ? physical_dim.bottom : physical_dim.top, | |
| 39 physical_dim.left, physical_dim.right}; | |
| 40 break; | |
| 41 case SidewaysLeftRight: | |
| 42 logical_dim = {is_ltr ? physical_dim.bottom : physical_dim.top, | |
| 43 is_ltr ? physical_dim.top : physical_dim.bottom, | |
| 44 physical_dim.left, physical_dim.right}; | |
| 45 break; | |
| 46 default: | |
| 47 NOTREACHED(); | |
| 48 /* FALLTHROUGH */ | |
| 49 case HorizontalTopBottom: | |
| 50 logical_dim = {is_ltr ? physical_dim.left : physical_dim.right, | |
| 51 is_ltr ? physical_dim.right : physical_dim.left, | |
| 52 physical_dim.top, physical_dim.bottom}; | |
| 53 break; | |
| 54 } | |
| 55 return logical_dim; | |
| 56 } | |
| 57 | |
| 58 } // namespace | |
| 59 | |
| 60 bool NeedMinAndMaxContentSizes(const ComputedStyle& style) { | 19 bool NeedMinAndMaxContentSizes(const ComputedStyle& style) { |
| 61 // TODO(layout-ng): In the future we may pass a shrink-to-fit flag through the | 20 // TODO(layout-ng): In the future we may pass a shrink-to-fit flag through the |
| 62 // constraint space; if so, this function needs to take a constraint space | 21 // constraint space; if so, this function needs to take a constraint space |
| 63 // as well to take that into account. | 22 // as well to take that into account. |
| 64 // This check is technically too broad (fill-available does not need intrinsic | 23 // This check is technically too broad (fill-available does not need intrinsic |
| 65 // size computation) but that's a rare case and only affects performance, not | 24 // size computation) but that's a rare case and only affects performance, not |
| 66 // correctness. | 25 // correctness. |
| 67 return style.logicalWidth().isIntrinsic() || | 26 return style.logicalWidth().isIntrinsic() || |
| 68 style.logicalMinWidth().isIntrinsic() || | 27 style.logicalMinWidth().isIntrinsic() || |
| 69 style.logicalMaxWidth().isIntrinsic(); | 28 style.logicalMaxWidth().isIntrinsic(); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 // If the available space is infinite, fit-content resolves to | 86 // If the available space is infinite, fit-content resolves to |
| 128 // max-content. See css-sizing section 2.1. | 87 // max-content. See css-sizing section 2.1. |
| 129 value = min_and_max->max_content; | 88 value = min_and_max->max_content; |
| 130 } else { | 89 } else { |
| 131 NGBoxStrut margins = ComputeMargins( | 90 NGBoxStrut margins = ComputeMargins( |
| 132 constraintSpace, style, | 91 constraintSpace, style, |
| 133 FromPlatformWritingMode(style.getWritingMode()), style.direction()); | 92 FromPlatformWritingMode(style.getWritingMode()), style.direction()); |
| 134 LayoutUnit fill_available = | 93 LayoutUnit fill_available = |
| 135 std::max(LayoutUnit(), available_size - margins.InlineSum() - | 94 std::max(LayoutUnit(), available_size - margins.InlineSum() - |
| 136 border_and_padding.InlineSum()); | 95 border_and_padding.InlineSum()); |
| 137 value = std::min(min_and_max->max_content, | 96 value = min_and_max->ShrinkToFit(fill_available); |
| 138 std::max(min_and_max->min_content, fill_available)); | |
| 139 } | 97 } |
| 140 return value + border_and_padding.InlineSum(); | 98 return value + border_and_padding.InlineSum(); |
| 141 } | 99 } |
| 142 case DeviceWidth: | 100 case DeviceWidth: |
| 143 case DeviceHeight: | 101 case DeviceHeight: |
| 144 case ExtendToZoom: | 102 case ExtendToZoom: |
| 145 NOTREACHED() << "These should only be used for viewport definitions"; | 103 NOTREACHED() << "These should only be used for viewport definitions"; |
| 146 case MaxSizeNone: | 104 case MaxSizeNone: |
| 147 default: | 105 default: |
| 148 NOTREACHED(); | 106 NOTREACHED(); |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 LengthResolveType::MarginBorderPaddingSize); | 242 LengthResolveType::MarginBorderPaddingSize); |
| 285 physical_dim.right = ResolveInlineLength( | 243 physical_dim.right = ResolveInlineLength( |
| 286 constraintSpace, style, empty_sizes, style.marginRight(), | 244 constraintSpace, style, empty_sizes, style.marginRight(), |
| 287 LengthResolveType::MarginBorderPaddingSize); | 245 LengthResolveType::MarginBorderPaddingSize); |
| 288 physical_dim.top = ResolveInlineLength( | 246 physical_dim.top = ResolveInlineLength( |
| 289 constraintSpace, style, empty_sizes, style.marginTop(), | 247 constraintSpace, style, empty_sizes, style.marginTop(), |
| 290 LengthResolveType::MarginBorderPaddingSize); | 248 LengthResolveType::MarginBorderPaddingSize); |
| 291 physical_dim.bottom = ResolveInlineLength( | 249 physical_dim.bottom = ResolveInlineLength( |
| 292 constraintSpace, style, empty_sizes, style.marginBottom(), | 250 constraintSpace, style, empty_sizes, style.marginBottom(), |
| 293 LengthResolveType::MarginBorderPaddingSize); | 251 LengthResolveType::MarginBorderPaddingSize); |
| 294 return ToLogicalDimensions(physical_dim, writing_mode, direction); | 252 return physical_dim.ConvertToLogical(writing_mode, direction); |
| 295 } | 253 } |
| 296 | 254 |
| 297 NGBoxStrut ComputeBorders(const ComputedStyle& style) { | 255 NGBoxStrut ComputeBorders(const ComputedStyle& style) { |
| 298 NGBoxStrut borders; | 256 NGBoxStrut borders; |
| 299 borders.inline_start = LayoutUnit(style.borderStartWidth()); | 257 borders.inline_start = LayoutUnit(style.borderStartWidth()); |
| 300 borders.inline_end = LayoutUnit(style.borderEndWidth()); | 258 borders.inline_end = LayoutUnit(style.borderEndWidth()); |
| 301 borders.block_start = LayoutUnit(style.borderBeforeWidth()); | 259 borders.block_start = LayoutUnit(style.borderBeforeWidth()); |
| 302 borders.block_end = LayoutUnit(style.borderAfterWidth()); | 260 borders.block_end = LayoutUnit(style.borderAfterWidth()); |
| 303 return borders; | 261 return borders; |
| 304 } | 262 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 margins->inline_start = available_space / 2; | 297 margins->inline_start = available_space / 2; |
| 340 margins->inline_end = available_space - margins->inline_start; | 298 margins->inline_end = available_space - margins->inline_start; |
| 341 } else if (style.marginStart().isAuto()) { | 299 } else if (style.marginStart().isAuto()) { |
| 342 margins->inline_start = available_space; | 300 margins->inline_start = available_space; |
| 343 } else if (style.marginEnd().isAuto()) { | 301 } else if (style.marginEnd().isAuto()) { |
| 344 margins->inline_end = available_space; | 302 margins->inline_end = available_space; |
| 345 } | 303 } |
| 346 } | 304 } |
| 347 | 305 |
| 348 } // namespace blink | 306 } // namespace blink |
| OLD | NEW |