Index: src/effects/gradients/SkGradientShaderPriv.h |
diff --git a/src/effects/gradients/SkGradientShaderPriv.h b/src/effects/gradients/SkGradientShaderPriv.h |
index 8e9360429fea3c0fac6146a1dc8d0123ba3b90d5..451bd2dfee6ec64277554f3c47a3e8aac89d155b 100644 |
--- a/src/effects/gradients/SkGradientShaderPriv.h |
+++ b/src/effects/gradients/SkGradientShaderPriv.h |
@@ -250,6 +250,27 @@ public: |
const SkMatrix& getMatrix() const { return fMatrix;} |
virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; |
+ |
+ enum ColorType { |
+ kTwo_ColorType, |
+ kThree_ColorType, |
+ kTexture_ColorType |
+ }; |
+ |
+ ColorType getColorType() const { return fColorType; } |
+ |
+ enum PremulType { |
+ kBeforeInterp_PremulType, |
+ kAfterInterp_PremulType, |
+ }; |
+ |
+ PremulType getPremulType() const { return fPremulType; } |
+ |
+ const SkColor* getColors(int pos) const { |
+ SkASSERT(fColorType != kTexture_ColorType); |
+ SkASSERT((pos-1) <= fColorType); |
+ return &fColors[pos]; |
+ } |
protected: |
@@ -270,13 +291,20 @@ protected: |
private: |
+ enum { |
+ kMaxAnalyticColors = 3 // if more colors use texture |
+ }; |
+ |
GrTextureAccess fTextureAccess; |
SkScalar fYCoord; |
GrTextureStripAtlas* fAtlas; |
int fRow; |
SkMatrix fMatrix; |
bool fIsOpaque; |
- |
+ ColorType fColorType; |
+ SkColor fColors[kMaxAnalyticColors]; |
+ PremulType fPremulType; // This only changes behavior for two and three color special cases. |
+ // It is already baked into to the table for texture gradients. |
typedef GrEffect INHERITED; |
}; |
@@ -299,13 +327,42 @@ protected: |
enum { |
kMatrixKeyBitCnt = GrGLEffectMatrix::kKeyBits, |
kMatrixKeyMask = (1 << kMatrixKeyBitCnt) - 1, |
+ |
+ kPremulTypeKeyBitCnt = 1, |
+ kPremulTypeMask = 1 << kMatrixKeyBitCnt, |
+ kPremulBeforeInterpKey = kPremulTypeMask, |
+ |
+ kTwoColorKey = 2 << (kMatrixKeyBitCnt + kPremulTypeKeyBitCnt), |
+ kThreeColorKey = 3 << (kMatrixKeyBitCnt + kPremulTypeKeyBitCnt), |
+ kColorKeyMask = kTwoColorKey | kThreeColorKey, |
+ kColorKeyBitCnt = 2, |
+ |
+ // Subclasses must shift any key bits they produce up by this amount |
+ // and combine with the result of GenBaseGradientKey. |
+ kBaseKeyBitCnt = (kMatrixKeyBitCnt + kPremulTypeKeyBitCnt + kColorKeyBitCnt) |
}; |
+ static GrGradientEffect::ColorType ColorTypeFromKey(EffectKey key){ |
+ if (kTwoColorKey == (key & kColorKeyMask)) { |
+ return GrGradientEffect::kTwo_ColorType; |
+ } else if (kThreeColorKey == (key & kColorKeyMask)) { |
+ return GrGradientEffect::kThree_ColorType; |
+ } else {return GrGradientEffect::kTexture_ColorType;} |
+ } |
+ |
+ static GrGradientEffect::PremulType PremulTypeFromKey(EffectKey key){ |
+ if (kPremulBeforeInterpKey == (key & kPremulTypeMask)) { |
+ return GrGradientEffect::kBeforeInterp_PremulType; |
+ } else { |
+ return GrGradientEffect::kAfterInterp_PremulType; |
+ } |
+ } |
+ |
/** |
- * Subclasses must call this. It will return a value restricted to the lower kMatrixKeyBitCnt |
+ * Subclasses must call this. It will return a value restricted to the lower kBaseKeyBitCnt |
* bits. |
*/ |
- static EffectKey GenMatrixKey(const GrDrawEffect&); |
+ static EffectKey GenBaseGradientKey(const GrDrawEffect&); |
/** |
* Inserts code to implement the GrGradientEffect's matrix. This should be called before a |
@@ -323,22 +380,27 @@ protected: |
// Emits the uniform used as the y-coord to texture samples in derived classes. Subclasses |
// should call this method from their emitCode(). |
- void emitYCoordUniform(GrGLShaderBuilder* builder); |
+ void emitUniforms(GrGLShaderBuilder* builder, EffectKey key); |
+ |
- // emit code that gets a fragment's color from an expression for t; for now this always uses the |
- // texture, but for simpler cases we'll be able to lerp. Subclasses should call this method from |
- // their emitCode(). |
- void emitColorLookup(GrGLShaderBuilder* builder, |
- const char* gradientTValue, |
- const char* outputColor, |
- const char* inputColor, |
- const GrGLShaderBuilder::TextureSampler&); |
+ // emit code that gets a fragment's color from an expression for t; Has branches for 3 separate |
+ // control flows inside -- 2 color gradients, 3 color symmetric gradients (both using |
+ // native GLSL mix), and 4+ color gradients that use the traditional texture lookup. |
+ void emitColor(GrGLShaderBuilder* builder, |
+ const char* gradientTValue, |
+ EffectKey key, |
+ const char* outputColor, |
+ const char* inputColor, |
+ const GrGLShaderBuilder::TextureSamplerArray& samplers); |
private: |
static const GrEffect::CoordsType kCoordsType = GrEffect::kLocal_CoordsType; |
SkScalar fCachedYCoord; |
GrGLUniformManager::UniformHandle fFSYUni; |
+ GrGLUniformManager::UniformHandle fColorStartUni; |
+ GrGLUniformManager::UniformHandle fColorMidUni; |
+ GrGLUniformManager::UniformHandle fColorEndUni; |
GrGLEffectMatrix fEffectMatrix; |
typedef GrGLEffect INHERITED; |