1363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
2363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/*
3363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Copyright 2010 Google Inc.
4363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger *
5363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
6363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * found in the LICENSE file.
7363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */
8363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifndef GrEffectStage_DEFINED
12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define GrEffectStage_DEFINED
13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "GrBackendEffectFactory.h"
15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "GrEffect.h"
16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkMatrix.h"
17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "GrTypes.h"
18363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkShader.h"
20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GrEffectStage {
22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic:
2358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    explicit GrEffectStage(const GrEffectRef* effectRef, int attrIndex0 = -1, int attrIndex1 = -1)
2458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    : fEffectRef(SkRef(effectRef)) {
2558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        fCoordChangeMatrixSet = false;
2658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        fVertexAttribIndices[0] = attrIndex0;
2758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        fVertexAttribIndices[1] = attrIndex1;
28363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
29363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
3058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrEffectStage(const GrEffectStage& other) {
3158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        *this = other;
32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
3458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    class DeferredStage;
3558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // This constructor balances DeferredStage::saveFrom().
3658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    explicit GrEffectStage(const DeferredStage& deferredStage) {
3758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        deferredStage.restoreTo(this);
3858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
3958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
4058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrEffectStage& operator= (const GrEffectStage& other) {
4158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        fCoordChangeMatrixSet = other.fCoordChangeMatrixSet;
4258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (other.fCoordChangeMatrixSet) {
4358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            fCoordChangeMatrix = other.fCoordChangeMatrix;
44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        }
4558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        fEffectRef.reset(SkRef(other.fEffectRef.get()));
4658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        memcpy(fVertexAttribIndices, other.fVertexAttribIndices, sizeof(fVertexAttribIndices));
4758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        return *this;
4858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
4958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
5058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    bool operator== (const GrEffectStage& other) const {
510a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkASSERT(NULL != fEffectRef.get());
520a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkASSERT(NULL != other.fEffectRef.get());
53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
54d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        if (!(*this->getEffect())->isEqual(*other.getEffect())) {
55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            return false;
56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        }
57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (fCoordChangeMatrixSet != other.fCoordChangeMatrixSet) {
597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            return false;
607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (!fCoordChangeMatrixSet) {
637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            return true;
647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        return fCoordChangeMatrix == other.fCoordChangeMatrix;
67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
6958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    bool operator!= (const GrEffectStage& s) const { return !(*this == s); }
70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    /**
72363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger     * This is called when the coordinate system in which the geometry is specified will change.
73363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger     *
74e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     * @param matrix    The transformation from the old coord system in which geometry is specified
75e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *                  to the new one from which it will actually be drawn.
76363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger     */
777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void localCoordChange(const SkMatrix& matrix) {
787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (fCoordChangeMatrixSet) {
797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fCoordChangeMatrix.preConcat(matrix);
807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        } else {
817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fCoordChangeMatrixSet = true;
827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fCoordChangeMatrix = matrix;
837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
85363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
86363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    class SavedCoordChange {
87363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    private:
887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        bool fCoordChangeMatrixSet;
89363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        SkMatrix fCoordChangeMatrix;
900a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkDEBUGCODE(mutable SkAutoTUnref<const GrEffectRef> fEffectRef;)
91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
92363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        friend class GrEffectStage;
93363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    };
94363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
95363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    /**
96363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger     * This gets the current coordinate system change. It is the accumulation of
97e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     * localCoordChange calls since the effect was installed. It is used when then caller
98363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger     * wants to temporarily change the source geometry coord system, draw something, and then
99363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger     * restore the previous coord system (e.g. temporarily draw in device coords).
100363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger     */
101363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    void saveCoordChange(SavedCoordChange* savedCoordChange) const {
1027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        savedCoordChange->fCoordChangeMatrixSet = fCoordChangeMatrixSet;
1037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (fCoordChangeMatrixSet) {
1047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            savedCoordChange->fCoordChangeMatrix = fCoordChangeMatrix;
1057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1060a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkASSERT(NULL == savedCoordChange->fEffectRef.get());
1070a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkDEBUGCODE(SkRef(fEffectRef.get());)
1080a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkDEBUGCODE(savedCoordChange->fEffectRef.reset(fEffectRef.get());)
109363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
110363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
111363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    /**
112363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger     * This balances the saveCoordChange call.
113363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger     */
114363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    void restoreCoordChange(const SavedCoordChange& savedCoordChange) {
1157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fCoordChangeMatrixSet = savedCoordChange.fCoordChangeMatrixSet;
1167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (fCoordChangeMatrixSet) {
1177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fCoordChangeMatrix = savedCoordChange.fCoordChangeMatrix;
1187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1190a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkASSERT(savedCoordChange.fEffectRef.get() == fEffectRef);
1200a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkDEBUGCODE(savedCoordChange.fEffectRef.reset(NULL);)
121363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
122363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
123363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    /**
124d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     * Used when storing a deferred GrDrawState. The DeferredStage allows resources owned by its
125d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     * GrEffect to be recycled through the cache.
126d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     */
127d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    class DeferredStage {
128d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    public:
129d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        DeferredStage() : fEffect(NULL) {
130d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            SkDEBUGCODE(fInitialized = false;)
131d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        }
132d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
133d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        ~DeferredStage() {
134d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            if (NULL != fEffect) {
135d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger                fEffect->decDeferredRefCounts();
136d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            }
137d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        }
138d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
139d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        void saveFrom(const GrEffectStage& stage) {
1400a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkASSERT(!fInitialized);
1410a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkASSERT(NULL != stage.fEffectRef.get());
14258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            stage.fEffectRef->get()->incDeferredRefCounts();
14358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            fEffect = stage.fEffectRef->get();
14458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            fCoordChangeMatrixSet = stage.fCoordChangeMatrixSet;
14558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            if (fCoordChangeMatrixSet) {
14658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                fCoordChangeMatrix = stage.fCoordChangeMatrix;
147d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            }
14858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            fVertexAttribIndices[0] = stage.fVertexAttribIndices[0];
14958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            fVertexAttribIndices[1] = stage.fVertexAttribIndices[1];
150d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            SkDEBUGCODE(fInitialized = true;)
151d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        }
152d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
15358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        void restoreTo(GrEffectStage* stage) const {
1540a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkASSERT(fInitialized);
15558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            stage->fEffectRef.reset(GrEffect::CreateEffectRef(fEffect));
15658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            stage->fCoordChangeMatrixSet = fCoordChangeMatrixSet;
15758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            if (fCoordChangeMatrixSet) {
15858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                stage->fCoordChangeMatrix = fCoordChangeMatrix;
159d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            }
16058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            stage->fVertexAttribIndices[0] = fVertexAttribIndices[0];
16158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            stage->fVertexAttribIndices[1] = fVertexAttribIndices[1];
162d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        }
163d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
16458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        bool isEqual(const GrEffectStage& stage, bool ignoreCoordChange) const {
16558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            if (fVertexAttribIndices[0] != stage.fVertexAttribIndices[0] ||
16658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                fVertexAttribIndices[1] != stage.fVertexAttribIndices[1]) {
167d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger                return false;
168d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            }
169d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
17058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            if (!(*stage.getEffect())->isEqual(*fEffect)) {
171096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                return false;
172096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            }
173096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
17458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            if (ignoreCoordChange) {
17558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                // ignore the coordinate change matrix since there are
17658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                // explicit uv coordinates
17758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                return true;
178d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            }
179d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
1807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            if (fCoordChangeMatrixSet != stage.fCoordChangeMatrixSet) {
1817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                return false;
1827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            }
1837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            if (!fCoordChangeMatrixSet) {
1857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                return true;
1867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            }
1877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
188d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            return fCoordChangeMatrix == stage.fCoordChangeMatrix;
189d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        }
190d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
191d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    private:
192d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        const GrEffect*               fEffect;
1937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        bool                          fCoordChangeMatrixSet;
194d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        SkMatrix                      fCoordChangeMatrix;
195096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        int                           fVertexAttribIndices[2];
196d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        SkDEBUGCODE(bool fInitialized;)
197d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    };
198d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
199d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    /**
200363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger     * Gets the matrix representing all changes of coordinate system since the GrEffect was
201363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger     * installed in the stage.
202363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger     */
2037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    const SkMatrix& getCoordChangeMatrix() const {
2047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (fCoordChangeMatrixSet) {
2057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            return fCoordChangeMatrix;
2067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        } else {
2077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            return SkMatrix::I();
2087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
2097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
210363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
21158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    const GrEffectRef* getEffect() const { return fEffectRef.get(); }
212363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
213096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    const int* getVertexAttribIndices() const { return fVertexAttribIndices; }
214096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    int getVertexAttribIndexCount() const { return fEffectRef->get()->numVertexAttribs(); }
215096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
216363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate:
21758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    bool                                fCoordChangeMatrixSet;
21858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkMatrix                            fCoordChangeMatrix;
21958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkAutoTUnref<const GrEffectRef>     fEffectRef;
22058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    int                                 fVertexAttribIndices[2];
221363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger};
222363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
223363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif
224