13eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org/* 23eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org * Copyright 2014 Google Inc. 33eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org * 43eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 53eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org * found in the LICENSE file. 63eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org */ 73eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 83eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org#include "GrOvalEffect.h" 93eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 103eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org#include "gl/GrGLEffect.h" 113eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org#include "gl/GrGLSL.h" 123eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org#include "GrTBackendEffectFactory.h" 133eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 143eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org#include "SkRect.h" 153eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 163eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 173eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 183eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgclass GLCircleEffect; 193eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 203eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgclass CircleEffect : public GrEffect { 213eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgpublic: 223eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org static GrEffectRef* Create(GrEffectEdgeType, const SkPoint& center, SkScalar radius); 233eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 243eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org virtual ~CircleEffect() {}; 253eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org static const char* Name() { return "Circle"; } 263eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 273eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const SkPoint& getCenter() const { return fCenter; } 283eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkScalar getRadius() const { return fRadius; } 293eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 303eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org GrEffectEdgeType getEdgeType() const { return fEdgeType; } 313eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 323eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org typedef GLCircleEffect GLEffect; 333eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 343eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; 353eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 363eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 373eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 383eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgprivate: 393eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org CircleEffect(GrEffectEdgeType, const SkPoint& center, SkScalar radius); 403eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 413eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; 423eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 433eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkPoint fCenter; 443eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkScalar fRadius; 453eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org GrEffectEdgeType fEdgeType; 463eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 473eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org GR_DECLARE_EFFECT_TEST; 483eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 493eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org typedef GrEffect INHERITED; 503eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org}; 513eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 523eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgGrEffectRef* CircleEffect::Create(GrEffectEdgeType edgeType, 533eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const SkPoint& center, 543eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkScalar radius) { 553eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkASSERT(radius >= 0); 563eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(CircleEffect, 573eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org (edgeType, center, radius)))); 583eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 593eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 603eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgvoid CircleEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { 613eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org *validFlags = 0; 623eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 633eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 643eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgconst GrBackendEffectFactory& CircleEffect::getFactory() const { 653eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return GrTBackendEffectFactory<CircleEffect>::getInstance(); 663eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 673eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 683eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgCircleEffect::CircleEffect(GrEffectEdgeType edgeType, const SkPoint& c, SkScalar r) 693eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org : fCenter(c) 703eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org , fRadius(r) 713eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org , fEdgeType(edgeType) { 723eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org this->setWillReadFragmentPosition(); 733eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 743eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 753eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgbool CircleEffect::onIsEqual(const GrEffect& other) const { 76d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const CircleEffect& ce = CastEffect<CircleEffect>(other); 77d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org return fEdgeType == ce.fEdgeType && fCenter == ce.fCenter && fRadius == ce.fRadius; 783eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 793eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 803eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 813eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 823eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgGR_DEFINE_EFFECT_TEST(CircleEffect); 833eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 843eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgGrEffectRef* CircleEffect::TestCreate(SkRandom* random, 853eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org GrContext*, 863eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const GrDrawTargetCaps& caps, 873eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org GrTexture*[]) { 883eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkPoint center; 893eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org center.fX = random->nextRangeScalar(0.f, 1000.f); 903eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org center.fY = random->nextRangeScalar(0.f, 1000.f); 913eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkScalar radius = random->nextRangeF(0.f, 1000.f); 923eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org GrEffectEdgeType et; 933eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org do { 943eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org et = (GrEffectEdgeType)random->nextULessThan(kGrEffectEdgeTypeCnt); 953eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } while (kHairlineAA_GrEffectEdgeType == et); 963eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return CircleEffect::Create(et, center, radius); 973eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 983eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 993eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 1003eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 1013eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgclass GLCircleEffect : public GrGLEffect { 1023eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgpublic: 1033eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org GLCircleEffect(const GrBackendEffectFactory&, const GrDrawEffect&); 1043eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 1053eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org virtual void emitCode(GrGLShaderBuilder* builder, 1063eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const GrDrawEffect& drawEffect, 1073eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org EffectKey key, 1083eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const char* outputColor, 1093eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const char* inputColor, 1103eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const TransformedCoordsArray&, 1113eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const TextureSamplerArray&) SK_OVERRIDE; 1123eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 1133eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); 1143eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 1153eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; 1163eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 1173eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgprivate: 1183eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org GrGLUniformManager::UniformHandle fCircleUniform; 1193eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkPoint fPrevCenter; 1203eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkScalar fPrevRadius; 1213eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 1223eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org typedef GrGLEffect INHERITED; 1233eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org}; 1243eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 1253eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgGLCircleEffect::GLCircleEffect(const GrBackendEffectFactory& factory, 1263eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const GrDrawEffect& drawEffect) 1273eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org : INHERITED (factory) { 1283eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org fPrevRadius = -1.f; 1293eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 1303eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 1313eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgvoid GLCircleEffect::emitCode(GrGLShaderBuilder* builder, 1323eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const GrDrawEffect& drawEffect, 1333eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org EffectKey key, 1343eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const char* outputColor, 1353eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const char* inputColor, 1363eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const TransformedCoordsArray&, 1373eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const TextureSamplerArray& samplers) { 1383eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const CircleEffect& ce = drawEffect.castEffect<CircleEffect>(); 1393eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const char *circleName; 1400a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org // The circle uniform is (center.x, center.y, radius + 0.5) for regular fills and 1410a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org // (... ,radius - 0.5) for inverse fills. 1423eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org fCircleUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 1433eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org kVec3f_GrSLType, 1443eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org "circle", 1453eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org &circleName); 1463eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const char* fragmentPos = builder->fragmentPosition(); 1473eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 1483eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkASSERT(kHairlineAA_GrEffectEdgeType != ce.getEdgeType()); 1493eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org if (GrEffectEdgeTypeIsInverseFill(ce.getEdgeType())) { 150160a52ba217012ed73c240f6d67b3bbf2b4879d6bsalomon builder->fsCodeAppendf("\t\tfloat d = length(%s.xy - %s) - %s.z;\n", 1513eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org circleName, fragmentPos, circleName); 1523eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } else { 153160a52ba217012ed73c240f6d67b3bbf2b4879d6bsalomon builder->fsCodeAppendf("\t\tfloat d = %s.z - length(%s - %s.xy);\n", 1543eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org circleName, fragmentPos, circleName); 1553eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 1563eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org if (GrEffectEdgeTypeIsAA(ce.getEdgeType())) { 1573eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org builder->fsCodeAppend("\t\td = clamp(d, 0.0, 1.0);\n"); 1583eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } else { 1593eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org builder->fsCodeAppend("\t\td = d > 0.5 ? 1.0 : 0.0;\n"); 1603eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 1613eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 1623eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor, 1633eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org (GrGLSLExpr4(inputColor) * GrGLSLExpr1("d")).c_str()); 1643eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 1653eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 1663eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgGrGLEffect::EffectKey GLCircleEffect::GenKey(const GrDrawEffect& drawEffect, 1673eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const GrGLCaps&) { 1683eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const CircleEffect& ce = drawEffect.castEffect<CircleEffect>(); 1693eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return ce.getEdgeType(); 1703eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 1713eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 1723eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgvoid GLCircleEffect::setData(const GrGLUniformManager& uman, const GrDrawEffect& drawEffect) { 1733eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const CircleEffect& ce = drawEffect.castEffect<CircleEffect>(); 1743eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org if (ce.getRadius() != fPrevRadius || ce.getCenter() != fPrevCenter) { 1750a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org SkScalar radius = ce.getRadius(); 1760a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org if (GrEffectEdgeTypeIsInverseFill(ce.getEdgeType())) { 1770a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org radius -= 0.5f; 1780a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org } else { 1790a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org radius += 0.5f; 1800a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org } 1810a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org uman.set3f(fCircleUniform, ce.getCenter().fX, ce.getCenter().fY, radius); 1823eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org fPrevCenter = ce.getCenter(); 1833eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org fPrevRadius = ce.getRadius(); 1843eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 1853eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 186d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 187d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 188d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 189d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgclass GLEllipseEffect; 190d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 191d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgclass EllipseEffect : public GrEffect { 192d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgpublic: 193d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org static GrEffectRef* Create(GrEffectEdgeType, const SkPoint& center, SkScalar rx, SkScalar ry); 194d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 195d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org virtual ~EllipseEffect() {}; 196d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org static const char* Name() { return "Ellipse"; } 197d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 198d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const SkPoint& getCenter() const { return fCenter; } 199d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkVector getRadii() const { return fRadii; } 200d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 201d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org GrEffectEdgeType getEdgeType() const { return fEdgeType; } 202d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 203d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org typedef GLEllipseEffect GLEffect; 204d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 205d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; 206d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 207d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 208d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 209d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgprivate: 210d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org EllipseEffect(GrEffectEdgeType, const SkPoint& center, SkScalar rx, SkScalar ry); 211d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 212d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; 213d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 214d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkPoint fCenter; 215d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkVector fRadii; 216d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org GrEffectEdgeType fEdgeType; 217d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 218d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org GR_DECLARE_EFFECT_TEST; 219d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 220d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org typedef GrEffect INHERITED; 221d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org}; 222d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 223d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgGrEffectRef* EllipseEffect::Create(GrEffectEdgeType edgeType, 224d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const SkPoint& center, 225d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkScalar rx, 226d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkScalar ry) { 227d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkASSERT(rx >= 0 && ry >= 0); 228d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org return CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(EllipseEffect, 229d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org (edgeType, center, rx, ry)))); 230d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 231d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 232d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgvoid EllipseEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { 233d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org *validFlags = 0; 234d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 235d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 236d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgconst GrBackendEffectFactory& EllipseEffect::getFactory() const { 237d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org return GrTBackendEffectFactory<EllipseEffect>::getInstance(); 238d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 239d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 240d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgEllipseEffect::EllipseEffect(GrEffectEdgeType edgeType, const SkPoint& c, SkScalar rx, SkScalar ry) 241d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org : fCenter(c) 242d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org , fRadii(SkVector::Make(rx, ry)) 243d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org , fEdgeType(edgeType) { 244d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org this->setWillReadFragmentPosition(); 245d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 246d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 247d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgbool EllipseEffect::onIsEqual(const GrEffect& other) const { 248d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const EllipseEffect& ee = CastEffect<EllipseEffect>(other); 249d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org return fEdgeType == ee.fEdgeType && fCenter == ee.fCenter && fRadii == ee.fRadii; 250d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 251d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 252d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 253d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 254d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgGR_DEFINE_EFFECT_TEST(EllipseEffect); 255d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 256d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgGrEffectRef* EllipseEffect::TestCreate(SkRandom* random, 257d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org GrContext*, 258d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const GrDrawTargetCaps& caps, 259d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org GrTexture*[]) { 260d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkPoint center; 261d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org center.fX = random->nextRangeScalar(0.f, 1000.f); 262d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org center.fY = random->nextRangeScalar(0.f, 1000.f); 263d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkScalar rx = random->nextRangeF(0.f, 1000.f); 264d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkScalar ry = random->nextRangeF(0.f, 1000.f); 265d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org GrEffectEdgeType et; 266d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org do { 267d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org et = (GrEffectEdgeType)random->nextULessThan(kGrEffectEdgeTypeCnt); 268d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org } while (kHairlineAA_GrEffectEdgeType == et); 269d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org return EllipseEffect::Create(et, center, rx, ry); 270d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 271d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 272d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 273d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 274d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgclass GLEllipseEffect : public GrGLEffect { 275d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgpublic: 276d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org GLEllipseEffect(const GrBackendEffectFactory&, const GrDrawEffect&); 277d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 278d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org virtual void emitCode(GrGLShaderBuilder* builder, 279d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const GrDrawEffect& drawEffect, 280d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org EffectKey key, 281d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const char* outputColor, 282d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const char* inputColor, 283d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const TransformedCoordsArray&, 284d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const TextureSamplerArray&) SK_OVERRIDE; 285d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 286d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); 287d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 288d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; 289d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 290d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgprivate: 291d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org GrGLUniformManager::UniformHandle fEllipseUniform; 292d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkPoint fPrevCenter; 293d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkVector fPrevRadii; 294d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 295d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org typedef GrGLEffect INHERITED; 296d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org}; 297d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 298d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgGLEllipseEffect::GLEllipseEffect(const GrBackendEffectFactory& factory, 299d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const GrDrawEffect& drawEffect) 300d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org : INHERITED (factory) { 301d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org fPrevRadii.fX = -1.f; 302d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 303d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 304d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgvoid GLEllipseEffect::emitCode(GrGLShaderBuilder* builder, 305d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const GrDrawEffect& drawEffect, 306d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org EffectKey key, 307d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const char* outputColor, 308d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const char* inputColor, 309d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const TransformedCoordsArray&, 310d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const TextureSamplerArray& samplers) { 311d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const EllipseEffect& ee = drawEffect.castEffect<EllipseEffect>(); 312d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const char *ellipseName; 313d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org // The ellipse uniform is (center.x, center.y, 1 / rx^2, 1 / ry^2) 314d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org fEllipseUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 315d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org kVec4f_GrSLType, 316d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org "ellipse", 317d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org &ellipseName); 318d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const char* fragmentPos = builder->fragmentPosition(); 319d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 320d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org // d is the offset to the ellipse center 321160a52ba217012ed73c240f6d67b3bbf2b4879d6bsalomon builder->fsCodeAppendf("\t\tvec2 d = %s - %s.xy;\n", fragmentPos, ellipseName); 322d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 Z = d * %s.zw;\n", ellipseName); 323d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org // implicit is the evaluation of (x/rx)^2 + (y/ry)^2 - 1. 324d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org builder->fsCodeAppend("\t\tfloat implicit = dot(Z, d) - 1.0;\n"); 325d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org // grad_dot is the squared length of the gradient of the implicit. 326d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat grad_dot = 4.0 * dot(Z, Z);\n"); 3271b035d82d2b8b50ae334463edd06e4c5e0639311commit-bot@chromium.org // avoid calling inversesqrt on zero. 3281b035d82d2b8b50ae334463edd06e4c5e0639311commit-bot@chromium.org builder->fsCodeAppend("\t\tgrad_dot = max(grad_dot, 1.0e-4);\n"); 329d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat approx_dist = implicit * inversesqrt(grad_dot);\n"); 330d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 331d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org switch (ee.getEdgeType()) { 332d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org case kFillAA_GrEffectEdgeType: 333d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org builder->fsCodeAppend("\t\tfloat alpha = clamp(0.5 - approx_dist, 0.0, 1.0);\n"); 334d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org break; 335d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org case kInverseFillAA_GrEffectEdgeType: 336d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org builder->fsCodeAppend("\t\tfloat alpha = clamp(0.5 + approx_dist, 0.0, 1.0);\n"); 337d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org break; 338d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org case kFillBW_GrEffectEdgeType: 339d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org builder->fsCodeAppend("\t\tfloat alpha = approx_dist > 0.0 ? 0.0 : 1.0;\n"); 340d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org break; 341d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org case kInverseFillBW_GrEffectEdgeType: 342d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org builder->fsCodeAppend("\t\tfloat alpha = approx_dist > 0.0 ? 1.0 : 0.0;\n"); 343d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org break; 344d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org case kHairlineAA_GrEffectEdgeType: 34588cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Hairline not expected here."); 346d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org } 347d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 348d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor, 349d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_str()); 350d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 351d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 352d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgGrGLEffect::EffectKey GLEllipseEffect::GenKey(const GrDrawEffect& drawEffect, 353d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const GrGLCaps&) { 354d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const EllipseEffect& ee = drawEffect.castEffect<EllipseEffect>(); 355d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org return ee.getEdgeType(); 356d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 357d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 358d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgvoid GLEllipseEffect::setData(const GrGLUniformManager& uman, const GrDrawEffect& drawEffect) { 359d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const EllipseEffect& ee = drawEffect.castEffect<EllipseEffect>(); 360d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org if (ee.getRadii() != fPrevRadii || ee.getCenter() != fPrevCenter) { 361d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkScalar invRXSqd = 1.f / (ee.getRadii().fX * ee.getRadii().fX); 362d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkScalar invRYSqd = 1.f / (ee.getRadii().fY * ee.getRadii().fY); 363d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org uman.set4f(fEllipseUniform, ee.getCenter().fX, ee.getCenter().fY, invRXSqd, invRYSqd); 364d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org fPrevCenter = ee.getCenter(); 365d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org fPrevRadii = ee.getRadii(); 366d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org } 367d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 368d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 3693eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 3703eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 3713eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgGrEffectRef* GrOvalEffect::Create(GrEffectEdgeType edgeType, const SkRect& oval) { 3723eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org if (kHairlineAA_GrEffectEdgeType == edgeType) { 3733eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return NULL; 3743eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 3753eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkScalar w = oval.width(); 3763eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkScalar h = oval.height(); 3773eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org if (SkScalarNearlyEqual(w, h)) { 3783eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org w /= 2; 3793eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return CircleEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, oval.fTop + w), w); 380d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org } else { 381d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org w /= 2; 382d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org h /= 2; 383d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org return EllipseEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, oval.fTop + h), w, h); 3843eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 3853eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 3863eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return NULL; 3873eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 388