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