GrRRectEffect.cpp revision 1598899975ecc85b003a59740b588d1ddbcedb09
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
830ba436f04e61d4505fb854d5fc56079636e0788joshualitt#include "gl/builders/GrGLProgramBuilder.h"
9c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org#include "GrRRectEffect.h"
10c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org
11b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "gl/GrGLProcessor.h"
12c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org#include "gl/GrGLSL.h"
132a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org#include "GrConvexPolyEffect.h"
143eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org#include "GrOvalEffect.h"
15b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "GrTBackendProcessorFactory.h"
16c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org
17e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org#include "SkRRect.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
244355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgclass GLCircularRRectEffect;
25fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org
26b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass CircularRRectEffect : public GrFragmentProcessor {
27e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.orgpublic:
28f1f66c0c8623805fdb88f09c0d87cbdd1745e12bskia.committer@gmail.com
29dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org    enum CornerFlags {
30dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org        kTopLeft_CornerFlag     = (1 << SkRRect::kUpperLeft_Corner),
31dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org        kTopRight_CornerFlag    = (1 << SkRRect::kUpperRight_Corner),
32dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org        kBottomRight_CornerFlag = (1 << SkRRect::kLowerRight_Corner),
33dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org        kBottomLeft_CornerFlag  = (1 << SkRRect::kLowerLeft_Corner),
34dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org
35dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org        kLeft_CornerFlags   = kTopLeft_CornerFlag    | kBottomLeft_CornerFlag,
36dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org        kTop_CornerFlags    = kTopLeft_CornerFlag    | kTopRight_CornerFlag,
37dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org        kRight_CornerFlags  = kTopRight_CornerFlag   | kBottomRight_CornerFlag,
38dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org        kBottom_CornerFlags = kBottomLeft_CornerFlag | kBottomRight_CornerFlag,
39dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org
40dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org        kAll_CornerFlags = kTopLeft_CornerFlag    | kTopRight_CornerFlag |
41dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org                           kBottomLeft_CornerFlag | kBottomRight_CornerFlag,
42dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org
432a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org        kNone_CornerFlags = 0
44cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    };
45cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org
46dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org    // The flags are used to indicate which corners are circluar (unflagged corners are assumed to
47dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org    // be square).
48b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static GrFragmentProcessor* Create(GrPrimitiveEdgeType, uint32_t circularCornerFlags,
49b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                       const SkRRect&);
50e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
514355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    virtual ~CircularRRectEffect() {};
524355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    static const char* Name() { return "CircularRRect"; }
53e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
54e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org    const SkRRect& getRRect() const { return fRRect; }
55e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
56dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org    uint32_t getCircularCornerFlags() const { return fCircularCornerFlags; }
5706acb58074778d8eb40f14ae72b000d5120a8111skia.committer@gmail.com
58b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
59cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org
60b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    typedef GLCircularRRectEffect GLProcessor;
61e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
62b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERRIDE;
63e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
64e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.orgprivate:
65b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    CircularRRectEffect(GrPrimitiveEdgeType, uint32_t circularCornerFlags, const SkRRect&);
66e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
67b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual bool onIsEqual(const GrProcessor& other) const SK_OVERRIDE;
68e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
691a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
701a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel
71b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    SkRRect                fRRect;
72b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrPrimitiveEdgeType    fEdgeType;
73b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    uint32_t               fCircularCornerFlags;
74e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
75b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
76e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
77b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    typedef GrFragmentProcessor INHERITED;
78e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org};
79e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
80b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* CircularRRectEffect::Create(GrPrimitiveEdgeType edgeType,
81b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                 uint32_t circularCornerFlags,
82b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                 const SkRRect& rrect) {
83b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    if (kFillAA_GrProcessorEdgeType != edgeType && kInverseFillAA_GrProcessorEdgeType != edgeType) {
843eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org        return NULL;
853eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org    }
8655fad7af61c21d502acb9891d631e8aa29e3628cbsalomon    return SkNEW_ARGS(CircularRRectEffect, (edgeType, circularCornerFlags, rrect));
87e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org}
88e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
891a8ecdfb73a15de600d5779b75d7c4b61863c50begdanielvoid CircularRRectEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
901a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel    inout->fValidFlags = 0;
911a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel    inout->fIsSingleComponent = false;
92e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org}
93e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
94b0a8a377f832c59cee939ad721e1f87d378b7142joshualittconst GrBackendFragmentProcessorFactory& CircularRRectEffect::getFactory() const {
95b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    return GrTBackendFragmentProcessorFactory<CircularRRectEffect>::getInstance();
96e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org}
97e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
98b0a8a377f832c59cee939ad721e1f87d378b7142joshualittCircularRRectEffect::CircularRRectEffect(GrPrimitiveEdgeType edgeType, uint32_t circularCornerFlags,
99b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                         const SkRRect& rrect)
100cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    : fRRect(rrect)
101fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org    , fEdgeType(edgeType)
102dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org    , fCircularCornerFlags(circularCornerFlags) {
103e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org    this->setWillReadFragmentPosition();
104e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org}
105e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
106b0a8a377f832c59cee939ad721e1f87d378b7142joshualittbool CircularRRectEffect::onIsEqual(const GrProcessor& other) const {
10749586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt    const CircularRRectEffect& crre = other.cast<CircularRRectEffect>();
1084355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // The corner flags are derived from fRRect, so no need to check them.
1094355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    return fEdgeType == crre.fEdgeType && fRRect == crre.fRRect;
110e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org}
111e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
112e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
113e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
114b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircularRRectEffect);
115e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
116b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* CircularRRectEffect::TestCreate(SkRandom* random,
117b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                     GrContext*,
118b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                     const GrDrawTargetCaps& caps,
119b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                     GrTexture*[]) {
120e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org    SkScalar w = random->nextRangeScalar(20.f, 1000.f);
121e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org    SkScalar h = random->nextRangeScalar(20.f, 1000.f);
122e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org    SkScalar r = random->nextRangeF(kRadiusMin, 9.f);
123e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org    SkRRect rrect;
124e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org    rrect.setRectXY(SkRect::MakeWH(w, h), r, r);
125b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrFragmentProcessor* fp;
126cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    do {
127b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        GrPrimitiveEdgeType et =
128b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                (GrPrimitiveEdgeType)random->nextULessThan(kGrProcessorEdgeTypeCnt);
129b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        fp = GrRRectEffect::Create(et, rrect);
130b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    } while (NULL == fp);
131b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    return fp;
132e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org}
133c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org
134c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
135e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org
136b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GLCircularRRectEffect : public GrGLFragmentProcessor {
137c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.orgpublic:
138b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GLCircularRRectEffect(const GrBackendProcessorFactory&, const GrProcessor&);
139c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org
1401598899975ecc85b003a59740b588d1ddbcedb09joshualitt    virtual void emitCode(GrGLFPBuilder* builder,
141b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                          const GrFragmentProcessor& fp,
142b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                          const GrProcessorKey& key,
143c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org                          const char* outputColor,
144c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org                          const char* inputColor,
145c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org                          const TransformedCoordsArray&,
146c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org                          const TextureSamplerArray&) SK_OVERRIDE;
147c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org
148b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*);
149c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org
150b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE;
151c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org
152c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.orgprivate:
1537510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen    GrGLProgramDataManager::UniformHandle fInnerRectUniform;
1547510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen    GrGLProgramDataManager::UniformHandle fRadiusPlusHalfUniform;
1557510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen    SkRRect                               fPrevRRect;
156b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    typedef GrGLFragmentProcessor INHERITED;
157c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org};
158c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org
159b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGLCircularRRectEffect::GLCircularRRectEffect(const GrBackendProcessorFactory& factory,
160b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                             const GrProcessor& )
161c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    : INHERITED (factory) {
162c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    fPrevRRect.setEmpty();
163c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org}
164c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org
1651598899975ecc85b003a59740b588d1ddbcedb09joshualittvoid GLCircularRRectEffect::emitCode(GrGLFPBuilder* builder,
166b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                             const GrFragmentProcessor& fp,
167b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                             const GrProcessorKey& key,
168e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org                             const char* outputColor,
169e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org                             const char* inputColor,
170e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org                             const TransformedCoordsArray&,
171e5280893f8f9f6b6149572a4c8fe513f9c2b3888commit-bot@chromium.org                             const TextureSamplerArray& samplers) {
172b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    const CircularRRectEffect& crre = fp.cast<CircularRRectEffect>();
173c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    const char *rectName;
174c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    const char *radiusPlusHalfName;
175c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    // The inner rect is the rrect bounds inset by the radius. Its left, top, right, and bottom
176c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    // edges correspond to components x, y, z, and w, respectively. When a side of the rrect has
177c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    // only rectangular corners, that side's value corresponds to the rect edge's value outset by
178c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org    // half a pixel.
17930ba436f04e61d4505fb854d5fc56079636e0788joshualitt    fInnerRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
180c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org                                            kVec4f_GrSLType,
181c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org                                            "innerRect",
182c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org                                            &rectName);
18330ba436f04e61d4505fb854d5fc56079636e0788joshualitt    fRadiusPlusHalfUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
184c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org                                                 kFloat_GrSLType,
185c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org                                                 "radiusPlusHalf",
186c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org                                                 &radiusPlusHalfName);
18730ba436f04e61d4505fb854d5fc56079636e0788joshualitt
1881598899975ecc85b003a59740b588d1ddbcedb09joshualitt    GrGLFPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder();
18930ba436f04e61d4505fb854d5fc56079636e0788joshualitt    const char* fragmentPos = fsBuilder->fragmentPosition();
190c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    // At each quarter-circle corner we compute a vector that is the offset of the fragment position
191c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    // from the circle center. The vector is pinned in x and y to be in the quarter-plane relevant
192c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    // to that corner. This means that points near the interior near the rrect top edge will have
193c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    // a vector that points straight up for both the TL left and TR corners. Computing an
194c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    // alpha from this vector at either the TR or TL corner will give the correct result. Similarly,
195c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    // fragments near the other three edges will get the correct AA. Fragments in the interior of
196c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    // the rrect will have a (0,0) vector at all four corners. So long as the radius > 0.5 they will
197c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    // correctly produce an alpha value of 1 at all four corners. We take the min of all the alphas.
198c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    // The code below is a simplified version of the above that performs maxs on the vector
199c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    // components before computing distances and alpha values so that only one distance computation
200c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    // need be computed to determine the min alpha.
201cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    //
202cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    // For the cases where one half of the rrect is rectangular we drop one of the x or y
203cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    // computations, compute a separate rect edge alpha for the rect side, and mul the two computed
204cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    // alphas together.
2054355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    switch (crre.getCircularCornerFlags()) {
2064355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org        case CircularRRectEffect::kAll_CornerFlags:
20730ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tvec2 dxy0 = %s.xy - %s.xy;\n", rectName, fragmentPos);
20830ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tvec2 dxy1 = %s.xy - %s.zw;\n", fragmentPos, rectName);
20930ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppend("\t\tvec2 dxy = max(max(dxy0, dxy1), 0.0);\n");
21030ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat alpha = clamp(%s - length(dxy), 0.0, 1.0);\n",
211cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                                   radiusPlusHalfName);
212cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org            break;
2134355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org        case CircularRRectEffect::kTopLeft_CornerFlag:
21430ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tvec2 dxy = max(%s.xy - %s.xy, 0.0);\n",
2154355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org                                   rectName, fragmentPos);
21630ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat rightAlpha = clamp(%s.z - %s.x, 0.0, 1.0);\n",
217c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                    rectName, fragmentPos);
21830ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat bottomAlpha = clamp(%s.w - %s.y, 0.0, 1.0);\n",
219c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                    rectName, fragmentPos);
22030ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat alpha = bottomAlpha * rightAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n",
221c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                   radiusPlusHalfName);
222c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org            break;
2234355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org        case CircularRRectEffect::kTopRight_CornerFlag:
22430ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tvec2 dxy = max(vec2(%s.x - %s.z, %s.y - %s.y), 0.0);\n",
225c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                   fragmentPos, rectName, rectName, fragmentPos);
22630ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat leftAlpha = clamp(%s.x - %s.x, 0.0, 1.0);\n",
227c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                   fragmentPos, rectName);
22830ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat bottomAlpha = clamp(%s.w - %s.y, 0.0, 1.0);\n",
229c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                    rectName, fragmentPos);
23030ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat alpha = bottomAlpha * leftAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n",
231c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                   radiusPlusHalfName);
232c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org            break;
2334355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org        case CircularRRectEffect::kBottomRight_CornerFlag:
23430ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tvec2 dxy = max(%s.xy - %s.zw, 0.0);\n",
235c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                   fragmentPos, rectName);
23630ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat leftAlpha = clamp(%s.x - %s.x, 0.0, 1.0);\n",
237c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                   fragmentPos, rectName);
23830ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat topAlpha = clamp(%s.y - %s.y, 0.0, 1.0);\n",
239c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                   fragmentPos, rectName);
24030ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat alpha = topAlpha * leftAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n",
241c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                   radiusPlusHalfName);
242c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org            break;
2434355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org        case CircularRRectEffect::kBottomLeft_CornerFlag:
24430ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tvec2 dxy = max(vec2(%s.x - %s.x, %s.y - %s.w), 0.0);\n",
245c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                   rectName, fragmentPos, fragmentPos, rectName);
24630ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat rightAlpha = clamp(%s.z - %s.x, 0.0, 1.0);\n",
247c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                    rectName, fragmentPos);
24830ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat topAlpha = clamp(%s.y - %s.y, 0.0, 1.0);\n",
249c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                   fragmentPos, rectName);
25030ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat alpha = topAlpha * rightAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n",
251c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                                   radiusPlusHalfName);
252c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org            break;
2534355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org        case CircularRRectEffect::kLeft_CornerFlags:
25430ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tvec2 dxy0 = %s.xy - %s.xy;\n", rectName, fragmentPos);
25530ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat dy1 = %s.y - %s.w;\n", fragmentPos, rectName);
25630ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppend("\t\tvec2 dxy = max(vec2(dxy0.x, max(dxy0.y, dy1)), 0.0);\n");
25730ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat rightAlpha = clamp(%s.z - %s.x, 0.0, 1.0);\n",
258cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                                    rectName, fragmentPos);
25930ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat alpha = rightAlpha * 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::kTop_CornerFlags:
26330ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tvec2 dxy0 = %s.xy - %s.xy;\n", rectName, fragmentPos);
26430ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat dx1 = %s.x - %s.z;\n", fragmentPos, rectName);
26530ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppend("\t\tvec2 dxy = max(vec2(max(dxy0.x, dx1), dxy0.y), 0.0);\n");
26630ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat bottomAlpha = clamp(%s.w - %s.y, 0.0, 1.0);\n",
267cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                                   rectName, fragmentPos);
26830ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat alpha = bottomAlpha * 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::kRight_CornerFlags:
27230ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat dy0 = %s.y - %s.y;\n", rectName, fragmentPos);
27330ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tvec2 dxy1 = %s.xy - %s.zw;\n", fragmentPos, rectName);
27430ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppend("\t\tvec2 dxy = max(vec2(dxy1.x, max(dy0, dxy1.y)), 0.0);\n");
27530ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat leftAlpha = clamp(%s.x - %s.x, 0.0, 1.0);\n",
276cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                                   fragmentPos, rectName);
27730ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat alpha = leftAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n",
278cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                                   radiusPlusHalfName);
279cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org            break;
2804355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org        case CircularRRectEffect::kBottom_CornerFlags:
28130ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat dx0 = %s.x - %s.x;\n", rectName, fragmentPos);
28230ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tvec2 dxy1 = %s.xy - %s.zw;\n", fragmentPos, rectName);
28330ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppend("\t\tvec2 dxy = max(vec2(max(dx0, dxy1.x), dxy1.y), 0.0);\n");
28430ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat topAlpha = clamp(%s.y - %s.y, 0.0, 1.0);\n",
285cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                                   fragmentPos, rectName);
28630ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tfloat alpha = topAlpha * clamp(%s - length(dxy), 0.0, 1.0);\n",
287cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                                   radiusPlusHalfName);
288cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org            break;
289cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org    }
29006acb58074778d8eb40f14ae72b000d5120a8111skia.committer@gmail.com
291b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    if (kInverseFillAA_GrProcessorEdgeType == crre.getEdgeType()) {
29230ba436f04e61d4505fb854d5fc56079636e0788joshualitt        fsBuilder->codeAppend("\t\talpha = 1.0 - alpha;\n");
293fbde87f53d659ae2bd616751e466c887b0f3bee5commit-bot@chromium.org    }
294c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org
29530ba436f04e61d4505fb854d5fc56079636e0788joshualitt    fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor,
296c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org                           (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_str());
297c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org}
298c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org
299b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GLCircularRRectEffect::GenKey(const GrProcessor& processor, const GrGLCaps&,
300b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                   GrProcessorKeyBuilder* b) {
301b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    const CircularRRectEffect& crre = processor.cast<CircularRRectEffect>();
302b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GR_STATIC_ASSERT(kGrProcessorEdgeTypeCnt <= 8);
30363e99f7a03b2ac90ae7a00232674fd39c0bdcc68bsalomon    b->add32((crre.getCircularCornerFlags() << 3) | crre.getEdgeType());
304cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org}
305cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org
3067510b224e52b9518a8ddf7418db0e9c258f79539kkinnunenvoid GLCircularRRectEffect::setData(const GrGLProgramDataManager& pdman,
307b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                    const GrProcessor& processor) {
308b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    const CircularRRectEffect& crre = processor.cast<CircularRRectEffect>();
3094355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    const SkRRect& rrect = crre.getRRect();
310c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    if (rrect != fPrevRRect) {
311c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org        SkRect rect = rrect.getBounds();
312cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org        SkScalar radius = 0;
3134355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org        switch (crre.getCircularCornerFlags()) {
3144355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kAll_CornerFlags:
315cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                SkASSERT(rrect.isSimpleCircular());
316cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                radius = rrect.getSimpleRadii().fX;
3172a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                SkASSERT(radius >= kRadiusMin);
318cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.inset(radius, radius);
319cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                break;
3204355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kTopLeft_CornerFlag:
321c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                radius = rrect.radii(SkRRect::kUpperLeft_Corner).fX;
322c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                rect.fLeft += radius;
323c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                rect.fTop += radius;
324c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                rect.fRight += 0.5f;
325c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                rect.fBottom += 0.5f;
326c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                break;
3274355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kTopRight_CornerFlag:
328c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                radius = rrect.radii(SkRRect::kUpperRight_Corner).fX;
329de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com                rect.fLeft -= 0.5f;
330c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                rect.fTop += radius;
331c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                rect.fRight -= radius;
332c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                rect.fBottom += 0.5f;
333c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                break;
3344355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kBottomRight_CornerFlag:
335c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                radius = rrect.radii(SkRRect::kLowerRight_Corner).fX;
336de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com                rect.fLeft -= 0.5f;
337de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com                rect.fTop -= 0.5f;
338c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                rect.fRight -= radius;
339c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                rect.fBottom -= radius;
340c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                break;
3414355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kBottomLeft_CornerFlag:
342c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                radius = rrect.radii(SkRRect::kLowerLeft_Corner).fX;
343c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                rect.fLeft += radius;
344de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com                rect.fTop -= 0.5f;
345de9f251427ccb35fa4d55b5efc97c1b31721cf78bsalomon@google.com                rect.fRight += 0.5f;
346c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                rect.fBottom -= radius;
347c5c748c14797ae49ba73999a63e3b07315c888e1commit-bot@chromium.org                break;
3484355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kLeft_CornerFlags:
349cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                radius = rrect.radii(SkRRect::kUpperLeft_Corner).fX;
350cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fLeft += radius;
351cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fTop += radius;
352cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fRight += 0.5f;
353cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fBottom -= radius;
354cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                break;
3554355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kTop_CornerFlags:
356cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                radius = rrect.radii(SkRRect::kUpperLeft_Corner).fX;
357cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fLeft += radius;
358cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fTop += radius;
359cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fRight -= radius;
360cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fBottom += 0.5f;
361cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                break;
3624355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kRight_CornerFlags:
363cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                radius = rrect.radii(SkRRect::kUpperRight_Corner).fX;
364cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fLeft -= 0.5f;
365cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fTop += radius;
366cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fRight -= radius;
367cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fBottom -= radius;
368cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                break;
3694355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kBottom_CornerFlags:
370cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                radius = rrect.radii(SkRRect::kLowerLeft_Corner).fX;
371cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fLeft += radius;
372cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fTop -= 0.5f;
373cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fRight -= radius;
374cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                rect.fBottom -= radius;
375cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                break;
376dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org            default:
37788cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org                SkFAIL("Should have been one of the above cases.");
378cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org        }
3797510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen        pdman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
3807510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen        pdman.set1f(fRadiusPlusHalfUniform, radius + 0.5f);
381c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org        fPrevRRect = rrect;
382c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    }
383c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org}
384c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org
385c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
386c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org
3874355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgclass GLEllipticalRRectEffect;
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    static const char* Name() { return "EllipticalRRect"; }
3954355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
3964355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    const SkRRect& getRRect() const { return fRRect; }
3974355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
398fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org
399b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
4004355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
401b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    typedef GLEllipticalRRectEffect GLProcessor;
4024355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
403b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERRIDE;
4044355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
4054355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgprivate:
406b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    EllipticalRRectEffect(GrPrimitiveEdgeType, const SkRRect&);
4074355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
408b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual bool onIsEqual(const GrProcessor& other) const SK_OVERRIDE;
4094355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
4101a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_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
4281a8ecdfb73a15de600d5779b75d7c4b61863c50begdanielvoid EllipticalRRectEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
4291a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel    inout->fValidFlags = 0;
4301a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel    inout->fIsSingleComponent = false;
4314355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org}
4324355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
433b0a8a377f832c59cee939ad721e1f87d378b7142joshualittconst GrBackendFragmentProcessorFactory& EllipticalRRectEffect::getFactory() const {
434b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    return GrTBackendFragmentProcessorFactory<EllipticalRRectEffect>::getInstance();
4354355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org}
4364355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
437b0a8a377f832c59cee939ad721e1f87d378b7142joshualittEllipticalRRectEffect::EllipticalRRectEffect(GrPrimitiveEdgeType edgeType, const SkRRect& rrect)
4384355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    : fRRect(rrect)
4394355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    , fEdgeType(edgeType){
4404355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    this->setWillReadFragmentPosition();
4414355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org}
4424355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
443b0a8a377f832c59cee939ad721e1f87d378b7142joshualittbool EllipticalRRectEffect::onIsEqual(const GrProcessor& other) const {
44449586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt    const EllipticalRRectEffect& erre = other.cast<EllipticalRRectEffect>();
4454355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    return fEdgeType == erre.fEdgeType && fRRect == erre.fRRect;
4464355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org}
4474355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
4484355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
4494355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
450b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGR_DEFINE_FRAGMENT_PROCESSOR_TEST(EllipticalRRectEffect);
4514355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
452b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* EllipticalRRectEffect::TestCreate(SkRandom* random,
453b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                       GrContext*,
454b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                       const GrDrawTargetCaps& caps,
455b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                       GrTexture*[]) {
4564355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    SkScalar w = random->nextRangeScalar(20.f, 1000.f);
4574355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    SkScalar h = random->nextRangeScalar(20.f, 1000.f);
458fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    SkVector r[4];
459fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    r[SkRRect::kUpperLeft_Corner].fX = random->nextRangeF(kRadiusMin, 9.f);
460fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    // ensure at least one corner really is elliptical
461fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    do {
462fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org        r[SkRRect::kUpperLeft_Corner].fY = random->nextRangeF(kRadiusMin, 9.f);
463fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    } while (r[SkRRect::kUpperLeft_Corner].fY == r[SkRRect::kUpperLeft_Corner].fX);
464fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org
4654355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    SkRRect rrect;
466fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    if (random->nextBool()) {
467fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org        // half the time create a four-radii rrect.
468fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org        r[SkRRect::kLowerRight_Corner].fX = random->nextRangeF(kRadiusMin, 9.f);
469fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org        r[SkRRect::kLowerRight_Corner].fY = random->nextRangeF(kRadiusMin, 9.f);
470fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org
471fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org        r[SkRRect::kUpperRight_Corner].fX = r[SkRRect::kLowerRight_Corner].fX;
472fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org        r[SkRRect::kUpperRight_Corner].fY = r[SkRRect::kUpperLeft_Corner].fY;
473fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org
474fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org        r[SkRRect::kLowerLeft_Corner].fX = r[SkRRect::kUpperLeft_Corner].fX;
475fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org        r[SkRRect::kLowerLeft_Corner].fY = r[SkRRect::kLowerRight_Corner].fY;
476fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org
477fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org        rrect.setRectRadii(SkRect::MakeWH(w, h), r);
478fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    } else {
479fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org        rrect.setRectXY(SkRect::MakeWH(w, h), r[SkRRect::kUpperLeft_Corner].fX,
480fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                                              r[SkRRect::kUpperLeft_Corner].fY);
481fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    }
482b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrFragmentProcessor* fp;
4834355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    do {
484b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        GrPrimitiveEdgeType et = (GrPrimitiveEdgeType)random->nextULessThan(kGrProcessorEdgeTypeCnt);
485b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        fp = GrRRectEffect::Create(et, rrect);
486b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    } while (NULL == fp);
487b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    return fp;
4884355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org}
4894355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
4904355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
4914355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
492b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GLEllipticalRRectEffect : public GrGLFragmentProcessor {
4934355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgpublic:
494b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GLEllipticalRRectEffect(const GrBackendProcessorFactory&, const GrProcessor&);
4954355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
4961598899975ecc85b003a59740b588d1ddbcedb09joshualitt    virtual void emitCode(GrGLFPBuilder* builder,
497b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                          const GrFragmentProcessor& effect,
498b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                          const GrProcessorKey& key,
4994355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org                          const char* outputColor,
5004355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org                          const char* inputColor,
5014355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org                          const TransformedCoordsArray&,
5024355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org                          const TextureSamplerArray&) SK_OVERRIDE;
5034355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
504b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*);
5054355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
506b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE;
5074355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
5084355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.orgprivate:
5097510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen    GrGLProgramDataManager::UniformHandle fInnerRectUniform;
5107510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen    GrGLProgramDataManager::UniformHandle fInvRadiiSqdUniform;
5117510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen    SkRRect                               fPrevRRect;
512b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    typedef GrGLFragmentProcessor INHERITED;
5134355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org};
5144355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
515b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGLEllipticalRRectEffect::GLEllipticalRRectEffect(const GrBackendProcessorFactory& factory,
516b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                             const GrProcessor& effect)
5174355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    : INHERITED (factory) {
5184355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    fPrevRRect.setEmpty();
5194355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org}
5204355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
5211598899975ecc85b003a59740b588d1ddbcedb09joshualittvoid GLEllipticalRRectEffect::emitCode(GrGLFPBuilder* builder,
522b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                       const GrFragmentProcessor& effect,
523b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                       const GrProcessorKey& key,
5244355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org                                       const char* outputColor,
5254355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org                                       const char* inputColor,
5264355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org                                       const TransformedCoordsArray&,
5274355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org                                       const TextureSamplerArray& samplers) {
52849586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt    const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>();
5294355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    const char *rectName;
5304355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // The inner rect is the rrect bounds inset by the x/y radii
53130ba436f04e61d4505fb854d5fc56079636e0788joshualitt    fInnerRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
5324355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org                                            kVec4f_GrSLType,
5334355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org                                            "innerRect",
5344355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org                                            &rectName);
53530ba436f04e61d4505fb854d5fc56079636e0788joshualitt
5361598899975ecc85b003a59740b588d1ddbcedb09joshualitt    GrGLFPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder();
53730ba436f04e61d4505fb854d5fc56079636e0788joshualitt    const char* fragmentPos = fsBuilder->fragmentPosition();
5384355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // At each quarter-ellipse corner we compute a vector that is the offset of the fragment pos
5394355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // to the ellipse center. The vector is pinned in x and y to be in the quarter-plane relevant
5404355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // to that corner. This means that points near the interior near the rrect top edge will have
5414355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // a vector that points straight up for both the TL left and TR corners. Computing an
5424355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // alpha from this vector at either the TR or TL corner will give the correct result. Similarly,
5434355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // fragments near the other three edges will get the correct AA. Fragments in the interior of
5444355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // the rrect will have a (0,0) vector at all four corners. So long as the radii > 0.5 they will
5454355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // correctly produce an alpha value of 1 at all four corners. We take the min of all the alphas.
5464355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // The code below is a simplified version of the above that performs maxs on the vector
5474355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // components before computing distances and alpha values so that only one distance computation
5484355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // need be computed to determine the min alpha.
54930ba436f04e61d4505fb854d5fc56079636e0788joshualitt    fsBuilder->codeAppendf("\t\tvec2 dxy0 = %s.xy - %s.xy;\n", rectName, fragmentPos);
55030ba436f04e61d4505fb854d5fc56079636e0788joshualitt    fsBuilder->codeAppendf("\t\tvec2 dxy1 = %s.xy - %s.zw;\n", fragmentPos, rectName);
5519615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org    switch (erre.getRRect().getType()) {
5529615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org        case SkRRect::kSimple_Type: {
553fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org            const char *invRadiiXYSqdName;
55430ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fInvRadiiSqdUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
555fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                                                      kVec2f_GrSLType,
556fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                                                      "invRadiiXY",
557fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                                                      &invRadiiXYSqdName);
55830ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppend("\t\tvec2 dxy = max(max(dxy0, dxy1), 0.0);\n");
559fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org            // Z is the x/y offsets divided by squared radii.
56030ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tvec2 Z = dxy * %s;\n", invRadiiXYSqdName);
561fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org            break;
562fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org        }
5639615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org        case SkRRect::kNinePatch_Type: {
564fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org            const char *invRadiiLTRBSqdName;
56530ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fInvRadiiSqdUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
566fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                                                      kVec4f_GrSLType,
567fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                                                      "invRadiiLTRB",
568fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                                                      &invRadiiLTRBSqdName);
56930ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppend("\t\tvec2 dxy = max(max(dxy0, dxy1), 0.0);\n");
570fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org            // Z is the x/y offsets divided by squared radii. We only care about the (at most) one
571fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org            // corner where both the x and y offsets are positive, hence the maxes. (The inverse
572fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org            // squared radii will always be positive.)
57330ba436f04e61d4505fb854d5fc56079636e0788joshualitt            fsBuilder->codeAppendf("\t\tvec2 Z = max(max(dxy0 * %s.xy, dxy1 * %s.zw), 0.0);\n",
574fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                                   invRadiiLTRBSqdName, invRadiiLTRBSqdName);
575fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org            break;
5769615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org        }
5779615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org        default:
57888cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org            SkFAIL("RRect should always be simple or nine-patch.");
579fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org    }
5804355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // implicit is the evaluation of (x/a)^2 + (y/b)^2 - 1.
58130ba436f04e61d4505fb854d5fc56079636e0788joshualitt    fsBuilder->codeAppend("\t\tfloat implicit = dot(Z, dxy) - 1.0;\n");
5824355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    // grad_dot is the squared length of the gradient of the implicit.
58330ba436f04e61d4505fb854d5fc56079636e0788joshualitt    fsBuilder->codeAppendf("\t\tfloat grad_dot = 4.0 * dot(Z, Z);\n");
5841b035d82d2b8b50ae334463edd06e4c5e0639311commit-bot@chromium.org    // avoid calling inversesqrt on zero.
58530ba436f04e61d4505fb854d5fc56079636e0788joshualitt    fsBuilder->codeAppend("\t\tgrad_dot = max(grad_dot, 1.0e-4);\n");
58630ba436f04e61d4505fb854d5fc56079636e0788joshualitt    fsBuilder->codeAppendf("\t\tfloat approx_dist = implicit * inversesqrt(grad_dot);\n");
5874355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
588b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    if (kFillAA_GrProcessorEdgeType == erre.getEdgeType()) {
58930ba436f04e61d4505fb854d5fc56079636e0788joshualitt        fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 - approx_dist, 0.0, 1.0);\n");
5904355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    } else {
59130ba436f04e61d4505fb854d5fc56079636e0788joshualitt        fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 + approx_dist, 0.0, 1.0);\n");
5924355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    }
5934355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
59430ba436f04e61d4505fb854d5fc56079636e0788joshualitt    fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor,
5954355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org                           (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_str());
5964355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org}
5974355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
598b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GLEllipticalRRectEffect::GenKey(const GrProcessor& effect, const GrGLCaps&,
599b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                     GrProcessorKeyBuilder* b) {
60049586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt    const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>();
601b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GR_STATIC_ASSERT(kLast_GrProcessorEdgeType < (1 << 3));
60263e99f7a03b2ac90ae7a00232674fd39c0bdcc68bsalomon    b->add32(erre.getRRect().getType() | erre.getEdgeType() << 3);
6034355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org}
6044355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
6057510b224e52b9518a8ddf7418db0e9c258f79539kkinnunenvoid GLEllipticalRRectEffect::setData(const GrGLProgramDataManager& pdman,
606b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                      const GrProcessor& effect) {
60749586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt    const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>();
6084355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    const SkRRect& rrect = erre.getRRect();
6094355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    if (rrect != fPrevRRect) {
6104355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org        SkRect rect = rrect.getBounds();
611fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org        const SkVector& r0 = rrect.radii(SkRRect::kUpperLeft_Corner);
6122a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org        SkASSERT(r0.fX >= kRadiusMin);
6132a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org        SkASSERT(r0.fY >= kRadiusMin);
6149615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org        switch (erre.getRRect().getType()) {
6159615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org            case SkRRect::kSimple_Type:
616fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                rect.inset(r0.fX, r0.fY);
6177510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen                pdman.set2f(fInvRadiiSqdUniform, 1.f / (r0.fX * r0.fX),
618fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                                                1.f / (r0.fY * r0.fY));
619fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                break;
6209615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org            case SkRRect::kNinePatch_Type: {
621fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                const SkVector& r1 = rrect.radii(SkRRect::kLowerRight_Corner);
6222a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                SkASSERT(r1.fX >= kRadiusMin);
6232a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                SkASSERT(r1.fY >= kRadiusMin);
624fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                rect.fLeft += r0.fX;
625fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                rect.fTop += r0.fY;
626fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                rect.fRight -= r1.fX;
627fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                rect.fBottom -= r1.fY;
6287510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen                pdman.set4f(fInvRadiiSqdUniform, 1.f / (r0.fX * r0.fX),
629fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                                                1.f / (r0.fY * r0.fY),
630fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                                                1.f / (r1.fX * r1.fX),
631fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                                                1.f / (r1.fY * r1.fY));
632fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                break;
633fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org            }
6349615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org        default:
63588cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org            SkFAIL("RRect should always be simple or nine-patch.");
636fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org        }
6377510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen        pdman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
6384355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org        fPrevRRect = rrect;
6394355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    }
6404355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org}
6414355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
6424355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
6434355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org
644b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* GrRRectEffect::Create(GrPrimitiveEdgeType edgeType, const SkRRect& rrect) {
6452a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org    if (rrect.isRect()) {
6462a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org        return GrConvexPolyEffect::Create(edgeType, rrect.getBounds());
6472a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org    }
6482a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org
6493eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org    if (rrect.isOval()) {
6503eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org        return GrOvalEffect::Create(edgeType, rrect.getBounds());
6513eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org    }
6523eedb801e35001df4b7e154edf4fd8da942296a0commit-bot@chromium.org
6534355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org    if (rrect.isSimple()) {
6542a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org        if (rrect.getSimpleRadii().fX < kRadiusMin || rrect.getSimpleRadii().fY < kRadiusMin) {
6552a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            // In this case the corners are extremely close to rectangular and we collapse the
6562a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            // clip to a rectangular clip.
6572a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            return GrConvexPolyEffect::Create(edgeType, rrect.getBounds());
6582a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org        }
6594355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org        if (rrect.getSimpleRadii().fX == rrect.getSimpleRadii().fY) {
6606e4eb21d9c4cf10585b705d1a0ded8cafef29adcskia.committer@gmail.com            return CircularRRectEffect::Create(edgeType, CircularRRectEffect::kAll_CornerFlags,
6612a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                                               rrect);
6624355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org        } else {
6639615d5fc040e7302ce870639ab221233f56fff7ccommit-bot@chromium.org            return EllipticalRRectEffect::Create(edgeType, rrect);
664cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org        }
6652a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org    }
6662a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org
6672a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org    if (rrect.isComplex() || rrect.isNinePatch()) {
668cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org        // Check for the "tab" cases - two adjacent circular corners and two square corners.
6692a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org        SkScalar circularRadius = 0;
6702a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org        uint32_t cornerFlags  = 0;
6712a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org
6722a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org        SkVector radii[4];
6732a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org        bool squashedRadii = false;
674cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org        for (int c = 0; c < 4; ++c) {
6752a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            radii[c] = rrect.radii((SkRRect::Corner)c);
6762a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            SkASSERT((0 == radii[c].fX) == (0 == radii[c].fY));
6772a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            if (0 == radii[c].fX) {
6782a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                // The corner is square, so no need to squash or flag as circular.
6792a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                continue;
6802a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            }
6812a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            if (radii[c].fX < kRadiusMin || radii[c].fY < kRadiusMin) {
6822a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                radii[c].set(0, 0);
6832a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                squashedRadii = true;
684cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                continue;
685cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org            }
6862a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            if (radii[c].fX != radii[c].fY) {
68744a435bc1ac84748d5bec420c7c5fe09171fd971bsalomon@google.com                cornerFlags = ~0U;
688fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                break;
689cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org            }
690dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org            if (!cornerFlags) {
6912a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                circularRadius = radii[c].fX;
692dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org                cornerFlags = 1 << c;
693cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org            } else {
6942a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                if (radii[c].fX != circularRadius) {
69544a435bc1ac84748d5bec420c7c5fe09171fd971bsalomon@google.com                   cornerFlags = ~0U;
696fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                   break;
697cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                }
698dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org                cornerFlags |= 1 << c;
699cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org            }
700cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org        }
701cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org
702dd58422b4b2bffb0f7b5bdc047d0f93bd93813b4commit-bot@chromium.org        switch (cornerFlags) {
7032a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            case CircularRRectEffect::kAll_CornerFlags:
7042a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                // This rrect should have been caught in the simple case above. Though, it would
7052a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                // be correctly handled in the fallthrough code.
7062a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                SkASSERT(false);
7074355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kTopLeft_CornerFlag:
7084355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kTopRight_CornerFlag:
7094355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kBottomRight_CornerFlag:
7104355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kBottomLeft_CornerFlag:
7114355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kLeft_CornerFlags:
7124355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kTop_CornerFlags:
7134355f21dbc29bcb479a3806444dd22916e22771ecommit-bot@chromium.org            case CircularRRectEffect::kRight_CornerFlags:
7142a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            case CircularRRectEffect::kBottom_CornerFlags: {
7152a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                SkTCopyOnFirstWrite<SkRRect> rr(rrect);
7162a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                if (squashedRadii) {
7172a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                    rr.writable()->setRectRadii(rrect.getBounds(), radii);
7182a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                }
7192a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                return CircularRRectEffect::Create(edgeType, cornerFlags, *rr);
7202a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            }
7212a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            case CircularRRectEffect::kNone_CornerFlags:
7222a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                return GrConvexPolyEffect::Create(edgeType, rrect.getBounds());
7232a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            default: {
7242a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                if (squashedRadii) {
7252a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                    // If we got here then we squashed some but not all the radii to zero. (If all
7262a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                    // had been squashed cornerFlags would be 0.) The elliptical effect doesn't
7272a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                    // support some rounded and some square corners.
7282a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                    return NULL;
7292a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                }
730fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                if (rrect.isNinePatch()) {
7312a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org                    return EllipticalRRectEffect::Create(edgeType, rrect);
732fa5edbe5750632b4590ed951c594dd2766ccc4cfcommit-bot@chromium.org                }
733cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org                return NULL;
7342a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org            }
735cb3672ed7fb9a5d54849e3265e8399bc5224bacecommit-bot@chromium.org        }
736c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org    }
7372a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org
7382a8be900db664bb26dca1adcb3a524a1bb1f45e6commit-bot@chromium.org    return NULL;
739c2f7824436d05da6e8514d06a54773538aace028commit-bot@chromium.org}
740