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 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 if (r->m_object->isText()) | 213 if (r->m_object->isText()) |
214 box = createInlineBoxForText(*r, isOnlyRun); | 214 box = createInlineBoxForText(*r, isOnlyRun); |
215 else | 215 else |
216 box = createInlineBoxForRenderer(r->m_object, false, isOnlyRun); | 216 box = createInlineBoxForRenderer(r->m_object, false, isOnlyRun); |
217 r->m_box = box; | 217 r->m_box = box; |
218 | 218 |
219 ASSERT(box); | 219 ASSERT(box); |
220 if (!box) | 220 if (!box) |
221 continue; | 221 continue; |
222 | 222 |
223 if (!rootHasSelectedChildren && box->renderer().selectionState() != Layo
utObject::SelectionNone) | 223 if (!rootHasSelectedChildren && box->layoutObject().selectionState() !=
LayoutObject::SelectionNone) |
224 rootHasSelectedChildren = true; | 224 rootHasSelectedChildren = true; |
225 | 225 |
226 // If we have no parent box yet, or if the run is not simply a sibling, | 226 // If we have no parent box yet, or if the run is not simply a sibling, |
227 // then we need to construct inline boxes as necessary to properly enclo
se the | 227 // then we need to construct inline boxes as necessary to properly enclo
se the |
228 // run's inline box. Segments can only be siblings at the root level, as | 228 // run's inline box. Segments can only be siblings at the root level, as |
229 // they are positioned separately. | 229 // they are positioned separately. |
230 if (!parentBox || parentBox->renderer() != r->m_object->parent()) { | 230 if (!parentBox || parentBox->layoutObject() != r->m_object->parent()) { |
231 // Create new inline boxes all the way back to the appropriate inser
tion point. | 231 // Create new inline boxes all the way back to the appropriate inser
tion point. |
232 parentBox = createLineBoxes(r->m_object->parent(), lineInfo, box); | 232 parentBox = createLineBoxes(r->m_object->parent(), lineInfo, box); |
233 } else { | 233 } else { |
234 // Append the inline box to this line. | 234 // Append the inline box to this line. |
235 parentBox->addToLine(box); | 235 parentBox->addToLine(box); |
236 } | 236 } |
237 | 237 |
238 box->setBidiLevel(r->level()); | 238 box->setBidiLevel(r->level()); |
239 | 239 |
240 if (box->isInlineTextBox()) { | 240 if (box->isInlineTextBox()) { |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 expansionOpportunityCount -= opportunitiesInRun; | 483 expansionOpportunityCount -= opportunitiesInRun; |
484 if (!expansionOpportunityCount) | 484 if (!expansionOpportunityCount) |
485 break; | 485 break; |
486 } | 486 } |
487 } | 487 } |
488 } | 488 } |
489 | 489 |
490 void LayoutBlockFlow::updateLogicalWidthForAlignment(const ETextAlign& textAlign
, const RootInlineBox* rootInlineBox, BidiRun* trailingSpaceRun, float& logicalL
eft, float& totalLogicalWidth, float& availableLogicalWidth, unsigned expansionO
pportunityCount) | 490 void LayoutBlockFlow::updateLogicalWidthForAlignment(const ETextAlign& textAlign
, const RootInlineBox* rootInlineBox, BidiRun* trailingSpaceRun, float& logicalL
eft, float& totalLogicalWidth, float& availableLogicalWidth, unsigned expansionO
pportunityCount) |
491 { | 491 { |
492 TextDirection direction; | 492 TextDirection direction; |
493 if (rootInlineBox && rootInlineBox->renderer().style()->unicodeBidi() == Pla
intext) | 493 if (rootInlineBox && rootInlineBox->layoutObject().style()->unicodeBidi() ==
Plaintext) |
494 direction = rootInlineBox->direction(); | 494 direction = rootInlineBox->direction(); |
495 else | 495 else |
496 direction = style()->direction(); | 496 direction = style()->direction(); |
497 | 497 |
498 // Armed with the total width of the line (without justification), | 498 // Armed with the total width of the line (without justification), |
499 // we now examine our text-align property in order to determine where to pos
ition the | 499 // we now examine our text-align property in order to determine where to pos
ition the |
500 // objects horizontally. The total width of the line can be increased if we
end up | 500 // objects horizontally. The total width of the line can be increased if we
end up |
501 // justifying text. | 501 // justifying text. |
502 switch (textAlign) { | 502 switch (textAlign) { |
503 case LEFT: | 503 case LEFT: |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
667 toLayoutText(r->m_object)->positionLineBox(r->m_box); | 667 toLayoutText(r->m_object)->positionLineBox(r->m_box); |
668 else if (r->m_object->isBox()) | 668 else if (r->m_object->isBox()) |
669 toLayoutBox(r->m_object)->positionLineBox(r->m_box); | 669 toLayoutBox(r->m_object)->positionLineBox(r->m_box); |
670 } | 670 } |
671 } | 671 } |
672 | 672 |
673 void LayoutBlockFlow::appendFloatingObjectToLastLine(FloatingObject* floatingObj
ect) | 673 void LayoutBlockFlow::appendFloatingObjectToLastLine(FloatingObject* floatingObj
ect) |
674 { | 674 { |
675 ASSERT(!floatingObject->originatingLine()); | 675 ASSERT(!floatingObject->originatingLine()); |
676 floatingObject->setOriginatingLine(lastRootBox()); | 676 floatingObject->setOriginatingLine(lastRootBox()); |
677 lastRootBox()->appendFloat(floatingObject->renderer()); | 677 lastRootBox()->appendFloat(floatingObject->layoutObject()); |
678 } | 678 } |
679 | 679 |
680 // This function constructs line boxes for all of the text runs in the resolver
and computes their position. | 680 // This function constructs line boxes for all of the text runs in the resolver
and computes their position. |
681 RootInlineBox* LayoutBlockFlow::createLineBoxesFromBidiRuns(unsigned bidiLevel,
BidiRunList<BidiRun>& bidiRuns, const InlineIterator& end, LineInfo& lineInfo, V
erticalPositionCache& verticalPositionCache, BidiRun* trailingSpaceRun, WordMeas
urements& wordMeasurements) | 681 RootInlineBox* LayoutBlockFlow::createLineBoxesFromBidiRuns(unsigned bidiLevel,
BidiRunList<BidiRun>& bidiRuns, const InlineIterator& end, LineInfo& lineInfo, V
erticalPositionCache& verticalPositionCache, BidiRun* trailingSpaceRun, WordMeas
urements& wordMeasurements) |
682 { | 682 { |
683 if (!bidiRuns.runCount()) | 683 if (!bidiRuns.runCount()) |
684 return 0; | 684 return 0; |
685 | 685 |
686 // FIXME: Why is this only done when we had runs? | 686 // FIXME: Why is this only done when we had runs? |
687 lineInfo.setLastLine(!end.object()); | 687 lineInfo.setLastLine(!end.object()); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 if (!layoutState.usesPaintInvalidationBounds()) | 753 if (!layoutState.usesPaintInvalidationBounds()) |
754 layoutState.setPaintInvalidationRange(logicalHeight()); | 754 layoutState.setPaintInvalidationRange(logicalHeight()); |
755 deleteLineRange(layoutState, startLine); | 755 deleteLineRange(layoutState, startLine); |
756 } | 756 } |
757 | 757 |
758 if (!layoutState.isFullLayout() && lastRootBox() && lastRootBox()->endsWithB
reak()) { | 758 if (!layoutState.isFullLayout() && lastRootBox() && lastRootBox()->endsWithB
reak()) { |
759 // If the last line before the start line ends with a line break that cl
ear floats, | 759 // If the last line before the start line ends with a line break that cl
ear floats, |
760 // adjust the height accordingly. | 760 // adjust the height accordingly. |
761 // A line break can be either the first or the last object on a line, de
pending on its direction. | 761 // A line break can be either the first or the last object on a line, de
pending on its direction. |
762 if (InlineBox* lastLeafChild = lastRootBox()->lastLeafChild()) { | 762 if (InlineBox* lastLeafChild = lastRootBox()->lastLeafChild()) { |
763 LayoutObject* lastObject = &lastLeafChild->renderer(); | 763 LayoutObject* lastObject = &lastLeafChild->layoutObject(); |
764 if (!lastObject->isBR()) | 764 if (!lastObject->isBR()) |
765 lastObject = &lastRootBox()->firstLeafChild()->renderer(); | 765 lastObject = &lastRootBox()->firstLeafChild()->layoutObject(); |
766 if (lastObject->isBR()) { | 766 if (lastObject->isBR()) { |
767 EClear clear = lastObject->style()->clear(); | 767 EClear clear = lastObject->style()->clear(); |
768 if (clear != CNONE) | 768 if (clear != CNONE) |
769 clearFloats(clear); | 769 clearFloats(clear); |
770 } | 770 } |
771 } | 771 } |
772 } | 772 } |
773 | 773 |
774 layoutRunsAndFloatsInRange(layoutState, resolver, cleanLineStart, cleanLineB
idiStatus); | 774 layoutRunsAndFloatsInRange(layoutState, resolver, cleanLineStart, cleanLineB
idiStatus); |
775 linkToEndLineIfNeeded(layoutState); | 775 linkToEndLineIfNeeded(layoutState); |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
908 FloatingObjectSetIterator end = floatingObjectSet.end(); | 908 FloatingObjectSetIterator end = floatingObjectSet.end(); |
909 if (layoutState.lastFloat()) { | 909 if (layoutState.lastFloat()) { |
910 FloatingObjectSetIterator lastFloatIterator = floatingObject
Set.find(layoutState.lastFloat()); | 910 FloatingObjectSetIterator lastFloatIterator = floatingObject
Set.find(layoutState.lastFloat()); |
911 ASSERT(lastFloatIterator != end); | 911 ASSERT(lastFloatIterator != end); |
912 ++lastFloatIterator; | 912 ++lastFloatIterator; |
913 it = lastFloatIterator; | 913 it = lastFloatIterator; |
914 } | 914 } |
915 for (; it != end; ++it) { | 915 for (; it != end; ++it) { |
916 FloatingObject* f = it->get(); | 916 FloatingObject* f = it->get(); |
917 appendFloatingObjectToLastLine(f); | 917 appendFloatingObjectToLastLine(f); |
918 ASSERT(f->renderer() == layoutState.floats()[layoutState.flo
atIndex()].object); | 918 ASSERT(f->layoutObject() == layoutState.floats()[layoutState
.floatIndex()].object); |
919 // If a float's geometry has changed, give up on syncing wit
h clean lines. | 919 // If a float's geometry has changed, give up on syncing wit
h clean lines. |
920 if (layoutState.floats()[layoutState.floatIndex()].rect != f
->frameRect()) | 920 if (layoutState.floats()[layoutState.floatIndex()].rect != f
->frameRect()) |
921 checkForEndLineMatch = false; | 921 checkForEndLineMatch = false; |
922 layoutState.setFloatIndex(layoutState.floatIndex() + 1); | 922 layoutState.setFloatIndex(layoutState.floatIndex() + 1); |
923 } | 923 } |
924 layoutState.setLastFloat(!floatingObjectSet.isEmpty() ? floating
ObjectSet.last().get() : 0); | 924 layoutState.setLastFloat(!floatingObjectSet.isEmpty() ? floating
ObjectSet.last().get() : 0); |
925 } | 925 } |
926 } | 926 } |
927 | 927 |
928 lineMidpointState.reset(); | 928 lineMidpointState.reset(); |
(...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2013 FloatingObjectSetIterator it = floatingObjectSet.end(); | 2013 FloatingObjectSetIterator it = floatingObjectSet.end(); |
2014 --it; // Last float is newFloat, skip that one. | 2014 --it; // Last float is newFloat, skip that one. |
2015 FloatingObjectSetIterator begin = floatingObjectSet.begin(); | 2015 FloatingObjectSetIterator begin = floatingObjectSet.begin(); |
2016 while (it != begin) { | 2016 while (it != begin) { |
2017 --it; | 2017 --it; |
2018 FloatingObject* floatingObject = it->get(); | 2018 FloatingObject* floatingObject = it->get(); |
2019 if (floatingObject == lastFloatFromPreviousLine) | 2019 if (floatingObject == lastFloatFromPreviousLine) |
2020 break; | 2020 break; |
2021 if (logicalTopForFloat(floatingObject) == logicalHeight() + lineInfo.flo
atPaginationStrut()) { | 2021 if (logicalTopForFloat(floatingObject) == logicalHeight() + lineInfo.flo
atPaginationStrut()) { |
2022 floatingObject->setPaginationStrut(paginationStrut + floatingObject-
>paginationStrut()); | 2022 floatingObject->setPaginationStrut(paginationStrut + floatingObject-
>paginationStrut()); |
2023 LayoutBox* floatBox = floatingObject->renderer(); | 2023 LayoutBox* floatBox = floatingObject->layoutObject(); |
2024 setLogicalTopForChild(*floatBox, logicalTopForChild(*floatBox) + mar
ginBeforeForChild(*floatBox) + paginationStrut); | 2024 setLogicalTopForChild(*floatBox, logicalTopForChild(*floatBox) + mar
ginBeforeForChild(*floatBox) + paginationStrut); |
2025 if (floatBox->isLayoutBlock()) | 2025 if (floatBox->isLayoutBlock()) |
2026 floatBox->forceChildLayout(); | 2026 floatBox->forceChildLayout(); |
2027 else | 2027 else |
2028 floatBox->layoutIfNeeded(); | 2028 floatBox->layoutIfNeeded(); |
2029 // Save the old logical top before calling removePlacedObject which
will set | 2029 // Save the old logical top before calling removePlacedObject which
will set |
2030 // isPlaced to false. Otherwise it will trigger an assert in logical
TopForFloat. | 2030 // isPlaced to false. Otherwise it will trigger an assert in logical
TopForFloat. |
2031 LayoutUnit oldLogicalTop = logicalTopForFloat(floatingObject); | 2031 LayoutUnit oldLogicalTop = logicalTopForFloat(floatingObject); |
2032 m_floatingObjects->removePlacedObject(floatingObject); | 2032 m_floatingObjects->removePlacedObject(floatingObject); |
2033 setLogicalTopForFloat(floatingObject, oldLogicalTop + paginationStru
t); | 2033 setLogicalTopForFloat(floatingObject, oldLogicalTop + paginationStru
t); |
(...skipping 19 matching lines...) Expand all Loading... |
2053 float logicalLeft = logicalLeftOffsetForLine(logicalHeight(), false).toFloat
(); | 2053 float logicalLeft = logicalLeftOffsetForLine(logicalHeight(), false).toFloat
(); |
2054 float availableLogicalWidth = logicalRightOffsetForLine(logicalHeight(), fal
se) - logicalLeft; | 2054 float availableLogicalWidth = logicalRightOffsetForLine(logicalHeight(), fal
se) - logicalLeft; |
2055 updateLogicalWidthForAlignment(textAlign, 0, 0, logicalLeft, totalLogicalWid
th, availableLogicalWidth, 0); | 2055 updateLogicalWidthForAlignment(textAlign, 0, 0, logicalLeft, totalLogicalWid
th, availableLogicalWidth, 0); |
2056 | 2056 |
2057 if (!style()->isLeftToRightDirection()) | 2057 if (!style()->isLeftToRightDirection()) |
2058 return logicalWidth() - logicalLeft; | 2058 return logicalWidth() - logicalLeft; |
2059 return logicalLeft; | 2059 return logicalLeft; |
2060 } | 2060 } |
2061 | 2061 |
2062 } | 2062 } |
OLD | NEW |