| Index: src/effects/SkRRectsGaussianEdgeShader.cpp | 
| diff --git a/src/effects/SkRRectsGaussianEdgeShader.cpp b/src/effects/SkRRectsGaussianEdgeShader.cpp | 
| index 02e46fb8746808f894b6235f84482dfbe044f234..2c41c26c101b4f8053b27f586b042e4fb4b2d9da 100644 | 
| --- a/src/effects/SkRRectsGaussianEdgeShader.cpp | 
| +++ b/src/effects/SkRRectsGaussianEdgeShader.cpp | 
| @@ -16,12 +16,10 @@ | 
| */ | 
| class SkRRectsGaussianEdgeShaderImpl : public SkShader { | 
| public: | 
| -    SkRRectsGaussianEdgeShaderImpl(const SkRRect& first, const SkRRect& second, | 
| -                                   SkScalar radius, SkScalar pad) | 
| +    SkRRectsGaussianEdgeShaderImpl(const SkRRect& first, const SkRRect& second, SkScalar radius) | 
| : fFirst(first) | 
| , fSecond(second) | 
| -        , fRadius(radius) | 
| -        , fPad(pad) { | 
| +        , fRadius(radius) { | 
| } | 
|  | 
| bool isOpaque() const override { return false; } | 
| @@ -58,7 +56,6 @@ private: | 
| SkRRect  fFirst; | 
| SkRRect  fSecond; | 
| SkScalar fRadius; | 
| -    SkScalar fPad; | 
|  | 
| friend class SkRRectsGaussianEdgeShader; // for serialization registration system | 
|  | 
| @@ -87,12 +84,10 @@ public: | 
| kSimpleCircular_Mode, | 
| }; | 
|  | 
| -    RRectsGaussianEdgeFP(const SkRRect& first, const SkRRect& second, | 
| -                         SkScalar radius, SkScalar pad) | 
| +    RRectsGaussianEdgeFP(const SkRRect& first, const SkRRect& second, SkScalar radius) | 
| : fFirst(first) | 
| , fSecond(second) | 
| -        , fRadius(radius) | 
| -        , fPad(pad) { | 
| +        , fRadius(radius) { | 
| this->initClassID<RRectsGaussianEdgeFP>(); | 
| this->setWillReadFragmentPosition(); | 
|  | 
| @@ -112,7 +107,7 @@ public: | 
| const char* posName, | 
| const char* sizesName, | 
| const char* radiiName, | 
| -                          const char* padRadName, | 
| +                          const char* radName, | 
| const char* outputName, | 
| const char  indices[2]) { // how to access the params for the 2 rrects | 
|  | 
| @@ -122,15 +117,15 @@ public: | 
|  | 
| switch (mode) { | 
| case kCircle_Mode: | 
| -                fragBuilder->codeAppendf("%s = clamp((%s.%c - length(delta))/%s.y, 0.0, 1.0);", | 
| -                                         outputName, sizesName, indices[0], padRadName); | 
| +                fragBuilder->codeAppendf("%s = clamp((%s.%c - length(delta))/%s, 0.0, 1.0);", | 
| +                                         outputName, sizesName, indices[0], radName); | 
| break; | 
| case kRect_Mode: | 
| fragBuilder->codeAppendf( | 
| -                    "vec2 rectDist = vec2(1.0 - clamp((%s.%c - abs(delta.x))/%s.y, 0.0, 1.0)," | 
| -                                         "1.0 - clamp((%s.%c - abs(delta.y))/%s.y, 0.0, 1.0));", | 
| -                    sizesName, indices[0], padRadName, | 
| -                    sizesName, indices[1], padRadName); | 
| +                    "vec2 rectDist = vec2(1.0 - clamp((%s.%c - abs(delta.x))/%s, 0.0, 1.0)," | 
| +                                         "1.0 - clamp((%s.%c - abs(delta.y))/%s, 0.0, 1.0));", | 
| +                    sizesName, indices[0], radName, | 
| +                    sizesName, indices[1], radName); | 
| fragBuilder->codeAppendf("%s = 1.0 - length(rectDist);", outputName); | 
| break; | 
| case kSimpleCircular_Mode: | 
| @@ -139,12 +134,12 @@ public: | 
| // point is in one of the circular corners. We then compute the | 
| // distance from the corner and then use the multiplier to mask | 
| // between the two distances. | 
| -                fragBuilder->codeAppendf("float xDist = clamp((%s.%c - abs(delta.x))/%s.y," | 
| +                fragBuilder->codeAppendf("float xDist = clamp((%s.%c - abs(delta.x))/%s," | 
| " 0.0, 1.0);", | 
| -                                         sizesName, indices[0], padRadName); | 
| -                fragBuilder->codeAppendf("float yDist = clamp((%s.%c - abs(delta.y))/%s.y," | 
| +                                         sizesName, indices[0], radName); | 
| +                fragBuilder->codeAppendf("float yDist = clamp((%s.%c - abs(delta.y))/%s," | 
| "0.0, 1.0);", | 
| -                                         sizesName, indices[1], padRadName); | 
| +                                         sizesName, indices[1], radName); | 
| fragBuilder->codeAppend("float rectDist = min(xDist, yDist);"); | 
|  | 
| fragBuilder->codeAppendf("vec2 cornerCenter = %s.%s - %s.%s;", | 
| @@ -158,9 +153,9 @@ public: | 
|  | 
| fragBuilder->codeAppendf("delta += %s.%s;", radiiName, indices); | 
|  | 
| -                fragBuilder->codeAppendf("cornerDist = clamp((2.0 * %s.%c - length(delta))/%s.y," | 
| +                fragBuilder->codeAppendf("cornerDist = clamp((2.0 * %s.%c - length(delta))/%s," | 
| "0.0, 1.0);", | 
| -                                         radiiName, indices[0], padRadName); | 
| +                                         radiiName, indices[0], radName); | 
|  | 
| fragBuilder->codeAppendf("%s = (multiplier * cornerDist) +" | 
| "((1.0-multiplier) * rectDist);", | 
| @@ -188,34 +183,32 @@ public: | 
| kVec4f_GrSLType, kDefault_GrSLPrecision, | 
| "Radii", &radiiUniName); | 
| } | 
| -            const char* padRadUniName = nullptr; | 
| -            fPadRadUni = uniformHandler->addUniform(kFragment_GrShaderFlag, | 
| -                                                    kVec2f_GrSLType, kDefault_GrSLPrecision, | 
| -                                                    "PadRad", &padRadUniName); | 
| +            const char* radUniName = nullptr; | 
| +            fRadiusUni = uniformHandler->addUniform(kFragment_GrShaderFlag, | 
| +                                                    kFloat_GrSLType, kDefault_GrSLPrecision, | 
| +                                                    "Radius", &radUniName); | 
|  | 
| fragBuilder->codeAppend("float firstDist;"); | 
| fragBuilder->codeAppend("{"); | 
| this->emitModeCode(fp.firstMode(), fragBuilder, | 
| positionsUniName, sizesUniName, radiiUniName, | 
| -                               padRadUniName, "firstDist", "xy"); | 
| +                               radUniName, "firstDist", "xy"); | 
| fragBuilder->codeAppend("}"); | 
|  | 
| fragBuilder->codeAppend("float secondDist;"); | 
| fragBuilder->codeAppend("{"); | 
| this->emitModeCode(fp.secondMode(), fragBuilder, | 
| positionsUniName, sizesUniName, radiiUniName, | 
| -                               padRadUniName, "secondDist", "zw"); | 
| +                               radUniName, "secondDist", "zw"); | 
| fragBuilder->codeAppend("}"); | 
|  | 
| -            fragBuilder->codeAppendf("float dist = %s.y * firstDist * secondDist;", | 
| -                                     padRadUniName); | 
| +            fragBuilder->codeAppendf("float dist = %s * firstDist * secondDist;", radUniName); | 
|  | 
| // Finally use the distance to apply the Gaussian edge | 
| // TODO: we undo the multiply by the radius here - we should just skip both | 
| -            fragBuilder->codeAppendf("float factor = 1.0 - clamp((dist - %s.x)/%s.y, 0.0, 1.0);", | 
| -                                     padRadUniName, padRadUniName); | 
| +            fragBuilder->codeAppendf("float factor = 1.0 - clamp(dist/%s, 0.0, 1.0);", radUniName); | 
| fragBuilder->codeAppend("factor = exp(-factor * factor * 4.0) - 0.018;"); | 
| -            fragBuilder->codeAppendf("%s = vec4(%s.rgb, factor);", | 
| +            fragBuilder->codeAppendf("%s = factor*%s;", | 
| args.fOutputColor, args.fInputColor); | 
| } | 
|  | 
| @@ -256,7 +249,7 @@ public: | 
| 0.5f * second.getSimpleRadii().fY); | 
| } | 
|  | 
| -            pdman.set2f(fPadRadUni, edgeFP.pad(), edgeFP.radius()); | 
| +            pdman.set1f(fRadiusUni, edgeFP.radius()); | 
| } | 
|  | 
| private: | 
| @@ -273,8 +266,8 @@ public: | 
| // non-circular corner round rects & ellipses. | 
| GrGLSLProgramDataManager::UniformHandle fRadiiUni; | 
|  | 
| -        // The pad and radius parameters (padding, radius) | 
| -        GrGLSLProgramDataManager::UniformHandle fPadRadUni; | 
| +        // The radius parameters (radius) | 
| +        GrGLSLProgramDataManager::UniformHandle fRadiusUni; | 
|  | 
| typedef GrGLSLFragmentProcessor INHERITED; | 
| }; | 
| @@ -294,7 +287,6 @@ public: | 
| const SkRRect& second() const { return fSecond; } | 
| Mode secondMode() const { return fSecondMode; } | 
| SkScalar radius() const { return fRadius; } | 
| -    SkScalar pad() const { return fPad; } | 
|  | 
| private: | 
| static Mode ComputeMode(const SkRRect& rr) { | 
| @@ -314,8 +306,9 @@ private: | 
|  | 
| bool onIsEqual(const GrFragmentProcessor& proc) const override { | 
| const RRectsGaussianEdgeFP& edgeFP = proc.cast<RRectsGaussianEdgeFP>(); | 
| -        return fFirst  == edgeFP.fFirst && fSecond == edgeFP.fSecond && | 
| -               fRadius == edgeFP.fRadius && fPad == edgeFP.fPad; | 
| +        return fFirst  == edgeFP.fFirst && | 
| +               fSecond == edgeFP.fSecond && | 
| +               fRadius == edgeFP.fRadius; | 
| } | 
|  | 
| SkRRect  fFirst; | 
| @@ -323,7 +316,6 @@ private: | 
| SkRRect  fSecond; | 
| Mode     fSecondMode; | 
| SkScalar fRadius; | 
| -    SkScalar fPad; | 
|  | 
| typedef GrFragmentProcessor INHERITED; | 
| }; | 
| @@ -332,7 +324,7 @@ private: | 
|  | 
| sk_sp<GrFragmentProcessor> SkRRectsGaussianEdgeShaderImpl::asFragmentProcessor( | 
| const AsFPArgs& args) const { | 
| -    return sk_make_sp<RRectsGaussianEdgeFP>(fFirst, fSecond, fRadius, fPad); | 
| +    return sk_make_sp<RRectsGaussianEdgeFP>(fFirst, fSecond, fRadius); | 
| } | 
|  | 
| #endif | 
| @@ -380,11 +372,10 @@ sk_sp<SkFlattenable> SkRRectsGaussianEdgeShaderImpl::CreateProc(SkReadBuffer& bu | 
| SkScalar yRad2 = buf.readScalar(); | 
|  | 
| SkScalar radius = buf.readScalar(); | 
| -    SkScalar pad = buf.readScalar(); | 
|  | 
| return sk_make_sp<SkRRectsGaussianEdgeShaderImpl>(SkRRect::MakeRectXY(rect1, xRad1, yRad1), | 
| SkRRect::MakeRectXY(rect2, xRad2, yRad2), | 
| -                                                      radius, pad); | 
| +                                                      radius); | 
| } | 
|  | 
| void SkRRectsGaussianEdgeShaderImpl::flatten(SkWriteBuffer& buf) const { | 
| @@ -403,7 +394,6 @@ void SkRRectsGaussianEdgeShaderImpl::flatten(SkWriteBuffer& buf) const { | 
| buf.writeScalar(radii2.fY); | 
|  | 
| buf.writeScalar(fRadius); | 
| -    buf.writeScalar(fPad); | 
| } | 
|  | 
| size_t SkRRectsGaussianEdgeShaderImpl::onContextSize(const ContextRec& rec) const { | 
| @@ -419,8 +409,7 @@ SkShader::Context* SkRRectsGaussianEdgeShaderImpl::onCreateContext(const Context | 
|  | 
| sk_sp<SkShader> SkRRectsGaussianEdgeShader::Make(const SkRRect& first, | 
| const SkRRect& second, | 
| -                                                 SkScalar radius, | 
| -                                                 SkScalar pad) { | 
| +                                                 SkScalar radius) { | 
| if ((!first.isRect()  && !first.isCircle()  && !first.isSimpleCircular()) || | 
| (!second.isRect() && !second.isCircle() && !second.isSimpleCircular())) { | 
| // we only deal with the shapes where the x & y radii are equal | 
| @@ -428,7 +417,7 @@ sk_sp<SkShader> SkRRectsGaussianEdgeShader::Make(const SkRRect& first, | 
| return nullptr; | 
| } | 
|  | 
| -    return sk_make_sp<SkRRectsGaussianEdgeShaderImpl>(first, second, radius, pad); | 
| +    return sk_make_sp<SkRRectsGaussianEdgeShaderImpl>(first, second, radius); | 
| } | 
|  | 
| /////////////////////////////////////////////////////////////////////////////// | 
|  |