| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2006, 2008 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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 LayoutUnit RootInlineBox::lineHeight() const { | 88 LayoutUnit RootInlineBox::lineHeight() const { |
| 89 return boxModelObject().lineHeight( | 89 return boxModelObject().lineHeight( |
| 90 isFirstLineStyle(), isHorizontal() ? HorizontalLine : VerticalLine, | 90 isFirstLineStyle(), isHorizontal() ? HorizontalLine : VerticalLine, |
| 91 PositionOfInteriorLineBoxes); | 91 PositionOfInteriorLineBoxes); |
| 92 } | 92 } |
| 93 | 93 |
| 94 bool RootInlineBox::lineCanAccommodateEllipsis(bool ltr, | 94 bool RootInlineBox::lineCanAccommodateEllipsis(bool ltr, |
| 95 int blockEdge, | 95 int blockEdge, |
| 96 int lineBoxEdge, | 96 int lineBoxEdge, |
| 97 int ellipsisWidth) { | 97 int ellipsisWidth) { |
| 98 // First sanity-check the unoverflowed width of the whole line to see if there
is sufficient room. | 98 // First sanity-check the unoverflowed width of the whole line to see if there |
| 99 // is sufficient room. |
| 99 int delta = ltr ? lineBoxEdge - blockEdge : blockEdge - lineBoxEdge; | 100 int delta = ltr ? lineBoxEdge - blockEdge : blockEdge - lineBoxEdge; |
| 100 if (logicalWidth() - delta < ellipsisWidth) | 101 if (logicalWidth() - delta < ellipsisWidth) |
| 101 return false; | 102 return false; |
| 102 | 103 |
| 103 // Next iterate over all the line boxes on the line. If we find a replaced el
ement that intersects | 104 // Next iterate over all the line boxes on the line. If we find a replaced |
| 104 // then we refuse to accommodate the ellipsis. Otherwise we're ok. | 105 // element that intersects then we refuse to accommodate the ellipsis. |
| 106 // Otherwise we're ok. |
| 105 return InlineFlowBox::canAccommodateEllipsis(ltr, blockEdge, ellipsisWidth); | 107 return InlineFlowBox::canAccommodateEllipsis(ltr, blockEdge, ellipsisWidth); |
| 106 } | 108 } |
| 107 | 109 |
| 108 LayoutUnit RootInlineBox::placeEllipsis(const AtomicString& ellipsisStr, | 110 LayoutUnit RootInlineBox::placeEllipsis(const AtomicString& ellipsisStr, |
| 109 bool ltr, | 111 bool ltr, |
| 110 LayoutUnit blockLeftEdge, | 112 LayoutUnit blockLeftEdge, |
| 111 LayoutUnit blockRightEdge, | 113 LayoutUnit blockRightEdge, |
| 112 LayoutUnit ellipsisWidth) { | 114 LayoutUnit ellipsisWidth) { |
| 113 // Create an ellipsis box. | 115 // Create an ellipsis box. |
| 114 EllipsisBox* ellipsisBox = | 116 EllipsisBox* ellipsisBox = |
| 115 new EllipsisBox(getLineLayoutItem(), ellipsisStr, this, ellipsisWidth, | 117 new EllipsisBox(getLineLayoutItem(), ellipsisStr, this, ellipsisWidth, |
| 116 logicalHeight().toFloat(), x().toInt(), y().toInt(), | 118 logicalHeight().toFloat(), x().toInt(), y().toInt(), |
| 117 !prevRootBox(), isHorizontal()); | 119 !prevRootBox(), isHorizontal()); |
| 118 | 120 |
| 119 if (!gEllipsisBoxMap) | 121 if (!gEllipsisBoxMap) |
| 120 gEllipsisBoxMap = new EllipsisBoxMap(); | 122 gEllipsisBoxMap = new EllipsisBoxMap(); |
| 121 gEllipsisBoxMap->add(this, ellipsisBox); | 123 gEllipsisBoxMap->add(this, ellipsisBox); |
| 122 setHasEllipsisBox(true); | 124 setHasEllipsisBox(true); |
| 123 | 125 |
| 124 // FIXME: Do we need an RTL version of this? | 126 // FIXME: Do we need an RTL version of this? |
| 125 if (ltr && | 127 if (ltr && |
| 126 (logicalLeft() + logicalWidth() + ellipsisWidth) <= blockRightEdge) { | 128 (logicalLeft() + logicalWidth() + ellipsisWidth) <= blockRightEdge) { |
| 127 ellipsisBox->setLogicalLeft(logicalLeft() + logicalWidth()); | 129 ellipsisBox->setLogicalLeft(logicalLeft() + logicalWidth()); |
| 128 return logicalWidth() + ellipsisWidth; | 130 return logicalWidth() + ellipsisWidth; |
| 129 } | 131 } |
| 130 | 132 |
| 131 // Now attempt to find the nearest glyph horizontally and place just to the ri
ght (or left in RTL) | 133 // Now attempt to find the nearest glyph horizontally and place just to the |
| 132 // of that glyph. Mark all of the objects that intersect the ellipsis box as
not painting (as being | 134 // right (or left in RTL) of that glyph. Mark all of the objects that |
| 133 // truncated). | 135 // intersect the ellipsis box as not painting (as being truncated). |
| 134 bool foundBox = false; | 136 bool foundBox = false; |
| 135 LayoutUnit truncatedWidth; | 137 LayoutUnit truncatedWidth; |
| 136 LayoutUnit position = | 138 LayoutUnit position = |
| 137 placeEllipsisBox(ltr, blockLeftEdge, blockRightEdge, ellipsisWidth, | 139 placeEllipsisBox(ltr, blockLeftEdge, blockRightEdge, ellipsisWidth, |
| 138 truncatedWidth, foundBox); | 140 truncatedWidth, foundBox); |
| 139 ellipsisBox->setLogicalLeft(position); | 141 ellipsisBox->setLogicalLeft(position); |
| 140 return truncatedWidth; | 142 return truncatedWidth; |
| 141 } | 143 } |
| 142 | 144 |
| 143 LayoutUnit RootInlineBox::placeEllipsisBox(bool ltr, | 145 LayoutUnit RootInlineBox::placeEllipsisBox(bool ltr, |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 m_hasAnnotationsBefore = hasAnnotationsBefore; | 286 m_hasAnnotationsBefore = hasAnnotationsBefore; |
| 285 m_hasAnnotationsAfter = hasAnnotationsAfter; | 287 m_hasAnnotationsAfter = hasAnnotationsAfter; |
| 286 | 288 |
| 287 maxHeight = maxHeight.clampNegativeToZero(); | 289 maxHeight = maxHeight.clampNegativeToZero(); |
| 288 | 290 |
| 289 setLineTopBottomPositions(lineTop, lineBottom, heightOfBlock, | 291 setLineTopBottomPositions(lineTop, lineBottom, heightOfBlock, |
| 290 heightOfBlock + maxHeight, selectionBottom); | 292 heightOfBlock + maxHeight, selectionBottom); |
| 291 | 293 |
| 292 LayoutUnit annotationsAdjustment = beforeAnnotationsAdjustment(); | 294 LayoutUnit annotationsAdjustment = beforeAnnotationsAdjustment(); |
| 293 if (annotationsAdjustment) { | 295 if (annotationsAdjustment) { |
| 294 // FIXME: Need to handle pagination here. We might have to move to the next
page/column as a result of the | 296 // FIXME: Need to handle pagination here. We might have to move to the next |
| 295 // ruby expansion. | 297 // page/column as a result of the ruby expansion. |
| 296 moveInBlockDirection(annotationsAdjustment); | 298 moveInBlockDirection(annotationsAdjustment); |
| 297 heightOfBlock += annotationsAdjustment; | 299 heightOfBlock += annotationsAdjustment; |
| 298 } | 300 } |
| 299 | 301 |
| 300 return heightOfBlock + maxHeight; | 302 return heightOfBlock + maxHeight; |
| 301 } | 303 } |
| 302 | 304 |
| 303 LayoutUnit RootInlineBox::maxLogicalTop() const { | 305 LayoutUnit RootInlineBox::maxLogicalTop() const { |
| 304 LayoutUnit maxLogicalTop; | 306 LayoutUnit maxLogicalTop; |
| 305 computeMaxLogicalTop(maxLogicalTop); | 307 computeMaxLogicalTop(maxLogicalTop); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 326 } else { | 328 } else { |
| 327 // Annotations under this line may push us up. | 329 // Annotations under this line may push us up. |
| 328 if (hasAnnotationsBefore()) | 330 if (hasAnnotationsBefore()) |
| 329 result = computeUnderAnnotationAdjustment( | 331 result = computeUnderAnnotationAdjustment( |
| 330 prevRootBox() ? prevRootBox()->lineBottom() | 332 prevRootBox() ? prevRootBox()->lineBottom() |
| 331 : static_cast<LayoutUnit>(block().borderBefore())); | 333 : static_cast<LayoutUnit>(block().borderBefore())); |
| 332 | 334 |
| 333 if (!prevRootBox() || !prevRootBox()->hasAnnotationsAfter()) | 335 if (!prevRootBox() || !prevRootBox()->hasAnnotationsAfter()) |
| 334 return result; | 336 return result; |
| 335 | 337 |
| 336 // We have to compute the expansion for annotations over the previous line t
o see how much we should move. | 338 // We have to compute the expansion for annotations over the previous line |
| 339 // to see how much we should move. |
| 337 LayoutUnit lowestAllowedPosition = | 340 LayoutUnit lowestAllowedPosition = |
| 338 std::max(prevRootBox()->lineBottom(), lineTop()) - result; | 341 std::max(prevRootBox()->lineBottom(), lineTop()) - result; |
| 339 result = | 342 result = |
| 340 prevRootBox()->computeOverAnnotationAdjustment(lowestAllowedPosition); | 343 prevRootBox()->computeOverAnnotationAdjustment(lowestAllowedPosition); |
| 341 } | 344 } |
| 342 | 345 |
| 343 return result; | 346 return result; |
| 344 } | 347 } |
| 345 | 348 |
| 346 SelectionState RootInlineBox::getSelectionState() const { | 349 SelectionState RootInlineBox::getSelectionState() const { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 selectionTop -= !getLineLayoutItem().style()->isFlippedLinesWritingMode() | 394 selectionTop -= !getLineLayoutItem().style()->isFlippedLinesWritingMode() |
| 392 ? computeOverAnnotationAdjustment(m_lineTop) | 395 ? computeOverAnnotationAdjustment(m_lineTop) |
| 393 : computeUnderAnnotationAdjustment(m_lineTop); | 396 : computeUnderAnnotationAdjustment(m_lineTop); |
| 394 | 397 |
| 395 if (getLineLayoutItem().style()->isFlippedLinesWritingMode() || | 398 if (getLineLayoutItem().style()->isFlippedLinesWritingMode() || |
| 396 !prevRootBox()) | 399 !prevRootBox()) |
| 397 return selectionTop; | 400 return selectionTop; |
| 398 | 401 |
| 399 LayoutUnit prevBottom = prevRootBox()->selectionBottom(); | 402 LayoutUnit prevBottom = prevRootBox()->selectionBottom(); |
| 400 if (prevBottom < selectionTop && block().containsFloats()) { | 403 if (prevBottom < selectionTop && block().containsFloats()) { |
| 401 // This line has actually been moved further down, probably from a large lin
e-height, but possibly because the | 404 // This line has actually been moved further down, probably from a large |
| 402 // line was forced to clear floats. If so, let's check the offsets, and onl
y be willing to use the previous | 405 // line-height, but possibly because the line was forced to clear floats. |
| 406 // If so, let's check the offsets, and only be willing to use the previous |
| 403 // line's bottom if the offsets are greater on both sides. | 407 // line's bottom if the offsets are greater on both sides. |
| 404 LayoutUnit prevLeft = | 408 LayoutUnit prevLeft = |
| 405 block().logicalLeftOffsetForLine(prevBottom, DoNotIndentText); | 409 block().logicalLeftOffsetForLine(prevBottom, DoNotIndentText); |
| 406 LayoutUnit prevRight = | 410 LayoutUnit prevRight = |
| 407 block().logicalRightOffsetForLine(prevBottom, DoNotIndentText); | 411 block().logicalRightOffsetForLine(prevBottom, DoNotIndentText); |
| 408 LayoutUnit newLeft = | 412 LayoutUnit newLeft = |
| 409 block().logicalLeftOffsetForLine(selectionTop, DoNotIndentText); | 413 block().logicalLeftOffsetForLine(selectionTop, DoNotIndentText); |
| 410 LayoutUnit newRight = | 414 LayoutUnit newRight = |
| 411 block().logicalRightOffsetForLine(selectionTop, DoNotIndentText); | 415 block().logicalRightOffsetForLine(selectionTop, DoNotIndentText); |
| 412 if (prevLeft > newLeft || prevRight < newRight) | 416 if (prevLeft > newLeft || prevRight < newRight) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 425 selectionBottom += !getLineLayoutItem().style()->isFlippedLinesWritingMode() | 429 selectionBottom += !getLineLayoutItem().style()->isFlippedLinesWritingMode() |
| 426 ? computeUnderAnnotationAdjustment(m_lineBottom) | 430 ? computeUnderAnnotationAdjustment(m_lineBottom) |
| 427 : computeOverAnnotationAdjustment(m_lineBottom); | 431 : computeOverAnnotationAdjustment(m_lineBottom); |
| 428 | 432 |
| 429 if (!getLineLayoutItem().style()->isFlippedLinesWritingMode() || | 433 if (!getLineLayoutItem().style()->isFlippedLinesWritingMode() || |
| 430 !nextRootBox()) | 434 !nextRootBox()) |
| 431 return selectionBottom; | 435 return selectionBottom; |
| 432 | 436 |
| 433 LayoutUnit nextTop = nextRootBox()->selectionTop(); | 437 LayoutUnit nextTop = nextRootBox()->selectionTop(); |
| 434 if (nextTop > selectionBottom && block().containsFloats()) { | 438 if (nextTop > selectionBottom && block().containsFloats()) { |
| 435 // The next line has actually been moved further over, probably from a large
line-height, but possibly because the | 439 // The next line has actually been moved further over, probably from a large |
| 436 // line was forced to clear floats. If so, let's check the offsets, and onl
y be willing to use the next | 440 // line-height, but possibly because the line was forced to clear floats. |
| 441 // If so, let's check the offsets, and only be willing to use the next |
| 437 // line's top if the offsets are greater on both sides. | 442 // line's top if the offsets are greater on both sides. |
| 438 LayoutUnit nextLeft = | 443 LayoutUnit nextLeft = |
| 439 block().logicalLeftOffsetForLine(nextTop, DoNotIndentText); | 444 block().logicalLeftOffsetForLine(nextTop, DoNotIndentText); |
| 440 LayoutUnit nextRight = | 445 LayoutUnit nextRight = |
| 441 block().logicalRightOffsetForLine(nextTop, DoNotIndentText); | 446 block().logicalRightOffsetForLine(nextTop, DoNotIndentText); |
| 442 LayoutUnit newLeft = | 447 LayoutUnit newLeft = |
| 443 block().logicalLeftOffsetForLine(selectionBottom, DoNotIndentText); | 448 block().logicalLeftOffsetForLine(selectionBottom, DoNotIndentText); |
| 444 LayoutUnit newRight = | 449 LayoutUnit newRight = |
| 445 block().logicalRightOffsetForLine(selectionBottom, DoNotIndentText); | 450 block().logicalRightOffsetForLine(selectionBottom, DoNotIndentText); |
| 446 if (nextLeft > newLeft || nextRight < newRight) | 451 if (nextLeft > newLeft || nextRight < newRight) |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 } | 493 } |
| 489 | 494 |
| 490 if (firstLeaf == lastLeaf && | 495 if (firstLeaf == lastLeaf && |
| 491 (!onlyEditableLeaves || isEditableLeaf(firstLeaf))) | 496 (!onlyEditableLeaves || isEditableLeaf(firstLeaf))) |
| 492 return firstLeaf; | 497 return firstLeaf; |
| 493 | 498 |
| 494 // Avoid returning a list marker when possible. | 499 // Avoid returning a list marker when possible. |
| 495 if (leftPosition <= firstLeaf->logicalLeft() && | 500 if (leftPosition <= firstLeaf->logicalLeft() && |
| 496 !firstLeaf->getLineLayoutItem().isListMarker() && | 501 !firstLeaf->getLineLayoutItem().isListMarker() && |
| 497 (!onlyEditableLeaves || isEditableLeaf(firstLeaf))) { | 502 (!onlyEditableLeaves || isEditableLeaf(firstLeaf))) { |
| 498 // The leftPosition coordinate is less or equal to left edge of the firstLea
f. | 503 // The leftPosition coordinate is less or equal to left edge of the |
| 499 // Return it. | 504 // firstLeaf. Return it. |
| 500 return firstLeaf; | 505 return firstLeaf; |
| 501 } | 506 } |
| 502 | 507 |
| 503 if (leftPosition >= lastLeaf->logicalRight() && | 508 if (leftPosition >= lastLeaf->logicalRight() && |
| 504 !lastLeaf->getLineLayoutItem().isListMarker() && | 509 !lastLeaf->getLineLayoutItem().isListMarker() && |
| 505 (!onlyEditableLeaves || isEditableLeaf(lastLeaf))) { | 510 (!onlyEditableLeaves || isEditableLeaf(lastLeaf))) { |
| 506 // The leftPosition coordinate is greater or equal to right edge of the last
Leaf. | 511 // The leftPosition coordinate is greater or equal to right edge of the |
| 507 // Return it. | 512 // lastLeaf. Return it. |
| 508 return lastLeaf; | 513 return lastLeaf; |
| 509 } | 514 } |
| 510 | 515 |
| 511 InlineBox* closestLeaf = nullptr; | 516 InlineBox* closestLeaf = nullptr; |
| 512 for (InlineBox* leaf = firstLeaf; leaf; | 517 for (InlineBox* leaf = firstLeaf; leaf; |
| 513 leaf = leaf->nextLeafChildIgnoringLineBreak()) { | 518 leaf = leaf->nextLeafChildIgnoringLineBreak()) { |
| 514 if (!leaf->getLineLayoutItem().isListMarker() && | 519 if (!leaf->getLineLayoutItem().isListMarker() && |
| 515 (!onlyEditableLeaves || isEditableLeaf(leaf))) { | 520 (!onlyEditableLeaves || isEditableLeaf(leaf))) { |
| 516 closestLeaf = leaf; | 521 closestLeaf = leaf; |
| 517 if (leftPosition < leaf->logicalRight()) { | 522 if (leftPosition < leaf->logicalRight()) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 531 static_cast<WTF::Unicode::CharDirection>(m_lineBreakBidiStatusLastStrong), | 536 static_cast<WTF::Unicode::CharDirection>(m_lineBreakBidiStatusLastStrong), |
| 532 static_cast<WTF::Unicode::CharDirection>(m_lineBreakBidiStatusLast), | 537 static_cast<WTF::Unicode::CharDirection>(m_lineBreakBidiStatusLast), |
| 533 m_lineBreakContext); | 538 m_lineBreakContext); |
| 534 } | 539 } |
| 535 | 540 |
| 536 void RootInlineBox::setLineBreakInfo(LineLayoutItem obj, | 541 void RootInlineBox::setLineBreakInfo(LineLayoutItem obj, |
| 537 unsigned breakPos, | 542 unsigned breakPos, |
| 538 const BidiStatus& status) { | 543 const BidiStatus& status) { |
| 539 // When setting lineBreakObj, the LayoutObject must not be a LayoutInline | 544 // When setting lineBreakObj, the LayoutObject must not be a LayoutInline |
| 540 // with no line boxes, otherwise all sorts of invariants are broken later. | 545 // with no line boxes, otherwise all sorts of invariants are broken later. |
| 541 // This has security implications because if the LayoutObject does not | 546 // This has security implications because if the LayoutObject does not point |
| 542 // point to at least one line box, then that LayoutInline can be deleted | 547 // to at least one line box, then that LayoutInline can be deleted later |
| 543 // later without resetting the lineBreakObj, leading to use-after-free. | 548 // without resetting the lineBreakObj, leading to use-after-free. |
| 544 ASSERT_WITH_SECURITY_IMPLICATION(!obj || obj.isText() || | 549 ASSERT_WITH_SECURITY_IMPLICATION(!obj || obj.isText() || |
| 545 !(obj.isLayoutInline() && obj.isBox() && | 550 !(obj.isLayoutInline() && obj.isBox() && |
| 546 !LineLayoutBox(obj).inlineBoxWrapper())); | 551 !LineLayoutBox(obj).inlineBoxWrapper())); |
| 547 | 552 |
| 548 m_lineBreakObj = obj; | 553 m_lineBreakObj = obj; |
| 549 m_lineBreakPos = breakPos; | 554 m_lineBreakPos = breakPos; |
| 550 m_lineBreakBidiStatusEor = status.eor; | 555 m_lineBreakBidiStatusEor = status.eor; |
| 551 m_lineBreakBidiStatusLastStrong = status.lastStrong; | 556 m_lineBreakBidiStatusLastStrong = status.lastStrong; |
| 552 m_lineBreakBidiStatusLast = status.last; | 557 m_lineBreakBidiStatusLast = status.last; |
| 553 m_lineBreakContext = status.context; | 558 m_lineBreakContext = status.context; |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 669 } | 674 } |
| 670 } | 675 } |
| 671 | 676 |
| 672 // If leading is included for the box, then we compute that box. | 677 // If leading is included for the box, then we compute that box. |
| 673 if (includeLeading && !setUsedFontWithLeading) { | 678 if (includeLeading && !setUsedFontWithLeading) { |
| 674 int ascentWithLeading = box->baselinePosition(baselineType()); | 679 int ascentWithLeading = box->baselinePosition(baselineType()); |
| 675 int descentWithLeading = (box->lineHeight() - ascentWithLeading).toInt(); | 680 int descentWithLeading = (box->lineHeight() - ascentWithLeading).toInt(); |
| 676 setAscentAndDescent(ascent, descent, ascentWithLeading, descentWithLeading, | 681 setAscentAndDescent(ascent, descent, ascentWithLeading, descentWithLeading, |
| 677 ascentDescentSet); | 682 ascentDescentSet); |
| 678 | 683 |
| 679 // Examine the font box for inline flows and text boxes to see if any part o
f it is above the baseline. | 684 // Examine the font box for inline flows and text boxes to see if any part |
| 680 // If the top of our font box relative to the root box baseline is above the
root box baseline, then | 685 // of it is above the baseline. If the top of our font box relative to the |
| 681 // we are contributing to the maxAscent value. Descent is similar. If any pa
rt of our font box is below | 686 // root box baseline is above the root box baseline, then we are |
| 682 // the root box's baseline, then we contribute to the maxDescent value. | 687 // contributing to the maxAscent value. Descent is similar. If any part of |
| 688 // our font box is below the root box's baseline, then we contribute to the |
| 689 // maxDescent value. |
| 683 affectsAscent = ascentWithLeading - box->logicalTop() > 0; | 690 affectsAscent = ascentWithLeading - box->logicalTop() > 0; |
| 684 affectsDescent = descentWithLeading + box->logicalTop() > 0; | 691 affectsDescent = descentWithLeading + box->logicalTop() > 0; |
| 685 } | 692 } |
| 686 } | 693 } |
| 687 | 694 |
| 688 LayoutUnit RootInlineBox::verticalPositionForBox( | 695 LayoutUnit RootInlineBox::verticalPositionForBox( |
| 689 InlineBox* box, | 696 InlineBox* box, |
| 690 VerticalPositionCache& verticalPositionCache) { | 697 VerticalPositionCache& verticalPositionCache) { |
| 691 if (box->getLineLayoutItem().isText()) | 698 if (box->getLineLayoutItem().isText()) |
| 692 return box->parent()->logicalTop(); | 699 return box->parent()->logicalTop(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 738 boxModel.baselinePosition(baselineType(), firstLine, lineDirection) - | 745 boxModel.baselinePosition(baselineType(), firstLine, lineDirection) - |
| 739 fontMetrics.ascent(baselineType()); | 746 fontMetrics.ascent(baselineType()); |
| 740 } else if (verticalAlign == VerticalAlignMiddle) { | 747 } else if (verticalAlign == VerticalAlignMiddle) { |
| 741 verticalPosition = LayoutUnit( | 748 verticalPosition = LayoutUnit( |
| 742 (verticalPosition - LayoutUnit(fontMetrics.xHeight() / 2) - | 749 (verticalPosition - LayoutUnit(fontMetrics.xHeight() / 2) - |
| 743 boxModel.lineHeight(firstLine, lineDirection) / 2 + | 750 boxModel.lineHeight(firstLine, lineDirection) / 2 + |
| 744 boxModel.baselinePosition(baselineType(), firstLine, lineDirection)) | 751 boxModel.baselinePosition(baselineType(), firstLine, lineDirection)) |
| 745 .round()); | 752 .round()); |
| 746 } else if (verticalAlign == VerticalAlignTextBottom) { | 753 } else if (verticalAlign == VerticalAlignTextBottom) { |
| 747 verticalPosition += fontMetrics.descent(baselineType()); | 754 verticalPosition += fontMetrics.descent(baselineType()); |
| 748 // lineHeight - baselinePosition is always 0 for replaced elements (except
inline blocks), so don't bother wasting time in that case. | 755 // lineHeight - baselinePosition is always 0 for replaced elements (except |
| 756 // inline blocks), so don't bother wasting time in that case. |
| 749 if (!boxModel.isAtomicInlineLevel() || | 757 if (!boxModel.isAtomicInlineLevel() || |
| 750 boxModel.isInlineBlockOrInlineTable()) | 758 boxModel.isInlineBlockOrInlineTable()) |
| 751 verticalPosition -= (boxModel.lineHeight(firstLine, lineDirection) - | 759 verticalPosition -= (boxModel.lineHeight(firstLine, lineDirection) - |
| 752 boxModel.baselinePosition( | 760 boxModel.baselinePosition( |
| 753 baselineType(), firstLine, lineDirection)); | 761 baselineType(), firstLine, lineDirection)); |
| 754 } else if (verticalAlign == VerticalAlignBaselineMiddle) { | 762 } else if (verticalAlign == VerticalAlignBaselineMiddle) { |
| 755 verticalPosition += | 763 verticalPosition += |
| 756 -boxModel.lineHeight(firstLine, lineDirection) / 2 + | 764 -boxModel.lineHeight(firstLine, lineDirection) / 2 + |
| 757 boxModel.baselinePosition(baselineType(), firstLine, lineDirection); | 765 boxModel.baselinePosition(baselineType(), firstLine, lineDirection); |
| 758 } else if (verticalAlign == VerticalAlignLength) { | 766 } else if (verticalAlign == VerticalAlignLength) { |
| 759 LayoutUnit lineHeight; | 767 LayoutUnit lineHeight; |
| 760 // Per http://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align: 'Pe
rcentages: refer to the 'line-height' of the element itself'. | 768 // Per http://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align: |
| 769 // 'Percentages: refer to the 'line-height' of the element itself'. |
| 761 if (boxModel.style()->getVerticalAlignLength().isPercentOrCalc()) | 770 if (boxModel.style()->getVerticalAlignLength().isPercentOrCalc()) |
| 762 lineHeight = LayoutUnit(boxModel.style()->computedLineHeight()); | 771 lineHeight = LayoutUnit(boxModel.style()->computedLineHeight()); |
| 763 else | 772 else |
| 764 lineHeight = boxModel.lineHeight(firstLine, lineDirection); | 773 lineHeight = boxModel.lineHeight(firstLine, lineDirection); |
| 765 verticalPosition -= valueForLength( | 774 verticalPosition -= valueForLength( |
| 766 boxModel.style()->getVerticalAlignLength(), lineHeight); | 775 boxModel.style()->getVerticalAlignLength(), lineHeight); |
| 767 } | 776 } |
| 768 } | 777 } |
| 769 | 778 |
| 770 // Store the cached value. | 779 // Store the cached value. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 804 } | 813 } |
| 805 endBox = nullptr; | 814 endBox = nullptr; |
| 806 return nullptr; | 815 return nullptr; |
| 807 } | 816 } |
| 808 | 817 |
| 809 const char* RootInlineBox::boxName() const { | 818 const char* RootInlineBox::boxName() const { |
| 810 return "RootInlineBox"; | 819 return "RootInlineBox"; |
| 811 } | 820 } |
| 812 | 821 |
| 813 } // namespace blink | 822 } // namespace blink |
| OLD | NEW |