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. 18 */ 19 class GrDrawEffect { 20 public: 21 GrDrawEffect(const GrEffectStage& stage, bool explicitLocalCoords) 22 : fEffectStage(&stage) 23 , fExplicitLocalCoords(explicitLocalCoords) { 24 SkASSERT(NULL != fEffectStage); 25 SkASSERT(NULL != fEffectStage->getEffect()); 26 } 27 const GrEffectRef* effect() const { return fEffectStage->getEffect(); } 28 29 template <typename T> 30 const T& castEffect() const { return *static_cast<const T*>(this->effect()->get()); } 31 32 const SkMatrix& getCoordChangeMatrix() const { 33 if (fExplicitLocalCoords) { 34 return SkMatrix::I(); 35 } else { 36 return fEffectStage->getCoordChangeMatrix(); 37 } 38 } 39 40 bool programHasExplicitLocalCoords() const { return fExplicitLocalCoords; } 41 42 const int* getVertexAttribIndices() const { return fEffectStage->getVertexAttribIndices(); } 43 int getVertexAttribIndexCount() const { return fEffectStage->getVertexAttribIndexCount(); } 44 45 private: 46 const GrEffectStage* fEffectStage; 47 bool fExplicitLocalCoords; 48 }; 49 50 #endif 51