| 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 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1035 } | 1035 } |
| 1036 } | 1036 } |
| 1037 | 1037 |
| 1038 void LayoutBlockFlow::markDirtyFloatsForPaintInvalidation(Vector<FloatWithRect>&
floats) | 1038 void LayoutBlockFlow::markDirtyFloatsForPaintInvalidation(Vector<FloatWithRect>&
floats) |
| 1039 { | 1039 { |
| 1040 size_t floatCount = floats.size(); | 1040 size_t floatCount = floats.size(); |
| 1041 // Floats that did not have layout did not paint invalidations when we laid
them out. They would have | 1041 // Floats that did not have layout did not paint invalidations when we laid
them out. They would have |
| 1042 // painted by now if they had moved, but if they stayed at (0, 0), they stil
l need to be | 1042 // painted by now if they had moved, but if they stayed at (0, 0), they stil
l need to be |
| 1043 // painted. | 1043 // painted. |
| 1044 for (size_t i = 0; i < floatCount; ++i) { | 1044 for (size_t i = 0; i < floatCount; ++i) { |
| 1045 LayoutBox* f = floats[i].object; |
| 1045 if (!floats[i].everHadLayout) { | 1046 if (!floats[i].everHadLayout) { |
| 1046 LayoutBox* f = floats[i].object; | |
| 1047 if (!f->location().x() && !f->location().y()) | 1047 if (!f->location().x() && !f->location().y()) |
| 1048 f->setShouldDoFullPaintInvalidation(); | 1048 f->setShouldDoFullPaintInvalidation(); |
| 1049 } | 1049 } |
| 1050 insertFloatingObject(*f); |
| 1050 } | 1051 } |
| 1052 positionNewFloats(); |
| 1051 } | 1053 } |
| 1052 | 1054 |
| 1053 struct InlineMinMaxIterator { | 1055 struct InlineMinMaxIterator { |
| 1054 /* InlineMinMaxIterator is a class that will iterate over all layout objects tha
t contribute to | 1056 /* InlineMinMaxIterator is a class that will iterate over all layout objects tha
t contribute to |
| 1055 inline min/max width calculations. Note the following about the way it walks
: | 1057 inline min/max width calculations. Note the following about the way it walks
: |
| 1056 (1) Positioned content is skipped (since it does not contribute to min/max wi
dth of a block) | 1058 (1) Positioned content is skipped (since it does not contribute to min/max wi
dth of a block) |
| 1057 (2) We do not drill into the children of floats or replaced elements, since y
ou can't break | 1059 (2) We do not drill into the children of floats or replaced elements, since y
ou can't break |
| 1058 in the middle of such an element. | 1060 in the middle of such an element. |
| 1059 (3) Inline flows (e.g., <a>, <span>, <i>) are walked twice, since each side c
an have | 1061 (3) Inline flows (e.g., <a>, <span>, <i>) are walked twice, since each side c
an have |
| 1060 distinct borders/margin/padding that contribute to the min/max width. | 1062 distinct borders/margin/padding that contribute to the min/max width. |
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1523 if (hasTextOverflow) | 1525 if (hasTextOverflow) |
| 1524 deleteEllipsisLineBoxes(); | 1526 deleteEllipsisLineBoxes(); |
| 1525 | 1527 |
| 1526 if (firstChild()) { | 1528 if (firstChild()) { |
| 1527 // In full layout mode, clear the line boxes of children upfront. Otherw
ise, | 1529 // In full layout mode, clear the line boxes of children upfront. Otherw
ise, |
| 1528 // siblings can run into stale root lineboxes during layout. Then layout | 1530 // siblings can run into stale root lineboxes during layout. Then layout |
| 1529 // the replaced elements later. In partial layout mode, line boxes are n
ot | 1531 // the replaced elements later. In partial layout mode, line boxes are n
ot |
| 1530 // deleted and only dirtied. In that case, we can layout the replaced | 1532 // deleted and only dirtied. In that case, we can layout the replaced |
| 1531 // elements at the same time. | 1533 // elements at the same time. |
| 1532 Vector<LayoutBox*> replacedChildren; | 1534 Vector<LayoutBox*> replacedChildren; |
| 1533 LayoutObject* lastChild = nullptr; | |
| 1534 for (InlineWalker walker(this); !walker.atEnd(); walker.advance()) { | 1535 for (InlineWalker walker(this); !walker.atEnd(); walker.advance()) { |
| 1535 LayoutObject* o = walker.current(); | 1536 LayoutObject* o = walker.current(); |
| 1536 | 1537 |
| 1537 if (!layoutState.hasInlineChild() && o->isInline()) | 1538 if (!layoutState.hasInlineChild() && o->isInline()) |
| 1538 layoutState.setHasInlineChild(true); | 1539 layoutState.setHasInlineChild(true); |
| 1539 | 1540 |
| 1540 if (o->isReplaced() || o->isFloating() || o->isOutOfFlowPositioned()
) { | 1541 if (o->isReplaced() || o->isFloating() || o->isOutOfFlowPositioned()
) { |
| 1541 LayoutBox* box = toLayoutBox(o); | 1542 LayoutBox* box = toLayoutBox(o); |
| 1542 | 1543 |
| 1543 updateBlockChildDirtyBitsBeforeLayout(relayoutChildren, *box); | 1544 updateBlockChildDirtyBitsBeforeLayout(relayoutChildren, *box); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1558 else | 1559 else |
| 1559 o->layoutIfNeeded(); | 1560 o->layoutIfNeeded(); |
| 1560 } | 1561 } |
| 1561 } else if (o->isText() || (o->isLayoutInline() && !walker.atEndOfInl
ine())) { | 1562 } else if (o->isText() || (o->isLayoutInline() && !walker.atEndOfInl
ine())) { |
| 1562 if (!o->isText()) | 1563 if (!o->isText()) |
| 1563 toLayoutInline(o)->updateAlwaysCreateLineBoxes(layoutState.i
sFullLayout()); | 1564 toLayoutInline(o)->updateAlwaysCreateLineBoxes(layoutState.i
sFullLayout()); |
| 1564 if (layoutState.isFullLayout() || o->selfNeedsLayout()) | 1565 if (layoutState.isFullLayout() || o->selfNeedsLayout()) |
| 1565 dirtyLineBoxesForObject(o, layoutState.isFullLayout()); | 1566 dirtyLineBoxesForObject(o, layoutState.isFullLayout()); |
| 1566 o->clearNeedsLayout(); | 1567 o->clearNeedsLayout(); |
| 1567 } | 1568 } |
| 1568 if (!o->isText() || !toLayoutText(o)->isAllCollapsibleWhitespace()) | |
| 1569 lastChild = o; | |
| 1570 } | 1569 } |
| 1571 // If there is a trailing float on the line that will possibly occur aft
er a natural line break | |
| 1572 // then dirty its adjacent lineboxes to ensure it gets placed. | |
| 1573 if (lastChild && lastChild->isFloating()) | |
| 1574 dirtyLinesFromChangedChild(lastChild); | |
| 1575 | 1570 |
| 1576 for (size_t i = 0; i < replacedChildren.size(); i++) | 1571 for (size_t i = 0; i < replacedChildren.size(); i++) |
| 1577 replacedChildren[i]->layoutIfNeeded(); | 1572 replacedChildren[i]->layoutIfNeeded(); |
| 1578 | 1573 |
| 1579 layoutRunsAndFloats(layoutState); | 1574 layoutRunsAndFloats(layoutState); |
| 1580 } | 1575 } |
| 1581 | 1576 |
| 1582 // Expand the last line to accommodate Ruby and emphasis marks. | 1577 // Expand the last line to accommodate Ruby and emphasis marks. |
| 1583 int lastLineAnnotationsAdjustment = 0; | 1578 int lastLineAnnotationsAdjustment = 0; |
| 1584 if (lastRootBox()) { | 1579 if (lastRootBox()) { |
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2018 LayoutUnit logicalLeft = logicalLeftOffsetForLine(logicalHeight(), false); | 2013 LayoutUnit logicalLeft = logicalLeftOffsetForLine(logicalHeight(), false); |
| 2019 LayoutUnit availableLogicalWidth = logicalRightOffsetForLine(logicalHeight()
, false) - logicalLeft; | 2014 LayoutUnit availableLogicalWidth = logicalRightOffsetForLine(logicalHeight()
, false) - logicalLeft; |
| 2020 updateLogicalWidthForAlignment(textAlign, 0, 0, logicalLeft, totalLogicalWid
th, availableLogicalWidth, 0); | 2015 updateLogicalWidthForAlignment(textAlign, 0, 0, logicalLeft, totalLogicalWid
th, availableLogicalWidth, 0); |
| 2021 | 2016 |
| 2022 if (!style()->isLeftToRightDirection()) | 2017 if (!style()->isLeftToRightDirection()) |
| 2023 return logicalWidth() - logicalLeft; | 2018 return logicalWidth() - logicalLeft; |
| 2024 return logicalLeft; | 2019 return logicalLeft; |
| 2025 } | 2020 } |
| 2026 | 2021 |
| 2027 } | 2022 } |
| OLD | NEW |