| 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;
|
|
|