| OLD | NEW |
| 1 /* | 1 /* |
| 2 * (C) 1999 Lars Knoll (knoll@kde.org) | 2 * (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 2000 Dirk Mueller (mueller@kde.org) | 3 * (C) 2000 Dirk Mueller (mueller@kde.org) |
| 4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. | 4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights 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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 return 0; | 117 return 0; |
| 118 if (renderer().isBR()) | 118 if (renderer().isBR()) |
| 119 return toRenderBR(renderer()).lineHeight(isFirstLineStyle()); | 119 return toRenderBR(renderer()).lineHeight(isFirstLineStyle()); |
| 120 if (parent()->renderer() == renderer().parent()) | 120 if (parent()->renderer() == renderer().parent()) |
| 121 return parent()->lineHeight(); | 121 return parent()->lineHeight(); |
| 122 return toRenderBoxModelObject(renderer().parent())->lineHeight(isFirstLineSt
yle(), isHorizontal() ? HorizontalLine : VerticalLine, PositionOnContainingLine)
; | 122 return toRenderBoxModelObject(renderer().parent())->lineHeight(isFirstLineSt
yle(), isHorizontal() ? HorizontalLine : VerticalLine, PositionOnContainingLine)
; |
| 123 } | 123 } |
| 124 | 124 |
| 125 LayoutUnit InlineTextBox::selectionTop() | 125 LayoutUnit InlineTextBox::selectionTop() |
| 126 { | 126 { |
| 127 return root()->selectionTop(); | 127 return root().selectionTop(); |
| 128 } | 128 } |
| 129 | 129 |
| 130 LayoutUnit InlineTextBox::selectionBottom() | 130 LayoutUnit InlineTextBox::selectionBottom() |
| 131 { | 131 { |
| 132 return root()->selectionBottom(); | 132 return root().selectionBottom(); |
| 133 } | 133 } |
| 134 | 134 |
| 135 LayoutUnit InlineTextBox::selectionHeight() | 135 LayoutUnit InlineTextBox::selectionHeight() |
| 136 { | 136 { |
| 137 return root()->selectionHeight(); | 137 return root().selectionHeight(); |
| 138 } | 138 } |
| 139 | 139 |
| 140 bool InlineTextBox::isSelected(int startPos, int endPos) const | 140 bool InlineTextBox::isSelected(int startPos, int endPos) const |
| 141 { | 141 { |
| 142 int sPos = max(startPos - m_start, 0); | 142 int sPos = max(startPos - m_start, 0); |
| 143 // The position after a hard line break is considered to be past its end. | 143 // The position after a hard line break is considered to be past its end. |
| 144 // See the corresponding code in InlineTextBox::selectionState. | 144 // See the corresponding code in InlineTextBox::selectionState. |
| 145 int ePos = min(endPos - m_start, int(m_len) + (isLineBreak() ? 0 : 1)); | 145 int ePos = min(endPos - m_start, int(m_len) + (isLineBreak() ? 0 : 1)); |
| 146 return (sPos < ePos); | 146 return (sPos < ePos); |
| 147 } | 147 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 167 else if (end) | 167 else if (end) |
| 168 state = RenderObject::SelectionEnd; | 168 state = RenderObject::SelectionEnd; |
| 169 else if ((state == RenderObject::SelectionEnd || startPos < m_start) && | 169 else if ((state == RenderObject::SelectionEnd || startPos < m_start) && |
| 170 (state == RenderObject::SelectionStart || endPos > lastSelectab
le)) | 170 (state == RenderObject::SelectionStart || endPos > lastSelectab
le)) |
| 171 state = RenderObject::SelectionInside; | 171 state = RenderObject::SelectionInside; |
| 172 else if (state == RenderObject::SelectionBoth) | 172 else if (state == RenderObject::SelectionBoth) |
| 173 state = RenderObject::SelectionNone; | 173 state = RenderObject::SelectionNone; |
| 174 } | 174 } |
| 175 | 175 |
| 176 // If there are ellipsis following, make sure their selection is updated. | 176 // If there are ellipsis following, make sure their selection is updated. |
| 177 if (m_truncation != cNoTruncation && root()->ellipsisBox()) { | 177 if (m_truncation != cNoTruncation && root().ellipsisBox()) { |
| 178 EllipsisBox* ellipsis = root()->ellipsisBox(); | 178 EllipsisBox* ellipsis = root().ellipsisBox(); |
| 179 if (state != RenderObject::SelectionNone) { | 179 if (state != RenderObject::SelectionNone) { |
| 180 int start, end; | 180 int start, end; |
| 181 selectionStartEnd(start, end); | 181 selectionStartEnd(start, end); |
| 182 // The ellipsis should be considered to be selected if the end of | 182 // The ellipsis should be considered to be selected if the end of |
| 183 // the selection is past the beginning of the truncation and the | 183 // the selection is past the beginning of the truncation and the |
| 184 // beginning of the selection is before or at the beginning of the | 184 // beginning of the selection is before or at the beginning of the |
| 185 // truncation. | 185 // truncation. |
| 186 ellipsis->setSelectionState(end >= m_truncation && start <= m_trunca
tion ? | 186 ellipsis->setSelectionState(end >= m_truncation && start <= m_trunca
tion ? |
| 187 RenderObject::SelectionInside : RenderObject::SelectionNone); | 187 RenderObject::SelectionInside : RenderObject::SelectionNone); |
| 188 } else | 188 } else |
| (...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 | 838 |
| 839 if (string.length() != static_cast<unsigned>(length) || m_start) | 839 if (string.length() != static_cast<unsigned>(length) || m_start) |
| 840 string.narrow(m_start, length); | 840 string.narrow(m_start, length); |
| 841 | 841 |
| 842 StringBuilder charactersWithHyphen; | 842 StringBuilder charactersWithHyphen; |
| 843 bool respectHyphen = ePos == length && hasHyphen(); | 843 bool respectHyphen = ePos == length && hasHyphen(); |
| 844 TextRun textRun = constructTextRun(style, font, string, textRenderer().textL
ength() - m_start, respectHyphen ? &charactersWithHyphen : 0); | 844 TextRun textRun = constructTextRun(style, font, string, textRenderer().textL
ength() - m_start, respectHyphen ? &charactersWithHyphen : 0); |
| 845 if (respectHyphen) | 845 if (respectHyphen) |
| 846 ePos = textRun.length(); | 846 ePos = textRun.length(); |
| 847 | 847 |
| 848 LayoutUnit selectionBottom = root()->selectionBottom(); | 848 LayoutUnit selectionBottom = root().selectionBottom(); |
| 849 LayoutUnit selectionTop = root()->selectionTopAdjustedForPrecedingBlock(); | 849 LayoutUnit selectionTop = root().selectionTopAdjustedForPrecedingBlock(); |
| 850 | 850 |
| 851 int deltaY = roundToInt(renderer().style()->isFlippedLinesWritingMode() ? se
lectionBottom - logicalBottom() : logicalTop() - selectionTop); | 851 int deltaY = roundToInt(renderer().style()->isFlippedLinesWritingMode() ? se
lectionBottom - logicalBottom() : logicalTop() - selectionTop); |
| 852 int selHeight = max(0, roundToInt(selectionBottom - selectionTop)); | 852 int selHeight = max(0, roundToInt(selectionBottom - selectionTop)); |
| 853 | 853 |
| 854 FloatPoint localOrigin(boxOrigin.x(), boxOrigin.y() - deltaY); | 854 FloatPoint localOrigin(boxOrigin.x(), boxOrigin.y() - deltaY); |
| 855 FloatRect clipRect(localOrigin, FloatSize(m_logicalWidth, selHeight)); | 855 FloatRect clipRect(localOrigin, FloatSize(m_logicalWidth, selHeight)); |
| 856 alignSelectionRectToDevicePixels(clipRect); | 856 alignSelectionRectToDevicePixels(clipRect); |
| 857 | 857 |
| 858 context->clip(clipRect); | 858 context->clip(clipRect); |
| 859 | 859 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 910 // Compute the gap between the font and the underline. Use at least one | 910 // Compute the gap between the font and the underline. Use at least one |
| 911 // pixel gap, if underline is thick then use a bigger gap. | 911 // pixel gap, if underline is thick then use a bigger gap. |
| 912 const int gap = std::max<int>(1, ceilf(textDecorationThickness / 2.f)); | 912 const int gap = std::max<int>(1, ceilf(textDecorationThickness / 2.f)); |
| 913 | 913 |
| 914 // FIXME: We support only horizontal text for now. | 914 // FIXME: We support only horizontal text for now. |
| 915 switch (underlinePosition) { | 915 switch (underlinePosition) { |
| 916 case TextUnderlinePositionAuto: | 916 case TextUnderlinePositionAuto: |
| 917 return fontMetrics.ascent() + gap; // Position underline near the alphab
etic baseline. | 917 return fontMetrics.ascent() + gap; // Position underline near the alphab
etic baseline. |
| 918 case TextUnderlinePositionUnder: { | 918 case TextUnderlinePositionUnder: { |
| 919 // Position underline relative to the under edge of the lowest element's
content box. | 919 // Position underline relative to the under edge of the lowest element's
content box. |
| 920 const float offset = inlineTextBox->root()->maxLogicalTop() - inlineText
Box->logicalTop(); | 920 const float offset = inlineTextBox->root().maxLogicalTop() - inlineTextB
ox->logicalTop(); |
| 921 if (offset > 0) | 921 if (offset > 0) |
| 922 return inlineTextBox->logicalHeight() + gap + offset; | 922 return inlineTextBox->logicalHeight() + gap + offset; |
| 923 return inlineTextBox->logicalHeight() + gap; | 923 return inlineTextBox->logicalHeight() + gap; |
| 924 } | 924 } |
| 925 } | 925 } |
| 926 | 926 |
| 927 ASSERT_NOT_REACHED(); | 927 ASSERT_NOT_REACHED(); |
| 928 return fontMetrics.ascent() + gap; | 928 return fontMetrics.ascent() + gap; |
| 929 } | 929 } |
| 930 | 930 |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1395 { | 1395 { |
| 1396 return m_start + m_len; | 1396 return m_start + m_len; |
| 1397 } | 1397 } |
| 1398 | 1398 |
| 1399 float InlineTextBox::textPos() const | 1399 float InlineTextBox::textPos() const |
| 1400 { | 1400 { |
| 1401 // When computing the width of a text run, RenderBlock::computeInlineDirecti
onPositionsForLine() doesn't include the actual offset | 1401 // When computing the width of a text run, RenderBlock::computeInlineDirecti
onPositionsForLine() doesn't include the actual offset |
| 1402 // from the containing block edge in its measurement. textPos() should be co
nsistent so the text are rendered in the same width. | 1402 // from the containing block edge in its measurement. textPos() should be co
nsistent so the text are rendered in the same width. |
| 1403 if (logicalLeft() == 0) | 1403 if (logicalLeft() == 0) |
| 1404 return 0; | 1404 return 0; |
| 1405 return logicalLeft() - root()->logicalLeft(); | 1405 return logicalLeft() - root().logicalLeft(); |
| 1406 } | 1406 } |
| 1407 | 1407 |
| 1408 int InlineTextBox::offsetForPosition(float lineOffset, bool includePartialGlyphs
) const | 1408 int InlineTextBox::offsetForPosition(float lineOffset, bool includePartialGlyphs
) const |
| 1409 { | 1409 { |
| 1410 if (isLineBreak()) | 1410 if (isLineBreak()) |
| 1411 return 0; | 1411 return 0; |
| 1412 | 1412 |
| 1413 if (lineOffset - logicalLeft() > logicalWidth()) | 1413 if (lineOffset - logicalLeft() > logicalWidth()) |
| 1414 return isLeftToRightDirection() ? len() : 0; | 1414 return isLeftToRightDirection() ? len() : 0; |
| 1415 if (lineOffset - logicalLeft() < 0) | 1415 if (lineOffset - logicalLeft() < 0) |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1554 printedCharacters = fprintf(stderr, "\t%s %p", obj.renderName(), &obj); | 1554 printedCharacters = fprintf(stderr, "\t%s %p", obj.renderName(), &obj); |
| 1555 const int rendererCharacterOffset = 24; | 1555 const int rendererCharacterOffset = 24; |
| 1556 for (; printedCharacters < rendererCharacterOffset; printedCharacters++) | 1556 for (; printedCharacters < rendererCharacterOffset; printedCharacters++) |
| 1557 fputc(' ', stderr); | 1557 fputc(' ', stderr); |
| 1558 fprintf(stderr, "(%d,%d) \"%s\"\n", start(), start() + len(), value.utf8().d
ata()); | 1558 fprintf(stderr, "(%d,%d) \"%s\"\n", start(), start() + len(), value.utf8().d
ata()); |
| 1559 } | 1559 } |
| 1560 | 1560 |
| 1561 #endif | 1561 #endif |
| 1562 | 1562 |
| 1563 } // namespace WebCore | 1563 } // namespace WebCore |
| OLD | NEW |