1/*
2 * Copyright 2012 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 GrSingleTextureEffect_DEFINED
9#define GrSingleTextureEffect_DEFINED
10
11#include "GrEffect.h"
12#include "SkMatrix.h"
13#include "GrCoordTransform.h"
14
15class GrTexture;
16
17/**
18 * A base class for effects that draw a single texture with a texture matrix. This effect has no
19 * backend implementations. One must be provided by the subclass.
20 */
21class GrSingleTextureEffect : public GrEffect {
22public:
23    virtual ~GrSingleTextureEffect();
24
25protected:
26    /** unfiltered, clamp mode */
27    GrSingleTextureEffect(GrTexture*, const SkMatrix&, GrCoordSet = kLocal_GrCoordSet);
28    /** clamp mode */
29    GrSingleTextureEffect(GrTexture*, const SkMatrix&, GrTextureParams::FilterMode filterMode,
30                          GrCoordSet = kLocal_GrCoordSet);
31    GrSingleTextureEffect(GrTexture*,
32                          const SkMatrix&,
33                          const GrTextureParams&,
34                          GrCoordSet = kLocal_GrCoordSet);
35
36    /**
37     * Helper for subclass onIsEqual() functions.
38     */
39    bool hasSameTextureParamsMatrixAndSourceCoords(const GrSingleTextureEffect& other) const {
40        // We don't have to check the accesses' swizzles because they are inferred from the texture.
41        return fTextureAccess == other.fTextureAccess &&
42               fCoordTransform.getMatrix().cheapEqualTo(other.fCoordTransform.getMatrix()) &&
43               fCoordTransform.sourceCoords() == other.fCoordTransform.sourceCoords();
44    }
45
46    /**
47     * Can be used as a helper to implement subclass getConstantColorComponents(). It assumes that
48     * the subclass output color will be a modulation of the input color with a value read from the
49     * texture.
50     */
51    void updateConstantColorComponentsForModulation(GrColor* color, uint32_t* validFlags) const {
52        if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color) &&
53            GrPixelConfigIsOpaque(this->texture(0)->config())) {
54            *validFlags = kA_GrColorComponentFlag;
55        } else {
56            *validFlags = 0;
57        }
58    }
59
60private:
61    GrCoordTransform fCoordTransform;
62    GrTextureAccess  fTextureAccess;
63
64    typedef GrEffect INHERITED;
65};
66
67#endif
68