1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrSingleTextureEffect_DEFINED 9 #define GrSingleTextureEffect_DEFINED 10 11 #include "GrEffect.h" 12 #include "SkMatrix.h" 13 #include "GrCoordTransform.h" 14 15 class GrTexture; 16 17 /** 18 * A base class for effects that draw a single texture with a texture matrix. This effect has no 19 * backend implementations. One must be provided by the subclass. 20 */ 21 class GrSingleTextureEffect : public GrEffect { 22 public: 23 virtual ~GrSingleTextureEffect(); 24 25 protected: 26 /** unfiltered, clamp mode */ 27 GrSingleTextureEffect(GrTexture*, const SkMatrix&, GrCoordSet = kLocal_GrCoordSet); 28 /** clamp mode */ 29 GrSingleTextureEffect(GrTexture*, const SkMatrix&, GrTextureParams::FilterMode filterMode, 30 GrCoordSet = kLocal_GrCoordSet); 31 GrSingleTextureEffect(GrTexture*, 32 const SkMatrix&, 33 const GrTextureParams&, 34 GrCoordSet = kLocal_GrCoordSet); 35 36 /** 37 * Helper for subclass onIsEqual() functions. 38 */ hasSameTextureParamsMatrixAndSourceCoords(const GrSingleTextureEffect & other)39 bool hasSameTextureParamsMatrixAndSourceCoords(const GrSingleTextureEffect& other) const { 40 // We don't have to check the accesses' swizzles because they are inferred from the texture. 41 return fTextureAccess == other.fTextureAccess && 42 fCoordTransform.getMatrix().cheapEqualTo(other.fCoordTransform.getMatrix()) && 43 fCoordTransform.sourceCoords() == other.fCoordTransform.sourceCoords(); 44 } 45 46 /** 47 * Can be used as a helper to implement subclass getConstantColorComponents(). It assumes that 48 * the subclass output color will be a modulation of the input color with a value read from the 49 * texture. 50 */ updateConstantColorComponentsForModulation(GrColor * color,uint32_t * validFlags)51 void updateConstantColorComponentsForModulation(GrColor* color, uint32_t* validFlags) const { 52 if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color) && 53 GrPixelConfigIsOpaque(this->texture(0)->config())) { 54 *validFlags = kA_GrColorComponentFlag; 55 } else { 56 *validFlags = 0; 57 } 58 } 59 60 private: 61 GrCoordTransform fCoordTransform; 62 GrTextureAccess fTextureAccess; 63 64 typedef GrEffect INHERITED; 65 }; 66 67 #endif 68