| Index: src/gpu/effects/GrSimpleTextureEffect.h | 
| =================================================================== | 
| --- src/gpu/effects/GrSimpleTextureEffect.h	(revision 8241) | 
| +++ src/gpu/effects/GrSimpleTextureEffect.h	(working copy) | 
| @@ -14,28 +14,53 @@ | 
|  | 
| /** | 
| * The output color of this effect is a modulation of the input color and a sample from a texture. | 
| - * The coord to sample the texture is determine by a matrix. It allows explicit specification of | 
| - * the filtering and wrap modes (GrTextureParams). | 
| + * It allows explicit specification of the filtering and wrap modes (GrTextureParams). It can use | 
| + * local coords, positions, or a custom vertex attribute as input texture coords. The input coords | 
| + * can have a matrix applied in the VS in both the local and position cases but not with a custom | 
| + * attribute coords at this time. It will add a varying to input interpolate texture coords to the | 
| + * FS. | 
| */ | 
| class GrSimpleTextureEffect : public GrSingleTextureEffect { | 
| public: | 
| /* unfiltered, clamp mode */ | 
| -    static GrEffectRef* Create(GrTexture* tex, const SkMatrix& matrix) { | 
| -        AutoEffectUnref effect(SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix))); | 
| +    static GrEffectRef* Create(GrTexture* tex, | 
| +                               const SkMatrix& matrix, | 
| +                               CoordsType coordsType = kLocal_CoordsType) { | 
| +        GrAssert(kLocal_CoordsType == coordsType || kPosition_CoordsType == coordsType); | 
| +        AutoEffectUnref effect(SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, false, coordsType))); | 
| return CreateEffectRef(effect); | 
| } | 
|  | 
| /* clamp mode */ | 
| -    static GrEffectRef* Create(GrTexture* tex, const SkMatrix& matrix, bool bilerp) { | 
| -        AutoEffectUnref effect(SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, bilerp))); | 
| +    static GrEffectRef* Create(GrTexture* tex, | 
| +                               const SkMatrix& matrix, | 
| +                               bool bilerp, | 
| +                               CoordsType coordsType = kLocal_CoordsType) { | 
| +        GrAssert(kLocal_CoordsType == coordsType || kPosition_CoordsType == coordsType); | 
| +        AutoEffectUnref effect( | 
| +            SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, bilerp, coordsType))); | 
| return CreateEffectRef(effect); | 
| } | 
|  | 
| -    static GrEffectRef* Create(GrTexture* tex, const SkMatrix& matrix, const GrTextureParams& p) { | 
| -        AutoEffectUnref effect(SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, p))); | 
| +    static GrEffectRef* Create(GrTexture* tex, | 
| +                               const SkMatrix& matrix, | 
| +                               const GrTextureParams& p, | 
| +                               CoordsType coordsType = kLocal_CoordsType) { | 
| +        GrAssert(kLocal_CoordsType == coordsType || kPosition_CoordsType == coordsType); | 
| +        AutoEffectUnref effect(SkNEW_ARGS(GrSimpleTextureEffect, (tex, matrix, p, coordsType))); | 
| return CreateEffectRef(effect); | 
| } | 
|  | 
| +    /** Variant that requires the client to install a custom kVec2 vertex attribute that will be | 
| +        the source of the coords. No matrix is allowed in this mode. */ | 
| +    static GrEffectRef* CreateWithCustomCoords(GrTexture* tex, const GrTextureParams& p) { | 
| +        AutoEffectUnref effect(SkNEW_ARGS(GrSimpleTextureEffect, (tex, | 
| +                                                                  SkMatrix::I(), | 
| +                                                                  p, | 
| +                                                                  kCustom_CoordsType))); | 
| +        return CreateEffectRef(effect); | 
| +    } | 
| + | 
| virtual ~GrSimpleTextureEffect() {} | 
|  | 
| static const char* Name() { return "Texture"; } | 
| @@ -47,16 +72,28 @@ | 
| virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; | 
|  | 
| private: | 
| -    GrSimpleTextureEffect(GrTexture* texture, const SkMatrix& matrix) | 
| -        : GrSingleTextureEffect(texture, matrix) {} | 
| -    GrSimpleTextureEffect(GrTexture* texture, const SkMatrix& matrix, bool bilerp) | 
| -        : GrSingleTextureEffect(texture, matrix, bilerp) {} | 
| -    GrSimpleTextureEffect(GrTexture* texture, const SkMatrix& matrix, const GrTextureParams& params) | 
| -        : GrSingleTextureEffect(texture, matrix, params) {} | 
| +    GrSimpleTextureEffect(GrTexture* texture, | 
| +                          const SkMatrix& matrix, | 
| +                          bool bilerp, | 
| +                          CoordsType coordsType) | 
| +        : GrSingleTextureEffect(texture, matrix, bilerp, coordsType) { | 
| +        GrAssert(kLocal_CoordsType == coordsType || kPosition_CoordsType == coordsType); | 
| +    } | 
|  | 
| +    GrSimpleTextureEffect(GrTexture* texture, | 
| +                          const SkMatrix& matrix, | 
| +                          const GrTextureParams& params, | 
| +                          CoordsType coordsType) | 
| +        : GrSingleTextureEffect(texture, matrix, params, coordsType) { | 
| +        if (kCustom_CoordsType == coordsType) { | 
| +            GrAssert(matrix.isIdentity()); | 
| +            this->addVertexAttrib(kVec2f_GrSLType); | 
| +        } | 
| +    } | 
| + | 
| virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE { | 
| const GrSimpleTextureEffect& ste = CastEffect<GrSimpleTextureEffect>(other); | 
| -        return this->hasSameTextureParamsAndMatrix(ste); | 
| +        return this->hasSameTextureParamsMatrixAndCoordsType(ste); | 
| } | 
|  | 
| GR_DECLARE_EFFECT_TEST; | 
|  |