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 "config.h" | 5 #include "config.h" |
6 #include "core/paint/SVGShapePainter.h" | 6 #include "core/paint/SVGShapePainter.h" |
7 | 7 |
8 #include "core/layout/svg/LayoutSVGPath.h" | 8 #include "core/layout/svg/LayoutSVGPath.h" |
9 #include "core/layout/svg/LayoutSVGResourceMarker.h" | 9 #include "core/layout/svg/LayoutSVGResourceMarker.h" |
10 #include "core/layout/svg/LayoutSVGShape.h" | 10 #include "core/layout/svg/LayoutSVGShape.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 | 50 |
51 FloatRect boundingBox = m_layoutSVGShape.paintInvalidationRectInLocalCoordin
ates(); | 51 FloatRect boundingBox = m_layoutSVGShape.paintInvalidationRectInLocalCoordin
ates(); |
52 if (!paintInfo.intersectsCullRect(m_layoutSVGShape.localTransform(), boundin
gBox)) | 52 if (!paintInfo.intersectsCullRect(m_layoutSVGShape.localTransform(), boundin
gBox)) |
53 return; | 53 return; |
54 | 54 |
55 PaintInfo paintInfoBeforeFiltering(paintInfo); | 55 PaintInfo paintInfoBeforeFiltering(paintInfo); |
56 // Shapes cannot have children so do not call updateCullRectForSVGTransform. | 56 // Shapes cannot have children so do not call updateCullRectForSVGTransform. |
57 TransformRecorder transformRecorder(*paintInfoBeforeFiltering.context, m_lay
outSVGShape, m_layoutSVGShape.localTransform()); | 57 TransformRecorder transformRecorder(*paintInfoBeforeFiltering.context, m_lay
outSVGShape, m_layoutSVGShape.localTransform()); |
58 { | 58 { |
59 SVGPaintContext paintContext(m_layoutSVGShape, paintInfoBeforeFiltering)
; | 59 SVGPaintContext paintContext(m_layoutSVGShape, paintInfoBeforeFiltering)
; |
60 if (paintContext.applyClipMaskAndFilterIfNecessary()) { | 60 if (paintContext.applyClipMaskAndFilterIfNecessary() && !LayoutObjectDra
wingRecorder::useCachedDrawingIfPossible(*paintContext.paintInfo().context, m_la
youtSVGShape, paintContext.paintInfo().phase)) { |
61 LayoutObjectDrawingRecorder recorder(*paintContext.paintInfo().conte
xt, m_layoutSVGShape, paintContext.paintInfo().phase, boundingBox); | 61 LayoutObjectDrawingRecorder recorder(*paintContext.paintInfo().conte
xt, m_layoutSVGShape, paintContext.paintInfo().phase, boundingBox); |
62 if (!recorder.canUseCachedDrawing()) { | 62 const SVGComputedStyle& svgStyle = m_layoutSVGShape.style()->svgStyl
e(); |
63 const SVGComputedStyle& svgStyle = m_layoutSVGShape.style()->svg
Style(); | |
64 | 63 |
65 bool shouldAntiAlias = svgStyle.shapeRendering() != SR_CRISPEDGE
S; | 64 bool shouldAntiAlias = svgStyle.shapeRendering() != SR_CRISPEDGES; |
66 | 65 |
67 for (int i = 0; i < 3; i++) { | 66 for (int i = 0; i < 3; i++) { |
68 switch (svgStyle.paintOrderType(i)) { | 67 switch (svgStyle.paintOrderType(i)) { |
69 case PT_FILL: { | 68 case PT_FILL: { |
70 SkPaint fillPaint; | 69 SkPaint fillPaint; |
71 if (!SVGPaintContext::paintForLayoutObject(paintContext.
paintInfo(), m_layoutSVGShape.styleRef(), m_layoutSVGShape, ApplyToFillMode, fil
lPaint)) | 70 if (!SVGPaintContext::paintForLayoutObject(paintContext.pain
tInfo(), m_layoutSVGShape.styleRef(), m_layoutSVGShape, ApplyToFillMode, fillPai
nt)) |
| 71 break; |
| 72 fillPaint.setAntiAlias(shouldAntiAlias); |
| 73 fillShape(paintContext.paintInfo().context, fillPaint, fillR
uleFromStyle(paintContext.paintInfo(), svgStyle)); |
| 74 break; |
| 75 } |
| 76 case PT_STROKE: |
| 77 if (svgStyle.hasVisibleStroke()) { |
| 78 GraphicsContextStateSaver stateSaver(*paintContext.paint
Info().context, false); |
| 79 AffineTransform nonScalingTransform; |
| 80 const AffineTransform* additionalPaintServerTransform =
0; |
| 81 |
| 82 if (m_layoutSVGShape.hasNonScalingStroke()) { |
| 83 nonScalingTransform = m_layoutSVGShape.nonScalingStr
okeTransform(); |
| 84 if (!setupNonScalingStrokeContext(nonScalingTransfor
m, stateSaver)) |
| 85 return; |
| 86 |
| 87 // Non-scaling stroke needs to reset the transform b
ack to the host transform. |
| 88 additionalPaintServerTransform = &nonScalingTransfor
m; |
| 89 } |
| 90 |
| 91 SkPaint strokePaint; |
| 92 if (!SVGPaintContext::paintForLayoutObject(paintContext.
paintInfo(), m_layoutSVGShape.styleRef(), m_layoutSVGShape, ApplyToStrokeMode, s
trokePaint, additionalPaintServerTransform)) |
72 break; | 93 break; |
73 fillPaint.setAntiAlias(shouldAntiAlias); | 94 strokePaint.setAntiAlias(shouldAntiAlias); |
74 fillShape(paintContext.paintInfo().context, fillPaint, f
illRuleFromStyle(paintContext.paintInfo(), svgStyle)); | 95 |
75 break; | 96 StrokeData strokeData; |
| 97 SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeDat
a, m_layoutSVGShape.styleRef(), m_layoutSVGShape); |
| 98 strokeData.setupPaint(&strokePaint); |
| 99 |
| 100 strokeShape(paintContext.paintInfo().context, strokePain
t); |
76 } | 101 } |
77 case PT_STROKE: | 102 break; |
78 if (svgStyle.hasVisibleStroke()) { | 103 case PT_MARKERS: |
79 GraphicsContextStateSaver stateSaver(*paintContext.p
aintInfo().context, false); | 104 paintMarkers(paintContext.paintInfo(), boundingBox); |
80 AffineTransform nonScalingTransform; | 105 break; |
81 const AffineTransform* additionalPaintServerTransfor
m = 0; | 106 default: |
82 | 107 ASSERT_NOT_REACHED(); |
83 if (m_layoutSVGShape.hasNonScalingStroke()) { | 108 break; |
84 nonScalingTransform = m_layoutSVGShape.nonScalin
gStrokeTransform(); | |
85 if (!setupNonScalingStrokeContext(nonScalingTran
sform, stateSaver)) | |
86 return; | |
87 | |
88 // Non-scaling stroke needs to reset the transfo
rm back to the host transform. | |
89 additionalPaintServerTransform = &nonScalingTran
sform; | |
90 } | |
91 | |
92 SkPaint strokePaint; | |
93 if (!SVGPaintContext::paintForLayoutObject(paintCont
ext.paintInfo(), m_layoutSVGShape.styleRef(), m_layoutSVGShape, ApplyToStrokeMod
e, strokePaint, additionalPaintServerTransform)) | |
94 break; | |
95 strokePaint.setAntiAlias(shouldAntiAlias); | |
96 | |
97 StrokeData strokeData; | |
98 SVGLayoutSupport::applyStrokeStyleToStrokeData(strok
eData, m_layoutSVGShape.styleRef(), m_layoutSVGShape); | |
99 strokeData.setupPaint(&strokePaint); | |
100 | |
101 strokeShape(paintContext.paintInfo().context, stroke
Paint); | |
102 } | |
103 break; | |
104 case PT_MARKERS: | |
105 paintMarkers(paintContext.paintInfo(), boundingBox); | |
106 break; | |
107 default: | |
108 ASSERT_NOT_REACHED(); | |
109 break; | |
110 } | |
111 } | 109 } |
112 } | 110 } |
113 } | 111 } |
114 } | 112 } |
115 | 113 |
116 if (m_layoutSVGShape.style()->outlineWidth()) { | 114 if (m_layoutSVGShape.style()->outlineWidth()) { |
117 PaintInfo outlinePaintInfo(paintInfoBeforeFiltering); | 115 PaintInfo outlinePaintInfo(paintInfoBeforeFiltering); |
118 outlinePaintInfo.phase = PaintPhaseSelfOutline; | 116 outlinePaintInfo.phase = PaintPhaseSelfOutline; |
119 LayoutRect layoutObjectBounds(boundingBox); | 117 LayoutRect layoutObjectBounds(boundingBox); |
120 LayoutRect visualOverflowRect = ObjectPainter::outlineBounds(layoutObjec
tBounds, m_layoutSVGShape.styleRef()); | 118 LayoutRect visualOverflowRect = ObjectPainter::outlineBounds(layoutObjec
tBounds, m_layoutSVGShape.styleRef()); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 position = nonScalingTransform.mapPoint(position); | 254 position = nonScalingTransform.mapPoint(position); |
257 FloatRect subpathRect = LayoutSVGPath::zeroLengthSubpathRect(position, m
_layoutSVGShape.strokeWidth()); | 255 FloatRect subpathRect = LayoutSVGPath::zeroLengthSubpathRect(position, m
_layoutSVGShape.strokeWidth()); |
258 if (m_layoutSVGShape.style()->svgStyle().capStyle() == SquareCap) | 256 if (m_layoutSVGShape.style()->svgStyle().capStyle() == SquareCap) |
259 context->drawRect(subpathRect, fillPaint); | 257 context->drawRect(subpathRect, fillPaint); |
260 else | 258 else |
261 context->drawOval(subpathRect, fillPaint); | 259 context->drawOval(subpathRect, fillPaint); |
262 } | 260 } |
263 } | 261 } |
264 | 262 |
265 } // namespace blink | 263 } // namespace blink |
OLD | NEW |