| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2010 Google Inc. | 3 * Copyright 2010 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 | 10 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 : fEffectRef(SkRef(effectRef)) { | 24 : fEffectRef(SkRef(effectRef)) { |
| 25 fCoordChangeMatrixSet = false; | 25 fCoordChangeMatrixSet = false; |
| 26 fVertexAttribIndices[0] = attrIndex0; | 26 fVertexAttribIndices[0] = attrIndex0; |
| 27 fVertexAttribIndices[1] = attrIndex1; | 27 fVertexAttribIndices[1] = attrIndex1; |
| 28 } | 28 } |
| 29 | 29 |
| 30 GrEffectStage(const GrEffectStage& other) { | 30 GrEffectStage(const GrEffectStage& other) { |
| 31 *this = other; | 31 *this = other; |
| 32 } | 32 } |
| 33 | 33 |
| 34 class DeferredStage; | |
| 35 // This constructor balances DeferredStage::saveFrom(). | |
| 36 explicit GrEffectStage(const DeferredStage& deferredStage) { | |
| 37 deferredStage.restoreTo(this); | |
| 38 } | |
| 39 | |
| 40 GrEffectStage& operator= (const GrEffectStage& other) { | 34 GrEffectStage& operator= (const GrEffectStage& other) { |
| 41 fCoordChangeMatrixSet = other.fCoordChangeMatrixSet; | 35 fCoordChangeMatrixSet = other.fCoordChangeMatrixSet; |
| 42 if (other.fCoordChangeMatrixSet) { | 36 if (other.fCoordChangeMatrixSet) { |
| 43 fCoordChangeMatrix = other.fCoordChangeMatrix; | 37 fCoordChangeMatrix = other.fCoordChangeMatrix; |
| 44 } | 38 } |
| 45 fEffectRef.reset(SkRef(other.fEffectRef.get())); | 39 fEffectRef.reset(SkRef(other.fEffectRef.get())); |
| 46 memcpy(fVertexAttribIndices, other.fVertexAttribIndices, sizeof(fVertexA
ttribIndices)); | 40 memcpy(fVertexAttribIndices, other.fVertexAttribIndices, sizeof(fVertexA
ttribIndices)); |
| 47 return *this; | 41 return *this; |
| 48 } | 42 } |
| 49 | 43 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 void restoreCoordChange(const SavedCoordChange& savedCoordChange) { | 108 void restoreCoordChange(const SavedCoordChange& savedCoordChange) { |
| 115 fCoordChangeMatrixSet = savedCoordChange.fCoordChangeMatrixSet; | 109 fCoordChangeMatrixSet = savedCoordChange.fCoordChangeMatrixSet; |
| 116 if (fCoordChangeMatrixSet) { | 110 if (fCoordChangeMatrixSet) { |
| 117 fCoordChangeMatrix = savedCoordChange.fCoordChangeMatrix; | 111 fCoordChangeMatrix = savedCoordChange.fCoordChangeMatrix; |
| 118 } | 112 } |
| 119 SkASSERT(savedCoordChange.fEffectRef.get() == fEffectRef); | 113 SkASSERT(savedCoordChange.fEffectRef.get() == fEffectRef); |
| 120 SkDEBUGCODE(savedCoordChange.fEffectRef.reset(NULL);) | 114 SkDEBUGCODE(savedCoordChange.fEffectRef.reset(NULL);) |
| 121 } | 115 } |
| 122 | 116 |
| 123 /** | 117 /** |
| 124 * Used when storing a deferred GrDrawState. The DeferredStage allows resour
ces owned by its | |
| 125 * GrEffect to be recycled through the cache. | |
| 126 */ | |
| 127 class DeferredStage { | |
| 128 public: | |
| 129 DeferredStage() : fEffect(NULL) { | |
| 130 SkDEBUGCODE(fInitialized = false;) | |
| 131 } | |
| 132 | |
| 133 ~DeferredStage() { | |
| 134 if (NULL != fEffect) { | |
| 135 fEffect->decDeferredRefCounts(); | |
| 136 } | |
| 137 } | |
| 138 | |
| 139 void saveFrom(const GrEffectStage& stage) { | |
| 140 SkASSERT(!fInitialized); | |
| 141 SkASSERT(NULL != stage.fEffectRef.get()); | |
| 142 stage.fEffectRef->get()->incDeferredRefCounts(); | |
| 143 fEffect = stage.fEffectRef->get(); | |
| 144 fCoordChangeMatrixSet = stage.fCoordChangeMatrixSet; | |
| 145 if (fCoordChangeMatrixSet) { | |
| 146 fCoordChangeMatrix = stage.fCoordChangeMatrix; | |
| 147 } | |
| 148 fVertexAttribIndices[0] = stage.fVertexAttribIndices[0]; | |
| 149 fVertexAttribIndices[1] = stage.fVertexAttribIndices[1]; | |
| 150 SkDEBUGCODE(fInitialized = true;) | |
| 151 } | |
| 152 | |
| 153 void restoreTo(GrEffectStage* stage) const { | |
| 154 SkASSERT(fInitialized); | |
| 155 stage->fEffectRef.reset(GrEffect::CreateEffectRef(fEffect)); | |
| 156 stage->fCoordChangeMatrixSet = fCoordChangeMatrixSet; | |
| 157 if (fCoordChangeMatrixSet) { | |
| 158 stage->fCoordChangeMatrix = fCoordChangeMatrix; | |
| 159 } | |
| 160 stage->fVertexAttribIndices[0] = fVertexAttribIndices[0]; | |
| 161 stage->fVertexAttribIndices[1] = fVertexAttribIndices[1]; | |
| 162 } | |
| 163 | |
| 164 bool isEqual(const GrEffectStage& stage, bool ignoreCoordChange) const { | |
| 165 if (fVertexAttribIndices[0] != stage.fVertexAttribIndices[0] || | |
| 166 fVertexAttribIndices[1] != stage.fVertexAttribIndices[1]) { | |
| 167 return false; | |
| 168 } | |
| 169 | |
| 170 if (!(*stage.getEffect())->isEqual(*fEffect)) { | |
| 171 return false; | |
| 172 } | |
| 173 | |
| 174 if (ignoreCoordChange) { | |
| 175 // ignore the coordinate change matrix since there are | |
| 176 // explicit uv coordinates | |
| 177 return true; | |
| 178 } | |
| 179 | |
| 180 if (fCoordChangeMatrixSet != stage.fCoordChangeMatrixSet) { | |
| 181 return false; | |
| 182 } | |
| 183 | |
| 184 if (!fCoordChangeMatrixSet) { | |
| 185 return true; | |
| 186 } | |
| 187 | |
| 188 return fCoordChangeMatrix == stage.fCoordChangeMatrix; | |
| 189 } | |
| 190 | |
| 191 private: | |
| 192 const GrEffect* fEffect; | |
| 193 bool fCoordChangeMatrixSet; | |
| 194 SkMatrix fCoordChangeMatrix; | |
| 195 int fVertexAttribIndices[2]; | |
| 196 SkDEBUGCODE(bool fInitialized;) | |
| 197 }; | |
| 198 | |
| 199 /** | |
| 200 * Gets the matrix representing all changes of coordinate system since the G
rEffect was | 118 * Gets the matrix representing all changes of coordinate system since the G
rEffect was |
| 201 * installed in the stage. | 119 * installed in the stage. |
| 202 */ | 120 */ |
| 203 const SkMatrix& getCoordChangeMatrix() const { | 121 const SkMatrix& getCoordChangeMatrix() const { |
| 204 if (fCoordChangeMatrixSet) { | 122 if (fCoordChangeMatrixSet) { |
| 205 return fCoordChangeMatrix; | 123 return fCoordChangeMatrix; |
| 206 } else { | 124 } else { |
| 207 return SkMatrix::I(); | 125 return SkMatrix::I(); |
| 208 } | 126 } |
| 209 } | 127 } |
| 210 | 128 |
| 211 const GrEffectRef* getEffect() const { return fEffectRef.get(); } | 129 const GrEffectRef* getEffect() const { return fEffectRef.get(); } |
| 212 | 130 |
| 213 const int* getVertexAttribIndices() const { return fVertexAttribIndices; } | 131 const int* getVertexAttribIndices() const { return fVertexAttribIndices; } |
| 214 int getVertexAttribIndexCount() const { return fEffectRef->get()->numVertexA
ttribs(); } | 132 int getVertexAttribIndexCount() const { return fEffectRef->get()->numVertexA
ttribs(); } |
| 215 | 133 |
| 216 private: | 134 private: |
| 217 bool fCoordChangeMatrixSet; | 135 bool fCoordChangeMatrixSet; |
| 218 SkMatrix fCoordChangeMatrix; | 136 SkMatrix fCoordChangeMatrix; |
| 219 SkAutoTUnref<const GrEffectRef> fEffectRef; | 137 SkAutoTUnref<const GrEffectRef> fEffectRef; |
| 220 int fVertexAttribIndices[2]; | 138 int fVertexAttribIndices[2]; |
| 221 }; | 139 }; |
| 222 | 140 |
| 223 #endif | 141 #endif |
| OLD | NEW |