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/SVGShapePainter.h" | 5 #include "core/paint/SVGShapePainter.h" |
6 | 6 |
7 #include "core/layout/svg/LayoutSVGResourceMarker.h" | 7 #include "core/layout/svg/LayoutSVGResourceMarker.h" |
8 #include "core/layout/svg/LayoutSVGShape.h" | 8 #include "core/layout/svg/LayoutSVGShape.h" |
9 #include "core/layout/svg/SVGLayoutSupport.h" | 9 #include "core/layout/svg/SVGLayoutSupport.h" |
10 #include "core/layout/svg/SVGMarkerData.h" | 10 #include "core/layout/svg/SVGMarkerData.h" |
11 #include "core/layout/svg/SVGResources.h" | 11 #include "core/layout/svg/SVGResources.h" |
12 #include "core/layout/svg/SVGResourcesCache.h" | 12 #include "core/layout/svg/SVGResourcesCache.h" |
13 #include "core/paint/FloatClipRecorder.h" | 13 #include "core/paint/FloatClipRecorder.h" |
14 #include "core/paint/LayoutObjectDrawingRecorder.h" | 14 #include "core/paint/LayoutObjectDrawingRecorder.h" |
15 #include "core/paint/ObjectPainter.h" | 15 #include "core/paint/ObjectPainter.h" |
16 #include "core/paint/PaintInfo.h" | 16 #include "core/paint/PaintInfo.h" |
17 #include "core/paint/SVGContainerPainter.h" | 17 #include "core/paint/SVGContainerPainter.h" |
18 #include "core/paint/SVGPaintContext.h" | 18 #include "core/paint/SVGPaintContext.h" |
19 #include "core/paint/TransformRecorder.h" | 19 #include "core/paint/TransformRecorder.h" |
20 #include "platform/graphics/GraphicsContextStateSaver.h" | 20 #include "platform/graphics/GraphicsContextStateSaver.h" |
| 21 #include "platform/graphics/paint/PaintRecord.h" |
21 #include "platform/graphics/paint/SkPictureBuilder.h" | 22 #include "platform/graphics/paint/SkPictureBuilder.h" |
22 #include "third_party/skia/include/core/SkPaint.h" | |
23 #include "third_party/skia/include/core/SkPicture.h" | |
24 #include "wtf/Optional.h" | 23 #include "wtf/Optional.h" |
25 | 24 |
26 namespace blink { | 25 namespace blink { |
27 | 26 |
28 static bool setupNonScalingStrokeContext( | 27 static bool setupNonScalingStrokeContext( |
29 AffineTransform& strokeTransform, | 28 AffineTransform& strokeTransform, |
30 GraphicsContextStateSaver& stateSaver) { | 29 GraphicsContextStateSaver& stateSaver) { |
31 if (!strokeTransform.isInvertible()) | 30 if (!strokeTransform.isInvertible()) |
32 return false; | 31 return false; |
33 | 32 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 paintContext.paintInfo().context, m_layoutSVGShape, | 68 paintContext.paintInfo().context, m_layoutSVGShape, |
70 paintContext.paintInfo().phase, boundingBox); | 69 paintContext.paintInfo().phase, boundingBox); |
71 const SVGComputedStyle& svgStyle = m_layoutSVGShape.style()->svgStyle(); | 70 const SVGComputedStyle& svgStyle = m_layoutSVGShape.style()->svgStyle(); |
72 | 71 |
73 bool shouldAntiAlias = svgStyle.shapeRendering() != SR_CRISPEDGES && | 72 bool shouldAntiAlias = svgStyle.shapeRendering() != SR_CRISPEDGES && |
74 svgStyle.shapeRendering() != SR_OPTIMIZESPEED; | 73 svgStyle.shapeRendering() != SR_OPTIMIZESPEED; |
75 | 74 |
76 for (int i = 0; i < 3; i++) { | 75 for (int i = 0; i < 3; i++) { |
77 switch (svgStyle.paintOrderType(i)) { | 76 switch (svgStyle.paintOrderType(i)) { |
78 case PT_FILL: { | 77 case PT_FILL: { |
79 SkPaint fillPaint; | 78 PaintFlags fillPaint; |
80 if (!SVGPaintContext::paintForLayoutObject( | 79 if (!SVGPaintContext::paintForLayoutObject( |
81 paintContext.paintInfo(), m_layoutSVGShape.styleRef(), | 80 paintContext.paintInfo(), m_layoutSVGShape.styleRef(), |
82 m_layoutSVGShape, ApplyToFillMode, fillPaint)) | 81 m_layoutSVGShape, ApplyToFillMode, fillPaint)) |
83 break; | 82 break; |
84 fillPaint.setAntiAlias(shouldAntiAlias); | 83 fillPaint.setAntiAlias(shouldAntiAlias); |
85 fillShape(paintContext.paintInfo().context, fillPaint, | 84 fillShape(paintContext.paintInfo().context, fillPaint, |
86 fillRuleFromStyle(paintContext.paintInfo(), svgStyle)); | 85 fillRuleFromStyle(paintContext.paintInfo(), svgStyle)); |
87 break; | 86 break; |
88 } | 87 } |
89 case PT_STROKE: | 88 case PT_STROKE: |
90 if (svgStyle.hasVisibleStroke()) { | 89 if (svgStyle.hasVisibleStroke()) { |
91 GraphicsContextStateSaver stateSaver( | 90 GraphicsContextStateSaver stateSaver( |
92 paintContext.paintInfo().context, false); | 91 paintContext.paintInfo().context, false); |
93 AffineTransform nonScalingTransform; | 92 AffineTransform nonScalingTransform; |
94 const AffineTransform* additionalPaintServerTransform = 0; | 93 const AffineTransform* additionalPaintServerTransform = 0; |
95 | 94 |
96 if (m_layoutSVGShape.hasNonScalingStroke()) { | 95 if (m_layoutSVGShape.hasNonScalingStroke()) { |
97 nonScalingTransform = | 96 nonScalingTransform = |
98 m_layoutSVGShape.nonScalingStrokeTransform(); | 97 m_layoutSVGShape.nonScalingStrokeTransform(); |
99 if (!setupNonScalingStrokeContext(nonScalingTransform, | 98 if (!setupNonScalingStrokeContext(nonScalingTransform, |
100 stateSaver)) | 99 stateSaver)) |
101 return; | 100 return; |
102 | 101 |
103 // Non-scaling stroke needs to reset the transform back to the | 102 // Non-scaling stroke needs to reset the transform back to the |
104 // host transform. | 103 // host transform. |
105 additionalPaintServerTransform = &nonScalingTransform; | 104 additionalPaintServerTransform = &nonScalingTransform; |
106 } | 105 } |
107 | 106 |
108 SkPaint strokePaint; | 107 PaintFlags strokePaint; |
109 if (!SVGPaintContext::paintForLayoutObject( | 108 if (!SVGPaintContext::paintForLayoutObject( |
110 paintContext.paintInfo(), m_layoutSVGShape.styleRef(), | 109 paintContext.paintInfo(), m_layoutSVGShape.styleRef(), |
111 m_layoutSVGShape, ApplyToStrokeMode, strokePaint, | 110 m_layoutSVGShape, ApplyToStrokeMode, strokePaint, |
112 additionalPaintServerTransform)) | 111 additionalPaintServerTransform)) |
113 break; | 112 break; |
114 strokePaint.setAntiAlias(shouldAntiAlias); | 113 strokePaint.setAntiAlias(shouldAntiAlias); |
115 | 114 |
116 StrokeData strokeData; | 115 StrokeData strokeData; |
117 SVGLayoutSupport::applyStrokeStyleToStrokeData( | 116 SVGLayoutSupport::applyStrokeStyleToStrokeData( |
118 strokeData, m_layoutSVGShape.styleRef(), m_layoutSVGShape, | 117 strokeData, m_layoutSVGShape.styleRef(), m_layoutSVGShape, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 ~PathWithTemporaryWindingRule() { m_path.setFillType(m_savedFillType); } | 150 ~PathWithTemporaryWindingRule() { m_path.setFillType(m_savedFillType); } |
152 | 151 |
153 const SkPath& getSkPath() const { return m_path; } | 152 const SkPath& getSkPath() const { return m_path; } |
154 | 153 |
155 private: | 154 private: |
156 SkPath& m_path; | 155 SkPath& m_path; |
157 SkPath::FillType m_savedFillType; | 156 SkPath::FillType m_savedFillType; |
158 }; | 157 }; |
159 | 158 |
160 void SVGShapePainter::fillShape(GraphicsContext& context, | 159 void SVGShapePainter::fillShape(GraphicsContext& context, |
161 const SkPaint& paint, | 160 const PaintFlags& paint, |
162 SkPath::FillType fillType) { | 161 SkPath::FillType fillType) { |
163 switch (m_layoutSVGShape.geometryCodePath()) { | 162 switch (m_layoutSVGShape.geometryCodePath()) { |
164 case RectGeometryFastPath: | 163 case RectGeometryFastPath: |
165 context.drawRect(m_layoutSVGShape.objectBoundingBox(), paint); | 164 context.drawRect(m_layoutSVGShape.objectBoundingBox(), paint); |
166 break; | 165 break; |
167 case EllipseGeometryFastPath: | 166 case EllipseGeometryFastPath: |
168 context.drawOval(m_layoutSVGShape.objectBoundingBox(), paint); | 167 context.drawOval(m_layoutSVGShape.objectBoundingBox(), paint); |
169 break; | 168 break; |
170 default: { | 169 default: { |
171 PathWithTemporaryWindingRule pathWithWinding(m_layoutSVGShape.path(), | 170 PathWithTemporaryWindingRule pathWithWinding(m_layoutSVGShape.path(), |
172 fillType); | 171 fillType); |
173 context.drawPath(pathWithWinding.getSkPath(), paint); | 172 context.drawPath(pathWithWinding.getSkPath(), paint); |
174 } | 173 } |
175 } | 174 } |
176 } | 175 } |
177 | 176 |
178 void SVGShapePainter::strokeShape(GraphicsContext& context, | 177 void SVGShapePainter::strokeShape(GraphicsContext& context, |
179 const SkPaint& paint) { | 178 const PaintFlags& paint) { |
180 if (!m_layoutSVGShape.style()->svgStyle().hasVisibleStroke()) | 179 if (!m_layoutSVGShape.style()->svgStyle().hasVisibleStroke()) |
181 return; | 180 return; |
182 | 181 |
183 switch (m_layoutSVGShape.geometryCodePath()) { | 182 switch (m_layoutSVGShape.geometryCodePath()) { |
184 case RectGeometryFastPath: | 183 case RectGeometryFastPath: |
185 context.drawRect(m_layoutSVGShape.objectBoundingBox(), paint); | 184 context.drawRect(m_layoutSVGShape.objectBoundingBox(), paint); |
186 break; | 185 break; |
187 case EllipseGeometryFastPath: | 186 case EllipseGeometryFastPath: |
188 context.drawOval(m_layoutSVGShape.objectBoundingBox(), paint); | 187 context.drawOval(m_layoutSVGShape.objectBoundingBox(), paint); |
189 break; | 188 break; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 marker.markerTransformation(position.origin, position.angle, | 245 marker.markerTransformation(position.origin, position.angle, |
247 strokeWidth)); | 246 strokeWidth)); |
248 Optional<FloatClipRecorder> clipRecorder; | 247 Optional<FloatClipRecorder> clipRecorder; |
249 if (SVGLayoutSupport::isOverflowHidden(&marker)) | 248 if (SVGLayoutSupport::isOverflowHidden(&marker)) |
250 clipRecorder.emplace(paintInfo.context, marker, paintInfo.phase, | 249 clipRecorder.emplace(paintInfo.context, marker, paintInfo.phase, |
251 marker.viewport()); | 250 marker.viewport()); |
252 SVGContainerPainter(marker).paint(paintInfo); | 251 SVGContainerPainter(marker).paint(paintInfo); |
253 } | 252 } |
254 | 253 |
255 } // namespace blink | 254 } // namespace blink |
OLD | NEW |