Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Side by Side Diff: Source/core/rendering/RenderBlockLineLayout.cpp

Issue 926193003: Move rendering/RenderBox to layout/LayoutBox. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/rendering/RenderBlockFlow.cpp ('k') | Source/core/rendering/RenderBox.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 54
55 static inline InlineBox* createInlineBoxForRenderer(LayoutObject* obj, bool isRo otLineBox, bool isOnlyRun = false) 55 static inline InlineBox* createInlineBoxForRenderer(LayoutObject* obj, bool isRo otLineBox, bool isOnlyRun = false)
56 { 56 {
57 // Callers should handle text themselves. 57 // Callers should handle text themselves.
58 ASSERT(!obj->isText()); 58 ASSERT(!obj->isText());
59 59
60 if (isRootLineBox) 60 if (isRootLineBox)
61 return toRenderBlockFlow(obj)->createAndAppendRootInlineBox(); 61 return toRenderBlockFlow(obj)->createAndAppendRootInlineBox();
62 62
63 if (obj->isBox()) 63 if (obj->isBox())
64 return toRenderBox(obj)->createInlineBox(); 64 return toLayoutBox(obj)->createInlineBox();
65 65
66 return toRenderInline(obj)->createAndAppendInlineFlowBox(); 66 return toRenderInline(obj)->createAndAppendInlineFlowBox();
67 } 67 }
68 68
69 static inline InlineTextBox* createInlineBoxForText(BidiRun& run, bool isOnlyRun ) 69 static inline InlineTextBox* createInlineBoxForText(BidiRun& run, bool isOnlyRun )
70 { 70 {
71 ASSERT(run.m_object->isText()); 71 ASSERT(run.m_object->isText());
72 RenderText* text = toRenderText(run.m_object); 72 RenderText* text = toRenderText(run.m_object);
73 InlineTextBox* textBox = text->createInlineTextBox(run.m_start, run.m_stop - run.m_start); 73 InlineTextBox* textBox = text->createInlineTextBox(run.m_start, run.m_stop - run.m_start);
74 // We only treat a box as text for a <br> if we are on a line by ourself or in strict mode 74 // We only treat a box as text for a <br> if we are on a line by ourself or in strict mode
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 bool isFirstLine = lineInfo.isFirstLine() && !(isAnonymousBlock() && parent( )->slowFirstChild() != this); 556 bool isFirstLine = lineInfo.isFirstLine() && !(isAnonymousBlock() && parent( )->slowFirstChild() != this);
557 bool isAfterHardLineBreak = lineBox->prevRootBox() && lineBox->prevRootBox() ->endsWithBreak(); 557 bool isAfterHardLineBreak = lineBox->prevRootBox() && lineBox->prevRootBox() ->endsWithBreak();
558 IndentTextOrNot shouldIndentText = requiresIndent(isFirstLine, isAfterHardLi neBreak, styleRef()); 558 IndentTextOrNot shouldIndentText = requiresIndent(isFirstLine, isAfterHardLi neBreak, styleRef());
559 float lineLogicalLeft; 559 float lineLogicalLeft;
560 float lineLogicalRight; 560 float lineLogicalRight;
561 float availableLogicalWidth; 561 float availableLogicalWidth;
562 updateLogicalInlinePositions(this, lineLogicalLeft, lineLogicalRight, availa bleLogicalWidth, isFirstLine, shouldIndentText, 0); 562 updateLogicalInlinePositions(this, lineLogicalLeft, lineLogicalRight, availa bleLogicalWidth, isFirstLine, shouldIndentText, 0);
563 bool needsWordSpacing; 563 bool needsWordSpacing;
564 564
565 if (firstRun && firstRun->m_object->isReplaced()) { 565 if (firstRun && firstRun->m_object->isReplaced()) {
566 RenderBox* renderBox = toRenderBox(firstRun->m_object); 566 LayoutBox* layoutBox = toLayoutBox(firstRun->m_object);
567 updateLogicalInlinePositions(this, lineLogicalLeft, lineLogicalRight, av ailableLogicalWidth, isFirstLine, shouldIndentText, renderBox->logicalHeight()); 567 updateLogicalInlinePositions(this, lineLogicalLeft, lineLogicalRight, av ailableLogicalWidth, isFirstLine, shouldIndentText, layoutBox->logicalHeight());
568 } 568 }
569 569
570 computeInlineDirectionPositionsForSegment(lineBox, lineInfo, textAlign, line LogicalLeft, availableLogicalWidth, firstRun, trailingSpaceRun, textBoxDataMap, verticalPositionCache, wordMeasurements); 570 computeInlineDirectionPositionsForSegment(lineBox, lineInfo, textAlign, line LogicalLeft, availableLogicalWidth, firstRun, trailingSpaceRun, textBoxDataMap, verticalPositionCache, wordMeasurements);
571 // The widths of all runs are now known. We can now place every inline box ( and 571 // The widths of all runs are now known. We can now place every inline box ( and
572 // compute accurate widths for the inline flow boxes). 572 // compute accurate widths for the inline flow boxes).
573 needsWordSpacing = lineBox->isLeftToRightDirection() ? false: true; 573 needsWordSpacing = lineBox->isLeftToRightDirection() ? false: true;
574 lineBox->placeBoxesInInlineDirection(lineLogicalLeft, needsWordSpacing); 574 lineBox->placeBoxesInInlineDirection(lineLogicalLeft, needsWordSpacing);
575 } 575 }
576 576
577 BidiRun* RenderBlockFlow::computeInlineDirectionPositionsForSegment(RootInlineBo x* lineBox, const LineInfo& lineInfo, ETextAlign textAlign, float& logicalLeft, 577 BidiRun* RenderBlockFlow::computeInlineDirectionPositionsForSegment(RootInlineBo x* lineBox, const LineInfo& lineInfo, ETextAlign textAlign, float& logicalLeft,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 if (rt->textLength()) { 609 if (rt->textLength()) {
610 if (!r->m_start && needsWordSpacing && isSpaceOrNewline(rt->char acterAt(r->m_start))) 610 if (!r->m_start && needsWordSpacing && isSpaceOrNewline(rt->char acterAt(r->m_start)))
611 totalLogicalWidth += rt->style(lineInfo.isFirstLine())->font ().fontDescription().wordSpacing(); 611 totalLogicalWidth += rt->style(lineInfo.isFirstLine())->font ().fontDescription().wordSpacing();
612 needsWordSpacing = !isSpaceOrNewline(rt->characterAt(r->m_stop - 1)); 612 needsWordSpacing = !isSpaceOrNewline(rt->characterAt(r->m_stop - 1));
613 } 613 }
614 614
615 setLogicalWidthForTextRun(lineBox, r, rt, totalLogicalWidth, lineInf o, textBoxDataMap, verticalPositionCache, wordMeasurements); 615 setLogicalWidthForTextRun(lineBox, r, rt, totalLogicalWidth, lineInf o, textBoxDataMap, verticalPositionCache, wordMeasurements);
616 } else { 616 } else {
617 isAfterExpansion = false; 617 isAfterExpansion = false;
618 if (!r->m_object->isRenderInline()) { 618 if (!r->m_object->isRenderInline()) {
619 RenderBox* renderBox = toRenderBox(r->m_object); 619 LayoutBox* layoutBox = toLayoutBox(r->m_object);
620 if (renderBox->isRubyRun()) 620 if (layoutBox->isRubyRun())
621 setMarginsForRubyRun(r, toLayoutRubyRun(renderBox), previous Object, lineInfo); 621 setMarginsForRubyRun(r, toLayoutRubyRun(layoutBox), previous Object, lineInfo);
622 r->m_box->setLogicalWidth(logicalWidthForChild(*renderBox).toFlo at()); 622 r->m_box->setLogicalWidth(logicalWidthForChild(*layoutBox).toFlo at());
623 totalLogicalWidth += marginStartForChild(*renderBox) + marginEnd ForChild(*renderBox); 623 totalLogicalWidth += marginStartForChild(*layoutBox) + marginEnd ForChild(*layoutBox);
624 needsWordSpacing = true; 624 needsWordSpacing = true;
625 } 625 }
626 } 626 }
627 627
628 totalLogicalWidth += r->m_box->logicalWidth(); 628 totalLogicalWidth += r->m_box->logicalWidth();
629 previousObject = r->m_object; 629 previousObject = r->m_object;
630 } 630 }
631 631
632 if (isAfterExpansion && !expansionOpportunities.isEmpty()) { 632 if (isAfterExpansion && !expansionOpportunities.isEmpty()) {
633 expansionOpportunities.last()--; 633 expansionOpportunities.last()--;
(...skipping 21 matching lines...) Expand all
655 // Align positioned boxes with the top of the line box. This is 655 // Align positioned boxes with the top of the line box. This is
656 // a reasonable approximation of an appropriate y position. 656 // a reasonable approximation of an appropriate y position.
657 if (r->m_object->isOutOfFlowPositioned()) 657 if (r->m_object->isOutOfFlowPositioned())
658 r->m_box->setLogicalTop(logicalHeight().toFloat()); 658 r->m_box->setLogicalTop(logicalHeight().toFloat());
659 659
660 // Position is used to properly position both replaced elements and 660 // Position is used to properly position both replaced elements and
661 // to update the static normal flow x/y of positioned elements. 661 // to update the static normal flow x/y of positioned elements.
662 if (r->m_object->isText()) 662 if (r->m_object->isText())
663 toRenderText(r->m_object)->positionLineBox(r->m_box); 663 toRenderText(r->m_object)->positionLineBox(r->m_box);
664 else if (r->m_object->isBox()) 664 else if (r->m_object->isBox())
665 toRenderBox(r->m_object)->positionLineBox(r->m_box); 665 toLayoutBox(r->m_object)->positionLineBox(r->m_box);
666 } 666 }
667 } 667 }
668 668
669 void RenderBlockFlow::appendFloatingObjectToLastLine(FloatingObject* floatingObj ect) 669 void RenderBlockFlow::appendFloatingObjectToLastLine(FloatingObject* floatingObj ect)
670 { 670 {
671 ASSERT(!floatingObject->originatingLine()); 671 ASSERT(!floatingObject->originatingLine());
672 floatingObject->setOriginatingLine(lastRootBox()); 672 floatingObject->setOriginatingLine(lastRootBox());
673 lastRootBox()->appendFloat(floatingObject->renderer()); 673 lastRootBox()->appendFloat(floatingObject->renderer());
674 } 674 }
675 675
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 for (RootInlineBox* line = layoutState.endLine(); line; line = line- >nextRootBox()) { 998 for (RootInlineBox* line = layoutState.endLine(); line; line = line- >nextRootBox()) {
999 line->attachLine(); 999 line->attachLine();
1000 if (paginated) { 1000 if (paginated) {
1001 delta -= line->paginationStrut(); 1001 delta -= line->paginationStrut();
1002 adjustLinePositionForPagination(*line, delta, layoutState.fl owThread()); 1002 adjustLinePositionForPagination(*line, delta, layoutState.fl owThread());
1003 } 1003 }
1004 if (delta) { 1004 if (delta) {
1005 layoutState.updatePaintInvalidationRangeFromBox(line, delta) ; 1005 layoutState.updatePaintInvalidationRangeFromBox(line, delta) ;
1006 line->adjustBlockDirectionPosition(delta.toFloat()); 1006 line->adjustBlockDirectionPosition(delta.toFloat());
1007 } 1007 }
1008 if (Vector<RenderBox*>* cleanLineFloats = line->floatsPtr()) { 1008 if (Vector<LayoutBox*>* cleanLineFloats = line->floatsPtr()) {
1009 Vector<RenderBox*>::iterator end = cleanLineFloats->end(); 1009 Vector<LayoutBox*>::iterator end = cleanLineFloats->end();
1010 for (Vector<RenderBox*>::iterator f = cleanLineFloats->begin (); f != end; ++f) { 1010 for (Vector<LayoutBox*>::iterator f = cleanLineFloats->begin (); f != end; ++f) {
1011 FloatingObject* floatingObject = insertFloatingObject(** f); 1011 FloatingObject* floatingObject = insertFloatingObject(** f);
1012 ASSERT(!floatingObject->originatingLine()); 1012 ASSERT(!floatingObject->originatingLine());
1013 floatingObject->setOriginatingLine(line); 1013 floatingObject->setOriginatingLine(line);
1014 setLogicalHeight(logicalTopForChild(**f) - marginBeforeF orChild(**f) + delta); 1014 setLogicalHeight(logicalTopForChild(**f) - marginBeforeF orChild(**f) + delta);
1015 positionNewFloats(); 1015 positionNewFloats();
1016 } 1016 }
1017 } 1017 }
1018 } 1018 }
1019 setLogicalHeight(lastRootBox()->lineBottomWithLeading()); 1019 setLogicalHeight(lastRootBox()->lineBottomWithLeading());
1020 } else { 1020 } else {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1063 } 1063 }
1064 1064
1065 void RenderBlockFlow::markDirtyFloatsForPaintInvalidation(Vector<FloatWithRect>& floats) 1065 void RenderBlockFlow::markDirtyFloatsForPaintInvalidation(Vector<FloatWithRect>& floats)
1066 { 1066 {
1067 size_t floatCount = floats.size(); 1067 size_t floatCount = floats.size();
1068 // Floats that did not have layout did not paint invalidations when we laid them out. They would have 1068 // Floats that did not have layout did not paint invalidations when we laid them out. They would have
1069 // painted by now if they had moved, but if they stayed at (0, 0), they stil l need to be 1069 // painted by now if they had moved, but if they stayed at (0, 0), they stil l need to be
1070 // painted. 1070 // painted.
1071 for (size_t i = 0; i < floatCount; ++i) { 1071 for (size_t i = 0; i < floatCount; ++i) {
1072 if (!floats[i].everHadLayout) { 1072 if (!floats[i].everHadLayout) {
1073 RenderBox* f = floats[i].object; 1073 LayoutBox* f = floats[i].object;
1074 if (!f->location().x() && !f->location().y()) 1074 if (!f->location().x() && !f->location().y())
1075 f->setShouldDoFullPaintInvalidation(); 1075 f->setShouldDoFullPaintInvalidation();
1076 } 1076 }
1077 } 1077 }
1078 } 1078 }
1079 1079
1080 struct InlineMinMaxIterator { 1080 struct InlineMinMaxIterator {
1081 /* InlineMinMaxIterator is a class that will iterate over all render objects tha t contribute to 1081 /* InlineMinMaxIterator is a class that will iterate over all render objects tha t contribute to
1082 inline min/max width calculations. Note the following about the way it walks : 1082 inline min/max width calculations. Note the following about the way it walks :
1083 (1) Positioned content is skipped (since it does not contribute to min/max wi dth of a block) 1083 (1) Positioned content is skipped (since it does not contribute to min/max wi dth of a block)
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1309 childMax += margins; 1309 childMax += margins;
1310 } 1310 }
1311 } 1311 }
1312 1312
1313 if (!child->isRenderInline() && !child->isText()) { 1313 if (!child->isRenderInline() && !child->isText()) {
1314 // Case (2). Inline replaced elements and floats. 1314 // Case (2). Inline replaced elements and floats.
1315 // Go ahead and terminate the current line as far as 1315 // Go ahead and terminate the current line as far as
1316 // minwidth is concerned. 1316 // minwidth is concerned.
1317 LayoutUnit childMinPreferredLogicalWidth, childMaxPreferredLogic alWidth; 1317 LayoutUnit childMinPreferredLogicalWidth, childMaxPreferredLogic alWidth;
1318 if (child->isBox() && child->isHorizontalWritingMode() != isHori zontalWritingMode()) { 1318 if (child->isBox() && child->isHorizontalWritingMode() != isHori zontalWritingMode()) {
1319 RenderBox* childBox = toRenderBox(child); 1319 LayoutBox* childBox = toLayoutBox(child);
1320 LogicalExtentComputedValues computedValues; 1320 LogicalExtentComputedValues computedValues;
1321 childBox->computeLogicalHeight(childBox->borderAndPaddingLog icalHeight(), 0, computedValues); 1321 childBox->computeLogicalHeight(childBox->borderAndPaddingLog icalHeight(), 0, computedValues);
1322 childMinPreferredLogicalWidth = childMaxPreferredLogicalWidt h = computedValues.m_extent; 1322 childMinPreferredLogicalWidth = childMaxPreferredLogicalWidt h = computedValues.m_extent;
1323 } else { 1323 } else {
1324 childMinPreferredLogicalWidth = child->minPreferredLogicalWi dth(); 1324 childMinPreferredLogicalWidth = child->minPreferredLogicalWi dth();
1325 childMaxPreferredLogicalWidth = child->maxPreferredLogicalWi dth(); 1325 childMaxPreferredLogicalWidth = child->maxPreferredLogicalWi dth();
1326 } 1326 }
1327 childMin += childMinPreferredLogicalWidth; 1327 childMin += childMinPreferredLogicalWidth;
1328 childMax += childMaxPreferredLogicalWidth; 1328 childMax += childMaxPreferredLogicalWidth;
1329 1329
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1544 // Walk all the lines and delete our ellipsis line boxes if they exist. 1544 // Walk all the lines and delete our ellipsis line boxes if they exist.
1545 if (hasTextOverflow) 1545 if (hasTextOverflow)
1546 deleteEllipsisLineBoxes(); 1546 deleteEllipsisLineBoxes();
1547 1547
1548 if (firstChild()) { 1548 if (firstChild()) {
1549 // In full layout mode, clear the line boxes of children upfront. Otherw ise, 1549 // In full layout mode, clear the line boxes of children upfront. Otherw ise,
1550 // siblings can run into stale root lineboxes during layout. Then layout 1550 // siblings can run into stale root lineboxes during layout. Then layout
1551 // the replaced elements later. In partial layout mode, line boxes are n ot 1551 // the replaced elements later. In partial layout mode, line boxes are n ot
1552 // deleted and only dirtied. In that case, we can layout the replaced 1552 // deleted and only dirtied. In that case, we can layout the replaced
1553 // elements at the same time. 1553 // elements at the same time.
1554 Vector<RenderBox*> replacedChildren; 1554 Vector<LayoutBox*> replacedChildren;
1555 for (InlineWalker walker(this); !walker.atEnd(); walker.advance()) { 1555 for (InlineWalker walker(this); !walker.atEnd(); walker.advance()) {
1556 LayoutObject* o = walker.current(); 1556 LayoutObject* o = walker.current();
1557 1557
1558 if (!layoutState.hasInlineChild() && o->isInline()) 1558 if (!layoutState.hasInlineChild() && o->isInline())
1559 layoutState.setHasInlineChild(true); 1559 layoutState.setHasInlineChild(true);
1560 1560
1561 if (o->isReplaced() || o->isFloating() || o->isOutOfFlowPositioned() ) { 1561 if (o->isReplaced() || o->isFloating() || o->isOutOfFlowPositioned() ) {
1562 RenderBox* box = toRenderBox(o); 1562 LayoutBox* box = toLayoutBox(o);
1563 1563
1564 updateBlockChildDirtyBitsBeforeLayout(relayoutChildren, *box); 1564 updateBlockChildDirtyBitsBeforeLayout(relayoutChildren, *box);
1565 1565
1566 if (o->isOutOfFlowPositioned()) 1566 if (o->isOutOfFlowPositioned())
1567 o->containingBlock()->insertPositionedObject(box); 1567 o->containingBlock()->insertPositionedObject(box);
1568 else if (o->isFloating()) 1568 else if (o->isFloating())
1569 layoutState.floats().append(FloatWithRect(box)); 1569 layoutState.floats().append(FloatWithRect(box));
1570 else if (isFullLayout || o->needsLayout()) { 1570 else if (isFullLayout || o->needsLayout()) {
1571 // Replaced element. 1571 // Replaced element.
1572 box->dirtyLineBoxes(isFullLayout); 1572 box->dirtyLineBoxes(isFullLayout);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1611 if (hasTextOverflow) 1611 if (hasTextOverflow)
1612 checkLinesForTextOverflow(); 1612 checkLinesForTextOverflow();
1613 1613
1614 // Ensure the new line boxes will be painted. 1614 // Ensure the new line boxes will be painted.
1615 if (isFullLayout && firstLineBox()) 1615 if (isFullLayout && firstLineBox())
1616 setShouldDoFullPaintInvalidation(); 1616 setShouldDoFullPaintInvalidation();
1617 } 1617 }
1618 1618
1619 void RenderBlockFlow::checkFloatsInCleanLine(RootInlineBox* line, Vector<FloatWi thRect>& floats, size_t& floatIndex, bool& encounteredNewFloat, bool& dirtiedByF loat) 1619 void RenderBlockFlow::checkFloatsInCleanLine(RootInlineBox* line, Vector<FloatWi thRect>& floats, size_t& floatIndex, bool& encounteredNewFloat, bool& dirtiedByF loat)
1620 { 1620 {
1621 Vector<RenderBox*>* cleanLineFloats = line->floatsPtr(); 1621 Vector<LayoutBox*>* cleanLineFloats = line->floatsPtr();
1622 if (!cleanLineFloats) 1622 if (!cleanLineFloats)
1623 return; 1623 return;
1624 1624
1625 Vector<RenderBox*>::iterator end = cleanLineFloats->end(); 1625 Vector<LayoutBox*>::iterator end = cleanLineFloats->end();
1626 for (Vector<RenderBox*>::iterator it = cleanLineFloats->begin(); it != end; ++it) { 1626 for (Vector<LayoutBox*>::iterator it = cleanLineFloats->begin(); it != end; ++it) {
1627 RenderBox* floatingBox = *it; 1627 LayoutBox* floatingBox = *it;
1628 floatingBox->layoutIfNeeded(); 1628 floatingBox->layoutIfNeeded();
1629 LayoutSize newSize = floatingBox->size() + 1629 LayoutSize newSize = floatingBox->size() +
1630 LayoutSize(floatingBox->marginWidth(), floatingBox->marginHeight()); 1630 LayoutSize(floatingBox->marginWidth(), floatingBox->marginHeight());
1631 if (floats[floatIndex].object != floatingBox) { 1631 if (floats[floatIndex].object != floatingBox) {
1632 encounteredNewFloat = true; 1632 encounteredNewFloat = true;
1633 return; 1633 return;
1634 } 1634 }
1635 1635
1636 if (floats[floatIndex].rect.size() != newSize) { 1636 if (floats[floatIndex].rect.size() != newSize) {
1637 LayoutUnit floatTop = isHorizontalWritingMode() ? floats[floatIndex] .rect.y() : floats[floatIndex].rect.x(); 1637 LayoutUnit floatTop = isHorizontalWritingMode() ? floats[floatIndex] .rect.y() : floats[floatIndex].rect.x();
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1726 // If we have no dirty lines, then last is just the last root box. 1726 // If we have no dirty lines, then last is just the last root box.
1727 last = curr ? curr->prevRootBox() : lastRootBox(); 1727 last = curr ? curr->prevRootBox() : lastRootBox();
1728 } 1728 }
1729 1729
1730 unsigned numCleanFloats = 0; 1730 unsigned numCleanFloats = 0;
1731 if (!layoutState.floats().isEmpty()) { 1731 if (!layoutState.floats().isEmpty()) {
1732 LayoutUnit savedLogicalHeight = logicalHeight(); 1732 LayoutUnit savedLogicalHeight = logicalHeight();
1733 // Restore floats from clean lines. 1733 // Restore floats from clean lines.
1734 RootInlineBox* line = firstRootBox(); 1734 RootInlineBox* line = firstRootBox();
1735 while (line != curr) { 1735 while (line != curr) {
1736 if (Vector<RenderBox*>* cleanLineFloats = line->floatsPtr()) { 1736 if (Vector<LayoutBox*>* cleanLineFloats = line->floatsPtr()) {
1737 Vector<RenderBox*>::iterator end = cleanLineFloats->end(); 1737 Vector<LayoutBox*>::iterator end = cleanLineFloats->end();
1738 for (Vector<RenderBox*>::iterator f = cleanLineFloats->begin(); f != end; ++f) { 1738 for (Vector<LayoutBox*>::iterator f = cleanLineFloats->begin(); f != end; ++f) {
1739 FloatingObject* floatingObject = insertFloatingObject(**f); 1739 FloatingObject* floatingObject = insertFloatingObject(**f);
1740 ASSERT(!floatingObject->originatingLine()); 1740 ASSERT(!floatingObject->originatingLine());
1741 floatingObject->setOriginatingLine(line); 1741 floatingObject->setOriginatingLine(line);
1742 setLogicalHeight(logicalTopForChild(**f) - marginBeforeForCh ild(**f)); 1742 setLogicalHeight(logicalTopForChild(**f) - marginBeforeForCh ild(**f));
1743 positionNewFloats(); 1743 positionNewFloats();
1744 ASSERT(layoutState.floats()[numCleanFloats].object == *f); 1744 ASSERT(layoutState.floats()[numCleanFloats].object == *f);
1745 numCleanFloats++; 1745 numCleanFloats++;
1746 } 1746 }
1747 } 1747 }
1748 line = line->nextRootBox(); 1748 line = line->nextRootBox();
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
2008 FloatingObjectSetIterator it = floatingObjectSet.end(); 2008 FloatingObjectSetIterator it = floatingObjectSet.end();
2009 --it; // Last float is newFloat, skip that one. 2009 --it; // Last float is newFloat, skip that one.
2010 FloatingObjectSetIterator begin = floatingObjectSet.begin(); 2010 FloatingObjectSetIterator begin = floatingObjectSet.begin();
2011 while (it != begin) { 2011 while (it != begin) {
2012 --it; 2012 --it;
2013 FloatingObject* floatingObject = it->get(); 2013 FloatingObject* floatingObject = it->get();
2014 if (floatingObject == lastFloatFromPreviousLine) 2014 if (floatingObject == lastFloatFromPreviousLine)
2015 break; 2015 break;
2016 if (logicalTopForFloat(floatingObject) == logicalHeight() + lineInfo.flo atPaginationStrut()) { 2016 if (logicalTopForFloat(floatingObject) == logicalHeight() + lineInfo.flo atPaginationStrut()) {
2017 floatingObject->setPaginationStrut(paginationStrut + floatingObject- >paginationStrut()); 2017 floatingObject->setPaginationStrut(paginationStrut + floatingObject- >paginationStrut());
2018 RenderBox* floatBox = floatingObject->renderer(); 2018 LayoutBox* floatBox = floatingObject->renderer();
2019 setLogicalTopForChild(*floatBox, logicalTopForChild(*floatBox) + mar ginBeforeForChild(*floatBox) + paginationStrut); 2019 setLogicalTopForChild(*floatBox, logicalTopForChild(*floatBox) + mar ginBeforeForChild(*floatBox) + paginationStrut);
2020 if (floatBox->isRenderBlock()) 2020 if (floatBox->isRenderBlock())
2021 floatBox->forceChildLayout(); 2021 floatBox->forceChildLayout();
2022 else 2022 else
2023 floatBox->layoutIfNeeded(); 2023 floatBox->layoutIfNeeded();
2024 // Save the old logical top before calling removePlacedObject which will set 2024 // Save the old logical top before calling removePlacedObject which will set
2025 // isPlaced to false. Otherwise it will trigger an assert in logical TopForFloat. 2025 // isPlaced to false. Otherwise it will trigger an assert in logical TopForFloat.
2026 LayoutUnit oldLogicalTop = logicalTopForFloat(floatingObject); 2026 LayoutUnit oldLogicalTop = logicalTopForFloat(floatingObject);
2027 m_floatingObjects->removePlacedObject(floatingObject); 2027 m_floatingObjects->removePlacedObject(floatingObject);
2028 setLogicalTopForFloat(floatingObject, oldLogicalTop + paginationStru t); 2028 setLogicalTopForFloat(floatingObject, oldLogicalTop + paginationStru t);
(...skipping 19 matching lines...) Expand all
2048 float logicalLeft = logicalLeftOffsetForLine(logicalHeight(), false).toFloat (); 2048 float logicalLeft = logicalLeftOffsetForLine(logicalHeight(), false).toFloat ();
2049 float availableLogicalWidth = logicalRightOffsetForLine(logicalHeight(), fal se) - logicalLeft; 2049 float availableLogicalWidth = logicalRightOffsetForLine(logicalHeight(), fal se) - logicalLeft;
2050 updateLogicalWidthForAlignment(textAlign, 0, 0, logicalLeft, totalLogicalWid th, availableLogicalWidth, 0); 2050 updateLogicalWidthForAlignment(textAlign, 0, 0, logicalLeft, totalLogicalWid th, availableLogicalWidth, 0);
2051 2051
2052 if (!style()->isLeftToRightDirection()) 2052 if (!style()->isLeftToRightDirection())
2053 return logicalWidth() - logicalLeft; 2053 return logicalWidth() - logicalLeft;
2054 return logicalLeft; 2054 return logicalLeft;
2055 } 2055 }
2056 2056
2057 } 2057 }
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderBlockFlow.cpp ('k') | Source/core/rendering/RenderBox.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698