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_absolute_utils.h" | 5 #include "core/layout/ng/ng_absolute_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_length_utils.h" | 8 #include "core/layout/ng/ng_length_utils.h" |
9 #include "core/style/ComputedStyle.h" | 9 #include "core/style/ComputedStyle.h" |
10 #include "platform/LengthFunctions.h" | 10 #include "platform/LengthFunctions.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 | 21 |
22 bool AbsoluteVerticalNeedsEstimate(const ComputedStyle& style) { | 22 bool AbsoluteVerticalNeedsEstimate(const ComputedStyle& style) { |
23 Length height = style.height(); | 23 Length height = style.height(); |
24 return height.isIntrinsic() || | 24 return height.isIntrinsic() || |
25 (height.isAuto() && (style.top().isAuto() || style.bottom().isAuto())); | 25 (height.isAuto() && (style.top().isAuto() || style.bottom().isAuto())); |
26 } | 26 } |
27 | 27 |
28 LayoutUnit ResolveWidth(const Length& width, | 28 LayoutUnit ResolveWidth(const Length& width, |
29 const NGConstraintSpace& space, | 29 const NGConstraintSpace& space, |
30 const ComputedStyle& style, | 30 const ComputedStyle& style, |
31 const Optional<MinMaxContentSize>& child_minmax, | 31 const Optional<MinAndMaxContentSizes>& child_minmax, |
32 LengthResolveType resolve_type) { | 32 LengthResolveType resolve_type) { |
33 if (space.WritingMode() == kHorizontalTopBottom) | 33 if (space.WritingMode() == kHorizontalTopBottom) |
34 return ResolveInlineLength(space, style, child_minmax, width, resolve_type); | 34 return ResolveInlineLength(space, style, child_minmax, width, resolve_type); |
35 LayoutUnit computed_width = | 35 LayoutUnit computed_width = |
36 child_minmax.has_value() ? child_minmax->max_content : LayoutUnit(); | 36 child_minmax.has_value() ? child_minmax->max_content : LayoutUnit(); |
37 return ResolveBlockLength(space, style, style.width(), computed_width, | 37 return ResolveBlockLength(space, style, style.width(), computed_width, |
38 resolve_type); | 38 resolve_type); |
39 } | 39 } |
40 | 40 |
41 LayoutUnit ResolveHeight(const Length& height, | 41 LayoutUnit ResolveHeight(const Length& height, |
42 const NGConstraintSpace& space, | 42 const NGConstraintSpace& space, |
43 const ComputedStyle& style, | 43 const ComputedStyle& style, |
44 const Optional<MinMaxContentSize>& child_minmax, | 44 const Optional<MinAndMaxContentSizes>& child_minmax, |
45 LengthResolveType resolve_type) { | 45 LengthResolveType resolve_type) { |
46 if (space.WritingMode() != kHorizontalTopBottom) | 46 if (space.WritingMode() != kHorizontalTopBottom) |
47 return ResolveInlineLength(space, style, child_minmax, height, | 47 return ResolveInlineLength(space, style, child_minmax, height, |
48 resolve_type); | 48 resolve_type); |
49 LayoutUnit computed_height = | 49 LayoutUnit computed_height = |
50 child_minmax.has_value() ? child_minmax->max_content : LayoutUnit(); | 50 child_minmax.has_value() ? child_minmax->max_content : LayoutUnit(); |
51 return ResolveBlockLength(space, style, height, computed_height, | 51 return ResolveBlockLength(space, style, height, computed_height, |
52 resolve_type); | 52 resolve_type); |
53 } | 53 } |
54 | 54 |
55 // Implement absolute horizontal size resolution algorithm. | 55 // Implement absolute horizontal size resolution algorithm. |
56 // https://www.w3.org/TR/css-position-3/#abs-non-replaced-width | 56 // https://www.w3.org/TR/css-position-3/#abs-non-replaced-width |
57 void ComputeAbsoluteHorizontal(const NGConstraintSpace& space, | 57 void ComputeAbsoluteHorizontal( |
58 const ComputedStyle& style, | 58 const NGConstraintSpace& space, |
59 const Optional<LayoutUnit>& incoming_width, | 59 const ComputedStyle& style, |
60 const NGStaticPosition& static_position, | 60 const Optional<LayoutUnit>& incoming_width, |
61 const Optional<MinMaxContentSize>& child_minmax, | 61 const NGStaticPosition& static_position, |
62 NGAbsolutePhysicalPosition* position) { | 62 const Optional<MinAndMaxContentSizes>& child_minmax, |
| 63 NGAbsolutePhysicalPosition* position) { |
63 NGLogicalSize percentage_logical = space.PercentageResolutionSize(); | 64 NGLogicalSize percentage_logical = space.PercentageResolutionSize(); |
64 NGPhysicalSize percentage_physical = | 65 NGPhysicalSize percentage_physical = |
65 percentage_logical.ConvertToPhysical(space.WritingMode()); | 66 percentage_logical.ConvertToPhysical(space.WritingMode()); |
66 LayoutUnit border_left(style.borderLeftWidth()); | 67 LayoutUnit border_left(style.borderLeftWidth()); |
67 LayoutUnit border_right(style.borderRightWidth()); | 68 LayoutUnit border_right(style.borderRightWidth()); |
68 LayoutUnit padding_left = | 69 LayoutUnit padding_left = |
69 valueForLength(style.paddingLeft(), percentage_logical.inline_size); | 70 valueForLength(style.paddingLeft(), percentage_logical.inline_size); |
70 LayoutUnit padding_right = | 71 LayoutUnit padding_right = |
71 valueForLength(style.paddingRight(), percentage_logical.inline_size); | 72 valueForLength(style.paddingRight(), percentage_logical.inline_size); |
72 Optional<LayoutUnit> margin_left; | 73 Optional<LayoutUnit> margin_left; |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 // Negative widths are not allowed. | 208 // Negative widths are not allowed. |
208 width = std::max(*width, border_padding); | 209 width = std::max(*width, border_padding); |
209 | 210 |
210 position->inset.left = *left + *margin_left; | 211 position->inset.left = *left + *margin_left; |
211 position->inset.right = *right + *margin_right; | 212 position->inset.right = *right + *margin_right; |
212 position->size.width = *width; | 213 position->size.width = *width; |
213 } | 214 } |
214 | 215 |
215 // Implements absolute vertical size resolution algorithm. | 216 // Implements absolute vertical size resolution algorithm. |
216 // https://www.w3.org/TR/css-position-3/#abs-non-replaced-height | 217 // https://www.w3.org/TR/css-position-3/#abs-non-replaced-height |
217 void ComputeAbsoluteVertical(const NGConstraintSpace& space, | 218 void ComputeAbsoluteVertical( |
218 const ComputedStyle& style, | 219 const NGConstraintSpace& space, |
219 const Optional<LayoutUnit>& incoming_height, | 220 const ComputedStyle& style, |
220 const NGStaticPosition& static_position, | 221 const Optional<LayoutUnit>& incoming_height, |
221 const Optional<MinMaxContentSize>& child_minmax, | 222 const NGStaticPosition& static_position, |
222 NGAbsolutePhysicalPosition* position) { | 223 const Optional<MinAndMaxContentSizes>& child_minmax, |
| 224 NGAbsolutePhysicalPosition* position) { |
223 NGLogicalSize percentage_logical = space.PercentageResolutionSize(); | 225 NGLogicalSize percentage_logical = space.PercentageResolutionSize(); |
224 NGPhysicalSize percentage_physical = | 226 NGPhysicalSize percentage_physical = |
225 percentage_logical.ConvertToPhysical(space.WritingMode()); | 227 percentage_logical.ConvertToPhysical(space.WritingMode()); |
226 | 228 |
227 LayoutUnit border_top(style.borderTopWidth()); | 229 LayoutUnit border_top(style.borderTopWidth()); |
228 LayoutUnit border_bottom(style.borderBottomWidth()); | 230 LayoutUnit border_bottom(style.borderBottomWidth()); |
229 LayoutUnit padding_top = | 231 LayoutUnit padding_top = |
230 valueForLength(style.paddingTop(), percentage_logical.inline_size); | 232 valueForLength(style.paddingTop(), percentage_logical.inline_size); |
231 LayoutUnit padding_bottom = | 233 LayoutUnit padding_bottom = |
232 valueForLength(style.paddingBottom(), percentage_logical.inline_size); | 234 valueForLength(style.paddingBottom(), percentage_logical.inline_size); |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 if (style.isHorizontalWritingMode()) | 376 if (style.isHorizontalWritingMode()) |
375 return AbsoluteHorizontalNeedsEstimate(style); | 377 return AbsoluteHorizontalNeedsEstimate(style); |
376 else | 378 else |
377 return AbsoluteVerticalNeedsEstimate(style); | 379 return AbsoluteVerticalNeedsEstimate(style); |
378 } | 380 } |
379 | 381 |
380 NGAbsolutePhysicalPosition ComputePartialAbsoluteWithChildInlineSize( | 382 NGAbsolutePhysicalPosition ComputePartialAbsoluteWithChildInlineSize( |
381 const NGConstraintSpace& space, | 383 const NGConstraintSpace& space, |
382 const ComputedStyle& style, | 384 const ComputedStyle& style, |
383 const NGStaticPosition& static_position, | 385 const NGStaticPosition& static_position, |
384 const Optional<MinMaxContentSize>& child_minmax) { | 386 const Optional<MinAndMaxContentSizes>& child_minmax) { |
385 NGAbsolutePhysicalPosition position; | 387 NGAbsolutePhysicalPosition position; |
386 if (style.isHorizontalWritingMode()) { | 388 if (style.isHorizontalWritingMode()) { |
387 Optional<LayoutUnit> width; | 389 Optional<LayoutUnit> width; |
388 if (!style.width().isAuto()) { | 390 if (!style.width().isAuto()) { |
389 width = ResolveWidth(style.width(), space, style, child_minmax, | 391 width = ResolveWidth(style.width(), space, style, child_minmax, |
390 LengthResolveType::kContentSize); | 392 LengthResolveType::kContentSize); |
391 } | 393 } |
392 ComputeAbsoluteHorizontal(space, style, width, static_position, | 394 ComputeAbsoluteHorizontal(space, style, width, static_position, |
393 child_minmax, &position); | 395 child_minmax, &position); |
394 } else { | 396 } else { |
(...skipping 11 matching lines...) Expand all Loading... |
406 void ComputeFullAbsoluteWithChildBlockSize( | 408 void ComputeFullAbsoluteWithChildBlockSize( |
407 const NGConstraintSpace& space, | 409 const NGConstraintSpace& space, |
408 const ComputedStyle& style, | 410 const ComputedStyle& style, |
409 const NGStaticPosition& static_position, | 411 const NGStaticPosition& static_position, |
410 const Optional<LayoutUnit>& child_block_size, | 412 const Optional<LayoutUnit>& child_block_size, |
411 NGAbsolutePhysicalPosition* position) { | 413 NGAbsolutePhysicalPosition* position) { |
412 // After partial size has been computed, child block size is either | 414 // After partial size has been computed, child block size is either |
413 // unknown, or fully computed, there is no minmax. | 415 // unknown, or fully computed, there is no minmax. |
414 // To express this, a 'fixed' minmax is created where | 416 // To express this, a 'fixed' minmax is created where |
415 // min and max are the same. | 417 // min and max are the same. |
416 Optional<MinMaxContentSize> child_minmax; | 418 Optional<MinAndMaxContentSizes> child_minmax; |
417 if (child_block_size.has_value()) { | 419 if (child_block_size.has_value()) { |
418 child_minmax = MinMaxContentSize{*child_block_size, *child_block_size}; | 420 child_minmax = MinAndMaxContentSizes{*child_block_size, *child_block_size}; |
419 } | 421 } |
420 if (style.isHorizontalWritingMode()) { | 422 if (style.isHorizontalWritingMode()) { |
421 Optional<LayoutUnit> height; | 423 Optional<LayoutUnit> height; |
422 if (!style.height().isAuto()) { | 424 if (!style.height().isAuto()) { |
423 height = ResolveHeight(style.height(), space, style, child_minmax, | 425 height = ResolveHeight(style.height(), space, style, child_minmax, |
424 LengthResolveType::kContentSize); | 426 LengthResolveType::kContentSize); |
425 } | 427 } |
426 ComputeAbsoluteVertical(space, style, height, static_position, child_minmax, | 428 ComputeAbsoluteVertical(space, style, height, static_position, child_minmax, |
427 position); | 429 position); |
428 } else { | 430 } else { |
429 Optional<LayoutUnit> width; | 431 Optional<LayoutUnit> width; |
430 if (!style.width().isAuto()) { | 432 if (!style.width().isAuto()) { |
431 width = ResolveWidth(style.width(), space, style, child_minmax, | 433 width = ResolveWidth(style.width(), space, style, child_minmax, |
432 LengthResolveType::kContentSize); | 434 LengthResolveType::kContentSize); |
433 } | 435 } |
434 ComputeAbsoluteHorizontal(space, style, width, static_position, | 436 ComputeAbsoluteHorizontal(space, style, width, static_position, |
435 child_minmax, position); | 437 child_minmax, position); |
436 } | 438 } |
437 } | 439 } |
438 | 440 |
439 } // namespace blink | 441 } // namespace blink |
OLD | NEW |