OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "GrSoftwarePathRenderer.h" | 9 #include "GrSoftwarePathRenderer.h" |
10 #include "GrContext.h" | 10 #include "GrContext.h" |
11 #include "GrSWMaskHelper.h" | 11 #include "GrSWMaskHelper.h" |
12 | 12 |
13 //////////////////////////////////////////////////////////////////////////////// | 13 //////////////////////////////////////////////////////////////////////////////// |
14 bool GrSoftwarePathRenderer::canDrawPath(const SkStrokeRec&, | 14 bool GrSoftwarePathRenderer::canDrawPath(const SkPath&, |
| 15 const SkStrokeRec&, |
15 const GrDrawTarget*, | 16 const GrDrawTarget*, |
16 bool antiAlias) const { | 17 bool antiAlias) const { |
17 if (!antiAlias || NULL == fContext) { | 18 if (!antiAlias || NULL == fContext) { |
18 // TODO: We could allow the SW path to also handle non-AA paths but | 19 // TODO: We could allow the SW path to also handle non-AA paths but |
19 // this would mean that GrDefaultPathRenderer would never be called | 20 // this would mean that GrDefaultPathRenderer would never be called |
20 // (since it appears after the SW renderer in the path renderer | 21 // (since it appears after the SW renderer in the path renderer |
21 // chain). Some testing would need to be done r.e. performance | 22 // chain). Some testing would need to be done r.e. performance |
22 // and consistency of the resulting images before removing | 23 // and consistency of the resulting images before removing |
23 // the "!antiAlias" clause from the above test | 24 // the "!antiAlias" clause from the above test |
24 return false; | 25 return false; |
25 } | 26 } |
26 | 27 |
27 return true; | 28 return true; |
28 } | 29 } |
29 | 30 |
30 GrPathRenderer::StencilSupport GrSoftwarePathRenderer::onGetStencilSupport( | 31 GrPathRenderer::StencilSupport GrSoftwarePathRenderer::onGetStencilSupport( |
| 32 const SkPath&, |
31 const SkStrokeRec&, | 33 const SkStrokeRec&, |
32 const GrDrawTarget*) const { | 34 const GrDrawTarget*) const { |
33 return GrPathRenderer::kNoSupport_StencilSupport; | 35 return GrPathRenderer::kNoSupport_StencilSupport; |
34 } | 36 } |
35 | 37 |
36 namespace { | 38 namespace { |
37 | 39 |
38 //////////////////////////////////////////////////////////////////////////////// | 40 //////////////////////////////////////////////////////////////////////////////// |
39 // gets device coord bounds of path (not considering the fill) and clip. The | 41 // gets device coord bounds of path (not considering the fill) and clip. The |
40 // path bounds will be a subset of the clip bounds. returns false if | 42 // path bounds will be a subset of the clip bounds. returns false if |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 rect.iset(devClipBounds.fLeft, devPathBounds.fBottom, | 106 rect.iset(devClipBounds.fLeft, devPathBounds.fBottom, |
105 devClipBounds.fRight, devClipBounds.fBottom); | 107 devClipBounds.fRight, devClipBounds.fBottom); |
106 target->drawSimpleRect(rect, NULL); | 108 target->drawSimpleRect(rect, NULL); |
107 } | 109 } |
108 } | 110 } |
109 | 111 |
110 } | 112 } |
111 | 113 |
112 //////////////////////////////////////////////////////////////////////////////// | 114 //////////////////////////////////////////////////////////////////////////////// |
113 // return true on success; false on failure | 115 // return true on success; false on failure |
114 bool GrSoftwarePathRenderer::onDrawPath(const SkStrokeRec& stroke, | 116 bool GrSoftwarePathRenderer::onDrawPath(const SkPath& path, |
| 117 const SkStrokeRec& stroke, |
115 GrDrawTarget* target, | 118 GrDrawTarget* target, |
116 bool antiAlias) { | 119 bool antiAlias) { |
117 | 120 |
118 if (NULL == fContext) { | 121 if (NULL == fContext) { |
119 return false; | 122 return false; |
120 } | 123 } |
121 | 124 |
122 GrDrawState* drawState = target->drawState(); | 125 GrDrawState* drawState = target->drawState(); |
123 | 126 |
124 SkMatrix vm = drawState->getViewMatrix(); | 127 SkMatrix vm = drawState->getViewMatrix(); |
125 | 128 |
126 SkIRect devPathBounds, devClipBounds; | 129 SkIRect devPathBounds, devClipBounds; |
127 if (!get_path_and_clip_bounds(target, this->path(), vm, | 130 if (!get_path_and_clip_bounds(target, path, vm, |
128 &devPathBounds, &devClipBounds)) { | 131 &devPathBounds, &devClipBounds)) { |
129 if (this->path().isInverseFillType()) { | 132 if (path.isInverseFillType()) { |
130 draw_around_inv_path(target, devClipBounds, devPathBounds); | 133 draw_around_inv_path(target, devClipBounds, devPathBounds); |
131 } | 134 } |
132 return true; | 135 return true; |
133 } | 136 } |
134 | 137 |
135 SkAutoTUnref<GrTexture> texture( | 138 SkAutoTUnref<GrTexture> texture( |
136 GrSWMaskHelper::DrawPathMaskToTexture(fContext, this->path(), stroke
, | 139 GrSWMaskHelper::DrawPathMaskToTexture(fContext, path, stroke, |
137 devPathBounds, | 140 devPathBounds, |
138 antiAlias, &vm)); | 141 antiAlias, &vm)); |
139 if (NULL == texture) { | 142 if (NULL == texture) { |
140 return false; | 143 return false; |
141 } | 144 } |
142 | 145 |
143 GrSWMaskHelper::DrawToTargetWithPathMask(texture, target, devPathBounds); | 146 GrSWMaskHelper::DrawToTargetWithPathMask(texture, target, devPathBounds); |
144 | 147 |
145 if (this->path().isInverseFillType()) { | 148 if (path.isInverseFillType()) { |
146 draw_around_inv_path(target, devClipBounds, devPathBounds); | 149 draw_around_inv_path(target, devClipBounds, devPathBounds); |
147 } | 150 } |
148 | 151 |
149 return true; | 152 return true; |
150 } | 153 } |
OLD | NEW |