OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrOvalRenderer.h" | 8 #include "GrOvalRenderer.h" |
9 | 9 |
10 #include "effects/GrCircleEdgeEffect.h" | 10 #include "effects/GrCircleEdgeEffect.h" |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 } else { | 123 } else { |
124 halfWidth = SkScalarHalf(strokeWidth); | 124 halfWidth = SkScalarHalf(strokeWidth); |
125 } | 125 } |
126 | 126 |
127 outerRadius += halfWidth; | 127 outerRadius += halfWidth; |
128 if (isStroked) { | 128 if (isStroked) { |
129 innerRadius = SkMaxScalar(0, radius - halfWidth); | 129 innerRadius = SkMaxScalar(0, radius - halfWidth); |
130 } | 130 } |
131 } | 131 } |
132 | 132 |
| 133 // The radii are outset for two reasons. First, it allows the shader to simp
ly perform |
| 134 // clamp(distance-to-center - radius, 0, 1). Second, the outer radius is use
d to compute the |
| 135 // verts of the bounding box that is rendered and the outset ensures the box
will cover all |
| 136 // pixels partially covered by the circle. |
| 137 outerRadius += SK_ScalarHalf; |
| 138 innerRadius -= SK_ScalarHalf; |
| 139 |
133 for (int i = 0; i < 4; ++i) { | 140 for (int i = 0; i < 4; ++i) { |
134 verts[i].fCenter = center; | 141 verts[i].fCenter = center; |
135 verts[i].fOuterRadius = outerRadius + 0.5f; | 142 verts[i].fOuterRadius = outerRadius; |
136 verts[i].fInnerRadius = innerRadius - 0.5f; | 143 verts[i].fInnerRadius = innerRadius; |
137 } | 144 } |
138 | 145 |
139 // We've extended the outer radius out half a pixel to antialias. | |
140 // Expand the drawn rect here so all the pixels will be captured. | |
141 SkRect bounds = SkRect::MakeLTRB( | 146 SkRect bounds = SkRect::MakeLTRB( |
142 center.fX - outerRadius - SK_ScalarHalf, | 147 center.fX - outerRadius, |
143 center.fY - outerRadius - SK_ScalarHalf, | 148 center.fY - outerRadius, |
144 center.fX + outerRadius + SK_ScalarHalf, | 149 center.fX + outerRadius, |
145 center.fY + outerRadius + SK_ScalarHalf | 150 center.fY + outerRadius |
146 ); | 151 ); |
147 | 152 |
148 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop); | 153 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop); |
149 verts[1].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); | 154 verts[1].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); |
150 verts[2].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom); | 155 verts[2].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom); |
151 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); | 156 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); |
152 | 157 |
153 target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4, &bounds); | 158 target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4, &bounds); |
154 } | 159 } |
155 | 160 |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 T += center.fY - SK_ScalarHalf; | 270 T += center.fY - SK_ScalarHalf; |
266 B += center.fY + SK_ScalarHalf; | 271 B += center.fY + SK_ScalarHalf; |
267 | 272 |
268 verts[0].fPos = SkPoint::Make(L, T); | 273 verts[0].fPos = SkPoint::Make(L, T); |
269 verts[1].fPos = SkPoint::Make(R, T); | 274 verts[1].fPos = SkPoint::Make(R, T); |
270 verts[2].fPos = SkPoint::Make(L, B); | 275 verts[2].fPos = SkPoint::Make(L, B); |
271 verts[3].fPos = SkPoint::Make(R, B); | 276 verts[3].fPos = SkPoint::Make(R, B); |
272 | 277 |
273 target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4); | 278 target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4); |
274 } | 279 } |
OLD | NEW |