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                                CoordsType coordsType = kLocal_CoordsType) {
     29         GrAssert(kLocal_CoordsType == coordsType || kPosition_CoordsType == coordsType);
     30         AutoEffectUnref effect(SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, GrTextureParams::kNone_FilterMode, coordsType)));
     31         return CreateEffectRef(effect);
     32     }
     33 
     34     /* clamp mode */
     35     static GrEffectRef* Create(GrTexture* tex,
     36                                const SkMatrix& matrix,
     37                                GrTextureParams::FilterMode filterMode,
     38                                CoordsType coordsType = kLocal_CoordsType) {
     39         GrAssert(kLocal_CoordsType == coordsType || kPosition_CoordsType == coordsType);
     40         AutoEffectUnref effect(
     41             SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, filterMode, coordsType)));
     42         return CreateEffectRef(effect);
     43     }
     44 
     45     static GrEffectRef* Create(GrTexture* tex,
     46                                const SkMatrix& matrix,
     47                                const GrTextureParams& p,
     48                                CoordsType coordsType = kLocal_CoordsType) {
     49         GrAssert(kLocal_CoordsType == coordsType || kPosition_CoordsType == coordsType);
     50         AutoEffectUnref effect(SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, p, coordsType)));
     51         return CreateEffectRef(effect);
     52     }
     53 
     54     /** Variant that requires the client to install a custom kVec2 vertex attribute that will be
     55         the source of the coords. No matrix is allowed in this mode. */
     56     static GrEffectRef* CreateWithCustomCoords(GrTexture* tex, const GrTextureParams& p) {
     57         AutoEffectUnref effect(SkNEW_ARGS(GrSimpleTextureEffect, (tex,
     58                                                                   SkMatrix::I(),
     59                                                                   p,
     60                                                                   kCustom_CoordsType)));
     61         return CreateEffectRef(effect);
     62     }
     63 
     64     virtual ~GrSimpleTextureEffect() {}
     65 
     66     static const char* Name() { return "Texture"; }
     67 
     68     virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
     69 
     70     typedef GrGLSimpleTextureEffect GLEffect;
     71 
     72     virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
     73 
     74 private:
     75     GrSimpleTextureEffect(GrTexture* texture,
     76                           const SkMatrix& matrix,
     77                           GrTextureParams::FilterMode filterMode,
     78                           CoordsType coordsType)
     79         : GrSingleTextureEffect(texture, matrix, filterMode, coordsType) {
     80         GrAssert(kLocal_CoordsType == coordsType || kPosition_CoordsType == coordsType);
     81     }
     82 
     83     GrSimpleTextureEffect(GrTexture* texture,
     84                           const SkMatrix& matrix,
     85                           const GrTextureParams& params,
     86                           CoordsType coordsType)
     87         : GrSingleTextureEffect(texture, matrix, params, coordsType) {
     88         if (kCustom_CoordsType == coordsType) {
     89             GrAssert(matrix.isIdentity());
     90             this->addVertexAttrib(kVec2f_GrSLType);
     91         }
     92     }
     93 
     94     virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE {
     95         const GrSimpleTextureEffect& ste = CastEffect<GrSimpleTextureEffect>(other);
     96         return this->hasSameTextureParamsMatrixAndCoordsType(ste);
     97     }
     98 
     99     GR_DECLARE_EFFECT_TEST;
    100 
    101     typedef GrSingleTextureEffect INHERITED;
    102 };
    103 
    104 #endif
    105