OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/paint/InlineTextBoxPainter.h" | 5 #include "core/paint/InlineTextBoxPainter.h" |
6 | 6 |
7 #include "core/editing/CompositionUnderline.h" | 7 #include "core/editing/CompositionUnderline.h" |
8 #include "core/editing/Editor.h" | 8 #include "core/editing/Editor.h" |
9 #include "core/editing/markers/DocumentMarkerController.h" | 9 #include "core/editing/markers/DocumentMarkerController.h" |
10 #include "core/frame/LocalFrame.h" | 10 #include "core/frame/LocalFrame.h" |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 | 104 |
105 LayoutPoint boxOrigin(m_inlineTextBox.locationIncludingFlipping()); | 105 LayoutPoint boxOrigin(m_inlineTextBox.locationIncludingFlipping()); |
106 boxOrigin.move(adjustedPaintOffset.x(), adjustedPaintOffset.y()); | 106 boxOrigin.move(adjustedPaintOffset.x(), adjustedPaintOffset.y()); |
107 LayoutRect boxRect(boxOrigin, LayoutSize(m_inlineTextBox.logicalWidth(), m_i
nlineTextBox.logicalHeight())); | 107 LayoutRect boxRect(boxOrigin, LayoutSize(m_inlineTextBox.logicalWidth(), m_i
nlineTextBox.logicalHeight())); |
108 | 108 |
109 int length = m_inlineTextBox.len(); | 109 int length = m_inlineTextBox.len(); |
110 StringView string = StringView(m_inlineTextBox.getLineLayoutItem().text(), m
_inlineTextBox.start(), length); | 110 StringView string = StringView(m_inlineTextBox.getLineLayoutItem().text(), m
_inlineTextBox.start(), length); |
111 int maximumLength = m_inlineTextBox.getLineLayoutItem().textLength() - m_inl
ineTextBox.start(); | 111 int maximumLength = m_inlineTextBox.getLineLayoutItem().textLength() - m_inl
ineTextBox.start(); |
112 | 112 |
113 StringBuilder charactersWithHyphen; | 113 StringBuilder charactersWithHyphen; |
114 TextRun textRun = m_inlineTextBox.constructTextRun(styleToUse, styleToUse.fo
nt(), string, maximumLength, m_inlineTextBox.hasHyphen() ? &charactersWithHyphen
: 0); | 114 TextRun textRun = m_inlineTextBox.constructTextRun(styleToUse, string, maxim
umLength, m_inlineTextBox.hasHyphen() ? &charactersWithHyphen : 0); |
115 if (m_inlineTextBox.hasHyphen()) | 115 if (m_inlineTextBox.hasHyphen()) |
116 length = textRun.length(); | 116 length = textRun.length(); |
117 | 117 |
118 bool shouldRotate = false; | 118 bool shouldRotate = false; |
119 LayoutTextCombine* combinedText = nullptr; | 119 LayoutTextCombine* combinedText = nullptr; |
120 if (!m_inlineTextBox.isHorizontal()) { | 120 if (!m_inlineTextBox.isHorizontal()) { |
121 if (styleToUse.hasTextCombine() && m_inlineTextBox.getLineLayoutItem().i
sCombineText()) { | 121 if (styleToUse.hasTextCombine() && m_inlineTextBox.getLineLayoutItem().i
sCombineText()) { |
122 combinedText = &toLayoutTextCombine(inlineLayoutObject()); | 122 combinedText = &toLayoutTextCombine(inlineLayoutObject()); |
123 if (!combinedText->isCombined()) | 123 if (!combinedText->isCombined()) |
124 combinedText = nullptr; | 124 combinedText = nullptr; |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 return; | 282 return; |
283 | 283 |
284 int sPos = std::max(startPos - static_cast<int>(m_inlineTextBox.start()), 0)
; | 284 int sPos = std::max(startPos - static_cast<int>(m_inlineTextBox.start()), 0)
; |
285 int ePos = std::min(endPos - static_cast<int>(m_inlineTextBox.start()), stat
ic_cast<int>(m_inlineTextBox.len())); | 285 int ePos = std::min(endPos - static_cast<int>(m_inlineTextBox.start()), stat
ic_cast<int>(m_inlineTextBox.len())); |
286 if (sPos >= ePos) | 286 if (sPos >= ePos) |
287 return; | 287 return; |
288 | 288 |
289 int deltaY = m_inlineTextBox.getLineLayoutItem().style()->isFlippedLinesWrit
ingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logicalBo
ttom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop(); | 289 int deltaY = m_inlineTextBox.getLineLayoutItem().style()->isFlippedLinesWrit
ingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logicalBo
ttom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop(); |
290 int selHeight = m_inlineTextBox.root().selectionHeight(); | 290 int selHeight = m_inlineTextBox.root().selectionHeight(); |
291 FloatPoint localOrigin(boxOrigin.x().toFloat(), boxOrigin.y().toFloat() - de
ltaY); | 291 FloatPoint localOrigin(boxOrigin.x().toFloat(), boxOrigin.y().toFloat() - de
ltaY); |
292 context.drawHighlightForText(font, m_inlineTextBox.constructTextRun(style, f
ont), localOrigin, selHeight, backgroundColor, sPos, ePos); | 292 context.drawHighlightForText(font, m_inlineTextBox.constructTextRun(style),
localOrigin, selHeight, backgroundColor, sPos, ePos); |
293 } | 293 } |
294 | 294 |
295 void InlineTextBoxPainter::paintDocumentMarkers(const PaintInfo& paintInfo, cons
t LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& font, Document
MarkerPaintPhase markerPaintPhase) | 295 void InlineTextBoxPainter::paintDocumentMarkers(const PaintInfo& paintInfo, cons
t LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& font, Document
MarkerPaintPhase markerPaintPhase) |
296 { | 296 { |
297 if (!m_inlineTextBox.getLineLayoutItem().node()) | 297 if (!m_inlineTextBox.getLineLayoutItem().node()) |
298 return; | 298 return; |
299 | 299 |
300 DocumentMarkerVector markers = m_inlineTextBox.getLineLayoutItem().document(
).markers().markersFor(m_inlineTextBox.getLineLayoutItem().node()); | 300 DocumentMarkerVector markers = m_inlineTextBox.getLineLayoutItem().document(
).markers().markersFor(m_inlineTextBox.getLineLayoutItem().node()); |
301 DocumentMarkerVector::const_iterator markerIt = markers.begin(); | 301 DocumentMarkerVector::const_iterator markerIt = markers.begin(); |
302 | 302 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 int startPosition = std::max<int>(marker->startOffset() - m_inlineTextBo
x.start(), 0); | 396 int startPosition = std::max<int>(marker->startOffset() - m_inlineTextBo
x.start(), 0); |
397 int endPosition = std::min<int>(marker->endOffset() - static_cast<int>(m
_inlineTextBox.start()), m_inlineTextBox.len()); | 397 int endPosition = std::min<int>(marker->endOffset() - static_cast<int>(m
_inlineTextBox.start()), m_inlineTextBox.len()); |
398 | 398 |
399 if (m_inlineTextBox.truncation() != cNoTruncation) | 399 if (m_inlineTextBox.truncation() != cNoTruncation) |
400 endPosition = std::min<int>(endPosition, m_inlineTextBox.truncation(
)); | 400 endPosition = std::min<int>(endPosition, m_inlineTextBox.truncation(
)); |
401 | 401 |
402 // Calculate start & width | 402 // Calculate start & width |
403 int deltaY = m_inlineTextBox.getLineLayoutItem().style()->isFlippedLines
WritingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logic
alBottom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop(
); | 403 int deltaY = m_inlineTextBox.getLineLayoutItem().style()->isFlippedLines
WritingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logic
alBottom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop(
); |
404 int selHeight = m_inlineTextBox.root().selectionHeight(); | 404 int selHeight = m_inlineTextBox.root().selectionHeight(); |
405 LayoutPoint startPoint(boxOrigin.x(), boxOrigin.y() - deltaY); | 405 LayoutPoint startPoint(boxOrigin.x(), boxOrigin.y() - deltaY); |
406 TextRun run = m_inlineTextBox.constructTextRun(style, font); | 406 TextRun run = m_inlineTextBox.constructTextRun(style); |
407 | 407 |
408 // FIXME: Convert the document markers to float rects. | 408 // FIXME: Convert the document markers to float rects. |
409 IntRect markerRect = enclosingIntRect(font.selectionRectForText(run, Flo
atPoint(startPoint), selHeight, startPosition, endPosition)); | 409 IntRect markerRect = enclosingIntRect(font.selectionRectForText(run, Flo
atPoint(startPoint), selHeight, startPosition, endPosition)); |
410 start = markerRect.x() - startPoint.x(); | 410 start = markerRect.x() - startPoint.x(); |
411 width = LayoutUnit(markerRect.width()); | 411 width = LayoutUnit(markerRect.width()); |
412 } | 412 } |
413 | 413 |
414 // IMPORTANT: The misspelling underline is not considered when calculating t
he text bounds, so we have to | 414 // IMPORTANT: The misspelling underline is not considered when calculating t
he text bounds, so we have to |
415 // make sure to fit within those bounds. This means the top pixel(s) of the
underline will overlap the | 415 // make sure to fit within those bounds. This means the top pixel(s) of the
underline will overlap the |
416 // bottom pixel(s) of the glyphs in smaller font sizes. The alternatives ar
e to increase the line spacing (bad!!) | 416 // bottom pixel(s) of the glyphs in smaller font sizes. The alternatives ar
e to increase the line spacing (bad!!) |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 if (textColor == c) | 449 if (textColor == c) |
450 c = Color(0xff - c.red(), 0xff - c.green(), 0xff - c.blue()); | 450 c = Color(0xff - c.red(), 0xff - c.green(), 0xff - c.blue()); |
451 | 451 |
452 // If the text is truncated, let the thing being painted in the truncation | 452 // If the text is truncated, let the thing being painted in the truncation |
453 // draw its own highlight. | 453 // draw its own highlight. |
454 int length = m_inlineTextBox.truncation() != cNoTruncation ? m_inlineTextBox
.truncation() : m_inlineTextBox.len(); | 454 int length = m_inlineTextBox.truncation() != cNoTruncation ? m_inlineTextBox
.truncation() : m_inlineTextBox.len(); |
455 StringView string(m_inlineTextBox.getLineLayoutItem().text(), m_inlineTextBo
x.start(), static_cast<unsigned>(length)); | 455 StringView string(m_inlineTextBox.getLineLayoutItem().text(), m_inlineTextBo
x.start(), static_cast<unsigned>(length)); |
456 | 456 |
457 StringBuilder charactersWithHyphen; | 457 StringBuilder charactersWithHyphen; |
458 bool respectHyphen = ePos == length && m_inlineTextBox.hasHyphen(); | 458 bool respectHyphen = ePos == length && m_inlineTextBox.hasHyphen(); |
459 TextRun textRun = m_inlineTextBox.constructTextRun(style, font, string, m_in
lineTextBox.getLineLayoutItem().textLength() - m_inlineTextBox.start(), respectH
yphen ? &charactersWithHyphen : 0); | 459 TextRun textRun = m_inlineTextBox.constructTextRun(style, string, m_inlineTe
xtBox.getLineLayoutItem().textLength() - m_inlineTextBox.start(), respectHyphen
? &charactersWithHyphen : 0); |
460 if (respectHyphen) | 460 if (respectHyphen) |
461 ePos = textRun.length(); | 461 ePos = textRun.length(); |
462 | 462 |
463 GraphicsContextStateSaver stateSaver(context); | 463 GraphicsContextStateSaver stateSaver(context); |
464 | 464 |
465 if (options == InlineTextBoxPainter::PaintOptions::CombinedText) { | 465 if (options == InlineTextBoxPainter::PaintOptions::CombinedText) { |
466 ASSERT(combinedText); | 466 ASSERT(combinedText); |
467 // We can't use the height of m_inlineTextBox because LayoutTextCombine'
s inlineTextBox is horizontal within vertical flow | 467 // We can't use the height of m_inlineTextBox because LayoutTextCombine'
s inlineTextBox is horizontal within vertical flow |
468 combinedText->transformToInlineCoordinates(context, boxRect, true); | 468 combinedText->transformToInlineCoordinates(context, boxRect, true); |
469 context.drawHighlightForText(font, textRun, FloatPoint(boxRect.location(
)), boxRect.height(), c, sPos, ePos); | 469 context.drawHighlightForText(font, textRun, FloatPoint(boxRect.location(
)), boxRect.height(), c, sPos, ePos); |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
829 } | 829 } |
830 | 830 |
831 void InlineTextBoxPainter::paintTextMatchMarkerForeground(const PaintInfo& paint
Info, const LayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle&
style, const Font& font) | 831 void InlineTextBoxPainter::paintTextMatchMarkerForeground(const PaintInfo& paint
Info, const LayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle&
style, const Font& font) |
832 { | 832 { |
833 if (!inlineLayoutObject().frame()->editor().markedTextMatchesAreHighlighted(
)) | 833 if (!inlineLayoutObject().frame()->editor().markedTextMatchesAreHighlighted(
)) |
834 return; | 834 return; |
835 | 835 |
836 // TODO(ramya.v): Extract this into a helper function and share many copies
of this code. | 836 // TODO(ramya.v): Extract this into a helper function and share many copies
of this code. |
837 int sPos = std::max(marker->startOffset() - m_inlineTextBox.start(), (unsign
ed)0); | 837 int sPos = std::max(marker->startOffset() - m_inlineTextBox.start(), (unsign
ed)0); |
838 int ePos = std::min(marker->endOffset() - m_inlineTextBox.start(), m_inlineT
extBox.len()); | 838 int ePos = std::min(marker->endOffset() - m_inlineTextBox.start(), m_inlineT
extBox.len()); |
839 TextRun run = m_inlineTextBox.constructTextRun(style, font); | 839 TextRun run = m_inlineTextBox.constructTextRun(style); |
840 | 840 |
841 Color textColor = LayoutTheme::theme().platformTextSearchColor(marker->activ
eMatch()); | 841 Color textColor = LayoutTheme::theme().platformTextSearchColor(marker->activ
eMatch()); |
842 if (style.visitedDependentColor(CSSPropertyColor) == textColor) | 842 if (style.visitedDependentColor(CSSPropertyColor) == textColor) |
843 return; | 843 return; |
844 TextPainter::Style textStyle; | 844 TextPainter::Style textStyle; |
845 textStyle.currentColor = textStyle.fillColor = textStyle.strokeColor = textS
tyle.emphasisMarkColor = textColor; | 845 textStyle.currentColor = textStyle.fillColor = textStyle.strokeColor = textS
tyle.emphasisMarkColor = textColor; |
846 textStyle.strokeWidth = style.textStrokeWidth(); | 846 textStyle.strokeWidth = style.textStrokeWidth(); |
847 textStyle.shadow = 0; | 847 textStyle.shadow = 0; |
848 | 848 |
849 LayoutRect boxRect(boxOrigin, LayoutSize(m_inlineTextBox.logicalWidth(), m_i
nlineTextBox.logicalHeight())); | 849 LayoutRect boxRect(boxOrigin, LayoutSize(m_inlineTextBox.logicalWidth(), m_i
nlineTextBox.logicalHeight())); |
850 LayoutPoint textOrigin(boxOrigin.x(), boxOrigin.y() + font.getFontMetrics().
ascent()); | 850 LayoutPoint textOrigin(boxOrigin.x(), boxOrigin.y() + font.getFontMetrics().
ascent()); |
851 TextPainter textPainter(paintInfo.context, font, run, textOrigin, boxRect, m
_inlineTextBox.isHorizontal()); | 851 TextPainter textPainter(paintInfo.context, font, run, textOrigin, boxRect, m
_inlineTextBox.isHorizontal()); |
852 | 852 |
853 textPainter.paint(sPos, ePos, m_inlineTextBox.len(), textStyle, 0); | 853 textPainter.paint(sPos, ePos, m_inlineTextBox.len(), textStyle, 0); |
854 } | 854 } |
855 | 855 |
856 void InlineTextBoxPainter::paintTextMatchMarkerBackground(const PaintInfo& paint
Info, const LayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle&
style, const Font& font) | 856 void InlineTextBoxPainter::paintTextMatchMarkerBackground(const PaintInfo& paint
Info, const LayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle&
style, const Font& font) |
857 { | 857 { |
858 if (!LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.getLineLayoutItem()
)->frame()->editor().markedTextMatchesAreHighlighted()) | 858 if (!LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.getLineLayoutItem()
)->frame()->editor().markedTextMatchesAreHighlighted()) |
859 return; | 859 return; |
860 | 860 |
861 int sPos = std::max(marker->startOffset() - m_inlineTextBox.start(), (unsign
ed)0); | 861 int sPos = std::max(marker->startOffset() - m_inlineTextBox.start(), (unsign
ed)0); |
862 int ePos = std::min(marker->endOffset() - m_inlineTextBox.start(), m_inlineT
extBox.len()); | 862 int ePos = std::min(marker->endOffset() - m_inlineTextBox.start(), m_inlineT
extBox.len()); |
863 TextRun run = m_inlineTextBox.constructTextRun(style, font); | 863 TextRun run = m_inlineTextBox.constructTextRun(style); |
864 | 864 |
865 Color color = LayoutTheme::theme().platformTextSearchHighlightColor(marker->
activeMatch()); | 865 Color color = LayoutTheme::theme().platformTextSearchHighlightColor(marker->
activeMatch()); |
866 GraphicsContext& context = paintInfo.context; | 866 GraphicsContext& context = paintInfo.context; |
867 GraphicsContextStateSaver stateSaver(context); | 867 GraphicsContextStateSaver stateSaver(context); |
868 | 868 |
869 LayoutRect boxRect(boxOrigin, LayoutSize(m_inlineTextBox.logicalWidth(), m_i
nlineTextBox.logicalHeight())); | 869 LayoutRect boxRect(boxOrigin, LayoutSize(m_inlineTextBox.logicalWidth(), m_i
nlineTextBox.logicalHeight())); |
870 context.clip(FloatRect(boxRect)); | 870 context.clip(FloatRect(boxRect)); |
871 context.drawHighlightForText(font, run, FloatPoint(boxOrigin), boxRect.heigh
t(), color, sPos, ePos); | 871 context.drawHighlightForText(font, run, FloatPoint(boxOrigin), boxRect.heigh
t(), color, sPos, ePos); |
872 } | 872 } |
873 | 873 |
874 | 874 |
875 } // namespace blink | 875 } // namespace blink |
OLD | NEW |