OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ight reserved. | 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ight reserved. |
4 * Copyright (C) 2010 Google Inc. All rights reserved. | 4 * Copyright (C) 2010 Google Inc. All rights reserved. |
5 * | 5 * |
6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
10 * | 10 * |
(...skipping 1550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1561 // simple case of an anonymous block truncating when it's parent is clipped. | 1561 // simple case of an anonymous block truncating when it's parent is clipped. |
1562 bool hasTextOverflow = (style()->getTextOverflow() && hasOverflowClip()) | 1562 bool hasTextOverflow = (style()->getTextOverflow() && hasOverflowClip()) |
1563 || (isAnonymousBlock() && parent() && parent()->isLayoutBlock() && toLay
outBlock(parent())->canCollapseAnonymousBlockChild() | 1563 || (isAnonymousBlock() && parent() && parent()->isLayoutBlock() && toLay
outBlock(parent())->canCollapseAnonymousBlockChild() |
1564 && parent()->style()->getTextOverflow() && parent()->hasOverflowClip
()); | 1564 && parent()->style()->getTextOverflow() && parent()->hasOverflowClip
()); |
1565 | 1565 |
1566 // Walk all the lines and delete our ellipsis line boxes if they exist. | 1566 // Walk all the lines and delete our ellipsis line boxes if they exist. |
1567 if (hasTextOverflow) | 1567 if (hasTextOverflow) |
1568 deleteEllipsisLineBoxes(); | 1568 deleteEllipsisLineBoxes(); |
1569 | 1569 |
1570 if (firstChild()) { | 1570 if (firstChild()) { |
1571 // In full layout mode, clear the line boxes of children upfront. Otherw
ise, | |
1572 // siblings can run into stale root lineboxes during layout. Then layout | |
1573 // the replaced elements later. In partial layout mode, line boxes are n
ot | |
1574 // deleted and only dirtied. In that case, we can layout the replaced | |
1575 // elements at the same time. | |
1576 Vector<LayoutBox*> replacedChildren; | |
1577 for (InlineWalker walker(LineLayoutBlockFlow(this)); !walker.atEnd(); wa
lker.advance()) { | 1571 for (InlineWalker walker(LineLayoutBlockFlow(this)); !walker.atEnd(); wa
lker.advance()) { |
1578 LayoutObject* o = walker.current().layoutObject(); | 1572 LayoutObject* o = walker.current().layoutObject(); |
1579 | 1573 |
1580 if (!layoutState.hasInlineChild() && o->isInline()) | 1574 if (!layoutState.hasInlineChild() && o->isInline()) |
1581 layoutState.setHasInlineChild(true); | 1575 layoutState.setHasInlineChild(true); |
1582 | 1576 |
1583 if (o->isAtomicInlineLevel() || o->isFloating() || o->isOutOfFlowPos
itioned()) { | 1577 if (o->isAtomicInlineLevel() || o->isFloating() || o->isOutOfFlowPos
itioned()) { |
1584 LayoutBox* box = toLayoutBox(o); | 1578 LayoutBox* box = toLayoutBox(o); |
1585 | 1579 |
1586 updateBlockChildDirtyBitsBeforeLayout(relayoutChildren, *box); | 1580 updateBlockChildDirtyBitsBeforeLayout(relayoutChildren, *box); |
1587 | 1581 |
1588 if (o->isOutOfFlowPositioned()) { | 1582 if (o->isOutOfFlowPositioned()) { |
1589 o->containingBlock()->insertPositionedObject(box); | 1583 o->containingBlock()->insertPositionedObject(box); |
1590 } else if (o->isFloating()) { | 1584 } else if (o->isFloating()) { |
1591 layoutState.floats().append(FloatWithRect(box)); | 1585 layoutState.floats().append(FloatWithRect(box)); |
1592 if (box->needsLayout()) { | 1586 if (box->needsLayout()) { |
1593 box->layout(); | 1587 box->layout(); |
1594 markLinesDirtyInBlockRange(toLayoutBox(o)->logicalTop(),
toLayoutBox(o)->logicalBottom()); | 1588 markLinesDirtyInBlockRange(toLayoutBox(o)->logicalTop(),
toLayoutBox(o)->logicalBottom()); |
1595 } | 1589 } |
1596 } else if (isFullLayout || o->needsLayout()) { | 1590 } else if (isFullLayout || o->needsLayout()) { |
1597 // Replaced element. | 1591 // Atomic inline. |
1598 box->dirtyLineBoxes(isFullLayout); | 1592 box->dirtyLineBoxes(isFullLayout); |
1599 if (isFullLayout) | 1593 o->layoutIfNeeded(); |
1600 replacedChildren.append(box); | |
1601 else | |
1602 o->layoutIfNeeded(); | |
1603 } | 1594 } |
1604 } else if (o->isText() || (o->isLayoutInline() && !walker.atEndOfInl
ine())) { | 1595 } else if (o->isText() || (o->isLayoutInline() && !walker.atEndOfInl
ine())) { |
1605 if (!o->isText()) | 1596 if (!o->isText()) |
1606 toLayoutInline(o)->updateAlwaysCreateLineBoxes(layoutState.i
sFullLayout()); | 1597 toLayoutInline(o)->updateAlwaysCreateLineBoxes(layoutState.i
sFullLayout()); |
1607 if (layoutState.isFullLayout() || o->selfNeedsLayout()) | 1598 if (layoutState.isFullLayout() || o->selfNeedsLayout()) |
1608 dirtyLineBoxesForObject(o, layoutState.isFullLayout()); | 1599 dirtyLineBoxesForObject(o, layoutState.isFullLayout()); |
1609 o->clearNeedsLayout(); | 1600 o->clearNeedsLayout(); |
1610 } | 1601 } |
1611 | 1602 |
1612 if (isInlineWithOutlineAndContinuation(*o)) | 1603 if (isInlineWithOutlineAndContinuation(*o)) |
1613 setContainsInlineWithOutlineAndContinuation(true); | 1604 setContainsInlineWithOutlineAndContinuation(true); |
1614 } | 1605 } |
1615 | 1606 |
1616 for (size_t i = 0; i < replacedChildren.size(); i++) | |
1617 replacedChildren[i]->layoutIfNeeded(); | |
1618 | |
1619 layoutRunsAndFloats(layoutState); | 1607 layoutRunsAndFloats(layoutState); |
1620 } | 1608 } |
1621 | 1609 |
1622 // Expand the last line to accommodate Ruby and emphasis marks. | 1610 // Expand the last line to accommodate Ruby and emphasis marks. |
1623 int lastLineAnnotationsAdjustment = 0; | 1611 int lastLineAnnotationsAdjustment = 0; |
1624 if (lastRootBox()) { | 1612 if (lastRootBox()) { |
1625 LayoutUnit lowestAllowedPosition = std::max(lastRootBox()->lineBottom(),
logicalHeight() + paddingAfter()); | 1613 LayoutUnit lowestAllowedPosition = std::max(lastRootBox()->lineBottom(),
logicalHeight() + paddingAfter()); |
1626 if (!style()->isFlippedLinesWritingMode()) | 1614 if (!style()->isFlippedLinesWritingMode()) |
1627 lastLineAnnotationsAdjustment = lastRootBox()->computeUnderAnnotatio
nAdjustment(lowestAllowedPosition); | 1615 lastLineAnnotationsAdjustment = lastRootBox()->computeUnderAnnotatio
nAdjustment(lowestAllowedPosition); |
1628 else | 1616 else |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2070 if (!line || !line->isFirstLineStyle()) | 2058 if (!line || !line->isFirstLineStyle()) |
2071 return reason; | 2059 return reason; |
2072 // It's the RootInlineBox that paints the ::first-line background. Note that
since it may be | 2060 // It's the RootInlineBox that paints the ::first-line background. Note that
since it may be |
2073 // expensive to figure out if the first line is affected by any ::first-line
selectors at all, | 2061 // expensive to figure out if the first line is affected by any ::first-line
selectors at all, |
2074 // we just invalidate it unconditionally, since that's typically cheaper. | 2062 // we just invalidate it unconditionally, since that's typically cheaper. |
2075 invalidateDisplayItemClient(*line); | 2063 invalidateDisplayItemClient(*line); |
2076 return reason; | 2064 return reason; |
2077 } | 2065 } |
2078 | 2066 |
2079 } // namespace blink | 2067 } // namespace blink |
OLD | NEW |