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 10c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org#include "gl/GrGLEffect.h" 11c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org#include "gl/GrGLSL.h" 122a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org#include "GrConvexPolyEffect.h" 133eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org#include "GrOvalEffect.h" 14c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org#include "GrTBackendEffectFactory.h" 15c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 16e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org#include "SkRRect.h" 17c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 182a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org// The effects defined here only handle rrect radii >= kRadiusMin. 192a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.orgstatic const SkScalar kRadiusMin = SK_ScalarHalf; 202a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org 212a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 222a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org 234355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgclass GLCircularRRectEffect; 24fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org 254355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgclass CircularRRectEffect : public GrEffect { 26e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.orgpublic: 27f1f66c0c8623805fdb88f09c0d87cbdd1745e12bskia.committer@gmail.com 28dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org enum CornerFlags { 29dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kTopLeft_CornerFlag = (1 << SkRRect::kUpperLeft_Corner), 30dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kTopRight_CornerFlag = (1 << SkRRect::kUpperRight_Corner), 31dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kBottomRight_CornerFlag = (1 << SkRRect::kLowerRight_Corner), 32dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kBottomLeft_CornerFlag = (1 << SkRRect::kLowerLeft_Corner), 33dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org 34dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kLeft_CornerFlags = kTopLeft_CornerFlag | kBottomLeft_CornerFlag, 35dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kTop_CornerFlags = kTopLeft_CornerFlag | kTopRight_CornerFlag, 36dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kRight_CornerFlags = kTopRight_CornerFlag | kBottomRight_CornerFlag, 37dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kBottom_CornerFlags = kBottomLeft_CornerFlag | kBottomRight_CornerFlag, 38dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org 39dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kAll_CornerFlags = kTopLeft_CornerFlag | kTopRight_CornerFlag | 40dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org kBottomLeft_CornerFlag | kBottomRight_CornerFlag, 41dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org 422a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org kNone_CornerFlags = 0 43cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org }; 44cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org 45dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org // The flags are used to indicate which corners are circluar (unflagged corners are assumed to 46dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org // be square). 47dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org static GrEffectRef* Create(GrEffectEdgeType, uint32_t circularCornerFlags, const SkRRect&); 48e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 494355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org virtual ~CircularRRectEffect() {}; 504355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org static const char* Name() { return "CircularRRect"; } 51e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 52e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org const SkRRect& getRRect() const { return fRRect; } 53e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 54dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org uint32_t getCircularCornerFlags() const { return fCircularCornerFlags; } 5506acb58074778d8eb40f14ae72b000d5120a8111skia.committer@gmail.com 56cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org GrEffectEdgeType getEdgeType() const { return fEdgeType; } 57cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org 584355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org typedef GLCircularRRectEffect GLEffect; 59e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 60e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; 61e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 62e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 63e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 64e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.orgprivate: 654355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org CircularRRectEffect(GrEffectEdgeType, uint32_t circularCornerFlags, const SkRRect&); 66e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 67e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE; 68e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 69cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org SkRRect fRRect; 70cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org GrEffectEdgeType fEdgeType; 71dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org uint32_t fCircularCornerFlags; 72e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 73e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org GR_DECLARE_EFFECT_TEST; 74e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 75e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org typedef GrEffect INHERITED; 76e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org}; 77e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 784355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgGrEffectRef* CircularRRectEffect::Create(GrEffectEdgeType edgeType, 79dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org uint32_t circularCornerFlags, 80cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org const SkRRect& rrect) { 813eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org if (kFillAA_GrEffectEdgeType != edgeType && kInverseFillAA_GrEffectEdgeType != edgeType) { 823eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return NULL; 833eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 844355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org return CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(CircularRRectEffect, 85dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org (edgeType, circularCornerFlags, rrect)))); 86e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org} 87e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 884355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgvoid CircularRRectEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { 89e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org *validFlags = 0; 90e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org} 91e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 924355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgconst GrBackendEffectFactory& CircularRRectEffect::getFactory() const { 934355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org return GrTBackendEffectFactory<CircularRRectEffect>::getInstance(); 94e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org} 95e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 964355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgCircularRRectEffect::CircularRRectEffect(GrEffectEdgeType edgeType, uint32_t circularCornerFlags, 97dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org const SkRRect& rrect) 98cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org : fRRect(rrect) 99fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org , fEdgeType(edgeType) 100dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org , fCircularCornerFlags(circularCornerFlags) { 101e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org this->setWillReadFragmentPosition(); 102e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org} 103e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 1044355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgbool CircularRRectEffect::onIsEqual(const GrEffect& other) const { 1054355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const CircularRRectEffect& crre = CastEffect<CircularRRectEffect>(other); 1064355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // The corner flags are derived from fRRect, so no need to check them. 1074355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org return fEdgeType == crre.fEdgeType && fRRect == crre.fRRect; 108e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org} 109e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 110e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 111e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 1124355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgGR_DEFINE_EFFECT_TEST(CircularRRectEffect); 113e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 1144355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgGrEffectRef* CircularRRectEffect::TestCreate(SkRandom* random, 115e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org GrContext*, 116e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org const GrDrawTargetCaps& caps, 117e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org GrTexture*[]) { 118e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org SkScalar w = random->nextRangeScalar(20.f, 1000.f); 119e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org SkScalar h = random->nextRangeScalar(20.f, 1000.f); 120e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org SkScalar r = random->nextRangeF(kRadiusMin, 9.f); 121e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org SkRRect rrect; 122e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org rrect.setRectXY(SkRect::MakeWH(w, h), r, r); 123cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org GrEffectRef* effect; 124cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org do { 125cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org GrEffectEdgeType et = (GrEffectEdgeType)random->nextULessThan(kGrEffectEdgeTypeCnt); 126cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org effect = GrRRectEffect::Create(et, rrect); 127cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org } while (NULL == effect); 128cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org return effect; 129e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org} 130c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 131c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 132e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org 1334355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgclass GLCircularRRectEffect : public GrGLEffect { 134c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.orgpublic: 1354355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org GLCircularRRectEffect(const GrBackendEffectFactory&, const GrDrawEffect&); 136c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 137c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org virtual void emitCode(GrGLShaderBuilder* builder, 138c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org const GrDrawEffect& drawEffect, 139c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org EffectKey key, 140c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org const char* outputColor, 141c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org const char* inputColor, 142c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org const TransformedCoordsArray&, 143c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org const TextureSamplerArray&) SK_OVERRIDE; 144c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 145cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); 146c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 147c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; 148c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 149c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.orgprivate: 150c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org GrGLUniformManager::UniformHandle fInnerRectUniform; 151c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org GrGLUniformManager::UniformHandle fRadiusPlusHalfUniform; 152c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org SkRRect fPrevRRect; 153c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org typedef GrGLEffect INHERITED; 154c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org}; 155c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 1564355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgGLCircularRRectEffect::GLCircularRRectEffect(const GrBackendEffectFactory& factory, 157e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org const GrDrawEffect& drawEffect) 158c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org : INHERITED (factory) { 159c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org fPrevRRect.setEmpty(); 160c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org} 161c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 1624355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgvoid GLCircularRRectEffect::emitCode(GrGLShaderBuilder* builder, 163e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org const GrDrawEffect& drawEffect, 164e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org EffectKey key, 165e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org const char* outputColor, 166e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org const char* inputColor, 167e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org const TransformedCoordsArray&, 168e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org const TextureSamplerArray& samplers) { 1694355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const CircularRRectEffect& crre = drawEffect.castEffect<CircularRRectEffect>(); 170c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org const char *rectName; 171c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org const char *radiusPlusHalfName; 172c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org // The inner rect is the rrect bounds inset by the radius. Its left, top, right, and bottom 173c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org // edges correspond to components x, y, z, and w, respectively. When a side of the rrect has 174c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org // only rectangular corners, that side's value corresponds to the rect edge's value outset by 175c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org // half a pixel. 176c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org fInnerRectUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 177c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org kVec4f_GrSLType, 178c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org "innerRect", 179c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org &rectName); 180c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org fRadiusPlusHalfUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 181c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org kFloat_GrSLType, 182c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org "radiusPlusHalf", 183c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org &radiusPlusHalfName); 184c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org const char* fragmentPos = builder->fragmentPosition(); 185c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // At each quarter-circle corner we compute a vector that is the offset of the fragment position 186c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // from the circle center. The vector is pinned in x and y to be in the quarter-plane relevant 187c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // to that corner. This means that points near the interior near the rrect top edge will have 188c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // a vector that points straight up for both the TL left and TR corners. Computing an 189c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // alpha from this vector at either the TR or TL corner will give the correct result. Similarly, 190c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // fragments near the other three edges will get the correct AA. Fragments in the interior of 191c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // the rrect will have a (0,0) vector at all four corners. So long as the radius > 0.5 they will 192c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // correctly produce an alpha value of 1 at all four corners. We take the min of all the alphas. 193c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // The code below is a simplified version of the above that performs maxs on the vector 194c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // components before computing distances and alpha values so that only one distance computation 195c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org // need be computed to determine the min alpha. 196cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org // 197cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org // For the cases where one half of the rrect is rectangular we drop one of the x or y 198cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org // computations, compute a separate rect edge alpha for the rect side, and mul the two computed 199cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org // alphas together. 2004355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org switch (crre.getCircularCornerFlags()) { 2014355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kAll_CornerFlags: 202cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 dxy0 = %s.xy - %s.xy;\n", rectName, fragmentPos); 203cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 dxy1 = %s.xy - %s.zw;\n", fragmentPos, rectName); 204cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppend("\t\tvec2 dxy = max(max(dxy0, dxy1), 0.0);\n"); 205cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat alpha = clamp(%s - length(dxy), 0.0, 1.0);\n", 206cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radiusPlusHalfName); 207cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 2084355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTopLeft_CornerFlag: 2094355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 dxy = max(%s.xy - %s.xy, 0.0);\n", 2104355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org rectName, fragmentPos); 211c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat rightAlpha = clamp(%s.z - %s.x, 0.0, 1.0);\n", 212c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rectName, fragmentPos); 213c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat bottomAlpha = clamp(%s.w - %s.y, 0.0, 1.0);\n", 214c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rectName, fragmentPos); 215c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat alpha = bottomAlpha * rightAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 216c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radiusPlusHalfName); 217c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 2184355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTopRight_CornerFlag: 219c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 dxy = max(vec2(%s.x - %s.z, %s.y - %s.y), 0.0);\n", 220c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org fragmentPos, rectName, rectName, fragmentPos); 221c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat leftAlpha = clamp(%s.x - %s.x, 0.0, 1.0);\n", 222c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org fragmentPos, rectName); 223c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat bottomAlpha = clamp(%s.w - %s.y, 0.0, 1.0);\n", 224c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rectName, fragmentPos); 225c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat alpha = bottomAlpha * leftAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 226c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radiusPlusHalfName); 227c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 2284355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottomRight_CornerFlag: 229c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 dxy = max(%s.xy - %s.zw, 0.0);\n", 230c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org fragmentPos, rectName); 231c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat leftAlpha = clamp(%s.x - %s.x, 0.0, 1.0);\n", 232c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org fragmentPos, rectName); 233c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat topAlpha = clamp(%s.y - %s.y, 0.0, 1.0);\n", 234c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org fragmentPos, rectName); 235c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat alpha = topAlpha * leftAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 236c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radiusPlusHalfName); 237c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 2384355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottomLeft_CornerFlag: 239c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 dxy = max(vec2(%s.x - %s.x, %s.y - %s.w), 0.0);\n", 240c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rectName, fragmentPos, fragmentPos, rectName); 241c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat rightAlpha = clamp(%s.z - %s.x, 0.0, 1.0);\n", 242c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rectName, fragmentPos); 243c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat topAlpha = clamp(%s.y - %s.y, 0.0, 1.0);\n", 244c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org fragmentPos, rectName); 245c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat alpha = topAlpha * rightAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 246c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radiusPlusHalfName); 247c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 2484355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kLeft_CornerFlags: 249cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 dxy0 = %s.xy - %s.xy;\n", rectName, fragmentPos); 250cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat dy1 = %s.y - %s.w;\n", fragmentPos, rectName); 251cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppend("\t\tvec2 dxy = max(vec2(dxy0.x, max(dxy0.y, dy1)), 0.0);\n"); 252cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat rightAlpha = clamp(%s.z - %s.x, 0.0, 1.0);\n", 253cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rectName, fragmentPos); 254cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat alpha = rightAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 255cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radiusPlusHalfName); 256cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 2574355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTop_CornerFlags: 258cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 dxy0 = %s.xy - %s.xy;\n", rectName, fragmentPos); 259cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat dx1 = %s.x - %s.z;\n", fragmentPos, rectName); 260cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppend("\t\tvec2 dxy = max(vec2(max(dxy0.x, dx1), dxy0.y), 0.0);\n"); 261cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat bottomAlpha = clamp(%s.w - %s.y, 0.0, 1.0);\n", 262cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rectName, fragmentPos); 263cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat alpha = bottomAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 264cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radiusPlusHalfName); 265cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 2664355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kRight_CornerFlags: 267cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat dy0 = %s.y - %s.y;\n", rectName, fragmentPos); 268cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 dxy1 = %s.xy - %s.zw;\n", fragmentPos, rectName); 269cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppend("\t\tvec2 dxy = max(vec2(dxy1.x, max(dy0, dxy1.y)), 0.0);\n"); 270cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat leftAlpha = clamp(%s.x - %s.x, 0.0, 1.0);\n", 271cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org fragmentPos, rectName); 272cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat alpha = leftAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 273cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radiusPlusHalfName); 274cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 2754355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottom_CornerFlags: 276cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat dx0 = %s.x - %s.x;\n", rectName, fragmentPos); 277cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 dxy1 = %s.xy - %s.zw;\n", fragmentPos, rectName); 278cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppend("\t\tvec2 dxy = max(vec2(max(dx0, dxy1.x), dxy1.y), 0.0);\n"); 279cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat topAlpha = clamp(%s.y - %s.y, 0.0, 1.0);\n", 280cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org fragmentPos, rectName); 281cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat alpha = topAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n", 282cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radiusPlusHalfName); 283cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 284cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 28506acb58074778d8eb40f14ae72b000d5120a8111skia.committer@gmail.com 2864355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org if (kInverseFillAA_GrEffectEdgeType == crre.getEdgeType()) { 287fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org builder->fsCodeAppend("\t\talpha = 1.0 - alpha;\n"); 288fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org } 289c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 290c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor, 291c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_str()); 292c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org} 293c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 2944355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgGrGLEffect::EffectKey GLCircularRRectEffect::GenKey(const GrDrawEffect& drawEffect, 2954355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const GrGLCaps&) { 2964355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const CircularRRectEffect& crre = drawEffect.castEffect<CircularRRectEffect>(); 297cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org GR_STATIC_ASSERT(kGrEffectEdgeTypeCnt <= 8); 2984355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org return (crre.getCircularCornerFlags() << 3) | crre.getEdgeType(); 299cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org} 300cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org 3014355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgvoid GLCircularRRectEffect::setData(const GrGLUniformManager& uman, 3024355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const GrDrawEffect& drawEffect) { 3034355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const CircularRRectEffect& crre = drawEffect.castEffect<CircularRRectEffect>(); 3044355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const SkRRect& rrect = crre.getRRect(); 305c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org if (rrect != fPrevRRect) { 306c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org SkRect rect = rrect.getBounds(); 307cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org SkScalar radius = 0; 3084355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org switch (crre.getCircularCornerFlags()) { 3094355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kAll_CornerFlags: 310cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org SkASSERT(rrect.isSimpleCircular()); 311cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radius = rrect.getSimpleRadii().fX; 3122a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT(radius >= kRadiusMin); 313cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.inset(radius, radius); 314cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 3154355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTopLeft_CornerFlag: 316c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radius = rrect.radii(SkRRect::kUpperLeft_Corner).fX; 317c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fLeft += radius; 318c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fTop += radius; 319c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fRight += 0.5f; 320c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fBottom += 0.5f; 321c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 3224355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTopRight_CornerFlag: 323c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radius = rrect.radii(SkRRect::kUpperRight_Corner).fX; 324de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com rect.fLeft -= 0.5f; 325c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fTop += radius; 326c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fRight -= radius; 327c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fBottom += 0.5f; 328c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 3294355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottomRight_CornerFlag: 330c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radius = rrect.radii(SkRRect::kLowerRight_Corner).fX; 331de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com rect.fLeft -= 0.5f; 332de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com rect.fTop -= 0.5f; 333c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fRight -= radius; 334c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fBottom -= radius; 335c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 3364355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottomLeft_CornerFlag: 337c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org radius = rrect.radii(SkRRect::kLowerLeft_Corner).fX; 338c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fLeft += radius; 339de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com rect.fTop -= 0.5f; 340de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com rect.fRight += 0.5f; 341c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org rect.fBottom -= radius; 342c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org break; 3434355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kLeft_CornerFlags: 344cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radius = rrect.radii(SkRRect::kUpperLeft_Corner).fX; 345cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fLeft += radius; 346cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fTop += radius; 347cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fRight += 0.5f; 348cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fBottom -= radius; 349cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 3504355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTop_CornerFlags: 351cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radius = rrect.radii(SkRRect::kUpperLeft_Corner).fX; 352cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fLeft += radius; 353cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fTop += radius; 354cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fRight -= radius; 355cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fBottom += 0.5f; 356cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 3574355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kRight_CornerFlags: 358cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radius = rrect.radii(SkRRect::kUpperRight_Corner).fX; 359cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fLeft -= 0.5f; 360cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fTop += radius; 361cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fRight -= radius; 362cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fBottom -= radius; 363cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 3644355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottom_CornerFlags: 365cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org radius = rrect.radii(SkRRect::kLowerLeft_Corner).fX; 366cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fLeft += radius; 367cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fTop -= 0.5f; 368cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fRight -= radius; 369cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org rect.fBottom -= radius; 370cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org break; 371dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org default: 37288cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Should have been one of the above cases."); 373cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 374c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org uman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 375c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org uman.set1f(fRadiusPlusHalfUniform, radius + 0.5f); 376c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org fPrevRRect = rrect; 377c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org } 378c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org} 379c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 380c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 381c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org 3824355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgclass GLEllipticalRRectEffect; 3834355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 3844355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgclass EllipticalRRectEffect : public GrEffect { 3854355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgpublic: 3869615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org static GrEffectRef* Create(GrEffectEdgeType, const SkRRect&); 3874355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 3884355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org virtual ~EllipticalRRectEffect() {}; 3894355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org static const char* Name() { return "EllipticalRRect"; } 3904355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 3914355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const SkRRect& getRRect() const { return fRRect; } 3924355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 393fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 3944355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org GrEffectEdgeType getEdgeType() const { return fEdgeType; } 3954355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 3964355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org typedef GLEllipticalRRectEffect GLEffect; 3974355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 3984355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; 3994355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4004355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 4014355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4024355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgprivate: 4039615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org EllipticalRRectEffect(GrEffectEdgeType, const SkRRect&); 4044355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4054355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE; 4064355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4074355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org SkRRect fRRect; 4084355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org GrEffectEdgeType fEdgeType; 4094355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4104355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org GR_DECLARE_EFFECT_TEST; 4114355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4124355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org typedef GrEffect INHERITED; 4134355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org}; 4144355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4159615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.orgGrEffectRef* EllipticalRRectEffect::Create(GrEffectEdgeType edgeType, const SkRRect& rrect) { 4163eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org if (kFillAA_GrEffectEdgeType != edgeType && kInverseFillAA_GrEffectEdgeType != edgeType) { 4173eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return NULL; 4183eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 4199615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org return CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(EllipticalRRectEffect, (edgeType, rrect)))); 4204355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 4214355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4224355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgvoid EllipticalRRectEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { 4234355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org *validFlags = 0; 4244355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 4254355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4264355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgconst GrBackendEffectFactory& EllipticalRRectEffect::getFactory() const { 4274355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org return GrTBackendEffectFactory<EllipticalRRectEffect>::getInstance(); 4284355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 4294355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4309615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.orgEllipticalRRectEffect::EllipticalRRectEffect(GrEffectEdgeType edgeType, const SkRRect& rrect) 4314355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org : fRRect(rrect) 4324355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org , fEdgeType(edgeType){ 4334355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org this->setWillReadFragmentPosition(); 4344355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 4354355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4364355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgbool EllipticalRRectEffect::onIsEqual(const GrEffect& other) const { 4374355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const EllipticalRRectEffect& erre = CastEffect<EllipticalRRectEffect>(other); 4384355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org return fEdgeType == erre.fEdgeType && fRRect == erre.fRRect; 4394355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 4404355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4414355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 4424355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4434355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgGR_DEFINE_EFFECT_TEST(EllipticalRRectEffect); 4444355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4454355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgGrEffectRef* EllipticalRRectEffect::TestCreate(SkRandom* random, 4464355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org GrContext*, 4474355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const GrDrawTargetCaps& caps, 4484355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org GrTexture*[]) { 4494355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org SkScalar w = random->nextRangeScalar(20.f, 1000.f); 4504355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org SkScalar h = random->nextRangeScalar(20.f, 1000.f); 451fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org SkVector r[4]; 452fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kUpperLeft_Corner].fX = random->nextRangeF(kRadiusMin, 9.f); 453fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org // ensure at least one corner really is elliptical 454fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org do { 455fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kUpperLeft_Corner].fY = random->nextRangeF(kRadiusMin, 9.f); 456fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } while (r[SkRRect::kUpperLeft_Corner].fY == r[SkRRect::kUpperLeft_Corner].fX); 457fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 4584355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org SkRRect rrect; 459fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org if (random->nextBool()) { 460fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org // half the time create a four-radii rrect. 461fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kLowerRight_Corner].fX = random->nextRangeF(kRadiusMin, 9.f); 462fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kLowerRight_Corner].fY = random->nextRangeF(kRadiusMin, 9.f); 463fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 464fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kUpperRight_Corner].fX = r[SkRRect::kLowerRight_Corner].fX; 465fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kUpperRight_Corner].fY = r[SkRRect::kUpperLeft_Corner].fY; 466fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 467fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kLowerLeft_Corner].fX = r[SkRRect::kUpperLeft_Corner].fX; 468fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kLowerLeft_Corner].fY = r[SkRRect::kLowerRight_Corner].fY; 469fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 470fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rrect.setRectRadii(SkRect::MakeWH(w, h), r); 471fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } else { 472fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rrect.setRectXY(SkRect::MakeWH(w, h), r[SkRRect::kUpperLeft_Corner].fX, 473fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org r[SkRRect::kUpperLeft_Corner].fY); 474fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } 4754355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org GrEffectRef* effect; 4764355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org do { 477fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org GrEffectEdgeType et = (GrEffectEdgeType)random->nextULessThan(kGrEffectEdgeTypeCnt); 478fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org effect = GrRRectEffect::Create(et, rrect); 4794355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org } while (NULL == effect); 4804355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org return effect; 4814355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 4824355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4834355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 4844355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4854355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgclass GLEllipticalRRectEffect : public GrGLEffect { 4864355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgpublic: 4874355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org GLEllipticalRRectEffect(const GrBackendEffectFactory&, const GrDrawEffect&); 4884355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4894355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org virtual void emitCode(GrGLShaderBuilder* builder, 4904355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const GrDrawEffect& drawEffect, 4914355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org EffectKey key, 4924355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const char* outputColor, 4934355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const char* inputColor, 4944355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const TransformedCoordsArray&, 4954355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const TextureSamplerArray&) SK_OVERRIDE; 4964355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4974355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); 4984355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 4994355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; 5004355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 5014355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgprivate: 5024355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org GrGLUniformManager::UniformHandle fInnerRectUniform; 503fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org GrGLUniformManager::UniformHandle fInvRadiiSqdUniform; 5044355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org SkRRect fPrevRRect; 5054355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org typedef GrGLEffect INHERITED; 5064355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org}; 5074355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 5084355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgGLEllipticalRRectEffect::GLEllipticalRRectEffect(const GrBackendEffectFactory& factory, 5094355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const GrDrawEffect& drawEffect) 5104355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org : INHERITED (factory) { 5114355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org fPrevRRect.setEmpty(); 5124355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 5134355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 5144355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgvoid GLEllipticalRRectEffect::emitCode(GrGLShaderBuilder* builder, 5154355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const GrDrawEffect& drawEffect, 5164355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org EffectKey key, 5174355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const char* outputColor, 5184355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const char* inputColor, 5194355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const TransformedCoordsArray&, 5204355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const TextureSamplerArray& samplers) { 5214355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const EllipticalRRectEffect& erre = drawEffect.castEffect<EllipticalRRectEffect>(); 5224355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const char *rectName; 5234355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // The inner rect is the rrect bounds inset by the x/y radii 5244355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org fInnerRectUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 5254355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org kVec4f_GrSLType, 5264355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org "innerRect", 5274355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org &rectName); 5284355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const char* fragmentPos = builder->fragmentPosition(); 5294355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // At each quarter-ellipse corner we compute a vector that is the offset of the fragment pos 5304355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // to the ellipse center. The vector is pinned in x and y to be in the quarter-plane relevant 5314355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // to that corner. This means that points near the interior near the rrect top edge will have 5324355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // a vector that points straight up for both the TL left and TR corners. Computing an 5334355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // alpha from this vector at either the TR or TL corner will give the correct result. Similarly, 5344355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // fragments near the other three edges will get the correct AA. Fragments in the interior of 5354355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // the rrect will have a (0,0) vector at all four corners. So long as the radii > 0.5 they will 5364355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // correctly produce an alpha value of 1 at all four corners. We take the min of all the alphas. 5374355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // The code below is a simplified version of the above that performs maxs on the vector 5384355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // components before computing distances and alpha values so that only one distance computation 5394355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // need be computed to determine the min alpha. 5404355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 dxy0 = %s.xy - %s.xy;\n", rectName, fragmentPos); 5414355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 dxy1 = %s.xy - %s.zw;\n", fragmentPos, rectName); 5429615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org switch (erre.getRRect().getType()) { 5439615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org case SkRRect::kSimple_Type: { 544fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org const char *invRadiiXYSqdName; 545fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org fInvRadiiSqdUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 546fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org kVec2f_GrSLType, 547fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org "invRadiiXY", 548fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org &invRadiiXYSqdName); 549fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org builder->fsCodeAppend("\t\tvec2 dxy = max(max(dxy0, dxy1), 0.0);\n"); 550fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org // Z is the x/y offsets divided by squared radii. 551fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 Z = dxy * %s;\n", invRadiiXYSqdName); 552fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org break; 553fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } 5549615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org case SkRRect::kNinePatch_Type: { 555fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org const char *invRadiiLTRBSqdName; 556fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org fInvRadiiSqdUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 557fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org kVec4f_GrSLType, 558fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org "invRadiiLTRB", 559fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org &invRadiiLTRBSqdName); 560fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org builder->fsCodeAppend("\t\tvec2 dxy = max(max(dxy0, dxy1), 0.0);\n"); 561fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org // Z is the x/y offsets divided by squared radii. We only care about the (at most) one 562fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org // corner where both the x and y offsets are positive, hence the maxes. (The inverse 563fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org // squared radii will always be positive.) 564fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org builder->fsCodeAppendf("\t\tvec2 Z = max(max(dxy0 * %s.xy, dxy1 * %s.zw), 0.0);\n", 565fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org invRadiiLTRBSqdName, invRadiiLTRBSqdName); 566fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org break; 5679615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org } 5689615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org default: 56988cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("RRect should always be simple or nine-patch."); 570fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } 5714355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // implicit is the evaluation of (x/a)^2 + (y/b)^2 - 1. 5724355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org builder->fsCodeAppend("\t\tfloat implicit = dot(Z, dxy) - 1.0;\n"); 5734355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org // grad_dot is the squared length of the gradient of the implicit. 5744355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat grad_dot = 4.0 * dot(Z, Z);\n"); 5751b035d82d2b8b50ae334463edd06e4c5e0639311commit-bot@chromium.org // avoid calling inversesqrt on zero. 5761b035d82d2b8b50ae334463edd06e4c5e0639311commit-bot@chromium.org builder->fsCodeAppend("\t\tgrad_dot = max(grad_dot, 1.0e-4);\n"); 5774355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org builder->fsCodeAppendf("\t\tfloat approx_dist = implicit * inversesqrt(grad_dot);\n"); 5784355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 5794355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org if (kFillAA_GrEffectEdgeType == erre.getEdgeType()) { 5804355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org builder->fsCodeAppend("\t\tfloat alpha = clamp(0.5 - approx_dist, 0.0, 1.0);\n"); 5814355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org } else { 5824355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org builder->fsCodeAppend("\t\tfloat alpha = clamp(0.5 + approx_dist, 0.0, 1.0);\n"); 5834355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org } 5844355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 5854355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor, 5864355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_str()); 5874355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 5884355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 5894355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgGrGLEffect::EffectKey GLEllipticalRRectEffect::GenKey(const GrDrawEffect& drawEffect, 5904355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const GrGLCaps&) { 5914355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const EllipticalRRectEffect& erre = drawEffect.castEffect<EllipticalRRectEffect>(); 592fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org GR_STATIC_ASSERT(kLast_GrEffectEdgeType < (1 << 3)); 5939615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org return erre.getRRect().getType() | erre.getEdgeType() << 3; 5944355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 5954355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 5964355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgvoid GLEllipticalRRectEffect::setData(const GrGLUniformManager& uman, 5974355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const GrDrawEffect& drawEffect) { 5984355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const EllipticalRRectEffect& erre = drawEffect.castEffect<EllipticalRRectEffect>(); 5994355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org const SkRRect& rrect = erre.getRRect(); 6004355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org if (rrect != fPrevRRect) { 6014355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org SkRect rect = rrect.getBounds(); 602fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org const SkVector& r0 = rrect.radii(SkRRect::kUpperLeft_Corner); 6032a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT(r0.fX >= kRadiusMin); 6042a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT(r0.fY >= kRadiusMin); 6059615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org switch (erre.getRRect().getType()) { 6069615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org case SkRRect::kSimple_Type: 607fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rect.inset(r0.fX, r0.fY); 608fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org uman.set2f(fInvRadiiSqdUniform, 1.f / (r0.fX * r0.fX), 609fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 1.f / (r0.fY * r0.fY)); 610fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org break; 6119615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org case SkRRect::kNinePatch_Type: { 612fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org const SkVector& r1 = rrect.radii(SkRRect::kLowerRight_Corner); 6132a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT(r1.fX >= kRadiusMin); 6142a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT(r1.fY >= kRadiusMin); 615fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rect.fLeft += r0.fX; 616fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rect.fTop += r0.fY; 617fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rect.fRight -= r1.fX; 618fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org rect.fBottom -= r1.fY; 619fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org uman.set4f(fInvRadiiSqdUniform, 1.f / (r0.fX * r0.fX), 620fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 1.f / (r0.fY * r0.fY), 621fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 1.f / (r1.fX * r1.fX), 622fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org 1.f / (r1.fY * r1.fY)); 623fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org break; 624fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } 6259615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org default: 62688cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("RRect should always be simple or nine-patch."); 627fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } 6284355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org uman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 6294355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org fPrevRRect = rrect; 6304355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org } 6314355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org} 6324355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 6334355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 6344355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org 635cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.orgGrEffectRef* GrRRectEffect::Create(GrEffectEdgeType edgeType, const SkRRect& rrect) { 6362a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (rrect.isRect()) { 6372a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return GrConvexPolyEffect::Create(edgeType, rrect.getBounds()); 6382a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 6392a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org 6403eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org if (rrect.isOval()) { 6413eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org return GrOvalEffect::Create(edgeType, rrect.getBounds()); 6423eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org } 6433eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org 6444355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org if (rrect.isSimple()) { 6452a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (rrect.getSimpleRadii().fX < kRadiusMin || rrect.getSimpleRadii().fY < kRadiusMin) { 6462a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // In this case the corners are extremely close to rectangular and we collapse the 6472a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // clip to a rectangular clip. 6482a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return GrConvexPolyEffect::Create(edgeType, rrect.getBounds()); 6492a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 6504355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org if (rrect.getSimpleRadii().fX == rrect.getSimpleRadii().fY) { 6516e4eb21d9c4cf10585b705d1a0ded8cafef29adcskia.committer@gmail.com return CircularRRectEffect::Create(edgeType, CircularRRectEffect::kAll_CornerFlags, 6522a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org rrect); 6534355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org } else { 6549615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org return EllipticalRRectEffect::Create(edgeType, rrect); 655cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 6562a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 6572a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org 6582a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (rrect.isComplex() || rrect.isNinePatch()) { 659cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org // Check for the "tab" cases - two adjacent circular corners and two square corners. 6602a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkScalar circularRadius = 0; 6612a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org uint32_t cornerFlags = 0; 6622a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org 6632a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkVector radii[4]; 6642a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org bool squashedRadii = false; 665cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org for (int c = 0; c < 4; ++c) { 6662a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org radii[c] = rrect.radii((SkRRect::Corner)c); 6672a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT((0 == radii[c].fX) == (0 == radii[c].fY)); 6682a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (0 == radii[c].fX) { 6692a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // The corner is square, so no need to squash or flag as circular. 6702a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org continue; 6712a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 6722a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (radii[c].fX < kRadiusMin || radii[c].fY < kRadiusMin) { 6732a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org radii[c].set(0, 0); 6742a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org squashedRadii = true; 675cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org continue; 676cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 6772a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (radii[c].fX != radii[c].fY) { 67844a435bc1ac84748d5bec420c7c5fe09171fd971bsalomon@google.com cornerFlags = ~0U; 679fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org break; 680cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 681dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org if (!cornerFlags) { 6822a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org circularRadius = radii[c].fX; 683dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org cornerFlags = 1 << c; 684cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } else { 6852a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (radii[c].fX != circularRadius) { 68644a435bc1ac84748d5bec420c7c5fe09171fd971bsalomon@google.com cornerFlags = ~0U; 687fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org break; 688cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 689dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org cornerFlags |= 1 << c; 690cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 691cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 692cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org 693dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org switch (cornerFlags) { 6942a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org case CircularRRectEffect::kAll_CornerFlags: 6952a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // This rrect should have been caught in the simple case above. Though, it would 6962a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // be correctly handled in the fallthrough code. 6972a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkASSERT(false); 6984355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTopLeft_CornerFlag: 6994355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTopRight_CornerFlag: 7004355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottomRight_CornerFlag: 7014355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kBottomLeft_CornerFlag: 7024355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kLeft_CornerFlags: 7034355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kTop_CornerFlags: 7044355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org case CircularRRectEffect::kRight_CornerFlags: 7052a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org case CircularRRectEffect::kBottom_CornerFlags: { 7062a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org SkTCopyOnFirstWrite<SkRRect> rr(rrect); 7072a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (squashedRadii) { 7082a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org rr.writable()->setRectRadii(rrect.getBounds(), radii); 7092a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 7102a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return CircularRRectEffect::Create(edgeType, cornerFlags, *rr); 7112a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 7122a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org case CircularRRectEffect::kNone_CornerFlags: 7132a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return GrConvexPolyEffect::Create(edgeType, rrect.getBounds()); 7142a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org default: { 7152a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org if (squashedRadii) { 7162a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // If we got here then we squashed some but not all the radii to zero. (If all 7172a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // had been squashed cornerFlags would be 0.) The elliptical effect doesn't 7182a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org // support some rounded and some square corners. 7192a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return NULL; 7202a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 721fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org if (rrect.isNinePatch()) { 7222a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return EllipticalRRectEffect::Create(edgeType, rrect); 723fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org } 724cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org return NULL; 7252a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org } 726cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org } 727c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org } 7282a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org 7292a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org return NULL; 730c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org} 731