Home | History | Annotate | Download | only in effects
      1 /*
      2  * Copyright 2013 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 GrSimpleTextureEffect_DEFINED
      9 #define GrSimpleTextureEffect_DEFINED
     10 
     11 #include "GrSingleTextureEffect.h"
     12 
     13 class GrGLSimpleTextureEffect;
     14 
     15 /**
     16  * The output color of this effect is a modulation of the input color and a sample from a texture.
     17  * It allows explicit specification of the filtering and wrap modes (GrTextureParams). It can use
     18  * local coords, positions, or a custom vertex attribute as input texture coords. The input coords
     19  * can have a matrix applied in the VS in both the local and position cases but not with a custom
     20  * attribute coords at this time. It will add a varying to input interpolate texture coords to the
     21  * FS.
     22  */
     23 class GrSimpleTextureEffect : public GrSingleTextureEffect {
     24 public:
     25     /* unfiltered, clamp mode */
     26     static GrEffectRef* Create(GrTexture* tex,
     27                                const SkMatrix& matrix,
     28                                GrCoordSet coordSet = kLocal_GrCoordSet) {
     29         AutoEffectUnref effect(SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, GrTextureParams::kNone_FilterMode, coordSet)));
     30         return CreateEffectRef(effect);
     31     }
     32 
     33     /* clamp mode */
     34     static GrEffectRef* Create(GrTexture* tex,
     35                                const SkMatrix& matrix,
     36                                GrTextureParams::FilterMode filterMode,
     37                                GrCoordSet coordSet = kLocal_GrCoordSet) {
     38         AutoEffectUnref effect(
     39             SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, filterMode, coordSet)));
     40         return CreateEffectRef(effect);
     41     }
     42 
     43     static GrEffectRef* Create(GrTexture* tex,
     44                                const SkMatrix& matrix,
     45                                const GrTextureParams& p,
     46                                GrCoordSet coordSet = kLocal_GrCoordSet) {
     47         AutoEffectUnref effect(SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, p, coordSet)));
     48         return CreateEffectRef(effect);
     49     }
     50 
     51     virtual ~GrSimpleTextureEffect() {}
     52 
     53     static const char* Name() { return "Texture"; }
     54 
     55     virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
     56 
     57     typedef GrGLSimpleTextureEffect GLEffect;
     58 
     59     virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
     60 
     61 private:
     62     GrSimpleTextureEffect(GrTexture* texture,
     63                           const SkMatrix& matrix,
     64                           GrTextureParams::FilterMode filterMode,
     65                           GrCoordSet coordSet)
     66         : GrSingleTextureEffect(texture, matrix, filterMode, coordSet) {
     67     }
     68 
     69     GrSimpleTextureEffect(GrTexture* texture,
     70                           const SkMatrix& matrix,
     71                           const GrTextureParams& params,
     72                           GrCoordSet coordSet)
     73         : GrSingleTextureEffect(texture, matrix, params, coordSet) {
     74     }
     75 
     76     virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE {
     77         const GrSimpleTextureEffect& ste = CastEffect<GrSimpleTextureEffect>(other);
     78         return this->hasSameTextureParamsMatrixAndSourceCoords(ste);
     79     }
     80 
     81     GR_DECLARE_EFFECT_TEST;
     82 
     83     typedef GrSingleTextureEffect INHERITED;
     84 };
     85 
     86 #endif
     87