Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(239)

Side by Side Diff: third_party/WebKit/Source/core/paint/SVGInlineTextBoxPainter.cpp

Issue 1468913002: Find In Page hides the text when text color matches text search hightlight color. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updating test case expectations Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "config.h" 5 #include "config.h"
6 #include "core/paint/SVGInlineTextBoxPainter.h" 6 #include "core/paint/SVGInlineTextBoxPainter.h"
7 7
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/editing/markers/RenderedDocumentMarker.h" 10 #include "core/editing/markers/RenderedDocumentMarker.h"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 if (!textShouldBePainted(textLayoutObject)) 57 if (!textShouldBePainted(textLayoutObject))
58 return; 58 return;
59 59
60 DisplayItem::Type displayItemType = DisplayItem::paintPhaseToDrawingType(pai ntInfo.phase); 60 DisplayItem::Type displayItemType = DisplayItem::paintPhaseToDrawingType(pai ntInfo.phase);
61 if (!DrawingRecorder::useCachedDrawingIfPossible(*paintInfo.context, m_svgIn lineTextBox, displayItemType)) { 61 if (!DrawingRecorder::useCachedDrawingIfPossible(*paintInfo.context, m_svgIn lineTextBox, displayItemType)) {
62 LayoutObject& parentLayoutObject = *LineLayoutPaintShim::layoutObjectFro m(m_svgInlineTextBox.parent()->lineLayoutItem()); 62 LayoutObject& parentLayoutObject = *LineLayoutPaintShim::layoutObjectFro m(m_svgInlineTextBox.parent()->lineLayoutItem());
63 const ComputedStyle& style = parentLayoutObject.styleRef(); 63 const ComputedStyle& style = parentLayoutObject.styleRef();
64 64
65 // TODO(chrishtr): passing the cull rect is incorrect. 65 // TODO(chrishtr): passing the cull rect is incorrect.
66 DrawingRecorder recorder(*paintInfo.context, m_svgInlineTextBox, display ItemType, FloatRect(paintInfo.cullRect().m_rect)); 66 DrawingRecorder recorder(*paintInfo.context, m_svgInlineTextBox, display ItemType, FloatRect(paintInfo.cullRect().m_rect));
67
67 InlineTextBoxPainter(m_svgInlineTextBox).paintDocumentMarkers( 68 InlineTextBoxPainter(m_svgInlineTextBox).paintDocumentMarkers(
68 paintInfo.context, paintOffset, style, 69 paintInfo, paintOffset, style,
69 textLayoutObject.scaledFont(), true); 70 textLayoutObject.scaledFont(), true);
70 71
71 if (!m_svgInlineTextBox.textFragments().isEmpty()) 72 if (!m_svgInlineTextBox.textFragments().isEmpty())
72 paintTextFragments(paintInfo, parentLayoutObject); 73 paintTextFragments(paintInfo, parentLayoutObject);
74
75 InlineTextBoxPainter(m_svgInlineTextBox).paintDocumentMarkers(
76 paintInfo, paintOffset, style,
77 textLayoutObject.scaledFont(), false);
73 } 78 }
74 } 79 }
75 80
76 void SVGInlineTextBoxPainter::paintTextFragments(const PaintInfo& paintInfo, Lay outObject& parentLayoutObject) 81 void SVGInlineTextBoxPainter::paintTextFragments(const PaintInfo& paintInfo, Lay outObject& parentLayoutObject)
77 { 82 {
78 const ComputedStyle& style = parentLayoutObject.styleRef(); 83 const ComputedStyle& style = parentLayoutObject.styleRef();
79 const SVGComputedStyle& svgStyle = style.svgStyle(); 84 const SVGComputedStyle& svgStyle = style.svgStyle();
80 85
81 bool hasFill = svgStyle.hasFill(); 86 bool hasFill = svgStyle.hasFill();
82 bool hasVisibleStroke = svgStyle.hasVisibleStroke(); 87 bool hasVisibleStroke = svgStyle.hasVisibleStroke();
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 StyleDifference diff; 399 StyleDifference diff;
395 diff.setNeedsPaintInvalidationObject(); 400 diff.setNeedsPaintInvalidationObject();
396 SVGResourcesCache::clientStyleChanged(LineLayoutPaintShim::layoutObjectF rom(m_svgInlineTextBox.parent()->lineLayoutItem()), diff, style); 401 SVGResourcesCache::clientStyleChanged(LineLayoutPaintShim::layoutObjectF rom(m_svgInlineTextBox.parent()->lineLayoutItem()), diff, style);
397 } 402 }
398 403
399 // Eventually draw text using regular style from the end position of the sel ection to the end of the current chunk part 404 // Eventually draw text using regular style from the end position of the sel ection to the end of the current chunk part
400 if (endPosition < static_cast<int>(fragment.length) && !paintSelectedTextOnl y) 405 if (endPosition < static_cast<int>(fragment.length) && !paintSelectedTextOnl y)
401 paintTextWithShadows(paintInfo, style, textRun, fragment, endPosition, f ragment.length, resourceMode); 406 paintTextWithShadows(paintInfo, style, textRun, fragment, endPosition, f ragment.length, resourceMode);
402 } 407 }
403 408
404 void SVGInlineTextBoxPainter::paintTextMatchMarker(GraphicsContext* context, con st LayoutPoint&, DocumentMarker* marker, const ComputedStyle& style, const Font& font) 409 void SVGInlineTextBoxPainter::paintTextMatchMarkerForeground(const PaintInfo& pa intInfo, const LayoutPoint& point, DocumentMarker* marker, const ComputedStyle& style, const Font& font)
405 { 410 {
406 // SVG is only interested in the TextMatch markers. 411 // SVG is only interested in the TextMatch markers.
pdr. 2015/12/14 22:53:26 This comment only says what the if statement below
ramya.v 2015/12/15 06:12:23 Done.
407 if (marker->type() != DocumentMarker::TextMatch) 412 if (marker->type() != DocumentMarker::TextMatch)
413 return;
414
415 LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutPai ntShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem()));
416
417 for (InlineTextBox* box = textLayoutObject.firstTextBox(); box; box = box->n extTextBox()) {
pdr. 2015/12/14 22:53:26 This code is too much copy & paste from SVGInlineT
ramya.v 2015/12/15 06:12:23 Done.
418 if (!box->isSVGInlineTextBox())
419 continue;
420
421 SVGInlineTextBox* textBox = toSVGInlineTextBox(box);
422
423 int markerStartPosition = std::max<int>(marker->startOffset() - textBox- >start(), 0);
424 int markerEndPosition = std::min<int>(marker->endOffset() - textBox->sta rt(), textBox->len());
425
426 if (markerStartPosition >= markerEndPosition)
427 continue;
428
429 const Vector<SVGTextFragment>& fragments = textBox->textFragments();
430 unsigned textFragmentsSize = fragments.size();
431 AffineTransform fragmentTransform;
432 for (unsigned i = 0; i < textFragmentsSize; ++i) {
433 const SVGTextFragment& fragment = fragments.at(i);
434
435 int fragmentStartPosition = markerStartPosition;
436 int fragmentEndPosition = markerEndPosition;
437 if (!textBox->mapStartEndPositionsIntoFragmentCoordinates(fragment, fragmentStartPosition, fragmentEndPosition))
438 continue;
439
440 if (LineLayoutPaintShim::layoutObjectFrom(m_svgInlineTextBox.lineLay outItem())->frame()->editor().markedTextMatchesAreHighlighted()) {
441 Color textColor = marker->activeMatch() ?
442 LayoutTheme::theme().platformTextSearchColor(true) :
443 LayoutTheme::theme().platformTextSearchColor(false);
444
445 GraphicsContextStateSaver stateSaver(*paintInfo.context, false);
446 fragment.buildFragmentTransform(fragmentTransform);
447 if (!fragmentTransform.isIdentity()) {
448 stateSaver.save();
449 paintInfo.context->concatCTM(fragmentTransform);
450 }
451
452 RefPtr<ComputedStyle> markerStyle = ComputedStyle::clone(style);
453 markerStyle->setFillPaintColor(textColor);
pdr. 2015/12/14 22:53:26 ComputedStyle is too big to be copying here. Can y
ramya.v 2015/12/15 06:12:23 I tried plumbing color through GraphicsContext usi
454 TextRun textRun = m_svgInlineTextBox.constructTextRun(*markerSty le, fragment);
455 paintTextWithShadows(paintInfo, *markerStyle, textRun, fragment, fragmentStartPosition, fragmentEndPosition, ApplyToFillMode);
456 }
457 }
458 }
459 }
460
461 void SVGInlineTextBoxPainter::paintTextMatchMarkerBackground(const PaintInfo& pa intInfo, const LayoutPoint& point, DocumentMarker* marker, const ComputedStyle& style, const Font& font)
462 {
463 // SVG is only interested in the TextMatch markers.
464 if (marker->type() != DocumentMarker::TextMatch)
408 return; 465 return;
409 466
410 LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutPai ntShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem())); 467 LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutPai ntShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem()));
411 468
412 AffineTransform fragmentTransform; 469 AffineTransform fragmentTransform;
413 for (InlineTextBox* box = textLayoutObject.firstTextBox(); box; box = box->n extTextBox()) { 470 for (InlineTextBox* box = textLayoutObject.firstTextBox(); box; box = box->n extTextBox()) {
414 if (!box->isSVGInlineTextBox()) 471 if (!box->isSVGInlineTextBox())
415 continue; 472 continue;
416 473
417 SVGInlineTextBox* textBox = toSVGInlineTextBox(box); 474 SVGInlineTextBox* textBox = toSVGInlineTextBox(box);
(...skipping 10 matching lines...) Expand all
428 const SVGTextFragment& fragment = fragments.at(i); 485 const SVGTextFragment& fragment = fragments.at(i);
429 486
430 int fragmentStartPosition = markerStartPosition; 487 int fragmentStartPosition = markerStartPosition;
431 int fragmentEndPosition = markerEndPosition; 488 int fragmentEndPosition = markerEndPosition;
432 if (!textBox->mapStartEndPositionsIntoFragmentCoordinates(fragment, fragmentStartPosition, fragmentEndPosition)) 489 if (!textBox->mapStartEndPositionsIntoFragmentCoordinates(fragment, fragmentStartPosition, fragmentEndPosition))
433 continue; 490 continue;
434 491
435 FloatRect fragmentRect = textBox->selectionRectForTextFragment(fragm ent, fragmentStartPosition, fragmentEndPosition, style); 492 FloatRect fragmentRect = textBox->selectionRectForTextFragment(fragm ent, fragmentStartPosition, fragmentEndPosition, style);
436 fragment.buildFragmentTransform(fragmentTransform); 493 fragment.buildFragmentTransform(fragmentTransform);
437 494
438 // Draw the marker highlight.
439 if (LineLayoutPaintShim::layoutObjectFrom(m_svgInlineTextBox.lineLay outItem())->frame()->editor().markedTextMatchesAreHighlighted()) { 495 if (LineLayoutPaintShim::layoutObjectFrom(m_svgInlineTextBox.lineLay outItem())->frame()->editor().markedTextMatchesAreHighlighted()) {
440 Color color = marker->activeMatch() ? 496 GraphicsContext* context = paintInfo.context;
441 LayoutTheme::theme().platformActiveTextSearchHighlightColor( ) :
442 LayoutTheme::theme().platformInactiveTextSearchHighlightColo r();
443 GraphicsContextStateSaver stateSaver(*context); 497 GraphicsContextStateSaver stateSaver(*context);
444 if (!fragmentTransform.isIdentity()) 498 if (!fragmentTransform.isIdentity())
445 context->concatCTM(fragmentTransform); 499 context->concatCTM(fragmentTransform);
500 Color color = marker->activeMatch() ?
501 LayoutTheme::theme().platformTextSearchHighlightColor(true) :
502 LayoutTheme::theme().platformTextSearchHighlightColor(false) ;
503
446 context->setFillColor(color); 504 context->setFillColor(color);
447 context->fillRect(fragmentRect, color); 505 context->fillRect(fragmentRect, color);
448 } 506 }
449 } 507 }
450 } 508 }
451 } 509 }
452 510
453 } // namespace blink 511 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698