1d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger/* 2d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * Copyright 2013 Google Inc. 3d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * 4d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 5d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * found in the LICENSE file. 6d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger */ 7d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 8d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#ifndef GrSimpleTextureEffect_DEFINED 9d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#define GrSimpleTextureEffect_DEFINED 10d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 11d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#include "GrSingleTextureEffect.h" 12d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 13d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerclass GrGLSimpleTextureEffect; 14d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 15d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger/** 16d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * The output color of this effect is a modulation of the input color and a sample from a texture. 17e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger * It allows explicit specification of the filtering and wrap modes (GrTextureParams). It can use 18e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger * local coords, positions, or a custom vertex attribute as input texture coords. The input coords 19e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger * can have a matrix applied in the VS in both the local and position cases but not with a custom 20e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger * attribute coords at this time. It will add a varying to input interpolate texture coords to the 21e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger * FS. 22d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger */ 23d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerclass GrSimpleTextureEffect : public GrSingleTextureEffect { 24d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerpublic: 25d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger /* unfiltered, clamp mode */ 26e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger static GrEffectRef* Create(GrTexture* tex, 27e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger const SkMatrix& matrix, 280a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrCoordSet coordSet = kLocal_GrCoordSet) { 290a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger AutoEffectUnref effect(SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, GrTextureParams::kNone_FilterMode, coordSet))); 30d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger return CreateEffectRef(effect); 31d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger } 32d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 33d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger /* clamp mode */ 34e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger static GrEffectRef* Create(GrTexture* tex, 35e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger const SkMatrix& matrix, 3658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrTextureParams::FilterMode filterMode, 370a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrCoordSet coordSet = kLocal_GrCoordSet) { 38e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger AutoEffectUnref effect( 390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, filterMode, coordSet))); 40d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger return CreateEffectRef(effect); 41d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger } 42d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 43e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger static GrEffectRef* Create(GrTexture* tex, 44e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger const SkMatrix& matrix, 45e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger const GrTextureParams& p, 460a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrCoordSet coordSet = kLocal_GrCoordSet) { 470a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger AutoEffectUnref effect(SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, p, coordSet))); 48d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger return CreateEffectRef(effect); 49d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger } 50d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 51d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger virtual ~GrSimpleTextureEffect() {} 52d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 53d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger static const char* Name() { return "Texture"; } 54d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 55d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; 56d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 57d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger typedef GrGLSimpleTextureEffect GLEffect; 58d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 59d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 60d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 61d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerprivate: 62e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger GrSimpleTextureEffect(GrTexture* texture, 63e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger const SkMatrix& matrix, 6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrTextureParams::FilterMode filterMode, 650a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrCoordSet coordSet) 660a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger : GrSingleTextureEffect(texture, matrix, filterMode, coordSet) { 67e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger } 68e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger 69e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger GrSimpleTextureEffect(GrTexture* texture, 70e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger const SkMatrix& matrix, 71e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger const GrTextureParams& params, 720a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrCoordSet coordSet) 730a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger : GrSingleTextureEffect(texture, matrix, params, coordSet) { 74e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger } 75d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 76d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE { 77d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger const GrSimpleTextureEffect& ste = CastEffect<GrSimpleTextureEffect>(other); 780a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger return this->hasSameTextureParamsMatrixAndSourceCoords(ste); 79d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger } 80d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 81d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger GR_DECLARE_EFFECT_TEST; 82d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 83d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger typedef GrSingleTextureEffect INHERITED; 84d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger}; 85d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 86d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#endif 87