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

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

Issue 2753013004: Apply SVG styles paint-order, stroke-linejoin, and stroke-linecap on DOM text
Patch Set: Apply SVG styles paint-order, stroke-linejoin, and stroke-linecap on DOM text Created 3 years, 9 months 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 "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 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 } 135 }
136 } 136 }
137 137
138 void SVGInlineTextBoxPainter::paintTextFragments( 138 void SVGInlineTextBoxPainter::paintTextFragments(
139 const PaintInfo& paintInfo, 139 const PaintInfo& paintInfo,
140 LayoutObject& parentLayoutObject) { 140 LayoutObject& parentLayoutObject) {
141 const ComputedStyle& style = parentLayoutObject.styleRef(); 141 const ComputedStyle& style = parentLayoutObject.styleRef();
142 const SVGComputedStyle& svgStyle = style.svgStyle(); 142 const SVGComputedStyle& svgStyle = style.svgStyle();
143 143
144 bool hasFill = svgStyle.hasFill(); 144 bool hasFill = svgStyle.hasFill();
145 bool hasVisibleStroke = svgStyle.hasVisibleStroke(); 145 bool hasVisibleStroke = style.hasVisibleStroke();
146 146
147 const ComputedStyle* selectionStyle = &style; 147 const ComputedStyle* selectionStyle = &style;
148 bool shouldPaintSelection = this->shouldPaintSelection(paintInfo); 148 bool shouldPaintSelection = this->shouldPaintSelection(paintInfo);
149 if (shouldPaintSelection) { 149 if (shouldPaintSelection) {
150 selectionStyle = parentLayoutObject.getCachedPseudoStyle(PseudoIdSelection); 150 selectionStyle = parentLayoutObject.getCachedPseudoStyle(PseudoIdSelection);
151 if (selectionStyle) { 151 if (selectionStyle) {
152 const SVGComputedStyle& svgSelectionStyle = selectionStyle->svgStyle(); 152 const SVGComputedStyle& svgSelectionStyle = selectionStyle->svgStyle();
153 153
154 if (!hasFill) 154 if (!hasFill)
155 hasFill = svgSelectionStyle.hasFill(); 155 hasFill = svgSelectionStyle.hasFill();
156 if (!hasVisibleStroke) 156 if (!hasVisibleStroke)
157 hasVisibleStroke = svgSelectionStyle.hasVisibleStroke(); 157 hasVisibleStroke = selectionStyle->hasVisibleStroke();
158 } else { 158 } else {
159 selectionStyle = &style; 159 selectionStyle = &style;
160 } 160 }
161 } 161 }
162 162
163 if (paintInfo.isRenderingClipPathAsMaskImage()) { 163 if (paintInfo.isRenderingClipPathAsMaskImage()) {
164 hasFill = true; 164 hasFill = true;
165 hasVisibleStroke = false; 165 hasVisibleStroke = false;
166 } 166 }
167 167
(...skipping 13 matching lines...) Expand all
181 const Vector<AppliedTextDecoration>& decorations = 181 const Vector<AppliedTextDecoration>& decorations =
182 style.appliedTextDecorations(); 182 style.appliedTextDecorations();
183 for (const AppliedTextDecoration& decoration : decorations) { 183 for (const AppliedTextDecoration& decoration : decorations) {
184 if (decoration.lines() & TextDecorationUnderline) 184 if (decoration.lines() & TextDecorationUnderline)
185 paintDecoration(paintInfo, TextDecorationUnderline, fragment); 185 paintDecoration(paintInfo, TextDecorationUnderline, fragment);
186 if (decoration.lines() & TextDecorationOverline) 186 if (decoration.lines() & TextDecorationOverline)
187 paintDecoration(paintInfo, TextDecorationOverline, fragment); 187 paintDecoration(paintInfo, TextDecorationOverline, fragment);
188 } 188 }
189 189
190 for (int i = 0; i < 3; i++) { 190 for (int i = 0; i < 3; i++) {
191 switch (svgStyle.paintOrderType(i)) { 191 switch (style.paintOrderType(i)) {
192 case PT_FILL: 192 case PT_FILL:
193 if (hasFill) 193 if (hasFill)
194 paintText(paintInfo, style, *selectionStyle, fragment, 194 paintText(paintInfo, style, *selectionStyle, fragment,
195 ApplyToFillMode, shouldPaintSelection); 195 ApplyToFillMode, shouldPaintSelection);
196 break; 196 break;
197 case PT_STROKE: 197 case PT_STROKE:
198 if (hasVisibleStroke) 198 if (hasVisibleStroke)
199 paintText(paintInfo, style, *selectionStyle, fragment, 199 paintText(paintInfo, style, *selectionStyle, fragment,
200 ApplyToStrokeMode, shouldPaintSelection); 200 ApplyToStrokeMode, shouldPaintSelection);
201 break; 201 break;
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 FloatPoint decorationOrigin(fragment.x, 346 FloatPoint decorationOrigin(fragment.x,
347 fragment.y - decorationOffset / scalingFactor); 347 fragment.y - decorationOffset / scalingFactor);
348 348
349 Path path; 349 Path path;
350 path.addRect(FloatRect(decorationOrigin, 350 path.addRect(FloatRect(decorationOrigin,
351 FloatSize(fragment.width, thickness / scalingFactor))); 351 FloatSize(fragment.width, thickness / scalingFactor)));
352 352
353 const SVGComputedStyle& svgDecorationStyle = decorationStyle.svgStyle(); 353 const SVGComputedStyle& svgDecorationStyle = decorationStyle.svgStyle();
354 354
355 for (int i = 0; i < 3; i++) { 355 for (int i = 0; i < 3; i++) {
356 switch (svgDecorationStyle.paintOrderType(i)) { 356 switch (decorationStyle.paintOrderType(i)) {
357 case PT_FILL: 357 case PT_FILL:
358 if (svgDecorationStyle.hasFill()) { 358 if (svgDecorationStyle.hasFill()) {
359 PaintFlags fillFlags; 359 PaintFlags fillFlags;
360 if (!SVGPaintContext::paintForLayoutObject( 360 if (!SVGPaintContext::paintForLayoutObject(
361 paintInfo, decorationStyle, *decorationLayoutObject, 361 paintInfo, decorationStyle, *decorationLayoutObject,
362 ApplyToFillMode, fillFlags)) 362 ApplyToFillMode, fillFlags))
363 break; 363 break;
364 fillFlags.setAntiAlias(true); 364 fillFlags.setAntiAlias(true);
365 paintInfo.context.drawPath(path.getSkPath(), fillFlags); 365 paintInfo.context.drawPath(path.getSkPath(), fillFlags);
366 } 366 }
367 break; 367 break;
368 case PT_STROKE: 368 case PT_STROKE:
369 if (svgDecorationStyle.hasVisibleStroke()) { 369 if (decorationStyle.hasVisibleStroke()) {
370 PaintFlags strokeFlags; 370 PaintFlags strokeFlags;
371 if (!SVGPaintContext::paintForLayoutObject( 371 if (!SVGPaintContext::paintForLayoutObject(
372 paintInfo, decorationStyle, *decorationLayoutObject, 372 paintInfo, decorationStyle, *decorationLayoutObject,
373 ApplyToStrokeMode, strokeFlags)) 373 ApplyToStrokeMode, strokeFlags))
374 break; 374 break;
375 strokeFlags.setAntiAlias(true); 375 strokeFlags.setAntiAlias(true);
376 float strokeScaleFactor = 376 float strokeScaleFactor =
377 svgDecorationStyle.vectorEffect() == VE_NON_SCALING_STROKE 377 svgDecorationStyle.vectorEffect() == VE_NON_SCALING_STROKE
378 ? 1 / scalingFactor 378 ? 1 / scalingFactor
379 : 1; 379 : 1;
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 } 653 }
654 FloatRect fragmentRect = m_svgInlineTextBox.selectionRectForTextFragment( 654 FloatRect fragmentRect = m_svgInlineTextBox.selectionRectForTextFragment(
655 fragment, textMatchInfo.startPosition, textMatchInfo.endPosition, 655 fragment, textMatchInfo.startPosition, textMatchInfo.endPosition,
656 style); 656 style);
657 paintInfo.context.setFillColor(color); 657 paintInfo.context.setFillColor(color);
658 paintInfo.context.fillRect(fragmentRect); 658 paintInfo.context.fillRect(fragmentRect);
659 } 659 }
660 } 660 }
661 661
662 } // namespace blink 662 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698