Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Unified Diff: src/effects/SkRRectsGaussianEdgeShader.cpp

Issue 2344963002: Fix color bug in SkRRectsGaussianEdgeShader (Closed)
Patch Set: Add new constant to GM Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/effects/SkRRectsGaussianEdgeShader.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
///////////////////////////////////////////////////////////////////////////////
« no previous file with comments | « include/effects/SkRRectsGaussianEdgeShader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698