Chromium Code Reviews| Index: third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp |
| diff --git a/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp b/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp |
| index dc43e47483fb687fbfd339963b5c0958b12172b1..de1fabe6f0dab5efe38ee611408de0e0453b19a5 100644 |
| --- a/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp |
| +++ b/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp |
| @@ -265,15 +265,31 @@ bool InlineTextBoxPainter::shouldPaintTextBox(const PaintInfo& paintInfo) |
| unsigned InlineTextBoxPainter::underlinePaintStart(const CompositionUnderline& underline) |
| { |
| - return std::max(static_cast<unsigned>(m_inlineTextBox.start()), underline.startOffset); |
| + DCHECK(m_inlineTextBox.truncation() != cFullTruncation); |
| + DCHECK(m_inlineTextBox.len()); |
| + |
| + // Start painting at the beginning of the text or the specified underline |
| + // start offset, whichever is higher. |
| + unsigned paintStart = std::max(m_inlineTextBox.start(), underline.startOffset); |
| + // Cap the maximum paint start to (if no truncation) the last character, |
| + // else the last character before the truncation ellipsis. |
| + return std::min(paintStart, (m_inlineTextBox.truncation() == cNoTruncation) ? |
| + m_inlineTextBox.end() : m_inlineTextBox.start() + m_inlineTextBox.truncation() - 1); |
|
kojii
2016/09/14 05:21:31
Is this safe when truncation() is 0? Maybe it'd ne
wkorman
2016/09/14 19:34:47
It should not occur, let's see:
- m_truncation is
|
| } |
| unsigned InlineTextBoxPainter::underlinePaintEnd(const CompositionUnderline& underline) |
| { |
| + DCHECK(m_inlineTextBox.truncation() != cFullTruncation); |
| + DCHECK(m_inlineTextBox.len()); |
| + |
| + // End painting just past the end of the text or the specified underline end |
| + // offset, whichever is lower. |
| unsigned paintEnd = std::min(m_inlineTextBox.end() + 1, underline.endOffset); // end() points at the last char, not past it. |
| - if (m_inlineTextBox.truncation() != cNoTruncation) |
| - paintEnd = std::min(paintEnd, static_cast<unsigned>(m_inlineTextBox.start() + m_inlineTextBox.truncation())); |
| - return paintEnd; |
| + // Cap the maximum paint end to (if no truncation) one past the last |
| + // character, else one past the last character before the truncation |
| + // ellipsis. |
| + return std::min(paintEnd, (m_inlineTextBox.truncation() == cNoTruncation) ? |
| + m_inlineTextBox.end() + 1 : m_inlineTextBox.start() + m_inlineTextBox.truncation()); |
| } |
| void InlineTextBoxPainter::paintSingleCompositionBackgroundRun(GraphicsContext& context, const LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& font, Color backgroundColor, int startPos, int endPos) |
| @@ -297,6 +313,9 @@ void InlineTextBoxPainter::paintDocumentMarkers(const PaintInfo& paintInfo, cons |
| if (!m_inlineTextBox.getLineLayoutItem().node()) |
| return; |
| + DCHECK(m_inlineTextBox.truncation() != cFullTruncation); |
| + DCHECK(m_inlineTextBox.len()); |
| + |
| DocumentMarkerVector markers = m_inlineTextBox.getLineLayoutItem().document().markers().markersFor(m_inlineTextBox.getLineLayoutItem().node()); |
| DocumentMarkerVector::const_iterator markerIt = markers.begin(); |
| @@ -461,7 +480,6 @@ void InlineTextBoxPainter::paintSelection(GraphicsContext& context, const Layout |
| } |
| StringView string(m_inlineTextBox.getLineLayoutItem().text(), start, static_cast<unsigned>(length)); |
| - |
| StringBuilder charactersWithHyphen; |
| bool respectHyphen = ePos == length && m_inlineTextBox.hasHyphen(); |
| TextRun textRun = m_inlineTextBox.constructTextRun(style, string, m_inlineTextBox.getLineLayoutItem().textLength() - m_inlineTextBox.start(), respectHyphen ? &charactersWithHyphen : 0); |
| @@ -799,18 +817,22 @@ void InlineTextBoxPainter::paintCompositionUnderline(GraphicsContext& context, c |
| unsigned paintStart = underlinePaintStart(underline); |
| unsigned paintEnd = underlinePaintEnd(underline); |
| + DCHECK_LT(paintStart, paintEnd); |
| // start of line to draw |
| - float start = paintStart == static_cast<unsigned>(m_inlineTextBox.start()) ? 0 : |
| + float start = paintStart == m_inlineTextBox.start() ? 0 : |
| m_inlineTextBox.getLineLayoutItem().width(m_inlineTextBox.start(), paintStart - m_inlineTextBox.start(), m_inlineTextBox.textPos(), m_inlineTextBox.isLeftToRightDirection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle()); |
| // how much line to draw |
| float width; |
| bool ltr = m_inlineTextBox.isLeftToRightDirection(); |
| bool flowIsLTR = m_inlineTextBox.getLineLayoutItem().style()->isLeftToRightDirection(); |
| - if (paintStart == static_cast<unsigned>(m_inlineTextBox.start()) && paintEnd == static_cast<unsigned>(m_inlineTextBox.end()) + 1) { |
| + if (paintStart == m_inlineTextBox.start() && paintEnd == m_inlineTextBox.end() + 1) { |
| width = m_inlineTextBox.logicalWidth().toFloat(); |
| } else { |
| - width = m_inlineTextBox.getLineLayoutItem().width(ltr == flowIsLTR ? paintStart : paintEnd, ltr == flowIsLTR ? paintEnd - paintStart : m_inlineTextBox.len() - paintEnd, LayoutUnit(m_inlineTextBox.textPos() + start), flowIsLTR ? LTR : RTL, m_inlineTextBox.isFirstLineStyle()); |
| + unsigned paintFrom = ltr == flowIsLTR ? paintStart : paintEnd; |
| + unsigned paintLength = ltr == flowIsLTR ? paintEnd - paintStart : m_inlineTextBox.start() + m_inlineTextBox.len() - paintEnd; |
| + width = m_inlineTextBox.getLineLayoutItem().width(paintFrom, paintLength, |
| + LayoutUnit(m_inlineTextBox.textPos() + start), flowIsLTR ? LTR : RTL, m_inlineTextBox.isFirstLineStyle()); |
| } |
| // In RTL mode, start and width are computed from the right end of the text box: |
| // starting at |logicalWidth| - |start| and continuing left by |width| to |
| @@ -819,7 +841,6 @@ void InlineTextBoxPainter::paintCompositionUnderline(GraphicsContext& context, c |
| if (!flowIsLTR) |
| start = m_inlineTextBox.logicalWidth().toFloat() - width - start; |
| - |
| // Thick marked text underlines are 2px thick as long as there is room for the 2px line under the baseline. |
| // All other marked text underlines are 1px thick. |
| // If there's not enough space the underline will touch or overlap characters. |
| @@ -881,5 +902,4 @@ void InlineTextBoxPainter::paintTextMatchMarkerBackground(const PaintInfo& paint |
| context.drawHighlightForText(font, run, FloatPoint(boxOrigin), boxRect.height().toInt(), color, sPos, ePos); |
| } |
| - |
| } // namespace blink |