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 83a42eecc02a4f4c41dd621161a7c034ac7bae10..f8b67fe85f9319a2dd69e92ffd586552872fc2e3 100644 |
--- a/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp |
+++ b/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp |
@@ -156,7 +156,7 @@ void InlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& |
// 1. Paint backgrounds behind text if needed. Examples of such backgrounds include selection |
// and composition highlights. |
if (paintInfo.phase != PaintPhaseSelection && paintInfo.phase != PaintPhaseTextClip && !isPrinting) { |
- paintDocumentMarkers(context, boxOrigin, styleToUse, font, true); |
+ paintDocumentMarkers(paintInfo, boxOrigin, styleToUse, font, DocumentMarkerPaintPhase::Background); |
if (haveSelection && !paintsCompositionMarkers(textBoxLayoutObject)) { |
if (combinedText) |
@@ -243,7 +243,7 @@ void InlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& |
} |
if (paintInfo.phase == PaintPhaseForeground) |
- paintDocumentMarkers(context, boxOrigin, styleToUse, font, false); |
+ paintDocumentMarkers(paintInfo, boxOrigin, styleToUse, font, DocumentMarkerPaintPhase::Foreground); |
if (shouldRotate) |
context.concatCTM(TextPainter::rotation(boxRect, TextPainter::Counterclockwise)); |
@@ -298,7 +298,7 @@ void InlineTextBoxPainter::paintSingleCompositionBackgroundRun(GraphicsContext& |
context.drawHighlightForText(font, m_inlineTextBox.constructTextRun(style, font), localOrigin, selHeight, backgroundColor, sPos, ePos); |
} |
-void InlineTextBoxPainter::paintDocumentMarkers(GraphicsContext& context, const LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& font, bool background) |
+void InlineTextBoxPainter::paintDocumentMarkers(const PaintInfo& paintInfo, const LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& font, DocumentMarkerPaintPhase markerPaintPhase) |
{ |
if (!m_inlineTextBox.lineLayoutItem().node()) |
return; |
@@ -315,13 +315,10 @@ void InlineTextBoxPainter::paintDocumentMarkers(GraphicsContext& context, const |
switch (marker->type()) { |
case DocumentMarker::Grammar: |
case DocumentMarker::Spelling: |
- if (background) |
+ if (markerPaintPhase == DocumentMarkerPaintPhase::Background) |
continue; |
break; |
case DocumentMarker::TextMatch: |
- if (!background) |
- continue; |
- break; |
case DocumentMarker::Composition: |
break; |
default: |
@@ -341,21 +338,24 @@ void InlineTextBoxPainter::paintDocumentMarkers(GraphicsContext& context, const |
// marker intersects this run. Paint it. |
switch (marker->type()) { |
case DocumentMarker::Spelling: |
- m_inlineTextBox.paintDocumentMarker(context, boxOrigin, marker, style, font, false); |
+ m_inlineTextBox.paintDocumentMarker(paintInfo.context, boxOrigin, marker, style, font, false); |
break; |
case DocumentMarker::Grammar: |
- m_inlineTextBox.paintDocumentMarker(context, boxOrigin, marker, style, font, true); |
+ m_inlineTextBox.paintDocumentMarker(paintInfo.context, boxOrigin, marker, style, font, true); |
break; |
case DocumentMarker::TextMatch: |
- m_inlineTextBox.paintTextMatchMarker(context, boxOrigin, marker, style, font); |
+ if (markerPaintPhase == DocumentMarkerPaintPhase::Background) |
+ m_inlineTextBox.paintTextMatchMarkerBackground(paintInfo, boxOrigin, marker, style, font); |
+ else |
+ m_inlineTextBox.paintTextMatchMarkerForeground(paintInfo, boxOrigin, marker, style, font); |
break; |
case DocumentMarker::Composition: |
{ |
CompositionUnderline underline(marker->startOffset(), marker->endOffset(), marker->underlineColor(), marker->thick(), marker->backgroundColor()); |
- if (background) |
- paintSingleCompositionBackgroundRun(context, boxOrigin, style, font, underline.backgroundColor, underlinePaintStart(underline), underlinePaintEnd(underline)); |
+ if (markerPaintPhase == DocumentMarkerPaintPhase::Background) |
+ paintSingleCompositionBackgroundRun(paintInfo.context, boxOrigin, style, font, underline.backgroundColor, underlinePaintStart(underline), underlinePaintEnd(underline)); |
else |
- paintCompositionUnderline(context, boxOrigin, underline); |
+ paintCompositionUnderline(paintInfo.context, boxOrigin, underline); |
} |
break; |
default: |
@@ -830,8 +830,36 @@ void InlineTextBoxPainter::paintCompositionUnderline(GraphicsContext& context, c |
context.drawLineForText(FloatPoint(boxOrigin.x() + start, (boxOrigin.y() + m_inlineTextBox.logicalHeight() - lineThickness).toFloat()), width, m_inlineTextBox.lineLayoutItem().document().printing()); |
} |
-void InlineTextBoxPainter::paintTextMatchMarker(GraphicsContext& context, const LayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle& style, const Font& font) |
+void InlineTextBoxPainter::paintTextMatchMarkerForeground(const PaintInfo& paintInfo, const LayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle& style, const Font& font) |
{ |
+ if (!LineLayoutPaintShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem())->frame()->editor().markedTextMatchesAreHighlighted()) |
+ return; |
+ |
+ // TODO(ramya.v): Extract this into a helper function and share many copies of this code. |
+ int sPos = std::max(marker->startOffset() - m_inlineTextBox.start(), (unsigned)0); |
+ int ePos = std::min(marker->endOffset() - m_inlineTextBox.start(), m_inlineTextBox.len()); |
+ TextRun run = m_inlineTextBox.constructTextRun(style, font); |
+ |
+ Color textColor = LayoutTheme::theme().platformTextSearchColor(marker->activeMatch()); |
+ if (style.visitedDependentColor(CSSPropertyColor) == textColor) |
+ return; |
+ TextPainter::Style textStyle; |
+ textStyle.currentColor = textStyle.fillColor = textStyle.strokeColor = textStyle.emphasisMarkColor = textColor; |
+ textStyle.strokeWidth = style.textStrokeWidth(); |
+ textStyle.shadow = 0; |
+ |
+ LayoutRect boxRect(boxOrigin, LayoutSize(m_inlineTextBox.logicalWidth(), m_inlineTextBox.logicalHeight())); |
+ LayoutPoint textOrigin(boxOrigin.x(), boxOrigin.y() + font.fontMetrics().ascent()); |
+ TextPainter textPainter(paintInfo.context, font, run, textOrigin, boxRect, m_inlineTextBox.isHorizontal()); |
+ |
+ textPainter.paint(sPos, ePos, m_inlineTextBox.len(), textStyle, 0); |
+} |
+ |
+void InlineTextBoxPainter::paintTextMatchMarkerBackground(const PaintInfo& paintInfo, const LayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle& style, const Font& font) |
+{ |
+ if (!LineLayoutPaintShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem())->frame()->editor().markedTextMatchesAreHighlighted()) |
+ return; |
+ |
// Use same y positioning and height as for selection, so that when the selection and this highlight are on |
// the same word there are no pieces sticking out. |
int deltaY = m_inlineTextBox.lineLayoutItem().style()->isFlippedLinesWritingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logicalBottom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop(); |
@@ -841,31 +869,11 @@ void InlineTextBoxPainter::paintTextMatchMarker(GraphicsContext& context, const |
int ePos = std::min(marker->endOffset() - m_inlineTextBox.start(), m_inlineTextBox.len()); |
TextRun run = m_inlineTextBox.constructTextRun(style, font); |
- // Optionally highlight the text |
- if (LineLayoutPaintShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem())->frame()->editor().markedTextMatchesAreHighlighted()) { |
- Color color = marker->activeMatch() ? |
- LayoutTheme::theme().platformActiveTextSearchHighlightColor() : |
- LayoutTheme::theme().platformInactiveTextSearchHighlightColor(); |
- GraphicsContextStateSaver stateSaver(context); |
- context.clip(FloatRect(boxOrigin.x().toFloat(), (boxOrigin.y() - deltaY).toFloat(), m_inlineTextBox.logicalWidth().toFloat(), selHeight)); |
- context.drawHighlightForText(font, run, FloatPoint(boxOrigin.x().toFloat(), (boxOrigin.y() - deltaY).toFloat()), selHeight, color, sPos, ePos); |
- |
- // Also Highlight the text with color:transparent |
- if (style.visitedDependentColor(CSSPropertyColor) == Color::transparent) { |
- int length = m_inlineTextBox.len(); |
- TextPainter::Style textStyle; |
- // When we use the text as a clip, we only care about the alpha, thus we make all the colors black. |
- textStyle.currentColor = textStyle.fillColor = textStyle.strokeColor = textStyle.emphasisMarkColor = Color::black; |
- textStyle.strokeWidth = style.textStrokeWidth(); |
- textStyle.shadow = 0; |
- |
- LayoutRect boxRect(boxOrigin, LayoutSize(m_inlineTextBox.logicalWidth(), m_inlineTextBox.logicalHeight())); |
- LayoutPoint textOrigin(boxOrigin.x(), boxOrigin.y() + font.fontMetrics().ascent()); |
- TextPainter textPainter(context, font, run, textOrigin, boxRect, m_inlineTextBox.isHorizontal()); |
- |
- textPainter.paint(sPos, ePos, length, textStyle, 0); |
- } |
- } |
+ Color color = LayoutTheme::theme().platformTextSearchHighlightColor(marker->activeMatch()); |
+ GraphicsContext& context = paintInfo.context; |
+ GraphicsContextStateSaver stateSaver(context); |
+ context.clip(FloatRect(boxOrigin.x().toFloat(), (boxOrigin.y() - deltaY).toFloat(), m_inlineTextBox.logicalWidth().toFloat(), selHeight)); |
+ context.drawHighlightForText(font, run, FloatPoint(boxOrigin.x().toFloat(), (boxOrigin.y() - deltaY).toFloat()), selHeight, color, sPos, ePos); |
} |