1c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org/* 2c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org * Copyright 2014 Google Inc. 3c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org * 4c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 5c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org * found in the LICENSE file. 6c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org */ 7c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 8c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org#include "GrRRectEffect.h" 9c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 102a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org#include "GrConvexPolyEffect.h" 11eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt#include "GrFragmentProcessor.h" 12605dd0fbce9dbb2a0d3313e13e161f2bd54870d7egdaniel#include "GrInvariantOutput.h" 133eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org#include "GrOvalEffect.h" 14e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org#include "SkRRect.h" 15eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt#include "gl/GrGLProcessor.h" 16eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt#include "gl/GrGLSL.h" 17eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt#include "gl/builders/GrGLProgramBuilder.h" 18c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 192a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org// The effects defined here only handle rrect radii >= kRadiusMin. 202a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.orgstatic const SkScalar kRadiusMin = SK_ScalarHalf; 212a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org 222a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 232a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org 24b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass CircularRRectEffect : public GrFragmentProcessor { 25e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.orgpublic: 26f1f66c0c8623805fdb88f09c0d87cbdd1745e12bskia.committer@gmail.com 27dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org enum CornerFlags { 28dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kTopLeft_CornerFlag = (1 << SkRRect::kUpperLeft_Corner), 29dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kTopRight_CornerFlag = (1 << SkRRect::kUpperRight_Corner), 30dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kBottomRight_CornerFlag = (1 << SkRRect::kLowerRight_Corner), 31dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kBottomLeft_CornerFlag = (1 << SkRRect::kLowerLeft_Corner), 32dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org 33dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kLeft_CornerFlags = kTopLeft_CornerFlag | kBottomLeft_CornerFlag, 34dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kTop_CornerFlags = kTopLeft_CornerFlag | kTopRight_CornerFlag, 35dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kRight_CornerFlags = kTopRight_CornerFlag | kBottomRight_CornerFlag, 36dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kBottom_CornerFlags = kBottomLeft_CornerFlag | kBottomRight_CornerFlag, 37dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org 38dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kAll_CornerFlags = kTopLeft_CornerFlag | kTopRight_CornerFlag | 39dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kBottomLeft_CornerFlag | kBottomRight_CornerFlag, 40dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org 412a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org kNone_CornerFlags = 0 42cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org }; 43cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org 44dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org // The flags are used to indicate which corners are circluar (unflagged corners are assumed to 45dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org // be square). 46b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static GrFragmentProcessor* Create(GrPrimitiveEdgeType, uint32_t circularCornerFlags, 47b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const SkRRect&); 48e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 494355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org virtual ~CircularRRectEffect() {}; 50eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 5136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* name() const override { return "CircularRRect"; } 52eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 53cfc18867d982119d9dc2888bf09f1093012daaddjvanverth void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; 54eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 5536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein GrGLFragmentProcessor* createGLInstance() const override; 56e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 57e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org const SkRRect& getRRect() const { return fRRect; } 58e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 59dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org uint32_t getCircularCornerFlags() const { return fCircularCornerFlags; } 6006acb58074778d8eb40f14ae72b000d5120a8111skia.committer@gmail.com 61b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } 62cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org 63e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.orgprivate: 64b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt CircularRRectEffect(GrPrimitiveEdgeType, uint32_t circularCornerFlags, const SkRRect&); 65e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 6636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool onIsEqual(const GrFragmentProcessor& other) const override; 67e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 6836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onComputeInvariantOutput(GrInvariantOutput* inout) const override; 691a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel 70b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt SkRRect fRRect; 71b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrPrimitiveEdgeType fEdgeType; 72b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt uint32_t fCircularCornerFlags; 73e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 74b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 75e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 76b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GrFragmentProcessor INHERITED; 77e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org}; 78e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 79b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* CircularRRectEffect::Create(GrPrimitiveEdgeType edgeType, 80b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt uint32_t circularCornerFlags, 81b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const SkRRect& rrect) { 82b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt if (kFillAA_GrProcessorEdgeType != edgeType && kInverseFillAA_GrProcessorEdgeType != edgeType) { 833eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return NULL; 843eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 8555fad7af61c21d502acb9891d631e8aa29e3628cbsalomon return SkNEW_ARGS(CircularRRectEffect, (edgeType, circularCornerFlags, rrect)); 86e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org} 87e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 88605dd0fbce9dbb2a0d3313e13e161f2bd54870d7egdanielvoid CircularRRectEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const { 8956995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt inout->mulByUnknownSingleComponent(); 90e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org} 91e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 92b0a8a377f832c59cee939ad721e1f87d378b7142joshualittCircularRRectEffect::CircularRRectEffect(GrPrimitiveEdgeType edgeType, uint32_t circularCornerFlags, 93b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const SkRRect& rrect) 94cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org : fRRect(rrect) 95fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org , fEdgeType(edgeType) 96dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org , fCircularCornerFlags(circularCornerFlags) { 97eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt this->initClassID<CircularRRectEffect>(); 98e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org this->setWillReadFragmentPosition(); 99e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org} 100e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 1010e08fc17e4718f7ce4e38f793695896473e96948bsalomonbool CircularRRectEffect::onIsEqual(const GrFragmentProcessor& other) const { 10249586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const CircularRRectEffect& crre = other.cast<CircularRRectEffect>(); 1034355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // The corner flags are derived from fRRect, so no need to check them. 1044355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org return fEdgeType == crre.fEdgeType && fRRect == crre.fRRect; 105e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org} 106e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 107e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 108e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 109b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircularRRectEffect); 110e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 111b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* CircularRRectEffect::TestCreate(SkRandom* random, 112b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrContext*, 113b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrDrawTargetCaps& caps, 114b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTexture*[]) { 115e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org SkScalar w = random->nextRangeScalar(20.f, 1000.f); 116e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org SkScalar h = random->nextRangeScalar(20.f, 1000.f); 117e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org SkScalar r = random->nextRangeF(kRadiusMin, 9.f); 118e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org SkRRect rrect; 119e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org rrect.setRectXY(SkRect::MakeWH(w, h), r, r); 120b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrFragmentProcessor* fp; 121cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org do { 122b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrPrimitiveEdgeType et = 123b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt (GrPrimitiveEdgeType)random->nextULessThan(kGrProcessorEdgeTypeCnt); 124b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt fp = GrRRectEffect::Create(et, rrect); 125b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt } while (NULL == fp); 126b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt return fp; 127e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org} 128c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 129c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 130e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 131b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GLCircularRRectEffect : public GrGLFragmentProcessor { 132c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.orgpublic: 133eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt GLCircularRRectEffect(const GrProcessor&); 134c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 1351598899975ecc85b003a59740b588d1ddbcedb09joshualitt virtual void emitCode(GrGLFPBuilder* builder, 136b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor& fp, 137c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org const char* outputColor, 138c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org const char* inputColor, 139c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org const TransformedCoordsArray&, 14036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const TextureSamplerArray&) override; 141c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 142cfc18867d982119d9dc2888bf09f1093012daaddjvanverth static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*); 143c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 14436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void setData(const GrGLProgramDataManager&, const GrProcessor&) override; 145c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 146c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.orgprivate: 1477510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen GrGLProgramDataManager::UniformHandle fInnerRectUniform; 1487510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen GrGLProgramDataManager::UniformHandle fRadiusPlusHalfUniform; 1497510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen SkRRect fPrevRRect; 150b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GrGLFragmentProcessor INHERITED; 151c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org}; 152c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 153eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualittGLCircularRRectEffect::GLCircularRRectEffect(const GrProcessor& ) { 154c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org fPrevRRect.setEmpty(); 155c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org} 156c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 1571598899975ecc85b003a59740b588d1ddbcedb09joshualittvoid GLCircularRRectEffect::emitCode(GrGLFPBuilder* builder, 158267ce482b54f46097584e0f9350ec74aa6a2cd44joshualitt const GrFragmentProcessor& fp, 159267ce482b54f46097584e0f9350ec74aa6a2cd44joshualitt const char* outputColor, 160267ce482b54f46097584e0f9350ec74aa6a2cd44joshualitt const char* inputColor, 161267ce482b54f46097584e0f9350ec74aa6a2cd44joshualitt const TransformedCoordsArray&, 162267ce482b54f46097584e0f9350ec74aa6a2cd44joshualitt const TextureSamplerArray& samplers) { 163b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const CircularRRectEffect& crre = fp.cast<CircularRRectEffect>(); 164c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org const char *rectName; 165c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org const char *radiusPlusHalfName; 166c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org // The inner rect is the rrect bounds inset by the radius. Its left, top, right, and bottom 167c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org // edges correspond to components x, y, z, and w, respectively. When a side of the rrect has 168c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org // only rectangular corners, that side's value corresponds to the rect edge's value outset by 169c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org // half a pixel. 17030ba436f04e61d4505fb854d5fc56079636e0788joshualitt fInnerRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 171422f56f6e51c2f6a6ab425573b4d790f0157f883bsalomon kVec4f_GrSLType, kDefault_GrSLPrecision, 172c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org "innerRect", 173c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org &rectName); 17430ba436f04e61d4505fb854d5fc56079636e0788joshualitt fRadiusPlusHalfUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 175422f56f6e51c2f6a6ab425573b4d790f0157f883bsalomon kFloat_GrSLType, kDefault_GrSLPrecision, 176c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org "radiusPlusHalf", 177c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org &radiusPlusHalfName); 17830ba436f04e61d4505fb854d5fc56079636e0788joshualitt 17929bee0fe657fabf7c396502b69c9167fba13eaaaegdaniel GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 18030ba436f04e61d4505fb854d5fc56079636e0788joshualitt const char* fragmentPos = fsBuilder->fragmentPosition(); 181c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // At each quarter-circle corner we compute a vector that is the offset of the fragment position 182c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // from the circle center. The vector is pinned in x and y to be in the quarter-plane relevant 183c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // to that corner. This means that points near the interior near the rrect top edge will have 184c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // a vector that points straight up for both the TL left and TR corners. Computing an 185c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // alpha from this vector at either the TR or TL corner will give the correct result. Similarly, 186c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // fragments near the other three edges will get the correct AA. Fragments in the interior of 187c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // the rrect will have a (0,0) vector at all four corners. So long as the radius > 0.5 they will 188c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // correctly produce an alpha value of 1 at all four corners. We take the min of all the alphas. 189c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // The code below is a simplified version of the above that performs maxs on the vector 190c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // components before computing distances and alpha values so that only one distance computation 191c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // need be computed to determine the min alpha. 192cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org // 193cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org // For the cases where one half of the rrect is rectangular we drop one of the x or y 194cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org // computations, compute a separate rect edge alpha for the rect side, and mul the two computed 195cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org // alphas together. 1964355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org switch (crre.getCircularCornerFlags()) { 1974355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kAll_CornerFlags: 19830ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 dxy0 = %s.xy - %s.xy;\n", rectName, fragmentPos); 19930ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 dxy1 = %s.xy - %s.zw;\n", fragmentPos, rectName); 20030ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tvec2 dxy = max(max(dxy0, dxy1), 0.0);\n"); 20130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat alpha = clamp(%s - length(dxy), 0.0, 1.0);\n", 202cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radiusPlusHalfName); 203cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 2044355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTopLeft_CornerFlag: 20530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 dxy = max(%s.xy - %s.xy, 0.0);\n", 2064355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org rectName, fragmentPos); 20730ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat rightAlpha = clamp(%s.z - %s.x, 0.0, 1.0);\n", 208c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rectName, fragmentPos); 20930ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat bottomAlpha = clamp(%s.w - %s.y, 0.0, 1.0);\n", 210c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rectName, fragmentPos); 21130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat alpha = bottomAlpha * rightAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 212c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radiusPlusHalfName); 213c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 2144355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTopRight_CornerFlag: 21530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 dxy = max(vec2(%s.x - %s.z, %s.y - %s.y), 0.0);\n", 216c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org fragmentPos, rectName, rectName, fragmentPos); 21730ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat leftAlpha = clamp(%s.x - %s.x, 0.0, 1.0);\n", 218c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org fragmentPos, rectName); 21930ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat bottomAlpha = clamp(%s.w - %s.y, 0.0, 1.0);\n", 220c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rectName, fragmentPos); 22130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat alpha = bottomAlpha * leftAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 222c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radiusPlusHalfName); 223c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 2244355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottomRight_CornerFlag: 22530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 dxy = max(%s.xy - %s.zw, 0.0);\n", 226c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org fragmentPos, rectName); 22730ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat leftAlpha = clamp(%s.x - %s.x, 0.0, 1.0);\n", 228c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org fragmentPos, rectName); 22930ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat topAlpha = clamp(%s.y - %s.y, 0.0, 1.0);\n", 230c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org fragmentPos, rectName); 23130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat alpha = topAlpha * leftAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 232c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radiusPlusHalfName); 233c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 2344355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottomLeft_CornerFlag: 23530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 dxy = max(vec2(%s.x - %s.x, %s.y - %s.w), 0.0);\n", 236c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rectName, fragmentPos, fragmentPos, rectName); 23730ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat rightAlpha = clamp(%s.z - %s.x, 0.0, 1.0);\n", 238c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rectName, fragmentPos); 23930ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat topAlpha = clamp(%s.y - %s.y, 0.0, 1.0);\n", 240c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org fragmentPos, rectName); 24130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat alpha = topAlpha * rightAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 242c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radiusPlusHalfName); 243c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 2444355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kLeft_CornerFlags: 24530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 dxy0 = %s.xy - %s.xy;\n", rectName, fragmentPos); 24630ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat dy1 = %s.y - %s.w;\n", fragmentPos, rectName); 24730ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tvec2 dxy = max(vec2(dxy0.x, max(dxy0.y, dy1)), 0.0);\n"); 24830ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat rightAlpha = clamp(%s.z - %s.x, 0.0, 1.0);\n", 249cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rectName, fragmentPos); 25030ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat alpha = rightAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 251cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radiusPlusHalfName); 252cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 2534355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTop_CornerFlags: 25430ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 dxy0 = %s.xy - %s.xy;\n", rectName, fragmentPos); 25530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat dx1 = %s.x - %s.z;\n", fragmentPos, rectName); 25630ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tvec2 dxy = max(vec2(max(dxy0.x, dx1), dxy0.y), 0.0);\n"); 25730ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat bottomAlpha = clamp(%s.w - %s.y, 0.0, 1.0);\n", 258cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rectName, fragmentPos); 25930ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat alpha = bottomAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 260cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radiusPlusHalfName); 261cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 2624355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kRight_CornerFlags: 26330ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat dy0 = %s.y - %s.y;\n", rectName, fragmentPos); 26430ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 dxy1 = %s.xy - %s.zw;\n", fragmentPos, rectName); 26530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tvec2 dxy = max(vec2(dxy1.x, max(dy0, dxy1.y)), 0.0);\n"); 26630ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat leftAlpha = clamp(%s.x - %s.x, 0.0, 1.0);\n", 267cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org fragmentPos, rectName); 26830ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat alpha = leftAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 269cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radiusPlusHalfName); 270cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 2714355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottom_CornerFlags: 27230ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat dx0 = %s.x - %s.x;\n", rectName, fragmentPos); 27330ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 dxy1 = %s.xy - %s.zw;\n", fragmentPos, rectName); 27430ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tvec2 dxy = max(vec2(max(dx0, dxy1.x), dxy1.y), 0.0);\n"); 27530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat topAlpha = clamp(%s.y - %s.y, 0.0, 1.0);\n", 276cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org fragmentPos, rectName); 27730ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat alpha = topAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 278cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radiusPlusHalfName); 279cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 280cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 28106acb58074778d8eb40f14ae72b000d5120a8111skia.committer@gmail.com 282b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt if (kInverseFillAA_GrProcessorEdgeType == crre.getEdgeType()) { 28330ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\talpha = 1.0 - alpha;\n"); 284fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org } 285c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 28630ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor, 287c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_str()); 288c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org} 289c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 290cfc18867d982119d9dc2888bf09f1093012daaddjvanverthvoid GLCircularRRectEffect::GenKey(const GrProcessor& processor, const GrGLSLCaps&, 291b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrProcessorKeyBuilder* b) { 292b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const CircularRRectEffect& crre = processor.cast<CircularRRectEffect>(); 293b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GR_STATIC_ASSERT(kGrProcessorEdgeTypeCnt <= 8); 29463e99f7a03b2ac90ae7a00232674fd39c0bdcc68bsalomon b->add32((crre.getCircularCornerFlags() << 3) | crre.getEdgeType()); 295cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org} 296cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org 2977510b224e52b9518a8ddf7418db0e9c258f79539kkinnunenvoid GLCircularRRectEffect::setData(const GrGLProgramDataManager& pdman, 298b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessor& processor) { 299b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const CircularRRectEffect& crre = processor.cast<CircularRRectEffect>(); 3004355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const SkRRect& rrect = crre.getRRect(); 301c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org if (rrect != fPrevRRect) { 302c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org SkRect rect = rrect.getBounds(); 303cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org SkScalar radius = 0; 3044355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org switch (crre.getCircularCornerFlags()) { 3054355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kAll_CornerFlags: 306cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org SkASSERT(rrect.isSimpleCircular()); 307cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radius = rrect.getSimpleRadii().fX; 3082a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT(radius >= kRadiusMin); 309cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.inset(radius, radius); 310cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 3114355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTopLeft_CornerFlag: 312c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radius = rrect.radii(SkRRect::kUpperLeft_Corner).fX; 313c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fLeft += radius; 314c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fTop += radius; 315c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fRight += 0.5f; 316c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fBottom += 0.5f; 317c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 3184355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTopRight_CornerFlag: 319c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radius = rrect.radii(SkRRect::kUpperRight_Corner).fX; 320de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com rect.fLeft -= 0.5f; 321c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fTop += radius; 322c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fRight -= radius; 323c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fBottom += 0.5f; 324c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 3254355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottomRight_CornerFlag: 326c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radius = rrect.radii(SkRRect::kLowerRight_Corner).fX; 327de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com rect.fLeft -= 0.5f; 328de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com rect.fTop -= 0.5f; 329c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fRight -= radius; 330c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fBottom -= radius; 331c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 3324355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottomLeft_CornerFlag: 333c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radius = rrect.radii(SkRRect::kLowerLeft_Corner).fX; 334c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fLeft += radius; 335de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com rect.fTop -= 0.5f; 336de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com rect.fRight += 0.5f; 337c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fBottom -= radius; 338c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 3394355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kLeft_CornerFlags: 340cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radius = rrect.radii(SkRRect::kUpperLeft_Corner).fX; 341cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fLeft += radius; 342cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fTop += radius; 343cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fRight += 0.5f; 344cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fBottom -= radius; 345cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 3464355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTop_CornerFlags: 347cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radius = rrect.radii(SkRRect::kUpperLeft_Corner).fX; 348cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fLeft += radius; 349cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fTop += radius; 350cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fRight -= radius; 351cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fBottom += 0.5f; 352cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 3534355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kRight_CornerFlags: 354cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radius = rrect.radii(SkRRect::kUpperRight_Corner).fX; 355cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fLeft -= 0.5f; 356cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fTop += radius; 357cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fRight -= radius; 358cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fBottom -= radius; 359cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 3604355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottom_CornerFlags: 361cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radius = rrect.radii(SkRRect::kLowerLeft_Corner).fX; 362cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fLeft += radius; 363cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fTop -= 0.5f; 364cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fRight -= radius; 365cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fBottom -= radius; 366cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 367dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org default: 36888cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Should have been one of the above cases."); 369cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 3707510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen pdman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 3717510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen pdman.set1f(fRadiusPlusHalfUniform, radius + 0.5f); 372c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org fPrevRRect = rrect; 373c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org } 374c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org} 375c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 376eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt//////////////////////////////////////////////////////////////////////////////////////////////////// 377c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 378cfc18867d982119d9dc2888bf09f1093012daaddjvanverthvoid CircularRRectEffect::getGLProcessorKey(const GrGLSLCaps& caps, 379eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt GrProcessorKeyBuilder* b) const { 380eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt GLCircularRRectEffect::GenKey(*this, caps, b); 381eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt} 382eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 383eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualittGrGLFragmentProcessor* CircularRRectEffect::createGLInstance() const { 384eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt return SkNEW_ARGS(GLCircularRRectEffect, (*this)); 385eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt} 386eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 387eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt////////////////////////////////////////////////////////////////////////////// 3884355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 389b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass EllipticalRRectEffect : public GrFragmentProcessor { 3904355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgpublic: 391b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkRRect&); 3924355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 3934355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org virtual ~EllipticalRRectEffect() {}; 3944355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 39536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* name() const override { return "EllipticalRRect"; } 3964355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 397cfc18867d982119d9dc2888bf09f1093012daaddjvanverth void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; 398fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 39936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein GrGLFragmentProcessor* createGLInstance() const override; 4004355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 401eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt const SkRRect& getRRect() const { return fRRect; } 4024355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 403eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } 4044355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4054355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgprivate: 406b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt EllipticalRRectEffect(GrPrimitiveEdgeType, const SkRRect&); 4074355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 40836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool onIsEqual(const GrFragmentProcessor& other) const override; 4094355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 41036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onComputeInvariantOutput(GrInvariantOutput* inout) const override; 4111a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel 4124355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org SkRRect fRRect; 413b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrPrimitiveEdgeType fEdgeType; 4144355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 415b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 4164355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 417b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GrFragmentProcessor INHERITED; 4184355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org}; 4194355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 420b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* 421b0a8a377f832c59cee939ad721e1f87d378b7142joshualittEllipticalRRectEffect::Create(GrPrimitiveEdgeType edgeType, const SkRRect& rrect) { 422b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt if (kFillAA_GrProcessorEdgeType != edgeType && kInverseFillAA_GrProcessorEdgeType != edgeType) { 4233eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return NULL; 4243eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 42555fad7af61c21d502acb9891d631e8aa29e3628cbsalomon return SkNEW_ARGS(EllipticalRRectEffect, (edgeType, rrect)); 4264355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 4274355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 428605dd0fbce9dbb2a0d3313e13e161f2bd54870d7egdanielvoid EllipticalRRectEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const { 42956995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt inout->mulByUnknownSingleComponent(); 4304355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 4314355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 432b0a8a377f832c59cee939ad721e1f87d378b7142joshualittEllipticalRRectEffect::EllipticalRRectEffect(GrPrimitiveEdgeType edgeType, const SkRRect& rrect) 4334355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org : fRRect(rrect) 434eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt , fEdgeType(edgeType) { 435eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt this->initClassID<EllipticalRRectEffect>(); 4364355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org this->setWillReadFragmentPosition(); 4374355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 4384355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4390e08fc17e4718f7ce4e38f793695896473e96948bsalomonbool EllipticalRRectEffect::onIsEqual(const GrFragmentProcessor& other) const { 44049586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const EllipticalRRectEffect& erre = other.cast<EllipticalRRectEffect>(); 4414355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org return fEdgeType == erre.fEdgeType && fRRect == erre.fRRect; 4424355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 4434355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4444355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 4454355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 446b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGR_DEFINE_FRAGMENT_PROCESSOR_TEST(EllipticalRRectEffect); 4474355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 448b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* EllipticalRRectEffect::TestCreate(SkRandom* random, 449b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrContext*, 450b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrDrawTargetCaps& caps, 451b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTexture*[]) { 4524355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org SkScalar w = random->nextRangeScalar(20.f, 1000.f); 4534355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org SkScalar h = random->nextRangeScalar(20.f, 1000.f); 454fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org SkVector r[4]; 455fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kUpperLeft_Corner].fX = random->nextRangeF(kRadiusMin, 9.f); 456fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org // ensure at least one corner really is elliptical 457fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org do { 458fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kUpperLeft_Corner].fY = random->nextRangeF(kRadiusMin, 9.f); 459fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } while (r[SkRRect::kUpperLeft_Corner].fY == r[SkRRect::kUpperLeft_Corner].fX); 460fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 4614355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org SkRRect rrect; 462fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org if (random->nextBool()) { 463fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org // half the time create a four-radii rrect. 464fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kLowerRight_Corner].fX = random->nextRangeF(kRadiusMin, 9.f); 465fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kLowerRight_Corner].fY = random->nextRangeF(kRadiusMin, 9.f); 466fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 467fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kUpperRight_Corner].fX = r[SkRRect::kLowerRight_Corner].fX; 468fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kUpperRight_Corner].fY = r[SkRRect::kUpperLeft_Corner].fY; 469fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 470fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kLowerLeft_Corner].fX = r[SkRRect::kUpperLeft_Corner].fX; 471fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kLowerLeft_Corner].fY = r[SkRRect::kLowerRight_Corner].fY; 472fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 473fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rrect.setRectRadii(SkRect::MakeWH(w, h), r); 474fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } else { 475fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rrect.setRectXY(SkRect::MakeWH(w, h), r[SkRRect::kUpperLeft_Corner].fX, 476fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kUpperLeft_Corner].fY); 477fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } 478b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrFragmentProcessor* fp; 4794355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org do { 480b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrPrimitiveEdgeType et = (GrPrimitiveEdgeType)random->nextULessThan(kGrProcessorEdgeTypeCnt); 481b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt fp = GrRRectEffect::Create(et, rrect); 482b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt } while (NULL == fp); 483b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt return fp; 4844355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 4854355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4864355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 4874355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 488b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GLEllipticalRRectEffect : public GrGLFragmentProcessor { 4894355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgpublic: 490eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt GLEllipticalRRectEffect(const GrProcessor&); 4914355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4921598899975ecc85b003a59740b588d1ddbcedb09joshualitt virtual void emitCode(GrGLFPBuilder* builder, 493b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor& effect, 4944355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const char* outputColor, 4954355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const char* inputColor, 4964355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const TransformedCoordsArray&, 49736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const TextureSamplerArray&) override; 4984355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 499cfc18867d982119d9dc2888bf09f1093012daaddjvanverth static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*); 5004355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 50136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void setData(const GrGLProgramDataManager&, const GrProcessor&) override; 5024355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 5034355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgprivate: 5047510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen GrGLProgramDataManager::UniformHandle fInnerRectUniform; 5057510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen GrGLProgramDataManager::UniformHandle fInvRadiiSqdUniform; 5067510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen SkRRect fPrevRRect; 507b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GrGLFragmentProcessor INHERITED; 5084355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org}; 5094355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 510eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualittGLEllipticalRRectEffect::GLEllipticalRRectEffect(const GrProcessor& effect) { 5114355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org fPrevRRect.setEmpty(); 5124355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 5134355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 5141598899975ecc85b003a59740b588d1ddbcedb09joshualittvoid GLEllipticalRRectEffect::emitCode(GrGLFPBuilder* builder, 515b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor& effect, 5164355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const char* outputColor, 5174355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const char* inputColor, 5184355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const TransformedCoordsArray&, 5194355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const TextureSamplerArray& samplers) { 52049586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>(); 5214355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const char *rectName; 5224355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // The inner rect is the rrect bounds inset by the x/y radii 52330ba436f04e61d4505fb854d5fc56079636e0788joshualitt fInnerRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 524422f56f6e51c2f6a6ab425573b4d790f0157f883bsalomon kVec4f_GrSLType, kDefault_GrSLPrecision, 5254355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org "innerRect", 5264355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org &rectName); 52730ba436f04e61d4505fb854d5fc56079636e0788joshualitt 52829bee0fe657fabf7c396502b69c9167fba13eaaaegdaniel GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 52930ba436f04e61d4505fb854d5fc56079636e0788joshualitt const char* fragmentPos = fsBuilder->fragmentPosition(); 5304355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // At each quarter-ellipse corner we compute a vector that is the offset of the fragment pos 5314355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // to the ellipse center. The vector is pinned in x and y to be in the quarter-plane relevant 5324355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // to that corner. This means that points near the interior near the rrect top edge will have 5334355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // a vector that points straight up for both the TL left and TR corners. Computing an 5344355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // alpha from this vector at either the TR or TL corner will give the correct result. Similarly, 5354355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // fragments near the other three edges will get the correct AA. Fragments in the interior of 5364355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // the rrect will have a (0,0) vector at all four corners. So long as the radii > 0.5 they will 5374355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // correctly produce an alpha value of 1 at all four corners. We take the min of all the alphas. 5384355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // The code below is a simplified version of the above that performs maxs on the vector 5394355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // components before computing distances and alpha values so that only one distance computation 5404355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // need be computed to determine the min alpha. 54130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 dxy0 = %s.xy - %s.xy;\n", rectName, fragmentPos); 54230ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 dxy1 = %s.xy - %s.zw;\n", fragmentPos, rectName); 5439615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org switch (erre.getRRect().getType()) { 5449615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org case SkRRect::kSimple_Type: { 545fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org const char *invRadiiXYSqdName; 54630ba436f04e61d4505fb854d5fc56079636e0788joshualitt fInvRadiiSqdUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 547422f56f6e51c2f6a6ab425573b4d790f0157f883bsalomon kVec2f_GrSLType, kDefault_GrSLPrecision, 548fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org "invRadiiXY", 549fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org &invRadiiXYSqdName); 55030ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tvec2 dxy = max(max(dxy0, dxy1), 0.0);\n"); 551fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org // Z is the x/y offsets divided by squared radii. 55230ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 Z = dxy * %s;\n", invRadiiXYSqdName); 553fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org break; 554fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } 5559615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org case SkRRect::kNinePatch_Type: { 556fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org const char *invRadiiLTRBSqdName; 55730ba436f04e61d4505fb854d5fc56079636e0788joshualitt fInvRadiiSqdUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 558422f56f6e51c2f6a6ab425573b4d790f0157f883bsalomon kVec4f_GrSLType, kDefault_GrSLPrecision, 559fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org "invRadiiLTRB", 560fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org &invRadiiLTRBSqdName); 56130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tvec2 dxy = max(max(dxy0, dxy1), 0.0);\n"); 562fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org // Z is the x/y offsets divided by squared radii. We only care about the (at most) one 563fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org // corner where both the x and y offsets are positive, hence the maxes. (The inverse 564fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org // squared radii will always be positive.) 56530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec2 Z = max(max(dxy0 * %s.xy, dxy1 * %s.zw), 0.0);\n", 566fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org invRadiiLTRBSqdName, invRadiiLTRBSqdName); 567fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org break; 5689615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org } 5699615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org default: 57088cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("RRect should always be simple or nine-patch."); 571fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } 5724355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // implicit is the evaluation of (x/a)^2 + (y/b)^2 - 1. 57330ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tfloat implicit = dot(Z, dxy) - 1.0;\n"); 5744355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // grad_dot is the squared length of the gradient of the implicit. 57530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat grad_dot = 4.0 * dot(Z, Z);\n"); 5761b035d82d2b8b50ae334463edd06e4c5e0639311commit-bot@chromium.org // avoid calling inversesqrt on zero. 57730ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tgrad_dot = max(grad_dot, 1.0e-4);\n"); 57830ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat approx_dist = implicit * inversesqrt(grad_dot);\n"); 5794355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 580b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt if (kFillAA_GrProcessorEdgeType == erre.getEdgeType()) { 58130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 - approx_dist, 0.0, 1.0);\n"); 5824355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org } else { 58330ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 + approx_dist, 0.0, 1.0);\n"); 5844355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org } 5854355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 58630ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor, 5874355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_str()); 5884355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 5894355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 590cfc18867d982119d9dc2888bf09f1093012daaddjvanverthvoid GLEllipticalRRectEffect::GenKey(const GrProcessor& effect, const GrGLSLCaps&, 591b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrProcessorKeyBuilder* b) { 59249586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>(); 593b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GR_STATIC_ASSERT(kLast_GrProcessorEdgeType < (1 << 3)); 59463e99f7a03b2ac90ae7a00232674fd39c0bdcc68bsalomon b->add32(erre.getRRect().getType() | erre.getEdgeType() << 3); 5954355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 5964355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 5977510b224e52b9518a8ddf7418db0e9c258f79539kkinnunenvoid GLEllipticalRRectEffect::setData(const GrGLProgramDataManager& pdman, 598b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessor& effect) { 59949586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>(); 6004355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const SkRRect& rrect = erre.getRRect(); 6014355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org if (rrect != fPrevRRect) { 6024355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org SkRect rect = rrect.getBounds(); 603fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org const SkVector& r0 = rrect.radii(SkRRect::kUpperLeft_Corner); 6042a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT(r0.fX >= kRadiusMin); 6052a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT(r0.fY >= kRadiusMin); 6069615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org switch (erre.getRRect().getType()) { 6079615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org case SkRRect::kSimple_Type: 608fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rect.inset(r0.fX, r0.fY); 6097510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen pdman.set2f(fInvRadiiSqdUniform, 1.f / (r0.fX * r0.fX), 610fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 1.f / (r0.fY * r0.fY)); 611fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org break; 6129615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org case SkRRect::kNinePatch_Type: { 613fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org const SkVector& r1 = rrect.radii(SkRRect::kLowerRight_Corner); 6142a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT(r1.fX >= kRadiusMin); 6152a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT(r1.fY >= kRadiusMin); 616fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rect.fLeft += r0.fX; 617fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rect.fTop += r0.fY; 618fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rect.fRight -= r1.fX; 619fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rect.fBottom -= r1.fY; 6207510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen pdman.set4f(fInvRadiiSqdUniform, 1.f / (r0.fX * r0.fX), 621fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 1.f / (r0.fY * r0.fY), 622fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 1.f / (r1.fX * r1.fX), 623fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 1.f / (r1.fY * r1.fY)); 624fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org break; 625fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } 6269615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org default: 62788cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("RRect should always be simple or nine-patch."); 628fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } 6297510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen pdman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 6304355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org fPrevRRect = rrect; 6314355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org } 6324355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 6334355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 634eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt//////////////////////////////////////////////////////////////////////////////////////////////////// 635eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 636cfc18867d982119d9dc2888bf09f1093012daaddjvanverthvoid EllipticalRRectEffect::getGLProcessorKey(const GrGLSLCaps& caps, 637eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt GrProcessorKeyBuilder* b) const { 638eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt GLEllipticalRRectEffect::GenKey(*this, caps, b); 639eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt} 640eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 641eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualittGrGLFragmentProcessor* EllipticalRRectEffect::createGLInstance() const { 642eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt return SkNEW_ARGS(GLEllipticalRRectEffect, (*this)); 643eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt} 644eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 6454355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 6464355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 647b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* GrRRectEffect::Create(GrPrimitiveEdgeType edgeType, const SkRRect& rrect) { 6482a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (rrect.isRect()) { 6492a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return GrConvexPolyEffect::Create(edgeType, rrect.getBounds()); 6502a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 6512a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org 6523eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org if (rrect.isOval()) { 6533eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return GrOvalEffect::Create(edgeType, rrect.getBounds()); 6543eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 6553eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 6564355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org if (rrect.isSimple()) { 6572a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (rrect.getSimpleRadii().fX < kRadiusMin || rrect.getSimpleRadii().fY < kRadiusMin) { 6582a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // In this case the corners are extremely close to rectangular and we collapse the 6592a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // clip to a rectangular clip. 6602a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return GrConvexPolyEffect::Create(edgeType, rrect.getBounds()); 6612a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 6624355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org if (rrect.getSimpleRadii().fX == rrect.getSimpleRadii().fY) { 6636e4eb21d9c4cf10585b705d1a0ded8cafef29adcskia.committer@gmail.com return CircularRRectEffect::Create(edgeType, CircularRRectEffect::kAll_CornerFlags, 6642a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org rrect); 6654355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org } else { 6669615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org return EllipticalRRectEffect::Create(edgeType, rrect); 667cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 6682a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 6692a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org 6702a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (rrect.isComplex() || rrect.isNinePatch()) { 671cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org // Check for the "tab" cases - two adjacent circular corners and two square corners. 6722a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkScalar circularRadius = 0; 6732a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org uint32_t cornerFlags = 0; 6742a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org 6752a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkVector radii[4]; 6762a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org bool squashedRadii = false; 677cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org for (int c = 0; c < 4; ++c) { 6782a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org radii[c] = rrect.radii((SkRRect::Corner)c); 6792a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT((0 == radii[c].fX) == (0 == radii[c].fY)); 6802a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (0 == radii[c].fX) { 6812a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // The corner is square, so no need to squash or flag as circular. 6822a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org continue; 6832a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 6842a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (radii[c].fX < kRadiusMin || radii[c].fY < kRadiusMin) { 6852a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org radii[c].set(0, 0); 6862a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org squashedRadii = true; 687cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org continue; 688cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 6892a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (radii[c].fX != radii[c].fY) { 69044a435bc1ac84748d5bec420c7c5fe09171fd971bsalomon@google.com cornerFlags = ~0U; 691fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org break; 692cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 693dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org if (!cornerFlags) { 6942a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org circularRadius = radii[c].fX; 695dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org cornerFlags = 1 << c; 696cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } else { 6972a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (radii[c].fX != circularRadius) { 69844a435bc1ac84748d5bec420c7c5fe09171fd971bsalomon@google.com cornerFlags = ~0U; 699fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org break; 700cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 701dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org cornerFlags |= 1 << c; 702cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 703cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 704cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org 705dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org switch (cornerFlags) { 7062a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org case CircularRRectEffect::kAll_CornerFlags: 7072a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // This rrect should have been caught in the simple case above. Though, it would 7082a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // be correctly handled in the fallthrough code. 7092a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT(false); 7104355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTopLeft_CornerFlag: 7114355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTopRight_CornerFlag: 7124355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottomRight_CornerFlag: 7134355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottomLeft_CornerFlag: 7144355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kLeft_CornerFlags: 7154355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTop_CornerFlags: 7164355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kRight_CornerFlags: 7172a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org case CircularRRectEffect::kBottom_CornerFlags: { 7182a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkTCopyOnFirstWrite<SkRRect> rr(rrect); 7192a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (squashedRadii) { 7202a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org rr.writable()->setRectRadii(rrect.getBounds(), radii); 7212a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 7222a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return CircularRRectEffect::Create(edgeType, cornerFlags, *rr); 7232a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 7242a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org case CircularRRectEffect::kNone_CornerFlags: 7252a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return GrConvexPolyEffect::Create(edgeType, rrect.getBounds()); 7262a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org default: { 7272a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (squashedRadii) { 7282a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // If we got here then we squashed some but not all the radii to zero. (If all 7292a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // had been squashed cornerFlags would be 0.) The elliptical effect doesn't 7302a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // support some rounded and some square corners. 7312a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return NULL; 7322a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 733fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org if (rrect.isNinePatch()) { 7342a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return EllipticalRRectEffect::Create(edgeType, rrect); 735fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } 736cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org return NULL; 7372a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 738cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 739c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org } 7402a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org 7412a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return NULL; 742c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org} 743