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 830ba436f04e61d4505fb854d5fc56079636e0788joshualitt#include "gl/builders/GrGLProgramBuilder.h" 93eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org#include "GrOvalEffect.h" 103eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 11b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "gl/GrGLProcessor.h" 123eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org#include "gl/GrGLSL.h" 13b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "GrTBackendProcessorFactory.h" 143eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 153eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org#include "SkRect.h" 163eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 173eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 183eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 193eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgclass GLCircleEffect; 203eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 21b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass CircleEffect : public GrFragmentProcessor { 223eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgpublic: 23b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkPoint& center, SkScalar radius); 243eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 253eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org virtual ~CircleEffect() {}; 263eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org static const char* Name() { return "Circle"; } 273eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 283eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const SkPoint& getCenter() const { return fCenter; } 293eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkScalar getRadius() const { return fRadius; } 303eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 31b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } 323eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 33b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GLCircleEffect GLProcessor; 343eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 353eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; 363eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 37b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERRIDE; 383eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 393eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgprivate: 40b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt CircleEffect(GrPrimitiveEdgeType, const SkPoint& center, SkScalar radius); 413eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 42b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt virtual bool onIsEqual(const GrProcessor&) const SK_OVERRIDE; 433eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 443eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkPoint fCenter; 453eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkScalar fRadius; 46b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrPrimitiveEdgeType fEdgeType; 473eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 48b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 493eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 50b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GrFragmentProcessor INHERITED; 513eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org}; 523eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 53b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* CircleEffect::Create(GrPrimitiveEdgeType edgeType, const SkPoint& center, 54b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt SkScalar radius) { 553eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkASSERT(radius >= 0); 5655fad7af61c21d502acb9891d631e8aa29e3628cbsalomon return SkNEW_ARGS(CircleEffect, (edgeType, center, radius)); 573eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 583eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 593eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgvoid CircleEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { 603eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org *validFlags = 0; 613eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 623eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 63b0a8a377f832c59cee939ad721e1f87d378b7142joshualittconst GrBackendFragmentProcessorFactory& CircleEffect::getFactory() const { 64b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt return GrTBackendFragmentProcessorFactory<CircleEffect>::getInstance(); 653eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 663eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 67b0a8a377f832c59cee939ad721e1f87d378b7142joshualittCircleEffect::CircleEffect(GrPrimitiveEdgeType edgeType, const SkPoint& c, SkScalar r) 683eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org : fCenter(c) 693eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org , fRadius(r) 703eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org , fEdgeType(edgeType) { 713eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org this->setWillReadFragmentPosition(); 723eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 733eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 74b0a8a377f832c59cee939ad721e1f87d378b7142joshualittbool CircleEffect::onIsEqual(const GrProcessor& other) const { 7549586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const CircleEffect& ce = other.cast<CircleEffect>(); 76d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org return fEdgeType == ce.fEdgeType && fCenter == ce.fCenter && fRadius == ce.fRadius; 773eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 783eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 793eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 803eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 81b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleEffect); 823eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 83b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* CircleEffect::TestCreate(SkRandom* random, 84b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrContext*, 85b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrDrawTargetCaps& caps, 86b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTexture*[]) { 873eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkPoint center; 883eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org center.fX = random->nextRangeScalar(0.f, 1000.f); 893eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org center.fY = random->nextRangeScalar(0.f, 1000.f); 903eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkScalar radius = random->nextRangeF(0.f, 1000.f); 91b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrPrimitiveEdgeType et; 923eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org do { 93b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt et = (GrPrimitiveEdgeType)random->nextULessThan(kGrProcessorEdgeTypeCnt); 94b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt } while (kHairlineAA_GrProcessorEdgeType == et); 953eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return CircleEffect::Create(et, center, radius); 963eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 973eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 983eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 993eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 100b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GLCircleEffect : public GrGLFragmentProcessor { 1013eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgpublic: 102b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GLCircleEffect(const GrBackendProcessorFactory&, const GrProcessor&); 1033eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 10430ba436f04e61d4505fb854d5fc56079636e0788joshualitt virtual void emitCode(GrGLProgramBuilder* builder, 105b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor& fp, 106b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessorKey& key, 1073eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const char* outputColor, 1083eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const char* inputColor, 1093eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const TransformedCoordsArray&, 1103eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const TextureSamplerArray&) SK_OVERRIDE; 1113eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 112b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*); 1133eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 114b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE; 1153eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 1163eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.orgprivate: 1177510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen GrGLProgramDataManager::UniformHandle fCircleUniform; 1187510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen SkPoint fPrevCenter; 1197510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen SkScalar fPrevRadius; 1203eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 121b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GrGLFragmentProcessor INHERITED; 1223eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org}; 1233eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 124b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGLCircleEffect::GLCircleEffect(const GrBackendProcessorFactory& factory, 125b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessor&) 1263eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org : INHERITED (factory) { 1273eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org fPrevRadius = -1.f; 1283eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 1293eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 13030ba436f04e61d4505fb854d5fc56079636e0788joshualittvoid GLCircleEffect::emitCode(GrGLProgramBuilder* builder, 131b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor& fp, 132b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessorKey& key, 1333eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const char* outputColor, 1343eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const char* inputColor, 1353eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const TransformedCoordsArray&, 1363eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const TextureSamplerArray& samplers) { 137b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const CircleEffect& ce = fp.cast<CircleEffect>(); 1383eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org const char *circleName; 1390a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org // The circle uniform is (center.x, center.y, radius + 0.5) for regular fills and 1400a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org // (... ,radius - 0.5) for inverse fills. 14130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fCircleUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 1423eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org kVec3f_GrSLType, 1433eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org "circle", 1443eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org &circleName); 14530ba436f04e61d4505fb854d5fc56079636e0788joshualitt 14630ba436f04e61d4505fb854d5fc56079636e0788joshualitt GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 14730ba436f04e61d4505fb854d5fc56079636e0788joshualitt const char* fragmentPos = fsBuilder->fragmentPosition(); 1483eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 149b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt SkASSERT(kHairlineAA_GrProcessorEdgeType != ce.getEdgeType()); 150b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt if (GrProcessorEdgeTypeIsInverseFill(ce.getEdgeType())) { 15130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat d = length(%s.xy - %s.xy) - %s.z;\n", 1523eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org circleName, fragmentPos, circleName); 1533eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } else { 15430ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat d = %s.z - length(%s.xy - %s.xy);\n", 1553eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org circleName, fragmentPos, circleName); 1563eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 157b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt if (GrProcessorEdgeTypeIsAA(ce.getEdgeType())) { 15830ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\td = clamp(d, 0.0, 1.0);\n"); 1593eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } else { 16030ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\td = d > 0.5 ? 1.0 : 0.0;\n"); 1613eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 1623eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 16330ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor, 1643eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org (GrGLSLExpr4(inputColor) * GrGLSLExpr1("d")).c_str()); 1653eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 1663eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 167b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GLCircleEffect::GenKey(const GrProcessor& processor, const GrGLCaps&, 168b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrProcessorKeyBuilder* b) { 169b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const CircleEffect& ce = processor.cast<CircleEffect>(); 17063e99f7a03b2ac90ae7a00232674fd39c0bdcc68bsalomon b->add32(ce.getEdgeType()); 1713eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 1723eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 173b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GLCircleEffect::setData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) { 174b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const CircleEffect& ce = processor.cast<CircleEffect>(); 1753eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org if (ce.getRadius() != fPrevRadius || ce.getCenter() != fPrevCenter) { 1760a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org SkScalar radius = ce.getRadius(); 177b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt if (GrProcessorEdgeTypeIsInverseFill(ce.getEdgeType())) { 1780a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org radius -= 0.5f; 1790a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org } else { 1800a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org radius += 0.5f; 1810a09d7195b8d9945e5c9c76cc4cfe6ef65d6d390commit-bot@chromium.org } 1827510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen pdman.set3f(fCircleUniform, ce.getCenter().fX, ce.getCenter().fY, radius); 1833eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org fPrevCenter = ce.getCenter(); 1843eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org fPrevRadius = ce.getRadius(); 1853eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 1863eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 187d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 188d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 189d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 190d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgclass GLEllipseEffect; 191d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 192b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass EllipseEffect : public GrFragmentProcessor { 193d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgpublic: 194b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkPoint& center, SkScalar rx, 195b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt SkScalar ry); 196d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 197d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org virtual ~EllipseEffect() {}; 198d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org static const char* Name() { return "Ellipse"; } 199d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 200d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const SkPoint& getCenter() const { return fCenter; } 201d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkVector getRadii() const { return fRadii; } 202d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 203b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } 204d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 205b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GLEllipseEffect GLProcessor; 206d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 207d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; 208d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 209b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERRIDE; 210d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 211d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgprivate: 212b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt EllipseEffect(GrPrimitiveEdgeType, const SkPoint& center, SkScalar rx, SkScalar ry); 213d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 214b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt virtual bool onIsEqual(const GrProcessor&) const SK_OVERRIDE; 215d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 216d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkPoint fCenter; 217d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkVector fRadii; 218b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrPrimitiveEdgeType fEdgeType; 219d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 220b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 221d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 222b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GrFragmentProcessor INHERITED; 223d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org}; 224d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 225b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* EllipseEffect::Create(GrPrimitiveEdgeType edgeType, 226b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const SkPoint& center, 227b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt SkScalar rx, 228b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt SkScalar ry) { 229d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkASSERT(rx >= 0 && ry >= 0); 23055fad7af61c21d502acb9891d631e8aa29e3628cbsalomon return SkNEW_ARGS(EllipseEffect, (edgeType, center, rx, ry)); 231d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 232d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 233d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgvoid EllipseEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { 234d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org *validFlags = 0; 235d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 236d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 237b0a8a377f832c59cee939ad721e1f87d378b7142joshualittconst GrBackendFragmentProcessorFactory& EllipseEffect::getFactory() const { 238b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt return GrTBackendFragmentProcessorFactory<EllipseEffect>::getInstance(); 239d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 240d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 241b0a8a377f832c59cee939ad721e1f87d378b7142joshualittEllipseEffect::EllipseEffect(GrPrimitiveEdgeType edgeType, const SkPoint& c, SkScalar rx, SkScalar ry) 242d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org : fCenter(c) 243d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org , fRadii(SkVector::Make(rx, ry)) 244d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org , fEdgeType(edgeType) { 245d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org this->setWillReadFragmentPosition(); 246d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 247d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 248b0a8a377f832c59cee939ad721e1f87d378b7142joshualittbool EllipseEffect::onIsEqual(const GrProcessor& other) const { 24949586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const EllipseEffect& ee = other.cast<EllipseEffect>(); 250d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org return fEdgeType == ee.fEdgeType && fCenter == ee.fCenter && fRadii == ee.fRadii; 251d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 252d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 253d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 254d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 255b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGR_DEFINE_FRAGMENT_PROCESSOR_TEST(EllipseEffect); 256d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 257b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* EllipseEffect::TestCreate(SkRandom* random, 258b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrContext*, 259b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrDrawTargetCaps& caps, 260b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTexture*[]) { 261d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkPoint center; 262d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org center.fX = random->nextRangeScalar(0.f, 1000.f); 263d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org center.fY = random->nextRangeScalar(0.f, 1000.f); 264d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkScalar rx = random->nextRangeF(0.f, 1000.f); 265d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkScalar ry = random->nextRangeF(0.f, 1000.f); 266b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrPrimitiveEdgeType et; 267d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org do { 268b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt et = (GrPrimitiveEdgeType)random->nextULessThan(kGrProcessorEdgeTypeCnt); 269b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt } while (kHairlineAA_GrProcessorEdgeType == et); 270d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org return EllipseEffect::Create(et, center, rx, ry); 271d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 272d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 273d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 274d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 275b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GLEllipseEffect : public GrGLFragmentProcessor { 276d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgpublic: 277b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GLEllipseEffect(const GrBackendProcessorFactory&, const GrProcessor&); 278d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 27930ba436f04e61d4505fb854d5fc56079636e0788joshualitt virtual void emitCode(GrGLProgramBuilder* builder, 280b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor& fp, 281b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessorKey& key, 282d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const char* outputColor, 283d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const char* inputColor, 284d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const TransformedCoordsArray&, 285d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const TextureSamplerArray&) SK_OVERRIDE; 286d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 287b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*); 288d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 289b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE; 290d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 291d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.orgprivate: 2927510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen GrGLProgramDataManager::UniformHandle fEllipseUniform; 2937510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen SkPoint fPrevCenter; 2947510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen SkVector fPrevRadii; 295d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 296b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GrGLFragmentProcessor INHERITED; 297d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org}; 298d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 299b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGLEllipseEffect::GLEllipseEffect(const GrBackendProcessorFactory& factory, 300b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessor& effect) 301d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org : INHERITED (factory) { 302d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org fPrevRadii.fX = -1.f; 303d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 304d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 30530ba436f04e61d4505fb854d5fc56079636e0788joshualittvoid GLEllipseEffect::emitCode(GrGLProgramBuilder* builder, 306b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor& fp, 307b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessorKey& key, 308d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const char* outputColor, 309d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const char* inputColor, 310d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const TransformedCoordsArray&, 311d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const TextureSamplerArray& samplers) { 312b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const EllipseEffect& ee = fp.cast<EllipseEffect>(); 313d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org const char *ellipseName; 314d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org // The ellipse uniform is (center.x, center.y, 1 / rx^2, 1 / ry^2) 31530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fEllipseUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 316d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org kVec4f_GrSLType, 317d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org "ellipse", 318d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org &ellipseName); 31930ba436f04e61d4505fb854d5fc56079636e0788joshualitt 32030ba436f04e61d4505fb854d5fc56079636e0788joshualitt GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 32130ba436f04e61d4505fb854d5fc56079636e0788joshualitt const char* fragmentPos = fsBuilder->fragmentPosition(); 322d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 323d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org // d is the offset to the ellipse center 32430ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 d = %s.xy - %s.xy;\n", fragmentPos, ellipseName); 32530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 Z = d * %s.zw;\n", ellipseName); 326d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org // implicit is the evaluation of (x/rx)^2 + (y/ry)^2 - 1. 32730ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tfloat implicit = dot(Z, d) - 1.0;\n"); 328d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org // grad_dot is the squared length of the gradient of the implicit. 32930ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat grad_dot = 4.0 * dot(Z, Z);\n"); 3301b035d82d2b8b50ae334463edd06e4c5e0639311commit-bot@chromium.org // avoid calling inversesqrt on zero. 33130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tgrad_dot = max(grad_dot, 1.0e-4);\n"); 33230ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat approx_dist = implicit * inversesqrt(grad_dot);\n"); 333d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 334d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org switch (ee.getEdgeType()) { 335b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt case kFillAA_GrProcessorEdgeType: 33630ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 - approx_dist, 0.0, 1.0);\n"); 337d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org break; 338b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt case kInverseFillAA_GrProcessorEdgeType: 33930ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 + approx_dist, 0.0, 1.0);\n"); 340d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org break; 341b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt case kFillBW_GrProcessorEdgeType: 34230ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tfloat alpha = approx_dist > 0.0 ? 0.0 : 1.0;\n"); 343d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org break; 344b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt case kInverseFillBW_GrProcessorEdgeType: 34530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tfloat alpha = approx_dist > 0.0 ? 1.0 : 0.0;\n"); 346d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org break; 347b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt case kHairlineAA_GrProcessorEdgeType: 34888cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Hairline not expected here."); 349d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org } 350d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 35130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor, 352d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_str()); 353d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 354d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 355b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GLEllipseEffect::GenKey(const GrProcessor& effect, const GrGLCaps&, 356b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrProcessorKeyBuilder* b) { 35749586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const EllipseEffect& ee = effect.cast<EllipseEffect>(); 35863e99f7a03b2ac90ae7a00232674fd39c0bdcc68bsalomon b->add32(ee.getEdgeType()); 359d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 360d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 361b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GLEllipseEffect::setData(const GrGLProgramDataManager& pdman, const GrProcessor& effect) { 36249586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const EllipseEffect& ee = effect.cast<EllipseEffect>(); 363d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org if (ee.getRadii() != fPrevRadii || ee.getCenter() != fPrevCenter) { 364d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkScalar invRXSqd = 1.f / (ee.getRadii().fX * ee.getRadii().fX); 365d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org SkScalar invRYSqd = 1.f / (ee.getRadii().fY * ee.getRadii().fY); 3667510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen pdman.set4f(fEllipseUniform, ee.getCenter().fX, ee.getCenter().fY, invRXSqd, invRYSqd); 367d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org fPrevCenter = ee.getCenter(); 368d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org fPrevRadii = ee.getRadii(); 369d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org } 370d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org} 371d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org 3723eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 3733eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 374b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* GrOvalEffect::Create(GrPrimitiveEdgeType edgeType, const SkRect& oval) { 375b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt if (kHairlineAA_GrProcessorEdgeType == edgeType) { 3763eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return NULL; 3773eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 3783eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkScalar w = oval.width(); 3793eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org SkScalar h = oval.height(); 3803eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org if (SkScalarNearlyEqual(w, h)) { 3813eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org w /= 2; 3823eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return CircleEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, oval.fTop + w), w); 383d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org } else { 384d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org w /= 2; 385d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org h /= 2; 386d0a502968c3fc7f03afbe07211e36d3eeaa83694commit-bot@chromium.org return EllipseEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, oval.fTop + h), w, h); 3873eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 3883eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 3893eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return NULL; 3903eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org} 391