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

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

Issue 2162033003: Include any text shadow bounds in SVG text cull rect. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix approximation. Created 4 years, 5 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 20 matching lines...) Expand all
31 // Font::pixelSize(), returns FontDescription::computedPixelSize(), which re turns "int(x + 0.5)". 31 // Font::pixelSize(), returns FontDescription::computedPixelSize(), which re turns "int(x + 0.5)".
32 // If the absolute font size on screen is below x=0.5, don't render anything . 32 // If the absolute font size on screen is below x=0.5, don't render anything .
33 return textLayoutObject.scaledFont().getFontDescription().computedPixelSize( ); 33 return textLayoutObject.scaledFont().getFontDescription().computedPixelSize( );
34 } 34 }
35 35
36 bool SVGInlineTextBoxPainter::shouldPaintSelection(const PaintInfo& paintInfo) c onst 36 bool SVGInlineTextBoxPainter::shouldPaintSelection(const PaintInfo& paintInfo) c onst
37 { 37 {
38 return !paintInfo.isPrinting() && m_svgInlineTextBox.getSelectionState() != SelectionNone; 38 return !paintInfo.isPrinting() && m_svgInlineTextBox.getSelectionState() != SelectionNone;
39 } 39 }
40 40
41 static bool hasShadow(const PaintInfo& paintInfo, const ComputedStyle& style)
42 {
43 // Text shadows are disabled when printing. http://crbug.com/258321
44 return style.textShadow() && !paintInfo.isPrinting();
45 }
46
41 FloatRect SVGInlineTextBoxPainter::boundsForDrawingRecorder( 47 FloatRect SVGInlineTextBoxPainter::boundsForDrawingRecorder(
42 const LayoutPoint& paintOffset, bool includeSelectionRect) const 48 const PaintInfo& paintInfo, const ComputedStyle& style, const LayoutPoint& p aintOffset, bool includeSelectionRect) const
43 { 49 {
44 // We compute the paint rect with what looks like the logical values, to mat ch the 50 // We compute the paint rect with what looks like the logical values, to mat ch the
45 // computation in SVGInlineTextBox::calculateBoundaries, and the fact that v ertical (etc) 51 // computation in SVGInlineTextBox::calculateBoundaries, and the fact that v ertical (etc)
46 // layouts are handled by SVGTextLayoutEngine. 52 // layouts are handled by SVGTextLayoutEngine.
47 LayoutRect bounds( 53 LayoutRect bounds(
48 LayoutPoint(m_svgInlineTextBox.topLeft() + paintOffset), 54 LayoutPoint(m_svgInlineTextBox.topLeft() + paintOffset),
49 LayoutSize(m_svgInlineTextBox.logicalWidth(), m_svgInlineTextBox.logical Height())); 55 LayoutSize(m_svgInlineTextBox.logicalWidth(), m_svgInlineTextBox.logical Height()));
56 if (hasShadow(paintInfo, style))
57 bounds.expand(style.textShadow()->rectOutsetsIncludingOriginal());
50 if (includeSelectionRect) { 58 if (includeSelectionRect) {
51 bounds.unite(m_svgInlineTextBox.localSelectionRect( 59 bounds.unite(m_svgInlineTextBox.localSelectionRect(
52 m_svgInlineTextBox.start(), m_svgInlineTextBox.start() + m_svgInline TextBox.len())); 60 m_svgInlineTextBox.start(), m_svgInlineTextBox.start() + m_svgInline TextBox.len()));
53 } 61 }
54 return FloatRect(bounds); 62 return FloatRect(bounds);
55 } 63 }
56 64
57 void SVGInlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoin t& paintOffset) 65 void SVGInlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoin t& paintOffset)
58 { 66 {
59 ASSERT(paintInfo.phase == PaintPhaseForeground || paintInfo.phase == PaintPh aseSelection); 67 ASSERT(paintInfo.phase == PaintPhaseForeground || paintInfo.phase == PaintPh aseSelection);
(...skipping 14 matching lines...) Expand all
74 return; 82 return;
75 83
76 DisplayItem::Type displayItemType = DisplayItem::paintPhaseToDrawingType(pai ntInfo.phase); 84 DisplayItem::Type displayItemType = DisplayItem::paintPhaseToDrawingType(pai ntInfo.phase);
77 if (!DrawingRecorder::useCachedDrawingIfPossible(paintInfo.context, m_svgInl ineTextBox, displayItemType)) { 85 if (!DrawingRecorder::useCachedDrawingIfPossible(paintInfo.context, m_svgInl ineTextBox, displayItemType)) {
78 LayoutObject& parentLayoutObject = *LineLayoutAPIShim::layoutObjectFrom( m_svgInlineTextBox.parent()->getLineLayoutItem()); 86 LayoutObject& parentLayoutObject = *LineLayoutAPIShim::layoutObjectFrom( m_svgInlineTextBox.parent()->getLineLayoutItem());
79 const ComputedStyle& style = parentLayoutObject.styleRef(); 87 const ComputedStyle& style = parentLayoutObject.styleRef();
80 88
81 bool includeSelectionRect = paintInfo.phase != PaintPhaseSelection 89 bool includeSelectionRect = paintInfo.phase != PaintPhaseSelection
82 && (haveSelection || InlineTextBoxPainter::paintsMarkerHighlights(te xtLayoutObject)); 90 && (haveSelection || InlineTextBoxPainter::paintsMarkerHighlights(te xtLayoutObject));
83 DrawingRecorder recorder(paintInfo.context, m_svgInlineTextBox, displayI temType, 91 DrawingRecorder recorder(paintInfo.context, m_svgInlineTextBox, displayI temType,
84 boundsForDrawingRecorder(paintOffset, includeSelectionRect)); 92 boundsForDrawingRecorder(paintInfo, style, paintOffset, includeSelec tionRect));
85 InlineTextBoxPainter(m_svgInlineTextBox).paintDocumentMarkers( 93 InlineTextBoxPainter(m_svgInlineTextBox).paintDocumentMarkers(
86 paintInfo, paintOffset, style, 94 paintInfo, paintOffset, style,
87 textLayoutObject.scaledFont(), DocumentMarkerPaintPhase::Background) ; 95 textLayoutObject.scaledFont(), DocumentMarkerPaintPhase::Background) ;
88 96
89 if (!m_svgInlineTextBox.textFragments().isEmpty()) 97 if (!m_svgInlineTextBox.textFragments().isEmpty())
90 paintTextFragments(paintInfo, parentLayoutObject); 98 paintTextFragments(paintInfo, parentLayoutObject);
91 99
92 InlineTextBoxPainter(m_svgInlineTextBox).paintDocumentMarkers( 100 InlineTextBoxPainter(m_svgInlineTextBox).paintDocumentMarkers(
93 paintInfo, paintOffset, style, 101 paintInfo, paintOffset, style,
94 textLayoutObject.scaledFont(), DocumentMarkerPaintPhase::Foreground) ; 102 textLayoutObject.scaledFont(), DocumentMarkerPaintPhase::Foreground) ;
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 } 315 }
308 316
309 bool SVGInlineTextBoxPainter::setupTextPaint(const PaintInfo& paintInfo, const C omputedStyle& style, 317 bool SVGInlineTextBoxPainter::setupTextPaint(const PaintInfo& paintInfo, const C omputedStyle& style,
310 LayoutSVGResourceMode resourceMode, SkPaint& paint) 318 LayoutSVGResourceMode resourceMode, SkPaint& paint)
311 { 319 {
312 LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutAPI Shim::layoutObjectFrom(m_svgInlineTextBox.getLineLayoutItem())); 320 LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutAPI Shim::layoutObjectFrom(m_svgInlineTextBox.getLineLayoutItem()));
313 321
314 float scalingFactor = textLayoutObject.scalingFactor(); 322 float scalingFactor = textLayoutObject.scalingFactor();
315 ASSERT(scalingFactor); 323 ASSERT(scalingFactor);
316 324
317 const ShadowList* shadowList = style.textShadow();
318
319 // Text shadows are disabled when printing. http://crbug.com/258321
320 bool hasShadow = shadowList && !paintInfo.isPrinting();
321
322 AffineTransform paintServerTransform; 325 AffineTransform paintServerTransform;
323 const AffineTransform* additionalPaintServerTransform = 0; 326 const AffineTransform* additionalPaintServerTransform = 0;
324 327
325 if (scalingFactor != 1) { 328 if (scalingFactor != 1) {
326 // Adjust the paint-server coordinate space. 329 // Adjust the paint-server coordinate space.
327 paintServerTransform.scale(scalingFactor); 330 paintServerTransform.scale(scalingFactor);
328 additionalPaintServerTransform = &paintServerTransform; 331 additionalPaintServerTransform = &paintServerTransform;
329 } 332 }
330 333
331 if (!SVGPaintContext::paintForLayoutObject(paintInfo, style, *LineLayoutAPIS him::layoutObjectFrom(m_svgInlineTextBox.parent()->getLineLayoutItem()), resourc eMode, paint, additionalPaintServerTransform)) 334 if (!SVGPaintContext::paintForLayoutObject(paintInfo, style, *LineLayoutAPIS him::layoutObjectFrom(m_svgInlineTextBox.parent()->getLineLayoutItem()), resourc eMode, paint, additionalPaintServerTransform))
332 return false; 335 return false;
333 paint.setAntiAlias(true); 336 paint.setAntiAlias(true);
334 337
335 if (hasShadow) { 338 if (hasShadow(paintInfo, style)) {
336 std::unique_ptr<DrawLooperBuilder> drawLooperBuilder = shadowList->creat eDrawLooper(DrawLooperBuilder::ShadowRespectsAlpha, style.visitedDependentColor( CSSPropertyColor)); 339 std::unique_ptr<DrawLooperBuilder> drawLooperBuilder = style.textShadow( )->createDrawLooper(DrawLooperBuilder::ShadowRespectsAlpha, style.visitedDepende ntColor(CSSPropertyColor));
337 paint.setLooper(toSkSp(drawLooperBuilder->detachDrawLooper())); 340 paint.setLooper(toSkSp(drawLooperBuilder->detachDrawLooper()));
338 } 341 }
339 342
340 if (resourceMode == ApplyToStrokeMode) { 343 if (resourceMode == ApplyToStrokeMode) {
341 StrokeData strokeData; 344 StrokeData strokeData;
342 SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, style, *LineL ayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.parent()->getLineLayoutItem()) , 1); 345 SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, style, *LineL ayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.parent()->getLineLayoutItem()) , 1);
343 if (style.svgStyle().vectorEffect() != VE_NON_SCALING_STROKE) 346 if (style.svgStyle().vectorEffect() != VE_NON_SCALING_STROKE)
344 strokeData.setThickness(strokeData.thickness() * scalingFactor); 347 strokeData.setThickness(strokeData.thickness() * scalingFactor);
345 strokeData.setupPaint(&paint); 348 strokeData.setupPaint(&paint);
346 } 349 }
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 stateSaver.save(); 518 stateSaver.save();
516 paintInfo.context.concatCTM(fragment.buildFragmentTransform()); 519 paintInfo.context.concatCTM(fragment.buildFragmentTransform());
517 } 520 }
518 FloatRect fragmentRect = m_svgInlineTextBox.selectionRectForTextFragment (fragment, textMatchInfo.startPosition, textMatchInfo.endPosition, style); 521 FloatRect fragmentRect = m_svgInlineTextBox.selectionRectForTextFragment (fragment, textMatchInfo.startPosition, textMatchInfo.endPosition, style);
519 paintInfo.context.setFillColor(color); 522 paintInfo.context.setFillColor(color);
520 paintInfo.context.fillRect(fragmentRect); 523 paintInfo.context.fillRect(fragmentRect);
521 } 524 }
522 } 525 }
523 526
524 } // namespace blink 527 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698