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

Side by Side Diff: third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp

Issue 1660863002: Force all LayoutUnit construction to be explicit (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Also fix LayoutRectTest.cpp Created 4 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3 * 3 *
4 * This library is free software; you can redistribute it and/or 4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public 5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either 6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version. 7 * version 2 of the License, or (at your option) any later version.
8 * 8 *
9 * This library is distributed in the hope that it will be useful, 9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 void InlineFlowBox::placeBoxRangeInInlineDirection(InlineBox* firstChild, Inline Box* lastChild, 382 void InlineFlowBox::placeBoxRangeInInlineDirection(InlineBox* firstChild, Inline Box* lastChild,
383 LayoutUnit& logicalLeft, LayoutUnit& minLogicalLeft, LayoutUnit& maxLogicalR ight, bool& needsWordSpacing) 383 LayoutUnit& logicalLeft, LayoutUnit& minLogicalLeft, LayoutUnit& maxLogicalR ight, bool& needsWordSpacing)
384 { 384 {
385 for (InlineBox* curr = firstChild; curr && curr != lastChild; curr = curr->n extOnLine()) { 385 for (InlineBox* curr = firstChild; curr && curr != lastChild; curr = curr->n extOnLine()) {
386 if (curr->lineLayoutItem().isText()) { 386 if (curr->lineLayoutItem().isText()) {
387 InlineTextBox* text = toInlineTextBox(curr); 387 InlineTextBox* text = toInlineTextBox(curr);
388 LineLayoutText rt = text->lineLayoutItem(); 388 LineLayoutText rt = text->lineLayoutItem();
389 LayoutUnit space; 389 LayoutUnit space;
390 if (rt.textLength()) { 390 if (rt.textLength()) {
391 if (needsWordSpacing && isSpaceOrNewline(rt.characterAt(text->st art()))) 391 if (needsWordSpacing && isSpaceOrNewline(rt.characterAt(text->st art())))
392 space = rt.style(isFirstLineStyle())->font().fontDescription ().wordSpacing(); 392 space = LayoutUnit(rt.style(isFirstLineStyle())->font().font Description().wordSpacing());
393 needsWordSpacing = !isSpaceOrNewline(rt.characterAt(text->end()) ); 393 needsWordSpacing = !isSpaceOrNewline(rt.characterAt(text->end()) );
394 } 394 }
395 if (isLeftToRightDirection()) { 395 if (isLeftToRightDirection()) {
396 logicalLeft += space; 396 logicalLeft += space;
397 text->setLogicalLeft(logicalLeft); 397 text->setLogicalLeft(logicalLeft);
398 } else { 398 } else {
399 text->setLogicalLeft(logicalLeft); 399 text->setLogicalLeft(logicalLeft);
400 logicalLeft += space; 400 logicalLeft += space;
401 } 401 }
402 if (knownToHaveNoOverflow()) 402 if (knownToHaveNoOverflow())
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
540 540
541 // The verticalPositionForBox function returns the distance between the child box's baseline 541 // The verticalPositionForBox function returns the distance between the child box's baseline
542 // and the root box's baseline. The value is negative if the child box' s baseline is above the 542 // and the root box's baseline. The value is negative if the child box' s baseline is above the
543 // root box's baseline, and it is positive if the child box's baseline i s below the root box's baseline. 543 // root box's baseline, and it is positive if the child box's baseline i s below the root box's baseline.
544 curr->setLogicalTop(rootBox->verticalPositionForBox(curr, verticalPositi onCache)); 544 curr->setLogicalTop(rootBox->verticalPositionForBox(curr, verticalPositi onCache));
545 545
546 int ascent = 0; 546 int ascent = 0;
547 int descent = 0; 547 int descent = 0;
548 rootBox->ascentAndDescentForBox(curr, textBoxDataMap, ascent, descent, a ffectsAscent, affectsDescent); 548 rootBox->ascentAndDescentForBox(curr, textBoxDataMap, ascent, descent, a ffectsAscent, affectsDescent);
549 549
550 LayoutUnit boxHeight = ascent + descent; 550 LayoutUnit boxHeight(ascent + descent);
551 if (curr->verticalAlign() == TOP) { 551 if (curr->verticalAlign() == TOP) {
552 if (maxPositionTop < boxHeight) 552 if (maxPositionTop < boxHeight)
553 maxPositionTop = boxHeight; 553 maxPositionTop = boxHeight;
554 } else if (curr->verticalAlign() == BOTTOM) { 554 } else if (curr->verticalAlign() == BOTTOM) {
555 if (maxPositionBottom < boxHeight) 555 if (maxPositionBottom < boxHeight)
556 maxPositionBottom = boxHeight; 556 maxPositionBottom = boxHeight;
557 } else if (!inlineFlowBox || noQuirksMode || inlineFlowBox->hasTextChild ren() || (inlineFlowBox->descendantsHaveSameLineHeightAndBaseline() && inlineFlo wBox->hasTextDescendants()) || inlineFlowBox->boxModelObject().hasInlineDirectio nBordersOrPadding()) { 557 } else if (!inlineFlowBox || noQuirksMode || inlineFlowBox->hasTextChild ren() || (inlineFlowBox->descendantsHaveSameLineHeightAndBaseline() && inlineFlo wBox->hasTextDescendants()) || inlineFlowBox->boxModelObject().hasInlineDirectio nBordersOrPadding()) {
558 // Note that these values can be negative. Even though we only affe ct the maxAscent and maxDescent values 558 // Note that these values can be negative. Even though we only affe ct the maxAscent and maxDescent values
559 // if our box (excluding line-height) was above (for ascent) or belo w (for descent) the root baseline, once you factor in line-height 559 // if our box (excluding line-height) was above (for ascent) or belo w (for descent) the root baseline, once you factor in line-height
560 // the final box can end up being fully above or fully below the roo t box's baseline! This is ok, but what it 560 // the final box can end up being fully above or fully below the roo t box's baseline! This is ok, but what it
(...skipping 18 matching lines...) Expand all
579 } 579 }
580 } 580 }
581 581
582 void InlineFlowBox::placeBoxesInBlockDirection(LayoutUnit top, LayoutUnit maxHei ght, int maxAscent, bool noQuirksMode, LayoutUnit& lineTop, LayoutUnit& lineBott om, LayoutUnit& selectionBottom, bool& setLineTop, LayoutUnit& lineTopIncludingM argins, LayoutUnit& lineBottomIncludingMargins, bool& hasAnnotationsBefore, bool & hasAnnotationsAfter, FontBaseline baselineType) 582 void InlineFlowBox::placeBoxesInBlockDirection(LayoutUnit top, LayoutUnit maxHei ght, int maxAscent, bool noQuirksMode, LayoutUnit& lineTop, LayoutUnit& lineBott om, LayoutUnit& selectionBottom, bool& setLineTop, LayoutUnit& lineTopIncludingM argins, LayoutUnit& lineBottomIncludingMargins, bool& hasAnnotationsBefore, bool & hasAnnotationsAfter, FontBaseline baselineType)
583 { 583 {
584 bool isRootBox = isRootInlineBox(); 584 bool isRootBox = isRootInlineBox();
585 if (isRootBox) { 585 if (isRootBox) {
586 const FontMetrics& fontMetrics = lineLayoutItem().style(isFirstLineStyle ())->fontMetrics(); 586 const FontMetrics& fontMetrics = lineLayoutItem().style(isFirstLineStyle ())->fontMetrics();
587 // RootInlineBoxes are always placed at pixel boundaries in their logica l y direction. Not doing 587 // RootInlineBoxes are always placed at pixel boundaries in their logica l y direction. Not doing
588 // so results in incorrect layout of text decorations, most notably unde rlines. 588 // so results in incorrect layout of text decorations, most notably unde rlines.
589 setLogicalTop(roundToInt(top + maxAscent - fontMetrics.ascent(baselineTy pe))); 589 setLogicalTop(LayoutUnit(roundToInt(top + maxAscent - fontMetrics.ascent (baselineType))));
590 } 590 }
591 591
592 LayoutUnit adjustmentForChildrenWithSameLineHeightAndBaseline; 592 LayoutUnit adjustmentForChildrenWithSameLineHeightAndBaseline;
593 if (descendantsHaveSameLineHeightAndBaseline()) { 593 if (descendantsHaveSameLineHeightAndBaseline()) {
594 adjustmentForChildrenWithSameLineHeightAndBaseline = logicalTop(); 594 adjustmentForChildrenWithSameLineHeightAndBaseline = logicalTop();
595 if (parent()) 595 if (parent())
596 adjustmentForChildrenWithSameLineHeightAndBaseline += boxModelObject ().borderAndPaddingOver(); 596 adjustmentForChildrenWithSameLineHeightAndBaseline += boxModelObject ().borderAndPaddingOver();
597 } 597 }
598 598
599 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { 599 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) {
600 if (curr->lineLayoutItem().isOutOfFlowPositioned()) 600 if (curr->lineLayoutItem().isOutOfFlowPositioned())
601 continue; // Positioned placeholders don't affect calculations. 601 continue; // Positioned placeholders don't affect calculations.
602 602
603 if (descendantsHaveSameLineHeightAndBaseline()) { 603 if (descendantsHaveSameLineHeightAndBaseline()) {
604 curr->moveInBlockDirection(adjustmentForChildrenWithSameLineHeightAn dBaseline); 604 curr->moveInBlockDirection(adjustmentForChildrenWithSameLineHeightAn dBaseline);
605 continue; 605 continue;
606 } 606 }
607 607
608 InlineFlowBox* inlineFlowBox = curr->isInlineFlowBox() ? toInlineFlowBox (curr) : nullptr; 608 InlineFlowBox* inlineFlowBox = curr->isInlineFlowBox() ? toInlineFlowBox (curr) : nullptr;
609 bool childAffectsTopBottomPos = true; 609 bool childAffectsTopBottomPos = true;
610 if (curr->verticalAlign() == TOP) { 610 if (curr->verticalAlign() == TOP) {
611 curr->setLogicalTop(top); 611 curr->setLogicalTop(top);
612 } else if (curr->verticalAlign() == BOTTOM) { 612 } else if (curr->verticalAlign() == BOTTOM) {
613 curr->setLogicalTop((top + maxHeight - curr->lineHeight())); 613 curr->setLogicalTop((top + maxHeight - curr->lineHeight()));
614 } else { 614 } else {
615 if (!noQuirksMode && inlineFlowBox && !inlineFlowBox->hasTextChildre n() && !curr->boxModelObject().hasInlineDirectionBordersOrPadding() 615 if (!noQuirksMode && inlineFlowBox && !inlineFlowBox->hasTextChildre n() && !curr->boxModelObject().hasInlineDirectionBordersOrPadding()
616 && !(inlineFlowBox->descendantsHaveSameLineHeightAndBaseline() & & inlineFlowBox->hasTextDescendants())) 616 && !(inlineFlowBox->descendantsHaveSameLineHeightAndBaseline() & & inlineFlowBox->hasTextDescendants()))
617 childAffectsTopBottomPos = false; 617 childAffectsTopBottomPos = false;
618 LayoutUnit posAdjust = maxAscent - curr->baselinePosition(baselineTy pe); 618 int posAdjust = maxAscent - curr->baselinePosition(baselineType);
619 curr->setLogicalTop(curr->logicalTop() + top + posAdjust); 619 curr->setLogicalTop(curr->logicalTop() + top + posAdjust);
620 } 620 }
621 621
622 LayoutUnit newLogicalTop = curr->logicalTop(); 622 LayoutUnit newLogicalTop = curr->logicalTop();
623 LayoutUnit newLogicalTopIncludingMargins = newLogicalTop; 623 LayoutUnit newLogicalTopIncludingMargins = newLogicalTop;
624 LayoutUnit boxHeight = curr->logicalHeight(); 624 LayoutUnit boxHeight = curr->logicalHeight();
625 LayoutUnit boxHeightIncludingMargins = boxHeight; 625 LayoutUnit boxHeightIncludingMargins = boxHeight;
626 LayoutUnit borderPaddingHeight; 626 LayoutUnit borderPaddingHeight;
627 if (curr->isText() || curr->isInlineFlowBox()) { 627 if (curr->isText() || curr->isInlineFlowBox()) {
628 const FontMetrics& fontMetrics = curr->lineLayoutItem().style(isFirs tLineStyle())->fontMetrics(); 628 const FontMetrics& fontMetrics = curr->lineLayoutItem().style(isFirs tLineStyle())->fontMetrics();
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 // Adjust boxes to use their real box y/height and not the logical heigh t (as dictated by 691 // Adjust boxes to use their real box y/height and not the logical heigh t (as dictated by
692 // line-height). 692 // line-height).
693 if (inlineFlowBox) 693 if (inlineFlowBox)
694 inlineFlowBox->placeBoxesInBlockDirection(top, maxHeight, maxAscent, noQuirksMode, lineTop, lineBottom, selectionBottom, setLineTop, lineTopIncludin gMargins, lineBottomIncludingMargins, hasAnnotationsBefore, hasAnnotationsAfter, baselineType); 694 inlineFlowBox->placeBoxesInBlockDirection(top, maxHeight, maxAscent, noQuirksMode, lineTop, lineBottom, selectionBottom, setLineTop, lineTopIncludin gMargins, lineBottomIncludingMargins, hasAnnotationsBefore, hasAnnotationsAfter, baselineType);
695 } 695 }
696 696
697 if (isRootBox) { 697 if (isRootBox) {
698 if (noQuirksMode || hasTextChildren() || (descendantsHaveSameLineHeightA ndBaseline() && hasTextDescendants())) { 698 if (noQuirksMode || hasTextChildren() || (descendantsHaveSameLineHeightA ndBaseline() && hasTextDescendants())) {
699 if (!setLineTop) { 699 if (!setLineTop) {
700 setLineTop = true; 700 setLineTop = true;
701 lineTop = pixelSnappedLogicalTop(); 701 lineTop = LayoutUnit(pixelSnappedLogicalTop());
702 lineTopIncludingMargins = lineTop; 702 lineTopIncludingMargins = lineTop;
703 } else { 703 } else {
704 lineTop = std::min<LayoutUnit>(lineTop, pixelSnappedLogicalTop() ); 704 lineTop = std::min(lineTop, LayoutUnit(pixelSnappedLogicalTop()) );
705 lineTopIncludingMargins = std::min(lineTop, lineTopIncludingMarg ins); 705 lineTopIncludingMargins = std::min(lineTop, lineTopIncludingMarg ins);
706 } 706 }
707 selectionBottom = std::max<LayoutUnit>(selectionBottom, pixelSnapped LogicalBottom()); 707 selectionBottom = std::max(selectionBottom, LayoutUnit(pixelSnappedL ogicalBottom()));
708 lineBottom = std::max<LayoutUnit>(lineBottom, pixelSnappedLogicalBot tom()); 708 lineBottom = std::max(lineBottom, LayoutUnit(pixelSnappedLogicalBott om()));
709 lineBottomIncludingMargins = std::max(lineBottom, lineBottomIncludin gMargins); 709 lineBottomIncludingMargins = std::max(lineBottom, lineBottomIncludin gMargins);
710 } 710 }
711 711
712 if (lineLayoutItem().style()->isFlippedLinesWritingMode()) 712 if (lineLayoutItem().style()->isFlippedLinesWritingMode())
713 flipLinesInBlockDirection(lineTopIncludingMargins, lineBottomIncludi ngMargins); 713 flipLinesInBlockDirection(lineTopIncludingMargins, lineBottomIncludi ngMargins);
714 } 714 }
715 } 715 }
716 716
717 void InlineFlowBox::computeMaxLogicalTop(LayoutUnit& maxLogicalTop) const 717 void InlineFlowBox::computeMaxLogicalTop(LayoutUnit& maxLogicalTop) const
718 { 718 {
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
849 if (ShadowList* textShadow = style.textShadow()) 849 if (ShadowList* textShadow = style.textShadow())
850 textShadowLogicalOutsets = LayoutRectOutsets(textShadow->rectOutsetsIncl udingOriginal()).logicalOutsets(style.writingMode()); 850 textShadowLogicalOutsets = LayoutRectOutsets(textShadow->rectOutsetsIncl udingOriginal()).logicalOutsets(style.writingMode());
851 851
852 // FIXME: This code currently uses negative values for expansion of the top 852 // FIXME: This code currently uses negative values for expansion of the top
853 // and left edges. This should be cleaned up. 853 // and left edges. This should be cleaned up.
854 LayoutUnit textShadowLogicalTop = -textShadowLogicalOutsets.top(); 854 LayoutUnit textShadowLogicalTop = -textShadowLogicalOutsets.top();
855 LayoutUnit textShadowLogicalBottom = textShadowLogicalOutsets.bottom(); 855 LayoutUnit textShadowLogicalBottom = textShadowLogicalOutsets.bottom();
856 LayoutUnit textShadowLogicalLeft = -textShadowLogicalOutsets.left(); 856 LayoutUnit textShadowLogicalLeft = -textShadowLogicalOutsets.left();
857 LayoutUnit textShadowLogicalRight = textShadowLogicalOutsets.right(); 857 LayoutUnit textShadowLogicalRight = textShadowLogicalOutsets.right();
858 858
859 LayoutUnit childOverflowLogicalTop = std::min<LayoutUnit>(textShadowLogicalT op + topGlyphOverflow, topGlyphOverflow); 859 LayoutUnit childOverflowLogicalTop(std::min(textShadowLogicalTop + topGlyphO verflow, topGlyphOverflow));
860 LayoutUnit childOverflowLogicalBottom = std::max<LayoutUnit>(textShadowLogic alBottom + bottomGlyphOverflow, bottomGlyphOverflow); 860 LayoutUnit childOverflowLogicalBottom(std::max(textShadowLogicalBottom + bot tomGlyphOverflow, bottomGlyphOverflow));
861 LayoutUnit childOverflowLogicalLeft = std::min<LayoutUnit>(textShadowLogical Left + leftGlyphOverflow, leftGlyphOverflow); 861 LayoutUnit childOverflowLogicalLeft(std::min(textShadowLogicalLeft + leftGly phOverflow, leftGlyphOverflow));
862 LayoutUnit childOverflowLogicalRight = std::max<LayoutUnit>(textShadowLogica lRight + rightGlyphOverflow, rightGlyphOverflow); 862 LayoutUnit childOverflowLogicalRight(std::max(textShadowLogicalRight + right GlyphOverflow, rightGlyphOverflow));
863 863
864 int enclosingLogicalTopWithOverflow = (textBox->logicalTop() + childOverflow LogicalTop).floor(); 864 int enclosingLogicalTopWithOverflow = (textBox->logicalTop() + childOverflow LogicalTop).floor();
865 int enclosingLogicalBottomWithOverflow = (textBox->logicalBottom() + childOv erflowLogicalBottom).ceil(); 865 int enclosingLogicalBottomWithOverflow = (textBox->logicalBottom() + childOv erflowLogicalBottom).ceil();
866 int enclosingLogicalLeftWithOverflow = (textBox->logicalLeft() + childOverfl owLogicalLeft).floor(); 866 int enclosingLogicalLeftWithOverflow = (textBox->logicalLeft() + childOverfl owLogicalLeft).floor();
867 int enclosingLogicalRightWithOverflow = (textBox->logicalRight() + childOver flowLogicalRight).ceil(); 867 int enclosingLogicalRightWithOverflow = (textBox->logicalRight() + childOver flowLogicalRight).ceil();
868 868
869 LayoutUnit logicalTopVisualOverflow = std::min<LayoutUnit>(enclosingLogicalT opWithOverflow, logicalVisualOverflow.y()); 869 LayoutUnit logicalTopVisualOverflow = std::min(LayoutUnit(enclosingLogicalTo pWithOverflow), logicalVisualOverflow.y());
870 LayoutUnit logicalBottomVisualOverflow = std::max<LayoutUnit>(enclosingLogic alBottomWithOverflow, logicalVisualOverflow.maxY()); 870 LayoutUnit logicalBottomVisualOverflow = std::max(LayoutUnit(enclosingLogica lBottomWithOverflow), logicalVisualOverflow.maxY());
871 LayoutUnit logicalLeftVisualOverflow = std::min<LayoutUnit>(enclosingLogical LeftWithOverflow, logicalVisualOverflow.x()); 871 LayoutUnit logicalLeftVisualOverflow = std::min(LayoutUnit(enclosingLogicalL eftWithOverflow), logicalVisualOverflow.x());
872 LayoutUnit logicalRightVisualOverflow = std::max<LayoutUnit>(enclosingLogica lRightWithOverflow, logicalVisualOverflow.maxX()); 872 LayoutUnit logicalRightVisualOverflow = std::max(LayoutUnit(enclosingLogical RightWithOverflow), logicalVisualOverflow.maxX());
873 873
874 logicalVisualOverflow = LayoutRect(logicalLeftVisualOverflow, logicalTopVisu alOverflow, logicalRightVisualOverflow - logicalLeftVisualOverflow, logicalBotto mVisualOverflow - logicalTopVisualOverflow); 874 logicalVisualOverflow = LayoutRect(logicalLeftVisualOverflow, logicalTopVisu alOverflow, logicalRightVisualOverflow - logicalLeftVisualOverflow, logicalBotto mVisualOverflow - logicalTopVisualOverflow);
875 875
876 textBox->setLogicalOverflowRect(logicalVisualOverflow); 876 textBox->setLogicalOverflowRect(logicalVisualOverflow);
877 } 877 }
878 878
879 inline void InlineFlowBox::addReplacedChildOverflow(const InlineBox* inlineBox, LayoutRect& logicalLayoutOverflow, LayoutRect& logicalVisualOverflow) 879 inline void InlineFlowBox::addReplacedChildOverflow(const InlineBox* inlineBox, LayoutRect& logicalLayoutOverflow, LayoutRect& logicalVisualOverflow)
880 { 880 {
881 LineLayoutBox box = LineLayoutBox(inlineBox->lineLayoutItem()); 881 LineLayoutBox box = LineLayoutBox(inlineBox->lineLayoutItem());
882 882
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1097 { 1097 {
1098 for (InlineBox* box = firstChild(); box; box = box->nextOnLine()) { 1098 for (InlineBox* box = firstChild(); box; box = box->nextOnLine()) {
1099 if (!box->canAccommodateEllipsis(ltr, blockEdge, ellipsisWidth)) 1099 if (!box->canAccommodateEllipsis(ltr, blockEdge, ellipsisWidth))
1100 return false; 1100 return false;
1101 } 1101 }
1102 return true; 1102 return true;
1103 } 1103 }
1104 1104
1105 LayoutUnit InlineFlowBox::placeEllipsisBox(bool ltr, LayoutUnit blockLeftEdge, L ayoutUnit blockRightEdge, LayoutUnit ellipsisWidth, LayoutUnit &truncatedWidth, bool& foundBox) 1105 LayoutUnit InlineFlowBox::placeEllipsisBox(bool ltr, LayoutUnit blockLeftEdge, L ayoutUnit blockRightEdge, LayoutUnit ellipsisWidth, LayoutUnit &truncatedWidth, bool& foundBox)
1106 { 1106 {
1107 LayoutUnit result = -1; 1107 LayoutUnit result(-1);
1108 // We iterate over all children, the foundBox variable tells us when we've f ound the 1108 // We iterate over all children, the foundBox variable tells us when we've f ound the
1109 // box containing the ellipsis. All boxes after that one in the flow are hi dden. 1109 // box containing the ellipsis. All boxes after that one in the flow are hi dden.
1110 // If our flow is ltr then iterate over the boxes from left to right, otherw ise iterate 1110 // If our flow is ltr then iterate over the boxes from left to right, otherw ise iterate
1111 // from right to left. Varying the order allows us to correctly hide the box es following the ellipsis. 1111 // from right to left. Varying the order allows us to correctly hide the box es following the ellipsis.
1112 InlineBox* box = ltr ? firstChild() : lastChild(); 1112 InlineBox* box = ltr ? firstChild() : lastChild();
1113 1113
1114 // NOTE: these will cross after foundBox = true. 1114 // NOTE: these will cross after foundBox = true.
1115 int visibleLeftEdge = blockLeftEdge; 1115 int visibleLeftEdge = blockLeftEdge;
1116 int visibleRightEdge = blockRightEdge; 1116 int visibleRightEdge = blockRightEdge;
1117 1117
1118 while (box) { 1118 while (box) {
1119 int currResult = box->placeEllipsisBox(ltr, visibleLeftEdge, visibleRigh tEdge, ellipsisWidth, truncatedWidth, foundBox); 1119 int currResult = box->placeEllipsisBox(ltr, LayoutUnit(visibleLeftEdge), LayoutUnit(visibleRightEdge),
1120 ellipsisWidth, truncatedWidth, foundBox);
1120 if (currResult != -1 && result == -1) 1121 if (currResult != -1 && result == -1)
1121 result = currResult; 1122 result = LayoutUnit(currResult);
1122 1123
1123 if (ltr) { 1124 if (ltr) {
1124 visibleLeftEdge += box->logicalWidth().round(); 1125 visibleLeftEdge += box->logicalWidth().round();
1125 box = box->nextOnLine(); 1126 box = box->nextOnLine();
1126 } else { 1127 } else {
1127 visibleRightEdge -= box->logicalWidth().round(); 1128 visibleRightEdge -= box->logicalWidth().round();
1128 box = box->prevOnLine(); 1129 box = box->prevOnLine();
1129 } 1130 }
1130 } 1131 }
1131 return result; 1132 return result;
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1313 ASSERT(child->prevOnLine() == prev); 1314 ASSERT(child->prevOnLine() == prev);
1314 prev = child; 1315 prev = child;
1315 } 1316 }
1316 ASSERT(prev == m_lastChild); 1317 ASSERT(prev == m_lastChild);
1317 #endif 1318 #endif
1318 } 1319 }
1319 1320
1320 #endif 1321 #endif
1321 1322
1322 } // namespace blink 1323 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698