| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) | 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) |
| 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) |
| 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. | 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. |
| 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. | 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. |
| 8 * | 8 * |
| 9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
| 10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
| (...skipping 2607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2618 // TODO(cbiesinger): We should probably return something other than just bor
der + padding, but for now | 2618 // TODO(cbiesinger): We should probably return something other than just bor
der + padding, but for now |
| 2619 // we have no good way to do anything else without layout, so we just use th
at. | 2619 // we have no good way to do anything else without layout, so we just use th
at. |
| 2620 LogicalExtentComputedValues computedValues; | 2620 LogicalExtentComputedValues computedValues; |
| 2621 computeLogicalHeight(borderAndPaddingLogicalHeight(), LayoutUnit(), computed
Values); | 2621 computeLogicalHeight(borderAndPaddingLogicalHeight(), LayoutUnit(), computed
Values); |
| 2622 return computedValues.m_extent; | 2622 return computedValues.m_extent; |
| 2623 } | 2623 } |
| 2624 | 2624 |
| 2625 LayoutUnit LayoutBox::computeLogicalHeightUsing(SizeType heightType, const Lengt
h& height, LayoutUnit intrinsicContentHeight) const | 2625 LayoutUnit LayoutBox::computeLogicalHeightUsing(SizeType heightType, const Lengt
h& height, LayoutUnit intrinsicContentHeight) const |
| 2626 { | 2626 { |
| 2627 LayoutUnit logicalHeight = computeContentAndScrollbarLogicalHeightUsing(heig
htType, height, intrinsicContentHeight); | 2627 LayoutUnit logicalHeight = computeContentAndScrollbarLogicalHeightUsing(heig
htType, height, intrinsicContentHeight); |
| 2628 if (logicalHeight != -1) | 2628 if (logicalHeight != -1) { |
| 2629 logicalHeight = adjustBorderBoxLogicalHeightForBoxSizing(logicalHeight); | 2629 if (height.isSpecified()) |
| 2630 logicalHeight = adjustBorderBoxLogicalHeightForBoxSizing(logicalHeig
ht); |
| 2631 else |
| 2632 logicalHeight += borderAndPaddingLogicalHeight(); |
| 2633 } |
| 2630 return logicalHeight; | 2634 return logicalHeight; |
| 2631 } | 2635 } |
| 2632 | 2636 |
| 2633 LayoutUnit LayoutBox::computeContentLogicalHeight(SizeType heightType, const Len
gth& height, LayoutUnit intrinsicContentHeight) const | 2637 LayoutUnit LayoutBox::computeContentLogicalHeight(SizeType heightType, const Len
gth& height, LayoutUnit intrinsicContentHeight) const |
| 2634 { | 2638 { |
| 2635 LayoutUnit heightIncludingScrollbar = computeContentAndScrollbarLogicalHeigh
tUsing(heightType, height, intrinsicContentHeight); | 2639 LayoutUnit heightIncludingScrollbar = computeContentAndScrollbarLogicalHeigh
tUsing(heightType, height, intrinsicContentHeight); |
| 2636 if (heightIncludingScrollbar == -1) | 2640 if (heightIncludingScrollbar == -1) |
| 2637 return LayoutUnit(-1); | 2641 return LayoutUnit(-1); |
| 2638 return std::max(LayoutUnit(), adjustContentBoxLogicalHeightForBoxSizing(heig
htIncludingScrollbar) - scrollbarLogicalHeight()); | 2642 LayoutUnit adjusted = heightIncludingScrollbar; |
| 2643 if (height.isSpecified()) { |
| 2644 // Keywords don't get adjusted for box-sizing |
| 2645 adjusted = adjustContentBoxLogicalHeightForBoxSizing(heightIncludingScro
llbar); |
| 2646 } |
| 2647 return std::max(LayoutUnit(), adjusted - scrollbarLogicalHeight()); |
| 2639 } | 2648 } |
| 2640 | 2649 |
| 2641 LayoutUnit LayoutBox::computeIntrinsicLogicalContentHeightUsing(const Length& lo
gicalHeightLength, LayoutUnit intrinsicContentHeight, LayoutUnit borderAndPaddin
g) const | 2650 LayoutUnit LayoutBox::computeIntrinsicLogicalContentHeightUsing(const Length& lo
gicalHeightLength, LayoutUnit intrinsicContentHeight, LayoutUnit borderAndPaddin
g) const |
| 2642 { | 2651 { |
| 2643 // FIXME(cbiesinger): The css-sizing spec is considering changing what min-c
ontent/max-content should resolve to. | 2652 // FIXME(cbiesinger): The css-sizing spec is considering changing what min-c
ontent/max-content should resolve to. |
| 2644 // If that happens, this code will have to change. | 2653 // If that happens, this code will have to change. |
| 2645 if (logicalHeightLength.isMinContent() || logicalHeightLength.isMaxContent()
|| logicalHeightLength.isFitContent()) { | 2654 if (logicalHeightLength.isMinContent() || logicalHeightLength.isMaxContent()
|| logicalHeightLength.isFitContent()) { |
| 2646 if (isAtomicInlineLevel()) | 2655 if (isAtomicInlineLevel()) |
| 2647 return intrinsicSize().height(); | 2656 return intrinsicSize().height(); |
| 2648 return intrinsicContentHeight; | 2657 return intrinsicContentHeight; |
| (...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3304 LayoutUnit preferredLogicalWidth = maxPreferredLogicalWidth() - bordersPlusP
adding; | 3313 LayoutUnit preferredLogicalWidth = maxPreferredLogicalWidth() - bordersPlusP
adding; |
| 3305 LayoutUnit preferredMinLogicalWidth = minPreferredLogicalWidth() - bordersPl
usPadding; | 3314 LayoutUnit preferredMinLogicalWidth = minPreferredLogicalWidth() - bordersPl
usPadding; |
| 3306 return std::min(std::max(preferredMinLogicalWidth, availableLogicalWidth), p
referredLogicalWidth); | 3315 return std::min(std::max(preferredMinLogicalWidth, availableLogicalWidth), p
referredLogicalWidth); |
| 3307 } | 3316 } |
| 3308 | 3317 |
| 3309 void LayoutBox::computePositionedLogicalWidthUsing(SizeType widthSizeType, Lengt
h logicalWidth, const LayoutBoxModelObject* containerBlock, TextDirection contai
nerDirection, | 3318 void LayoutBox::computePositionedLogicalWidthUsing(SizeType widthSizeType, Lengt
h logicalWidth, const LayoutBoxModelObject* containerBlock, TextDirection contai
nerDirection, |
| 3310 LayoutUnit containerLogicalWidth, LayoutUnit bordersPlusPadding, | 3319 LayoutUnit containerLogicalWidth, LayoutUnit bordersPlusPadding, |
| 3311 const Length& logicalLeft, const Length& logicalRight, const Length& marginL
ogicalLeft, | 3320 const Length& logicalLeft, const Length& logicalRight, const Length& marginL
ogicalLeft, |
| 3312 const Length& marginLogicalRight, LogicalExtentComputedValues& computedValue
s) const | 3321 const Length& marginLogicalRight, LogicalExtentComputedValues& computedValue
s) const |
| 3313 { | 3322 { |
| 3323 LayoutUnit logicalWidthValue; |
| 3324 |
| 3314 ASSERT(widthSizeType == MinSize || widthSizeType == MainOrPreferredSize || !
logicalWidth.isAuto()); | 3325 ASSERT(widthSizeType == MinSize || widthSizeType == MainOrPreferredSize || !
logicalWidth.isAuto()); |
| 3315 if (widthSizeType == MinSize && logicalWidth.isAuto()) | 3326 if (widthSizeType == MinSize && logicalWidth.isAuto()) |
| 3316 logicalWidth = Length(0, Fixed); | 3327 logicalWidthValue = LayoutUnit(); |
| 3317 else if (logicalWidth.isIntrinsic()) | 3328 else if (logicalWidth.isIntrinsic()) |
| 3318 logicalWidth = Length(computeIntrinsicLogicalWidthUsing(logicalWidth, co
ntainerLogicalWidth, bordersPlusPadding) - bordersPlusPadding, Fixed); | 3329 logicalWidthValue = computeIntrinsicLogicalWidthUsing(logicalWidth, cont
ainerLogicalWidth, bordersPlusPadding) - bordersPlusPadding; |
| 3330 else |
| 3331 logicalWidthValue = adjustContentBoxLogicalWidthForBoxSizing(valueForLen
gth(logicalWidth, containerLogicalWidth)); |
| 3319 | 3332 |
| 3320 // 'left' and 'right' cannot both be 'auto' because one would of been | 3333 // 'left' and 'right' cannot both be 'auto' because one would of been |
| 3321 // converted to the static position already | 3334 // converted to the static position already |
| 3322 ASSERT(!(logicalLeft.isAuto() && logicalRight.isAuto())); | 3335 ASSERT(!(logicalLeft.isAuto() && logicalRight.isAuto())); |
| 3323 | 3336 |
| 3324 // minimumValueForLength will convert 'auto' to 0 so that it doesn't impact
the available space computation below. | 3337 // minimumValueForLength will convert 'auto' to 0 so that it doesn't impact
the available space computation below. |
| 3325 LayoutUnit logicalLeftValue = minimumValueForLength(logicalLeft, containerLo
gicalWidth); | 3338 LayoutUnit logicalLeftValue = minimumValueForLength(logicalLeft, containerLo
gicalWidth); |
| 3326 LayoutUnit logicalRightValue = minimumValueForLength(logicalRight, container
LogicalWidth); | 3339 LayoutUnit logicalRightValue = minimumValueForLength(logicalRight, container
LogicalWidth); |
| 3327 | 3340 |
| 3328 const LayoutUnit containerRelativeLogicalWidth = containingBlockLogicalWidth
ForPositioned(containerBlock, false); | 3341 const LayoutUnit containerRelativeLogicalWidth = containingBlockLogicalWidth
ForPositioned(containerBlock, false); |
| 3329 | 3342 |
| 3330 bool logicalWidthIsAuto = logicalWidth.isIntrinsicOrAuto(); | 3343 bool logicalWidthIsAuto = logicalWidth.isAuto(); |
| 3331 bool logicalLeftIsAuto = logicalLeft.isAuto(); | 3344 bool logicalLeftIsAuto = logicalLeft.isAuto(); |
| 3332 bool logicalRightIsAuto = logicalRight.isAuto(); | 3345 bool logicalRightIsAuto = logicalRight.isAuto(); |
| 3333 LayoutUnit& marginLogicalLeftValue = style()->isLeftToRightDirection() ? com
putedValues.m_margins.m_start : computedValues.m_margins.m_end; | 3346 LayoutUnit& marginLogicalLeftValue = style()->isLeftToRightDirection() ? com
putedValues.m_margins.m_start : computedValues.m_margins.m_end; |
| 3334 LayoutUnit& marginLogicalRightValue = style()->isLeftToRightDirection() ? co
mputedValues.m_margins.m_end : computedValues.m_margins.m_start; | 3347 LayoutUnit& marginLogicalRightValue = style()->isLeftToRightDirection() ? co
mputedValues.m_margins.m_end : computedValues.m_margins.m_start; |
| 3335 if (!logicalLeftIsAuto && !logicalWidthIsAuto && !logicalRightIsAuto) { | 3348 if (!logicalLeftIsAuto && !logicalWidthIsAuto && !logicalRightIsAuto) { |
| 3336 /*----------------------------------------------------------------------
-*\ | 3349 /*----------------------------------------------------------------------
-*\ |
| 3337 * If none of the three is 'auto': If both 'margin-left' and 'margin- | 3350 * If none of the three is 'auto': If both 'margin-left' and 'margin- |
| 3338 * right' are 'auto', solve the equation under the extra constraint that | 3351 * right' are 'auto', solve the equation under the extra constraint that |
| 3339 * the two margins get equal values, unless this would make them negativ
e, | 3352 * the two margins get equal values, unless this would make them negativ
e, |
| 3340 * in which case when direction of the containing block is 'ltr' ('rtl')
, | 3353 * in which case when direction of the containing block is 'ltr' ('rtl')
, |
| 3341 * set 'margin-left' ('margin-right') to zero and solve for 'margin-righ
t' | 3354 * set 'margin-left' ('margin-right') to zero and solve for 'margin-righ
t' |
| 3342 * ('margin-left'). If one of 'margin-left' or 'margin-right' is 'auto', | 3355 * ('margin-left'). If one of 'margin-left' or 'margin-right' is 'auto', |
| 3343 * solve the equation for that value. If the values are over-constrained
, | 3356 * solve the equation for that value. If the values are over-constrained
, |
| 3344 * ignore the value for 'left' (in case the 'direction' property of the | 3357 * ignore the value for 'left' (in case the 'direction' property of the |
| 3345 * containing block is 'rtl') or 'right' (in case 'direction' is 'ltr') | 3358 * containing block is 'rtl') or 'right' (in case 'direction' is 'ltr') |
| 3346 * and solve for that value. | 3359 * and solve for that value. |
| 3347 \*----------------------------------------------------------------------
-*/ | 3360 \*----------------------------------------------------------------------
-*/ |
| 3348 // NOTE: It is not necessary to solve for 'right' in the over constrain
ed | 3361 // NOTE: It is not necessary to solve for 'right' in the over constrain
ed |
| 3349 // case because the value is not used for any further calculations. | 3362 // case because the value is not used for any further calculations. |
| 3350 | 3363 |
| 3351 computedValues.m_extent = adjustContentBoxLogicalWidthForBoxSizing(value
ForLength(logicalWidth, containerLogicalWidth)); | 3364 computedValues.m_extent = logicalWidthValue; |
| 3352 | 3365 |
| 3353 const LayoutUnit availableSpace = containerLogicalWidth - (logicalLeftVa
lue + computedValues.m_extent + logicalRightValue + bordersPlusPadding); | 3366 const LayoutUnit availableSpace = containerLogicalWidth - (logicalLeftVa
lue + computedValues.m_extent + logicalRightValue + bordersPlusPadding); |
| 3354 | 3367 |
| 3355 // Margins are now the only unknown | 3368 // Margins are now the only unknown |
| 3356 if (marginLogicalLeft.isAuto() && marginLogicalRight.isAuto()) { | 3369 if (marginLogicalLeft.isAuto() && marginLogicalRight.isAuto()) { |
| 3357 // Both margins auto, solve for equality | 3370 // Both margins auto, solve for equality |
| 3358 if (availableSpace >= 0) { | 3371 if (availableSpace >= 0) { |
| 3359 marginLogicalLeftValue = availableSpace / 2; // split the differ
ence | 3372 marginLogicalLeftValue = availableSpace / 2; // split the differ
ence |
| 3360 marginLogicalRightValue = availableSpace - marginLogicalLeftValu
e; // account for odd valued differences | 3373 marginLogicalRightValue = availableSpace - marginLogicalLeftValu
e; // account for odd valued differences |
| 3361 } else { | 3374 } else { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3439 // Use rule/case that applies. | 3452 // Use rule/case that applies. |
| 3440 if (logicalLeftIsAuto && logicalWidthIsAuto && !logicalRightIsAuto) { | 3453 if (logicalLeftIsAuto && logicalWidthIsAuto && !logicalRightIsAuto) { |
| 3441 // RULE 1: (use shrink-to-fit for width, and solve of left) | 3454 // RULE 1: (use shrink-to-fit for width, and solve of left) |
| 3442 computedValues.m_extent = shrinkToFitLogicalWidth(availableSpace, bo
rdersPlusPadding); | 3455 computedValues.m_extent = shrinkToFitLogicalWidth(availableSpace, bo
rdersPlusPadding); |
| 3443 logicalLeftValue = availableSpace - computedValues.m_extent; | 3456 logicalLeftValue = availableSpace - computedValues.m_extent; |
| 3444 } else if (!logicalLeftIsAuto && logicalWidthIsAuto && logicalRightIsAut
o) { | 3457 } else if (!logicalLeftIsAuto && logicalWidthIsAuto && logicalRightIsAut
o) { |
| 3445 // RULE 3: (use shrink-to-fit for width, and no need solve of right) | 3458 // RULE 3: (use shrink-to-fit for width, and no need solve of right) |
| 3446 computedValues.m_extent = shrinkToFitLogicalWidth(availableSpace, bo
rdersPlusPadding); | 3459 computedValues.m_extent = shrinkToFitLogicalWidth(availableSpace, bo
rdersPlusPadding); |
| 3447 } else if (logicalLeftIsAuto && !logicalWidthIsAuto && !logicalRightIsAu
to) { | 3460 } else if (logicalLeftIsAuto && !logicalWidthIsAuto && !logicalRightIsAu
to) { |
| 3448 // RULE 4: (solve for left) | 3461 // RULE 4: (solve for left) |
| 3449 computedValues.m_extent = adjustContentBoxLogicalWidthForBoxSizing(v
alueForLength(logicalWidth, containerLogicalWidth)); | 3462 computedValues.m_extent = logicalWidthValue; |
| 3450 logicalLeftValue = availableSpace - computedValues.m_extent; | 3463 logicalLeftValue = availableSpace - computedValues.m_extent; |
| 3451 } else if (!logicalLeftIsAuto && logicalWidthIsAuto && !logicalRightIsAu
to) { | 3464 } else if (!logicalLeftIsAuto && logicalWidthIsAuto && !logicalRightIsAu
to) { |
| 3452 // RULE 5: (solve for width) | 3465 // RULE 5: (solve for width) |
| 3453 if (autoWidthShouldFitContent()) | 3466 if (autoWidthShouldFitContent()) |
| 3454 computedValues.m_extent = shrinkToFitLogicalWidth(availableSpace
, bordersPlusPadding); | 3467 computedValues.m_extent = shrinkToFitLogicalWidth(availableSpace
, bordersPlusPadding); |
| 3455 else | 3468 else |
| 3456 computedValues.m_extent = std::max(LayoutUnit(), availableSpace)
; | 3469 computedValues.m_extent = std::max(LayoutUnit(), availableSpace)
; |
| 3457 } else if (!logicalLeftIsAuto && !logicalWidthIsAuto && logicalRightIsAu
to) { | 3470 } else if (!logicalLeftIsAuto && !logicalWidthIsAuto && logicalRightIsAu
to) { |
| 3458 // RULE 6: (no need solve for right) | 3471 // RULE 6: (no need solve for right) |
| 3459 computedValues.m_extent = adjustContentBoxLogicalWidthForBoxSizing(v
alueForLength(logicalWidth, containerLogicalWidth)); | 3472 computedValues.m_extent = logicalWidthValue; |
| 3460 } | 3473 } |
| 3461 } | 3474 } |
| 3462 | 3475 |
| 3463 // Use computed values to calculate the horizontal position. | 3476 // Use computed values to calculate the horizontal position. |
| 3464 | 3477 |
| 3465 // FIXME: This hack is needed to calculate the logical left position for a
'rtl' relatively | 3478 // FIXME: This hack is needed to calculate the logical left position for a
'rtl' relatively |
| 3466 // positioned, inline because right now, it is using the logical left positi
on | 3479 // positioned, inline because right now, it is using the logical left positi
on |
| 3467 // of the first line box when really it should use the last line box. When | 3480 // of the first line box when really it should use the last line box. When |
| 3468 // this is fixed elsewhere, this block should be removed. | 3481 // this is fixed elsewhere, this block should be removed. |
| 3469 if (containerBlock->isLayoutInline() && !containerBlock->style()->isLeftToRi
ghtDirection()) { | 3482 if (containerBlock->isLayoutInline() && !containerBlock->style()->isLeftToRi
ghtDirection()) { |
| (...skipping 1416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4886 m_rareData->m_snapAreas->remove(&snapArea); | 4899 m_rareData->m_snapAreas->remove(&snapArea); |
| 4887 } | 4900 } |
| 4888 } | 4901 } |
| 4889 | 4902 |
| 4890 SnapAreaSet* LayoutBox::snapAreas() const | 4903 SnapAreaSet* LayoutBox::snapAreas() const |
| 4891 { | 4904 { |
| 4892 return m_rareData ? m_rareData->m_snapAreas.get() : nullptr; | 4905 return m_rareData ? m_rareData->m_snapAreas.get() : nullptr; |
| 4893 } | 4906 } |
| 4894 | 4907 |
| 4895 } // namespace blink | 4908 } // namespace blink |
| OLD | NEW |