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 2226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2237 containerWidthInInlineDirection = perpendicularContainingBlockLogica
lHeight(); | 2237 containerWidthInInlineDirection = perpendicularContainingBlockLogica
lHeight(); |
2238 LayoutUnit preferredWidth = computeLogicalWidthUsing(MainOrPreferredSize
, styleToUse->logicalWidth(), containerWidthInInlineDirection, cb); | 2238 LayoutUnit preferredWidth = computeLogicalWidthUsing(MainOrPreferredSize
, styleToUse->logicalWidth(), containerWidthInInlineDirection, cb); |
2239 computedValues.m_extent = constrainLogicalWidthByMinMax(preferredWidth,
containerWidthInInlineDirection, cb); | 2239 computedValues.m_extent = constrainLogicalWidthByMinMax(preferredWidth,
containerWidthInInlineDirection, cb); |
2240 } | 2240 } |
2241 | 2241 |
2242 // Margin calculations. | 2242 // Margin calculations. |
2243 if (hasPerpendicularContainingBlock || isFloating() || isInline()) { | 2243 if (hasPerpendicularContainingBlock || isFloating() || isInline()) { |
2244 computedValues.m_margins.m_start = minimumValueForLength(styleToUse->mar
ginStart(), containerLogicalWidth); | 2244 computedValues.m_margins.m_start = minimumValueForLength(styleToUse->mar
ginStart(), containerLogicalWidth); |
2245 computedValues.m_margins.m_end = minimumValueForLength(styleToUse->margi
nEnd(), containerLogicalWidth); | 2245 computedValues.m_margins.m_end = minimumValueForLength(styleToUse->margi
nEnd(), containerLogicalWidth); |
2246 } else { | 2246 } else { |
2247 LayoutUnit containerLogicalWidthForAutoMargins = containerLogicalWidth; | |
2248 if (avoidsFloats() && cb->containsFloats()) | |
2249 containerLogicalWidthForAutoMargins = containingBlockAvailableLineWi
dth(); | |
2250 bool hasInvertedDirection = cb->style()->isLeftToRightDirection() != sty
le()->isLeftToRightDirection(); | 2247 bool hasInvertedDirection = cb->style()->isLeftToRightDirection() != sty
le()->isLeftToRightDirection(); |
2251 computeInlineDirectionMargins(cb, containerLogicalWidthForAutoMargins, c
omputedValues.m_extent, | 2248 computeInlineDirectionMargins(cb, containerLogicalWidth, computedValues.
m_extent, |
2252 hasInvertedDirection ? computedValues.m_margins.m_end : computedValu
es.m_margins.m_start, | 2249 hasInvertedDirection ? computedValues.m_margins.m_end : computedValu
es.m_margins.m_start, |
2253 hasInvertedDirection ? computedValues.m_margins.m_start : computedVa
lues.m_margins.m_end); | 2250 hasInvertedDirection ? computedValues.m_margins.m_start : computedVa
lues.m_margins.m_end); |
2254 } | 2251 } |
2255 | 2252 |
2256 if (!hasPerpendicularContainingBlock && containerLogicalWidth && containerLo
gicalWidth != (computedValues.m_extent + computedValues.m_margins.m_start + comp
utedValues.m_margins.m_end) | 2253 if (!hasPerpendicularContainingBlock && containerLogicalWidth && containerLo
gicalWidth != (computedValues.m_extent + computedValues.m_margins.m_start + comp
utedValues.m_margins.m_end) |
2257 && !isFloating() && !isInline() && !cb->isFlexibleBoxIncludingDeprecated
() && !cb->isRenderGrid()) { | 2254 && !isFloating() && !isInline() && !cb->isFlexibleBoxIncludingDeprecated
() && !cb->isRenderGrid()) { |
2258 LayoutUnit newMargin = containerLogicalWidth - computedValues.m_extent -
cb->marginStartForChild(this); | 2255 LayoutUnit newMargin = containerLogicalWidth - computedValues.m_extent -
cb->marginStartForChild(this); |
2259 bool hasInvertedDirection = cb->style()->isLeftToRightDirection() != sty
le()->isLeftToRightDirection(); | 2256 bool hasInvertedDirection = cb->style()->isLeftToRightDirection() != sty
le()->isLeftToRightDirection(); |
2260 if (hasInvertedDirection) | 2257 if (hasInvertedDirection) |
2261 computedValues.m_margins.m_start = newMargin; | 2258 computedValues.m_margins.m_start = newMargin; |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2438 if (containingBlock->isFlexibleBox()) { | 2435 if (containingBlock->isFlexibleBox()) { |
2439 // We need to let flexbox handle the margin adjustment - otherwise, flex
box | 2436 // We need to let flexbox handle the margin adjustment - otherwise, flex
box |
2440 // will think we're wider than we actually are and calculate line sizes
wrong. | 2437 // will think we're wider than we actually are and calculate line sizes
wrong. |
2441 // See also http://dev.w3.org/csswg/css-flexbox/#auto-margins | 2438 // See also http://dev.w3.org/csswg/css-flexbox/#auto-margins |
2442 if (marginStartLength.isAuto()) | 2439 if (marginStartLength.isAuto()) |
2443 marginStartLength.setValue(0); | 2440 marginStartLength.setValue(0); |
2444 if (marginEndLength.isAuto()) | 2441 if (marginEndLength.isAuto()) |
2445 marginEndLength.setValue(0); | 2442 marginEndLength.setValue(0); |
2446 } | 2443 } |
2447 | 2444 |
| 2445 LayoutUnit availableWidth = containerWidth; |
| 2446 if (avoidsFloats() && containingBlock->containsFloats()) |
| 2447 availableWidth = containingBlockAvailableLineWidth(); |
| 2448 |
2448 // Case One: The object is being centered in the containing block's availabl
e logical width. | 2449 // Case One: The object is being centered in the containing block's availabl
e logical width. |
2449 if ((marginStartLength.isAuto() && marginEndLength.isAuto() && childWidth <
containerWidth) | 2450 if ((marginStartLength.isAuto() && marginEndLength.isAuto() && childWidth <
availableWidth) |
2450 || (!marginStartLength.isAuto() && !marginEndLength.isAuto() && containi
ngBlock->style()->textAlign() == WEBKIT_CENTER)) { | 2451 || (!marginStartLength.isAuto() && !marginEndLength.isAuto() && containi
ngBlock->style()->textAlign() == WEBKIT_CENTER)) { |
2451 // Other browsers center the margin box for align=center elements so we
match them here. | 2452 // Other browsers center the margin box for align=center elements so we
match them here. |
2452 LayoutUnit marginStartWidth = minimumValueForLength(marginStartLength, c
ontainerWidth); | 2453 LayoutUnit marginStartWidth = minimumValueForLength(marginStartLength, c
ontainerWidth); |
2453 LayoutUnit marginEndWidth = minimumValueForLength(marginEndLength, conta
inerWidth); | 2454 LayoutUnit marginEndWidth = minimumValueForLength(marginEndLength, conta
inerWidth); |
2454 LayoutUnit centeredMarginBoxStart = max<LayoutUnit>(0, (containerWidth -
childWidth - marginStartWidth - marginEndWidth) / 2); | 2455 LayoutUnit centeredMarginBoxStart = max<LayoutUnit>(0, (availableWidth -
childWidth - marginStartWidth - marginEndWidth) / 2); |
2455 marginStart = centeredMarginBoxStart + marginStartWidth; | 2456 marginStart = centeredMarginBoxStart + marginStartWidth; |
2456 marginEnd = containerWidth - childWidth - marginStart + marginEndWidth; | 2457 marginEnd = availableWidth - childWidth - marginStart + marginEndWidth; |
2457 return; | 2458 return; |
2458 } | 2459 } |
2459 | 2460 |
2460 // Case Two: The object is being pushed to the start of the containing block
's available logical width. | 2461 // Case Two: The object is being pushed to the start of the containing block
's available logical width. |
2461 if (marginEndLength.isAuto() && childWidth < containerWidth) { | 2462 if (marginEndLength.isAuto() && childWidth < availableWidth) { |
2462 marginStart = valueForLength(marginStartLength, containerWidth); | 2463 marginStart = valueForLength(marginStartLength, containerWidth); |
2463 marginEnd = containerWidth - childWidth - marginStart; | 2464 marginEnd = availableWidth - childWidth - marginStart; |
2464 return; | 2465 return; |
2465 } | 2466 } |
2466 | 2467 |
2467 // Case Three: The object is being pushed to the end of the containing block
's available logical width. | 2468 // Case Three: The object is being pushed to the end of the containing block
's available logical width. |
2468 bool pushToEndFromTextAlign = !marginEndLength.isAuto() && ((!containingBloc
kStyle->isLeftToRightDirection() && containingBlockStyle->textAlign() == WEBKIT_
LEFT) | 2469 bool pushToEndFromTextAlign = !marginEndLength.isAuto() && ((!containingBloc
kStyle->isLeftToRightDirection() && containingBlockStyle->textAlign() == WEBKIT_
LEFT) |
2469 || (containingBlockStyle->isLeftToRightDirection() && containingBlockSty
le->textAlign() == WEBKIT_RIGHT)); | 2470 || (containingBlockStyle->isLeftToRightDirection() && containingBlockSty
le->textAlign() == WEBKIT_RIGHT)); |
2470 if ((marginStartLength.isAuto() && childWidth < containerWidth) || pushToEnd
FromTextAlign) { | 2471 if ((marginStartLength.isAuto() && childWidth < availableWidth) || pushToEnd
FromTextAlign) { |
2471 marginEnd = valueForLength(marginEndLength, containerWidth); | 2472 marginEnd = valueForLength(marginEndLength, containerWidth); |
2472 marginStart = containerWidth - childWidth - marginEnd; | 2473 marginStart = availableWidth - childWidth - marginEnd; |
2473 return; | 2474 return; |
2474 } | 2475 } |
2475 | 2476 |
2476 // Case Four: Either no auto margins, or our width is >= the container width
(css2.1, 10.3.3). In that case | 2477 // Case Four: Either no auto margins, or our width is >= the container width
(css2.1, 10.3.3). In that case |
2477 // auto margins will just turn into 0. | 2478 // auto margins will just turn into 0. |
2478 marginStart = minimumValueForLength(marginStartLength, containerWidth); | 2479 marginStart = minimumValueForLength(marginStartLength, containerWidth); |
2479 marginEnd = minimumValueForLength(marginEndLength, containerWidth); | 2480 marginEnd = minimumValueForLength(marginEndLength, containerWidth); |
2480 } | 2481 } |
2481 | 2482 |
2482 static bool shouldFlipBeforeAfterMargins(const RenderStyle* containingBlockStyle
, const RenderStyle* childStyle) | 2483 static bool shouldFlipBeforeAfterMargins(const RenderStyle* containingBlockStyle
, const RenderStyle* childStyle) |
(...skipping 2209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4692 return 0; | 4693 return 0; |
4693 | 4694 |
4694 if (!layoutState && !flowThreadContainingBlock()) | 4695 if (!layoutState && !flowThreadContainingBlock()) |
4695 return 0; | 4696 return 0; |
4696 | 4697 |
4697 RenderBlock* containerBlock = containingBlock(); | 4698 RenderBlock* containerBlock = containingBlock(); |
4698 return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop(); | 4699 return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop(); |
4699 } | 4700 } |
4700 | 4701 |
4701 } // namespace WebCore | 4702 } // namespace WebCore |
OLD | NEW |