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