blob: 65f188e9083caf29f575469e2eecff57007878d6 [file] [log] [blame]
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +00001/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
joshualitt30ba4362014-08-21 20:18:45 -07008#include "gl/builders/GrGLProgramBuilder.h"
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +00009#include "GrOvalEffect.h"
10
11#include "gl/GrGLEffect.h"
12#include "gl/GrGLSL.h"
13#include "GrTBackendEffectFactory.h"
14
15#include "SkRect.h"
16
17//////////////////////////////////////////////////////////////////////////////
18
19class GLCircleEffect;
20
21class CircleEffect : public GrEffect {
22public:
bsalomon83d081a2014-07-08 09:56:10 -070023 static GrEffect* Create(GrEffectEdgeType, const SkPoint& center, SkScalar radius);
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +000024
25 virtual ~CircleEffect() {};
26 static const char* Name() { return "Circle"; }
27
28 const SkPoint& getCenter() const { return fCenter; }
29 SkScalar getRadius() const { return fRadius; }
30
31 GrEffectEdgeType getEdgeType() const { return fEdgeType; }
32
33 typedef GLCircleEffect GLEffect;
34
35 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
36
37 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
38
39private:
40 CircleEffect(GrEffectEdgeType, const SkPoint& center, SkScalar radius);
41
42 virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE;
43
44 SkPoint fCenter;
45 SkScalar fRadius;
46 GrEffectEdgeType fEdgeType;
47
48 GR_DECLARE_EFFECT_TEST;
49
50 typedef GrEffect INHERITED;
51};
52
bsalomon83d081a2014-07-08 09:56:10 -070053GrEffect* CircleEffect::Create(GrEffectEdgeType edgeType, const SkPoint& center, SkScalar radius) {
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +000054 SkASSERT(radius >= 0);
bsalomon55fad7a2014-07-08 07:34:20 -070055 return SkNEW_ARGS(CircleEffect, (edgeType, center, radius));
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +000056}
57
58void CircleEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const {
59 *validFlags = 0;
60}
61
62const GrBackendEffectFactory& CircleEffect::getFactory() const {
63 return GrTBackendEffectFactory<CircleEffect>::getInstance();
64}
65
66CircleEffect::CircleEffect(GrEffectEdgeType edgeType, const SkPoint& c, SkScalar r)
67 : fCenter(c)
68 , fRadius(r)
69 , fEdgeType(edgeType) {
70 this->setWillReadFragmentPosition();
71}
72
73bool CircleEffect::onIsEqual(const GrEffect& other) const {
joshualitt49586be2014-09-16 08:21:41 -070074 const CircleEffect& ce = other.cast<CircleEffect>();
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +000075 return fEdgeType == ce.fEdgeType && fCenter == ce.fCenter && fRadius == ce.fRadius;
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +000076}
77
78//////////////////////////////////////////////////////////////////////////////
79
80GR_DEFINE_EFFECT_TEST(CircleEffect);
81
bsalomon83d081a2014-07-08 09:56:10 -070082GrEffect* CircleEffect::TestCreate(SkRandom* random,
83 GrContext*,
84 const GrDrawTargetCaps& caps,
85 GrTexture*[]) {
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +000086 SkPoint center;
87 center.fX = random->nextRangeScalar(0.f, 1000.f);
88 center.fY = random->nextRangeScalar(0.f, 1000.f);
89 SkScalar radius = random->nextRangeF(0.f, 1000.f);
90 GrEffectEdgeType et;
91 do {
92 et = (GrEffectEdgeType)random->nextULessThan(kGrEffectEdgeTypeCnt);
93 } while (kHairlineAA_GrEffectEdgeType == et);
94 return CircleEffect::Create(et, center, radius);
95}
96
97//////////////////////////////////////////////////////////////////////////////
98
99class GLCircleEffect : public GrGLEffect {
100public:
joshualitt49586be2014-09-16 08:21:41 -0700101 GLCircleEffect(const GrBackendEffectFactory&, const GrEffect&);
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000102
joshualitt30ba4362014-08-21 20:18:45 -0700103 virtual void emitCode(GrGLProgramBuilder* builder,
joshualitt49586be2014-09-16 08:21:41 -0700104 const GrEffect& effect,
bsalomon63e99f72014-07-21 08:03:14 -0700105 const GrEffectKey& key,
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000106 const char* outputColor,
107 const char* inputColor,
108 const TransformedCoordsArray&,
109 const TextureSamplerArray&) SK_OVERRIDE;
110
joshualitt49586be2014-09-16 08:21:41 -0700111 static inline void GenKey(const GrEffect&, const GrGLCaps&, GrEffectKeyBuilder*);
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000112
joshualitt49586be2014-09-16 08:21:41 -0700113 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVERRIDE;
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000114
115private:
kkinnunen7510b222014-07-30 00:04:16 -0700116 GrGLProgramDataManager::UniformHandle fCircleUniform;
117 SkPoint fPrevCenter;
118 SkScalar fPrevRadius;
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000119
120 typedef GrGLEffect INHERITED;
121};
122
123GLCircleEffect::GLCircleEffect(const GrBackendEffectFactory& factory,
joshualitt49586be2014-09-16 08:21:41 -0700124 const GrEffect& effect)
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000125 : INHERITED (factory) {
126 fPrevRadius = -1.f;
127}
128
joshualitt30ba4362014-08-21 20:18:45 -0700129void GLCircleEffect::emitCode(GrGLProgramBuilder* builder,
joshualitt49586be2014-09-16 08:21:41 -0700130 const GrEffect& effect,
bsalomon63e99f72014-07-21 08:03:14 -0700131 const GrEffectKey& key,
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000132 const char* outputColor,
133 const char* inputColor,
134 const TransformedCoordsArray&,
135 const TextureSamplerArray& samplers) {
joshualitt49586be2014-09-16 08:21:41 -0700136 const CircleEffect& ce = effect.cast<CircleEffect>();
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000137 const char *circleName;
commit-bot@chromium.org0a09d712014-04-09 21:26:11 +0000138 // The circle uniform is (center.x, center.y, radius + 0.5) for regular fills and
139 // (... ,radius - 0.5) for inverse fills.
joshualitt30ba4362014-08-21 20:18:45 -0700140 fCircleUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000141 kVec3f_GrSLType,
142 "circle",
143 &circleName);
joshualitt30ba4362014-08-21 20:18:45 -0700144
145 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
146 const char* fragmentPos = fsBuilder->fragmentPosition();
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000147
148 SkASSERT(kHairlineAA_GrEffectEdgeType != ce.getEdgeType());
149 if (GrEffectEdgeTypeIsInverseFill(ce.getEdgeType())) {
joshualitt30ba4362014-08-21 20:18:45 -0700150 fsBuilder->codeAppendf("\t\tfloat d = length(%s.xy - %s.xy) - %s.z;\n",
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000151 circleName, fragmentPos, circleName);
152 } else {
joshualitt30ba4362014-08-21 20:18:45 -0700153 fsBuilder->codeAppendf("\t\tfloat d = %s.z - length(%s.xy - %s.xy);\n",
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000154 circleName, fragmentPos, circleName);
155 }
156 if (GrEffectEdgeTypeIsAA(ce.getEdgeType())) {
joshualitt30ba4362014-08-21 20:18:45 -0700157 fsBuilder->codeAppend("\t\td = clamp(d, 0.0, 1.0);\n");
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000158 } else {
joshualitt30ba4362014-08-21 20:18:45 -0700159 fsBuilder->codeAppend("\t\td = d > 0.5 ? 1.0 : 0.0;\n");
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000160 }
161
joshualitt30ba4362014-08-21 20:18:45 -0700162 fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor,
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000163 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("d")).c_str());
164}
165
joshualitt49586be2014-09-16 08:21:41 -0700166void GLCircleEffect::GenKey(const GrEffect& effect, const GrGLCaps&,
bsalomon63e99f72014-07-21 08:03:14 -0700167 GrEffectKeyBuilder* b) {
joshualitt49586be2014-09-16 08:21:41 -0700168 const CircleEffect& ce = effect.cast<CircleEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700169 b->add32(ce.getEdgeType());
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000170}
171
joshualitt49586be2014-09-16 08:21:41 -0700172void GLCircleEffect::setData(const GrGLProgramDataManager& pdman, const GrEffect& effect) {
173 const CircleEffect& ce = effect.cast<CircleEffect>();
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000174 if (ce.getRadius() != fPrevRadius || ce.getCenter() != fPrevCenter) {
commit-bot@chromium.org0a09d712014-04-09 21:26:11 +0000175 SkScalar radius = ce.getRadius();
176 if (GrEffectEdgeTypeIsInverseFill(ce.getEdgeType())) {
177 radius -= 0.5f;
178 } else {
179 radius += 0.5f;
180 }
kkinnunen7510b222014-07-30 00:04:16 -0700181 pdman.set3f(fCircleUniform, ce.getCenter().fX, ce.getCenter().fY, radius);
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000182 fPrevCenter = ce.getCenter();
183 fPrevRadius = ce.getRadius();
184 }
185}
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000186
187//////////////////////////////////////////////////////////////////////////////
188
189class GLEllipseEffect;
190
191class EllipseEffect : public GrEffect {
192public:
bsalomon83d081a2014-07-08 09:56:10 -0700193 static GrEffect* Create(GrEffectEdgeType, const SkPoint& center, SkScalar rx, SkScalar ry);
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000194
195 virtual ~EllipseEffect() {};
196 static const char* Name() { return "Ellipse"; }
197
198 const SkPoint& getCenter() const { return fCenter; }
199 SkVector getRadii() const { return fRadii; }
200
201 GrEffectEdgeType getEdgeType() const { return fEdgeType; }
202
203 typedef GLEllipseEffect GLEffect;
204
205 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
206
207 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
208
209private:
210 EllipseEffect(GrEffectEdgeType, const SkPoint& center, SkScalar rx, SkScalar ry);
211
212 virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE;
213
214 SkPoint fCenter;
215 SkVector fRadii;
216 GrEffectEdgeType fEdgeType;
217
218 GR_DECLARE_EFFECT_TEST;
219
220 typedef GrEffect INHERITED;
221};
222
bsalomon83d081a2014-07-08 09:56:10 -0700223GrEffect* EllipseEffect::Create(GrEffectEdgeType edgeType,
224 const SkPoint& center,
225 SkScalar rx,
226 SkScalar ry) {
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000227 SkASSERT(rx >= 0 && ry >= 0);
bsalomon55fad7a2014-07-08 07:34:20 -0700228 return SkNEW_ARGS(EllipseEffect, (edgeType, center, rx, ry));
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000229}
230
231void EllipseEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const {
232 *validFlags = 0;
233}
234
235const GrBackendEffectFactory& EllipseEffect::getFactory() const {
236 return GrTBackendEffectFactory<EllipseEffect>::getInstance();
237}
238
239EllipseEffect::EllipseEffect(GrEffectEdgeType edgeType, const SkPoint& c, SkScalar rx, SkScalar ry)
240 : fCenter(c)
241 , fRadii(SkVector::Make(rx, ry))
242 , fEdgeType(edgeType) {
243 this->setWillReadFragmentPosition();
244}
245
246bool EllipseEffect::onIsEqual(const GrEffect& other) const {
joshualitt49586be2014-09-16 08:21:41 -0700247 const EllipseEffect& ee = other.cast<EllipseEffect>();
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000248 return fEdgeType == ee.fEdgeType && fCenter == ee.fCenter && fRadii == ee.fRadii;
249}
250
251//////////////////////////////////////////////////////////////////////////////
252
253GR_DEFINE_EFFECT_TEST(EllipseEffect);
254
bsalomon83d081a2014-07-08 09:56:10 -0700255GrEffect* EllipseEffect::TestCreate(SkRandom* random,
256 GrContext*,
257 const GrDrawTargetCaps& caps,
258 GrTexture*[]) {
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000259 SkPoint center;
260 center.fX = random->nextRangeScalar(0.f, 1000.f);
261 center.fY = random->nextRangeScalar(0.f, 1000.f);
262 SkScalar rx = random->nextRangeF(0.f, 1000.f);
263 SkScalar ry = random->nextRangeF(0.f, 1000.f);
264 GrEffectEdgeType et;
265 do {
266 et = (GrEffectEdgeType)random->nextULessThan(kGrEffectEdgeTypeCnt);
267 } while (kHairlineAA_GrEffectEdgeType == et);
268 return EllipseEffect::Create(et, center, rx, ry);
269}
270
271//////////////////////////////////////////////////////////////////////////////
272
273class GLEllipseEffect : public GrGLEffect {
274public:
joshualitt49586be2014-09-16 08:21:41 -0700275 GLEllipseEffect(const GrBackendEffectFactory&, const GrEffect&);
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000276
joshualitt30ba4362014-08-21 20:18:45 -0700277 virtual void emitCode(GrGLProgramBuilder* builder,
joshualitt49586be2014-09-16 08:21:41 -0700278 const GrEffect& effect,
bsalomon63e99f72014-07-21 08:03:14 -0700279 const GrEffectKey& key,
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000280 const char* outputColor,
281 const char* inputColor,
282 const TransformedCoordsArray&,
283 const TextureSamplerArray&) SK_OVERRIDE;
284
joshualitt49586be2014-09-16 08:21:41 -0700285 static inline void GenKey(const GrEffect&, const GrGLCaps&, GrEffectKeyBuilder*);
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000286
joshualitt49586be2014-09-16 08:21:41 -0700287 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVERRIDE;
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000288
289private:
kkinnunen7510b222014-07-30 00:04:16 -0700290 GrGLProgramDataManager::UniformHandle fEllipseUniform;
291 SkPoint fPrevCenter;
292 SkVector fPrevRadii;
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000293
294 typedef GrGLEffect INHERITED;
295};
296
297GLEllipseEffect::GLEllipseEffect(const GrBackendEffectFactory& factory,
joshualitt49586be2014-09-16 08:21:41 -0700298 const GrEffect& effect)
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000299 : INHERITED (factory) {
300 fPrevRadii.fX = -1.f;
301}
302
joshualitt30ba4362014-08-21 20:18:45 -0700303void GLEllipseEffect::emitCode(GrGLProgramBuilder* builder,
joshualitt49586be2014-09-16 08:21:41 -0700304 const GrEffect& effect,
bsalomon63e99f72014-07-21 08:03:14 -0700305 const GrEffectKey& key,
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000306 const char* outputColor,
307 const char* inputColor,
308 const TransformedCoordsArray&,
309 const TextureSamplerArray& samplers) {
joshualitt49586be2014-09-16 08:21:41 -0700310 const EllipseEffect& ee = effect.cast<EllipseEffect>();
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000311 const char *ellipseName;
312 // The ellipse uniform is (center.x, center.y, 1 / rx^2, 1 / ry^2)
joshualitt30ba4362014-08-21 20:18:45 -0700313 fEllipseUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000314 kVec4f_GrSLType,
315 "ellipse",
316 &ellipseName);
joshualitt30ba4362014-08-21 20:18:45 -0700317
318 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
319 const char* fragmentPos = fsBuilder->fragmentPosition();
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000320
321 // d is the offset to the ellipse center
joshualitt30ba4362014-08-21 20:18:45 -0700322 fsBuilder->codeAppendf("\t\tvec2 d = %s.xy - %s.xy;\n", fragmentPos, ellipseName);
323 fsBuilder->codeAppendf("\t\tvec2 Z = d * %s.zw;\n", ellipseName);
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000324 // implicit is the evaluation of (x/rx)^2 + (y/ry)^2 - 1.
joshualitt30ba4362014-08-21 20:18:45 -0700325 fsBuilder->codeAppend("\t\tfloat implicit = dot(Z, d) - 1.0;\n");
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000326 // grad_dot is the squared length of the gradient of the implicit.
joshualitt30ba4362014-08-21 20:18:45 -0700327 fsBuilder->codeAppendf("\t\tfloat grad_dot = 4.0 * dot(Z, Z);\n");
commit-bot@chromium.org1b035d82014-04-09 17:11:09 +0000328 // avoid calling inversesqrt on zero.
joshualitt30ba4362014-08-21 20:18:45 -0700329 fsBuilder->codeAppend("\t\tgrad_dot = max(grad_dot, 1.0e-4);\n");
330 fsBuilder->codeAppendf("\t\tfloat approx_dist = implicit * inversesqrt(grad_dot);\n");
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000331
332 switch (ee.getEdgeType()) {
333 case kFillAA_GrEffectEdgeType:
joshualitt30ba4362014-08-21 20:18:45 -0700334 fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 - approx_dist, 0.0, 1.0);\n");
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000335 break;
336 case kInverseFillAA_GrEffectEdgeType:
joshualitt30ba4362014-08-21 20:18:45 -0700337 fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 + approx_dist, 0.0, 1.0);\n");
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000338 break;
339 case kFillBW_GrEffectEdgeType:
joshualitt30ba4362014-08-21 20:18:45 -0700340 fsBuilder->codeAppend("\t\tfloat alpha = approx_dist > 0.0 ? 0.0 : 1.0;\n");
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000341 break;
342 case kInverseFillBW_GrEffectEdgeType:
joshualitt30ba4362014-08-21 20:18:45 -0700343 fsBuilder->codeAppend("\t\tfloat alpha = approx_dist > 0.0 ? 1.0 : 0.0;\n");
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000344 break;
345 case kHairlineAA_GrEffectEdgeType:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000346 SkFAIL("Hairline not expected here.");
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000347 }
348
joshualitt30ba4362014-08-21 20:18:45 -0700349 fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor,
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000350 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_str());
351}
352
joshualitt49586be2014-09-16 08:21:41 -0700353void GLEllipseEffect::GenKey(const GrEffect& effect, const GrGLCaps&,
bsalomon63e99f72014-07-21 08:03:14 -0700354 GrEffectKeyBuilder* b) {
joshualitt49586be2014-09-16 08:21:41 -0700355 const EllipseEffect& ee = effect.cast<EllipseEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700356 b->add32(ee.getEdgeType());
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000357}
358
joshualitt49586be2014-09-16 08:21:41 -0700359void GLEllipseEffect::setData(const GrGLProgramDataManager& pdman, const GrEffect& effect) {
360 const EllipseEffect& ee = effect.cast<EllipseEffect>();
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000361 if (ee.getRadii() != fPrevRadii || ee.getCenter() != fPrevCenter) {
362 SkScalar invRXSqd = 1.f / (ee.getRadii().fX * ee.getRadii().fX);
363 SkScalar invRYSqd = 1.f / (ee.getRadii().fY * ee.getRadii().fY);
kkinnunen7510b222014-07-30 00:04:16 -0700364 pdman.set4f(fEllipseUniform, ee.getCenter().fX, ee.getCenter().fY, invRXSqd, invRYSqd);
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000365 fPrevCenter = ee.getCenter();
366 fPrevRadii = ee.getRadii();
367 }
368}
369
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000370//////////////////////////////////////////////////////////////////////////////
371
bsalomon83d081a2014-07-08 09:56:10 -0700372GrEffect* GrOvalEffect::Create(GrEffectEdgeType edgeType, const SkRect& oval) {
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000373 if (kHairlineAA_GrEffectEdgeType == edgeType) {
374 return NULL;
375 }
376 SkScalar w = oval.width();
377 SkScalar h = oval.height();
378 if (SkScalarNearlyEqual(w, h)) {
379 w /= 2;
380 return CircleEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, oval.fTop + w), w);
commit-bot@chromium.orgd0a50292014-04-02 15:00:39 +0000381 } else {
382 w /= 2;
383 h /= 2;
384 return EllipseEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, oval.fTop + h), w, h);
commit-bot@chromium.org3eedb802014-03-28 15:58:31 +0000385 }
386
387 return NULL;
388}