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 #include "GrSimpleTextureEffect.h" 9 #include "gl/GrGLEffect.h" 10 #include "gl/GrGLEffectMatrix.h" 11 #include "gl/GrGLSL.h" 12 #include "gl/GrGLTexture.h" 13 #include "GrTBackendEffectFactory.h" 14 #include "GrTexture.h" 15 16 class GrGLSimpleTextureEffect : public GrGLEffect { 17 public: 18 GrGLSimpleTextureEffect(const GrBackendEffectFactory& factory, const GrEffectRef&) 19 : INHERITED (factory) {} 20 21 virtual void emitCode(GrGLShaderBuilder* builder, 22 const GrEffectStage&, 23 EffectKey key, 24 const char* vertexCoords, 25 const char* outputColor, 26 const char* inputColor, 27 const TextureSamplerArray& samplers) SK_OVERRIDE { 28 const char* coordName; 29 GrSLType coordType = fEffectMatrix.emitCode(builder, key, vertexCoords, &coordName); 30 builder->fFSCode.appendf("\t%s = ", outputColor); 31 builder->appendTextureLookupAndModulate(&builder->fFSCode, 32 inputColor, 33 samplers[0], 34 coordName, 35 coordType); 36 builder->fFSCode.append(";\n"); 37 } 38 39 static inline EffectKey GenKey(const GrEffectStage& stage, const GrGLCaps&) { 40 const GrSimpleTextureEffect& ste = GetEffectFromStage<GrSimpleTextureEffect>(stage); 41 return GrGLEffectMatrix::GenKey(ste.getMatrix(), 42 stage.getCoordChangeMatrix(), 43 ste.texture(0)); 44 } 45 46 virtual void setData(const GrGLUniformManager& uman, const GrEffectStage& stage) SK_OVERRIDE { 47 const GrSimpleTextureEffect& ste = GetEffectFromStage<GrSimpleTextureEffect>(stage); 48 fEffectMatrix.setData(uman, ste.getMatrix(), stage.getCoordChangeMatrix(), ste.texture(0)); 49 } 50 51 private: 52 GrGLEffectMatrix fEffectMatrix; 53 typedef GrGLEffect INHERITED; 54 }; 55 56 /////////////////////////////////////////////////////////////////////////////// 57 58 void GrSimpleTextureEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { 59 this->updateConstantColorComponentsForModulation(color, validFlags); 60 } 61 62 const GrBackendEffectFactory& GrSimpleTextureEffect::getFactory() const { 63 return GrTBackendEffectFactory<GrSimpleTextureEffect>::getInstance(); 64 } 65 66 /////////////////////////////////////////////////////////////////////////////// 67 68 GR_DEFINE_EFFECT_TEST(GrSimpleTextureEffect); 69 70 GrEffectRef* GrSimpleTextureEffect::TestCreate(SkRandom* random, 71 GrContext* context, 72 GrTexture* textures[]) { 73 int texIdx = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx : 74 GrEffectUnitTest::kAlphaTextureIdx; 75 const SkMatrix& matrix = GrEffectUnitTest::TestMatrix(random); 76 return GrSimpleTextureEffect::Create(textures[texIdx], matrix); 77 } 78