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