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

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

Issue 889563002: Make RenderObject::style() return a const object (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Blind fix for Mac. Created 5 years, 10 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 | Annotate | Revision Log
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/dom/DocumentMarkerController.h" 8 #include "core/dom/DocumentMarkerController.h"
9 #include "core/dom/RenderedDocumentMarker.h" 9 #include "core/dom/RenderedDocumentMarker.h"
10 #include "core/editing/Editor.h" 10 #include "core/editing/Editor.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 // If we ever need that for SVG, it's very easy to refactor and reuse the co de. 49 // If we ever need that for SVG, it's very easy to refactor and reuse the co de.
50 50
51 if (paintInfo.phase == PaintPhaseSelection && !shouldPaintSelection()) 51 if (paintInfo.phase == PaintPhaseSelection && !shouldPaintSelection())
52 return; 52 return;
53 53
54 RenderSVGInlineText& textRenderer = toRenderSVGInlineText(m_svgInlineTextBox .renderer()); 54 RenderSVGInlineText& textRenderer = toRenderSVGInlineText(m_svgInlineTextBox .renderer());
55 if (!textShouldBePainted(textRenderer)) 55 if (!textShouldBePainted(textRenderer))
56 return; 56 return;
57 57
58 RenderObject& parentRenderer = m_svgInlineTextBox.parent()->renderer(); 58 RenderObject& parentRenderer = m_svgInlineTextBox.parent()->renderer();
59 RenderStyle* style = parentRenderer.style(); 59 const RenderStyle* style = parentRenderer.style();
60 ASSERT(style); 60 ASSERT(style);
61 61
62 InlineTextBoxPainter(m_svgInlineTextBox).paintDocumentMarkers( 62 InlineTextBoxPainter(m_svgInlineTextBox).paintDocumentMarkers(
63 paintInfo.context, FloatPoint(paintOffset), style, 63 paintInfo.context, FloatPoint(paintOffset), style,
64 textRenderer.scaledFont(), true); 64 textRenderer.scaledFont(), true);
65 65
66 if (!m_svgInlineTextBox.textFragments().isEmpty()) { 66 if (!m_svgInlineTextBox.textFragments().isEmpty()) {
67 RenderDrawingRecorder recorder(paintInfo.context, m_svgInlineTextBox.ren derer(), paintInfo.phase, paintInfo.rect); 67 RenderDrawingRecorder recorder(paintInfo.context, m_svgInlineTextBox.ren derer(), paintInfo.phase, paintInfo.rect);
68 if (!recorder.canUseCachedDrawing()) 68 if (!recorder.canUseCachedDrawing())
69 paintTextFragments(paintInfo, parentRenderer); 69 paintTextFragments(paintInfo, parentRenderer);
70 } 70 }
71 71
72 if (style->hasOutline() && parentRenderer.isRenderInline()) 72 if (style->hasOutline() && parentRenderer.isRenderInline())
73 InlinePainter(toRenderInline(parentRenderer)).paintOutline(paintInfo, pa intOffset); 73 InlinePainter(toRenderInline(parentRenderer)).paintOutline(paintInfo, pa intOffset);
74 } 74 }
75 75
76 void SVGInlineTextBoxPainter::paintTextFragments(const PaintInfo& paintInfo, Ren derObject& parentRenderer) 76 void SVGInlineTextBoxPainter::paintTextFragments(const PaintInfo& paintInfo, Ren derObject& parentRenderer)
77 { 77 {
78 RenderStyle* style = parentRenderer.style(); 78 const RenderStyle* style = parentRenderer.style();
79 const SVGRenderStyle& svgStyle = style->svgStyle(); 79 const SVGRenderStyle& svgStyle = style->svgStyle();
80 80
81 bool hasFill = svgStyle.hasFill(); 81 bool hasFill = svgStyle.hasFill();
82 bool hasVisibleStroke = svgStyle.hasVisibleStroke(); 82 bool hasVisibleStroke = svgStyle.hasVisibleStroke();
83 83
84 RenderStyle* selectionStyle = style; 84 const RenderStyle* selectionStyle = style;
85 bool shouldPaintSelection = this->shouldPaintSelection(); 85 bool shouldPaintSelection = this->shouldPaintSelection();
86 if (shouldPaintSelection) { 86 if (shouldPaintSelection) {
87 selectionStyle = parentRenderer.getCachedPseudoStyle(SELECTION); 87 selectionStyle = parentRenderer.getCachedPseudoStyle(SELECTION);
88 if (selectionStyle) { 88 if (selectionStyle) {
89 const SVGRenderStyle& svgSelectionStyle = selectionStyle->svgStyle() ; 89 const SVGRenderStyle& svgSelectionStyle = selectionStyle->svgStyle() ;
90 90
91 if (!hasFill) 91 if (!hasFill)
92 hasFill = svgSelectionStyle.hasFill(); 92 hasFill = svgSelectionStyle.hasFill();
93 if (!hasVisibleStroke) 93 if (!hasVisibleStroke)
94 hasVisibleStroke = svgSelectionStyle.hasVisibleStroke(); 94 hasVisibleStroke = svgSelectionStyle.hasVisibleStroke();
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 return; 157 return;
158 158
159 Color backgroundColor = m_svgInlineTextBox.renderer().selectionBackgroundCol or(); 159 Color backgroundColor = m_svgInlineTextBox.renderer().selectionBackgroundCol or();
160 if (!backgroundColor.alpha()) 160 if (!backgroundColor.alpha())
161 return; 161 return;
162 162
163 RenderSVGInlineText& textRenderer = toRenderSVGInlineText(m_svgInlineTextBox .renderer()); 163 RenderSVGInlineText& textRenderer = toRenderSVGInlineText(m_svgInlineTextBox .renderer());
164 if (!textShouldBePainted(textRenderer)) 164 if (!textShouldBePainted(textRenderer))
165 return; 165 return;
166 166
167 RenderStyle* style = m_svgInlineTextBox.parent()->renderer().style(); 167 const RenderStyle* style = m_svgInlineTextBox.parent()->renderer().style();
168 ASSERT(style); 168 ASSERT(style);
169 169
170 int startPosition, endPosition; 170 int startPosition, endPosition;
171 m_svgInlineTextBox.selectionStartEnd(startPosition, endPosition); 171 m_svgInlineTextBox.selectionStartEnd(startPosition, endPosition);
172 172
173 int fragmentStartPosition = 0; 173 int fragmentStartPosition = 0;
174 int fragmentEndPosition = 0; 174 int fragmentEndPosition = 0;
175 AffineTransform fragmentTransform; 175 AffineTransform fragmentTransform;
176 unsigned textFragmentsSize = m_svgInlineTextBox.textFragments().size(); 176 unsigned textFragmentsSize = m_svgInlineTextBox.textFragments().size();
177 for (unsigned i = 0; i < textFragmentsSize; ++i) { 177 for (unsigned i = 0; i < textFragmentsSize; ++i) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 void SVGInlineTextBoxPainter::paintDecoration(const PaintInfo& paintInfo, TextDe coration decoration, const SVGTextFragment& fragment) 235 void SVGInlineTextBoxPainter::paintDecoration(const PaintInfo& paintInfo, TextDe coration decoration, const SVGTextFragment& fragment)
236 { 236 {
237 if (m_svgInlineTextBox.renderer().style()->textDecorationsInEffect() == Text DecorationNone) 237 if (m_svgInlineTextBox.renderer().style()->textDecorationsInEffect() == Text DecorationNone)
238 return; 238 return;
239 239
240 if (fragment.width <= 0) 240 if (fragment.width <= 0)
241 return; 241 return;
242 242
243 // Find out which render style defined the text-decoration, as its fill/stro ke properties have to be used for drawing instead of ours. 243 // Find out which render style defined the text-decoration, as its fill/stro ke properties have to be used for drawing instead of ours.
244 RenderObject* decorationRenderer = findRenderObjectDefininingTextDecoration( m_svgInlineTextBox.parent()); 244 RenderObject* decorationRenderer = findRenderObjectDefininingTextDecoration( m_svgInlineTextBox.parent());
245 RenderStyle* decorationStyle = decorationRenderer->style(); 245 const RenderStyle* decorationStyle = decorationRenderer->style();
246 ASSERT(decorationStyle); 246 ASSERT(decorationStyle);
247 247
248 if (decorationStyle->visibility() == HIDDEN) 248 if (decorationStyle->visibility() == HIDDEN)
249 return; 249 return;
250 250
251 float scalingFactor = 1; 251 float scalingFactor = 1;
252 Font scaledFont; 252 Font scaledFont;
253 RenderSVGInlineText::computeNewScaledFontForStyle(decorationRenderer, decora tionStyle, scalingFactor, scaledFont); 253 RenderSVGInlineText::computeNewScaledFontForStyle(decorationRenderer, decora tionStyle, scalingFactor, scaledFont);
254 ASSERT(scalingFactor); 254 ASSERT(scalingFactor);
255 255
(...skipping 29 matching lines...) Expand all
285 } 285 }
286 break; 286 break;
287 case PT_MARKERS: 287 case PT_MARKERS:
288 break; 288 break;
289 default: 289 default:
290 ASSERT_NOT_REACHED(); 290 ASSERT_NOT_REACHED();
291 } 291 }
292 } 292 }
293 } 293 }
294 294
295 void SVGInlineTextBoxPainter::paintTextWithShadows(const PaintInfo& paintInfo, R enderStyle* style, 295 void SVGInlineTextBoxPainter::paintTextWithShadows(const PaintInfo& paintInfo, c onst RenderStyle* style,
296 TextRun& textRun, const SVGTextFragment& fragment, int startPosition, int en dPosition, 296 TextRun& textRun, const SVGTextFragment& fragment, int startPosition, int en dPosition,
297 RenderSVGResourceMode resourceMode) 297 RenderSVGResourceMode resourceMode)
298 { 298 {
299 RenderSVGInlineText& textRenderer = toRenderSVGInlineText(m_svgInlineTextBox .renderer()); 299 RenderSVGInlineText& textRenderer = toRenderSVGInlineText(m_svgInlineTextBox .renderer());
300 300
301 float scalingFactor = textRenderer.scalingFactor(); 301 float scalingFactor = textRenderer.scalingFactor();
302 ASSERT(scalingFactor); 302 ASSERT(scalingFactor);
303 303
304 const Font& scaledFont = textRenderer.scaledFont(); 304 const Font& scaledFont = textRenderer.scaledFont();
305 const ShadowList* shadowList = style->textShadow(); 305 const ShadowList* shadowList = style->textShadow();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 textRunPaintInfo.from = startPosition; 343 textRunPaintInfo.from = startPosition;
344 textRunPaintInfo.to = endPosition; 344 textRunPaintInfo.to = endPosition;
345 345
346 float baseline = scaledFont.fontMetrics().floatAscent(); 346 float baseline = scaledFont.fontMetrics().floatAscent();
347 textRunPaintInfo.bounds = FloatRect(textOrigin.x(), textOrigin.y() - baselin e, 347 textRunPaintInfo.bounds = FloatRect(textOrigin.x(), textOrigin.y() - baselin e,
348 textSize.width(), textSize.height()); 348 textSize.width(), textSize.height());
349 349
350 scaledFont.drawText(context, textRunPaintInfo, textOrigin); 350 scaledFont.drawText(context, textRunPaintInfo, textOrigin);
351 } 351 }
352 352
353 void SVGInlineTextBoxPainter::paintText(const PaintInfo& paintInfo, RenderStyle* style, 353 void SVGInlineTextBoxPainter::paintText(const PaintInfo& paintInfo, const Render Style* style,
354 RenderStyle* selectionStyle, const SVGTextFragment& fragment, 354 const RenderStyle* selectionStyle, const SVGTextFragment& fragment,
355 RenderSVGResourceMode resourceMode, bool shouldPaintSelection) 355 RenderSVGResourceMode resourceMode, bool shouldPaintSelection)
356 { 356 {
357 ASSERT(style); 357 ASSERT(style);
358 ASSERT(selectionStyle); 358 ASSERT(selectionStyle);
359 359
360 int startPosition = 0; 360 int startPosition = 0;
361 int endPosition = 0; 361 int endPosition = 0;
362 if (shouldPaintSelection) { 362 if (shouldPaintSelection) {
363 m_svgInlineTextBox.selectionStartEnd(startPosition, endPosition); 363 m_svgInlineTextBox.selectionStartEnd(startPosition, endPosition);
364 shouldPaintSelection = m_svgInlineTextBox.mapStartEndPositionsIntoFragme ntCoordinates(fragment, startPosition, endPosition); 364 shouldPaintSelection = m_svgInlineTextBox.mapStartEndPositionsIntoFragme ntCoordinates(fragment, startPosition, endPosition);
(...skipping 24 matching lines...) Expand all
389 StyleDifference diff; 389 StyleDifference diff;
390 diff.setNeedsPaintInvalidationObject(); 390 diff.setNeedsPaintInvalidationObject();
391 SVGResourcesCache::clientStyleChanged(&m_svgInlineTextBox.parent()->rend erer(), diff, style); 391 SVGResourcesCache::clientStyleChanged(&m_svgInlineTextBox.parent()->rend erer(), diff, style);
392 } 392 }
393 393
394 // Eventually draw text using regular style from the end position of the sel ection to the end of the current chunk part 394 // Eventually draw text using regular style from the end position of the sel ection to the end of the current chunk part
395 if (endPosition < static_cast<int>(fragment.length) && !paintSelectedTextOnl y) 395 if (endPosition < static_cast<int>(fragment.length) && !paintSelectedTextOnl y)
396 paintTextWithShadows(paintInfo, style, textRun, fragment, endPosition, f ragment.length, resourceMode); 396 paintTextWithShadows(paintInfo, style, textRun, fragment, endPosition, f ragment.length, resourceMode);
397 } 397 }
398 398
399 void SVGInlineTextBoxPainter::paintTextMatchMarker(GraphicsContext* context, con st FloatPoint&, DocumentMarker* marker, RenderStyle* style, const Font& font) 399 void SVGInlineTextBoxPainter::paintTextMatchMarker(GraphicsContext* context, con st FloatPoint&, DocumentMarker* marker, const RenderStyle* style, const Font& fo nt)
400 { 400 {
401 // SVG is only interested in the TextMatch markers. 401 // SVG is only interested in the TextMatch markers.
402 if (marker->type() != DocumentMarker::TextMatch) 402 if (marker->type() != DocumentMarker::TextMatch)
403 return; 403 return;
404 404
405 RenderSVGInlineText& textRenderer = toRenderSVGInlineText(m_svgInlineTextBox .renderer()); 405 RenderSVGInlineText& textRenderer = toRenderSVGInlineText(m_svgInlineTextBox .renderer());
406 406
407 FloatRect markerRect; 407 FloatRect markerRect;
408 AffineTransform fragmentTransform; 408 AffineTransform fragmentTransform;
409 for (InlineTextBox* box = textRenderer.firstTextBox(); box; box = box->nextT extBox()) { 409 for (InlineTextBox* box = textRenderer.firstTextBox(); box; box = box->nextT extBox()) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 445
446 fragmentRect = fragmentTransform.mapRect(fragmentRect); 446 fragmentRect = fragmentTransform.mapRect(fragmentRect);
447 markerRect.unite(fragmentRect); 447 markerRect.unite(fragmentRect);
448 } 448 }
449 } 449 }
450 450
451 toRenderedDocumentMarker(marker)->setRenderedRect(textRenderer.localToAbsolu teQuad(markerRect).enclosingBoundingBox()); 451 toRenderedDocumentMarker(marker)->setRenderedRect(textRenderer.localToAbsolu teQuad(markerRect).enclosingBoundingBox());
452 } 452 }
453 453
454 } // namespace blink 454 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698