GrDrawEffect.h revision c78188896e28a4ae49e406a7422b345ae177dafe
1 2#ifndef GrDrawEffect_DEFINED 3#define GrDrawEffect_DEFINED 4 5#include "GrEffectStage.h" 6 7/** 8 * This class is used to communicate the particular GrEffect used in a draw to the backend-specific 9 * effect subclass (e.g. GrGLEffect). It is used to by the backend-specific class to generate a 10 * cache key for the effect, generate code on a program cache miss, and to upload uniform values to 11 * the program. 12 * In addition to the effect, it also communicates any changes between the relationship between 13 * the view matrix and local coordinate system since the effect was installed in its GrDrawState. 14 * The typical use case is that sometime after an effect was installed a decision was made to draw 15 * in device coordinates (i.e. use an identity view-matrix). In such a case the GrDrawEffect's 16 * coord-change-matrix would be the inverse of the view matrix that was set when the effect was 17 * installed. GrGLEffectMatrix is a handy class that implements a local coordinate matrix that 18 * automatically accounts for the coord-change matrix. 19 */ 20class GrDrawEffect { 21public: 22 GrDrawEffect(const GrEffectStage& stage, bool explicitLocalCoords) 23 : fEffectStage(&stage) 24 , fExplicitLocalCoords(explicitLocalCoords) { 25 GrAssert(NULL != fEffectStage); 26 GrAssert(NULL != fEffectStage->getEffect()); 27 } 28 const GrEffectRef* effect() const { return fEffectStage->getEffect(); } 29 30 template <typename T> 31 const T& castEffect() const { return *static_cast<const T*>(this->effect()->get()); } 32 33 const SkMatrix& getCoordChangeMatrix() const { 34 if (fExplicitLocalCoords) { 35 return SkMatrix::I(); 36 } else { 37 return fEffectStage->getCoordChangeMatrix(); 38 } 39 } 40 41 bool programHasExplicitLocalCoords() const { return fExplicitLocalCoords; } 42 43 const int* getVertexAttribIndices() const { return fEffectStage->getVertexAttribIndices(); } 44 int getVertexAttribIndexCount() const { return fEffectStage->getVertexAttribIndexCount(); } 45 46private: 47 const GrEffectStage* fEffectStage; 48 bool fExplicitLocalCoords; 49}; 50 51#endif 52