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