Index: src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp |
diff --git a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp |
index d7b03840172164af52a5ed7d1f68f4a47230165b..7cdb62dc44c516154b24dabacb83c4cddb77172f 100644 |
--- a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp |
+++ b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp |
@@ -56,6 +56,7 @@ public: |
// The radial gradient parameters can collapse to a linear (instead of quadratic) equation. |
bool isDegenerate() const { return SkScalarAbs(fDiffRadius) == SkScalarAbs(fCenterX1); } |
+ bool isFlipped() const { return fIsFlipped; } |
SkScalar center() const { return fCenterX1; } |
SkScalar diffRadius() const { return fDiffRadius; } |
SkScalar radius() const { return fRadius0; } |
@@ -68,7 +69,8 @@ private: |
return (INHERITED::onIsEqual(sBase) && |
this->fCenterX1 == s.fCenterX1 && |
this->fRadius0 == s.fRadius0 && |
- this->fDiffRadius == s.fDiffRadius); |
+ this->fDiffRadius == s.fDiffRadius && |
+ this->fIsFlipped == s.fIsFlipped); |
} |
Default2PtConicalEffect(GrContext* ctx, |
@@ -78,7 +80,8 @@ private: |
: INHERITED(ctx, shader, matrix, tm), |
fCenterX1(shader.getCenterX1()), |
fRadius0(shader.getStartRadius()), |
- fDiffRadius(shader.getDiffRadius()) { |
+ fDiffRadius(shader.getDiffRadius()), |
+ fIsFlipped(shader.isFlippedGrad()) { |
// We pass the linear part of the quadratic as a varying. |
// float b = -2.0 * (fCenterX1 * x + fRadius0 * fDiffRadius * z) |
fBTransform = this->getCoordTransform(); |
@@ -103,6 +106,7 @@ private: |
SkScalar fCenterX1; |
SkScalar fRadius0; |
SkScalar fDiffRadius; |
+ bool fIsFlipped; |
// @} |
@@ -132,6 +136,7 @@ protected: |
const char* fFSVaryingName; |
bool fIsDegenerate; |
+ bool fIsFlipped; |
// @{ |
/// Values last uploaded as uniforms |
@@ -194,6 +199,7 @@ GLDefault2PtConicalEffect::GLDefault2PtConicalEffect(const GrBackendEffectFactor |
const Default2PtConicalEffect& data = drawEffect.castEffect<Default2PtConicalEffect>(); |
fIsDegenerate = data.isDegenerate(); |
+ fIsFlipped = data.isFlipped(); |
} |
void GLDefault2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, |
@@ -281,9 +287,14 @@ void GLDefault2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, |
// Note: If there are two roots that both generate radius(t) > 0, the |
// Canvas spec says to choose the larger t. |
- // so we'll look at the larger one first: |
- builder->fsCodeAppendf("\t\tfloat %s = max(%s, %s);\n", tName.c_str(), |
- r0Name.c_str(), r1Name.c_str()); |
+ // so we'll look at the larger one first (or smaller if flipped): |
+ if (!fIsFlipped) { |
+ builder->fsCodeAppendf("\t\tfloat %s = max(%s, %s);\n", tName.c_str(), |
+ r0Name.c_str(), r1Name.c_str()); |
+ } else { |
+ builder->fsCodeAppendf("\t\tfloat %s = min(%s, %s);\n", tName.c_str(), |
+ r0Name.c_str(), r1Name.c_str()); |
+ } |
// if r(t) > 0, then we're done; t will be our x coordinate |
builder->fsCodeAppendf("\t\tif (%s * %s + %s > 0.0) {\n", tName.c_str(), |
@@ -294,8 +305,13 @@ void GLDefault2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, |
// otherwise, if r(t) for the larger root was <= 0, try the other root |
builder->fsCodeAppend("\t\t} else {\n"); |
- builder->fsCodeAppendf("\t\t\t%s = min(%s, %s);\n", tName.c_str(), |
- r0Name.c_str(), r1Name.c_str()); |
+ if (!fIsFlipped) { |
+ builder->fsCodeAppendf("\t\t\t%s = min(%s, %s);\n", tName.c_str(), |
+ r0Name.c_str(), r1Name.c_str()); |
+ } else { |
+ builder->fsCodeAppendf("\t\t\t%s = max(%s, %s);\n", tName.c_str(), |
+ r0Name.c_str(), r1Name.c_str()); |
+ } |
// if r(t) > 0 for the smaller root, then t will be our x coordinate |
builder->fsCodeAppendf("\t\t\tif (%s * %s + %s > 0.0) {\n", |
@@ -330,6 +346,7 @@ void GLDefault2PtConicalEffect::setData(const GrGLUniformManager& uman, |
INHERITED::setData(uman, drawEffect); |
const Default2PtConicalEffect& data = drawEffect.castEffect<Default2PtConicalEffect>(); |
SkASSERT(data.isDegenerate() == fIsDegenerate); |
+ SkASSERT(data.isFlipped() == fIsFlipped); |
SkScalar centerX1 = data.center(); |
SkScalar radius0 = data.radius(); |
SkScalar diffRadius = data.diffRadius(); |
@@ -365,12 +382,16 @@ GrGLEffect::EffectKey GLDefault2PtConicalEffect::GenKey(const GrDrawEffect& draw |
const GrGLCaps&) { |
enum { |
kIsDegenerate = 1 << kBaseKeyBitCnt, |
+ kIsFlipped = 1 << (kBaseKeyBitCnt + 1), |
}; |
EffectKey key = GenBaseGradientKey(drawEffect); |
if (drawEffect.castEffect<Default2PtConicalEffect>().isDegenerate()) { |
key |= kIsDegenerate; |
} |
+ if (drawEffect.castEffect<Default2PtConicalEffect>().isFlipped()) { |
+ key |= kIsFlipped; |
+ } |
return key; |
} |