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/SVGInlineTextBoxPainter.h" | 5 #include "core/paint/SVGInlineTextBoxPainter.h" |
6 | 6 |
7 #include "core/editing/Editor.h" | 7 #include "core/editing/Editor.h" |
8 #include "core/editing/markers/DocumentMarkerController.h" | 8 #include "core/editing/markers/DocumentMarkerController.h" |
9 #include "core/editing/markers/RenderedDocumentMarker.h" | 9 #include "core/editing/markers/RenderedDocumentMarker.h" |
10 #include "core/frame/LocalFrame.h" | 10 #include "core/frame/LocalFrame.h" |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 } else { | 98 } else { |
99 selectionStyle = &style; | 99 selectionStyle = &style; |
100 } | 100 } |
101 } | 101 } |
102 | 102 |
103 if (paintInfo.isRenderingClipPathAsMaskImage()) { | 103 if (paintInfo.isRenderingClipPathAsMaskImage()) { |
104 hasFill = true; | 104 hasFill = true; |
105 hasVisibleStroke = false; | 105 hasVisibleStroke = false; |
106 } | 106 } |
107 | 107 |
108 AffineTransform fragmentTransform; | |
109 unsigned textFragmentsSize = m_svgInlineTextBox.textFragments().size(); | 108 unsigned textFragmentsSize = m_svgInlineTextBox.textFragments().size(); |
110 for (unsigned i = 0; i < textFragmentsSize; ++i) { | 109 for (unsigned i = 0; i < textFragmentsSize; ++i) { |
111 const SVGTextFragment& fragment = m_svgInlineTextBox.textFragments().at(
i); | 110 const SVGTextFragment& fragment = m_svgInlineTextBox.textFragments().at(
i); |
112 | 111 |
113 GraphicsContextStateSaver stateSaver(paintInfo.context, false); | 112 GraphicsContextStateSaver stateSaver(paintInfo.context, false); |
114 if (fragment.isTransformed()) { | 113 if (fragment.isTransformed()) { |
115 fragment.buildFragmentTransform(fragmentTransform); | |
116 stateSaver.save(); | 114 stateSaver.save(); |
117 paintInfo.context.concatCTM(fragmentTransform); | 115 paintInfo.context.concatCTM(fragment.buildFragmentTransform()); |
118 } | 116 } |
119 | 117 |
120 // Spec: All text decorations except line-through should be drawn before
the text is filled and stroked; thus, the text is rendered on top of these deco
rations. | 118 // Spec: All text decorations except line-through should be drawn before
the text is filled and stroked; thus, the text is rendered on top of these deco
rations. |
121 unsigned decorations = style.textDecorationsInEffect(); | 119 unsigned decorations = style.textDecorationsInEffect(); |
122 if (decorations & TextDecorationUnderline) | 120 if (decorations & TextDecorationUnderline) |
123 paintDecoration(paintInfo, TextDecorationUnderline, fragment); | 121 paintDecoration(paintInfo, TextDecorationUnderline, fragment); |
124 if (decorations & TextDecorationOverline) | 122 if (decorations & TextDecorationOverline) |
125 paintDecoration(paintInfo, TextDecorationOverline, fragment); | 123 paintDecoration(paintInfo, TextDecorationOverline, fragment); |
126 | 124 |
127 for (int i = 0; i < 3; i++) { | 125 for (int i = 0; i < 3; i++) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 | 163 |
166 LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutPai
ntShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem())); | 164 LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutPai
ntShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem())); |
167 if (!textShouldBePainted(textLayoutObject)) | 165 if (!textShouldBePainted(textLayoutObject)) |
168 return; | 166 return; |
169 | 167 |
170 const ComputedStyle& style = m_svgInlineTextBox.parent()->lineLayoutItem().s
tyleRef(); | 168 const ComputedStyle& style = m_svgInlineTextBox.parent()->lineLayoutItem().s
tyleRef(); |
171 | 169 |
172 int startPosition, endPosition; | 170 int startPosition, endPosition; |
173 m_svgInlineTextBox.selectionStartEnd(startPosition, endPosition); | 171 m_svgInlineTextBox.selectionStartEnd(startPosition, endPosition); |
174 | 172 |
175 AffineTransform fragmentTransform; | |
176 const Vector<SVGTextFragmentWithRange> fragmentInfoList = collectFragmentsIn
Range(startPosition, endPosition); | 173 const Vector<SVGTextFragmentWithRange> fragmentInfoList = collectFragmentsIn
Range(startPosition, endPosition); |
177 for (const SVGTextFragmentWithRange& fragmentWithRange : fragmentInfoList) { | 174 for (const SVGTextFragmentWithRange& fragmentWithRange : fragmentInfoList) { |
178 const SVGTextFragment& fragment = fragmentWithRange.fragment; | 175 const SVGTextFragment& fragment = fragmentWithRange.fragment; |
179 GraphicsContextStateSaver stateSaver(paintInfo.context); | 176 GraphicsContextStateSaver stateSaver(paintInfo.context); |
180 if (fragment.isTransformed()) { | 177 if (fragment.isTransformed()) |
181 fragment.buildFragmentTransform(fragmentTransform); | 178 paintInfo.context.concatCTM(fragment.buildFragmentTransform()); |
182 paintInfo.context.concatCTM(fragmentTransform); | |
183 } | |
184 | 179 |
185 paintInfo.context.setFillColor(backgroundColor); | 180 paintInfo.context.setFillColor(backgroundColor); |
186 paintInfo.context.fillRect(m_svgInlineTextBox.selectionRectForTextFragme
nt(fragment, fragmentWithRange.startPosition, fragmentWithRange.endPosition, sty
le), backgroundColor); | 181 paintInfo.context.fillRect(m_svgInlineTextBox.selectionRectForTextFragme
nt(fragment, fragmentWithRange.startPosition, fragmentWithRange.endPosition, sty
le), backgroundColor); |
187 } | 182 } |
188 } | 183 } |
189 | 184 |
190 static inline LayoutObject* findLayoutObjectDefininingTextDecoration(InlineFlowB
ox* parentBox) | 185 static inline LayoutObject* findLayoutObjectDefininingTextDecoration(InlineFlowB
ox* parentBox) |
191 { | 186 { |
192 // Lookup first layout object in parent hierarchy which has text-decoration
set. | 187 // Lookup first layout object in parent hierarchy which has text-decoration
set. |
193 LayoutObject* layoutObject = 0; | 188 LayoutObject* layoutObject = 0; |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 fillPaint.setAntiAlias(true); | 462 fillPaint.setAntiAlias(true); |
468 | 463 |
469 SkPaint strokePaint; | 464 SkPaint strokePaint; |
470 bool shouldPaintStroke = false; | 465 bool shouldPaintStroke = false; |
471 if (setupTextPaint(paintInfo, style, ApplyToStrokeMode, strokePaint)) { | 466 if (setupTextPaint(paintInfo, style, ApplyToStrokeMode, strokePaint)) { |
472 shouldPaintStroke = true; | 467 shouldPaintStroke = true; |
473 strokePaint.setLooper(nullptr); | 468 strokePaint.setLooper(nullptr); |
474 strokePaint.setColor(textColor.rgb()); | 469 strokePaint.setColor(textColor.rgb()); |
475 } | 470 } |
476 | 471 |
477 AffineTransform fragmentTransform; | |
478 for (const SVGTextFragmentWithRange& textMatchInfo : textMatchInfoList) { | 472 for (const SVGTextFragmentWithRange& textMatchInfo : textMatchInfoList) { |
479 const SVGTextFragment& fragment = textMatchInfo.fragment; | 473 const SVGTextFragment& fragment = textMatchInfo.fragment; |
480 GraphicsContextStateSaver stateSaver(paintInfo.context); | 474 GraphicsContextStateSaver stateSaver(paintInfo.context); |
481 if (fragment.isTransformed()) { | 475 if (fragment.isTransformed()) |
482 fragment.buildFragmentTransform(fragmentTransform); | 476 paintInfo.context.concatCTM(fragment.buildFragmentTransform()); |
483 paintInfo.context.concatCTM(fragmentTransform); | |
484 } | |
485 | 477 |
486 TextRun textRun = m_svgInlineTextBox.constructTextRun(style, fragment); | 478 TextRun textRun = m_svgInlineTextBox.constructTextRun(style, fragment); |
487 paintText(paintInfo, textRun, fragment, textMatchInfo.startPosition, tex
tMatchInfo.endPosition, fillPaint); | 479 paintText(paintInfo, textRun, fragment, textMatchInfo.startPosition, tex
tMatchInfo.endPosition, fillPaint); |
488 if (shouldPaintStroke) | 480 if (shouldPaintStroke) |
489 paintText(paintInfo, textRun, fragment, textMatchInfo.startPosition,
textMatchInfo.endPosition, strokePaint); | 481 paintText(paintInfo, textRun, fragment, textMatchInfo.startPosition,
textMatchInfo.endPosition, strokePaint); |
490 } | 482 } |
491 } | 483 } |
492 | 484 |
493 void SVGInlineTextBoxPainter::paintTextMatchMarkerBackground(const PaintInfo& pa
intInfo, const LayoutPoint& point, DocumentMarker* marker, const ComputedStyle&
style, const Font& font) | 485 void SVGInlineTextBoxPainter::paintTextMatchMarkerBackground(const PaintInfo& pa
intInfo, const LayoutPoint& point, DocumentMarker* marker, const ComputedStyle&
style, const Font& font) |
494 { | 486 { |
495 const Vector<SVGTextFragmentWithRange> textMatchInfoList = collectTextMatche
s(marker); | 487 const Vector<SVGTextFragmentWithRange> textMatchInfoList = collectTextMatche
s(marker); |
496 if (textMatchInfoList.isEmpty()) | 488 if (textMatchInfoList.isEmpty()) |
497 return; | 489 return; |
498 | 490 |
499 Color color = LayoutTheme::theme().platformTextSearchHighlightColor(marker->
activeMatch()); | 491 Color color = LayoutTheme::theme().platformTextSearchHighlightColor(marker->
activeMatch()); |
500 AffineTransform fragmentTransform; | |
501 for (const SVGTextFragmentWithRange& textMatchInfo : textMatchInfoList) { | 492 for (const SVGTextFragmentWithRange& textMatchInfo : textMatchInfoList) { |
502 const SVGTextFragment& fragment = textMatchInfo.fragment; | 493 const SVGTextFragment& fragment = textMatchInfo.fragment; |
503 | 494 |
504 GraphicsContextStateSaver stateSaver(paintInfo.context, false); | 495 GraphicsContextStateSaver stateSaver(paintInfo.context, false); |
505 if (fragment.isTransformed()) { | 496 if (fragment.isTransformed()) { |
506 stateSaver.save(); | 497 stateSaver.save(); |
507 fragment.buildFragmentTransform(fragmentTransform); | 498 paintInfo.context.concatCTM(fragment.buildFragmentTransform()); |
508 paintInfo.context.concatCTM(fragmentTransform); | |
509 } | 499 } |
510 FloatRect fragmentRect = m_svgInlineTextBox.selectionRectForTextFragment
(fragment, textMatchInfo.startPosition, textMatchInfo.endPosition, style); | 500 FloatRect fragmentRect = m_svgInlineTextBox.selectionRectForTextFragment
(fragment, textMatchInfo.startPosition, textMatchInfo.endPosition, style); |
511 paintInfo.context.setFillColor(color); | 501 paintInfo.context.setFillColor(color); |
512 paintInfo.context.fillRect(fragmentRect); | 502 paintInfo.context.fillRect(fragmentRect); |
513 } | 503 } |
514 } | 504 } |
515 | 505 |
516 } // namespace blink | 506 } // namespace blink |
OLD | NEW |