180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 Google Inc.
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef GrSingleTextureEffect_DEFINED
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define GrSingleTextureEffect_DEFINED
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "GrEffect.h"
12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkMatrix.h"
130a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "GrCoordTransform.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerclass GrTexture;
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
18e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger * A base class for effects that draw a single texture with a texture matrix. This effect has no
19e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger * backend implementations. One must be provided by the subclass.
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GrSingleTextureEffect : public GrEffect {
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ~GrSingleTextureEffect();
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
25d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerprotected:
26e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    /** unfiltered, clamp mode */
270a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    GrSingleTextureEffect(GrTexture*, const SkMatrix&, GrCoordSet = kLocal_GrCoordSet);
28e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    /** clamp mode */
29e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    GrSingleTextureEffect(GrTexture*, const SkMatrix&, GrTextureParams::FilterMode filterMode,
300a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                          GrCoordSet = kLocal_GrCoordSet);
31e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    GrSingleTextureEffect(GrTexture*,
32e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger                          const SkMatrix&,
33e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger                          const GrTextureParams&,
340a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                          GrCoordSet = kLocal_GrCoordSet);
35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
36d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    /**
37d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     * Helper for subclass onIsEqual() functions.
38d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     */
390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    bool hasSameTextureParamsMatrixAndSourceCoords(const GrSingleTextureEffect& other) const {
40d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        // We don't have to check the accesses' swizzles because they are inferred from the texture.
410a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        return fTextureAccess == other.fTextureAccess &&
420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger               fCoordTransform.getMatrix().cheapEqualTo(other.fCoordTransform.getMatrix()) &&
430a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger               fCoordTransform.sourceCoords() == other.fCoordTransform.sourceCoords();
44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
46d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    /**
47d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     * Can be used as a helper to implement subclass getConstantColorComponents(). It assumes that
48d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     * the subclass output color will be a modulation of the input color with a value read from the
49d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     * texture.
50d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     */
51d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    void updateConstantColorComponentsForModulation(GrColor* color, uint32_t* validFlags) const {
527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color) &&
53d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            GrPixelConfigIsOpaque(this->texture(0)->config())) {
547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            *validFlags = kA_GrColorComponentFlag;
55d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        } else {
56d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            *validFlags = 0;
57d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        }
58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
610a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    GrCoordTransform fCoordTransform;
620a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    GrTextureAccess  fTextureAccess;
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    typedef GrEffect INHERITED;
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
68