| 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 |
| 11 #ifndef GrEffectStage_DEFINED | 11 #ifndef GrEffectStage_DEFINED |
| 12 #define GrEffectStage_DEFINED | 12 #define GrEffectStage_DEFINED |
| 13 | 13 |
| 14 #include "GrBackendEffectFactory.h" | 14 #include "GrBackendEffectFactory.h" |
| 15 #include "GrEffect.h" | 15 #include "GrEffect.h" |
| 16 #include "SkMatrix.h" | 16 #include "SkMatrix.h" |
| 17 #include "GrTypes.h" | 17 #include "GrTypes.h" |
| 18 | 18 |
| 19 #include "SkShader.h" | 19 #include "SkShader.h" |
| 20 | 20 |
| 21 class GrEffectStage { | 21 class GrEffectStage { |
| 22 public: | 22 public: |
| 23 GrEffectStage() | 23 GrEffectStage() { |
| 24 : fEffectRef (NULL) { | 24 fCoordChangeMatrixSet = false; |
| 25 GR_DEBUGCODE(fSavedCoordChangeCnt = 0;) | 25 fVertexAttribIndices[0] = -1; |
| 26 fVertexAttribIndices[1] = -1; |
| 26 } | 27 } |
| 27 | 28 |
| 28 ~GrEffectStage() { | 29 explicit GrEffectStage(const GrEffectRef* effectRef, int attrIndex0 = -1, in
t attrIndex1 = -1) |
| 29 GrSafeUnref(fEffectRef); | 30 : fEffectRef(SkSafeRef(effectRef)) { |
| 30 GrAssert(0 == fSavedCoordChangeCnt); | 31 fCoordChangeMatrixSet = false; |
| 32 fVertexAttribIndices[0] = attrIndex0; |
| 33 fVertexAttribIndices[1] = attrIndex1; |
| 31 } | 34 } |
| 32 | 35 |
| 33 bool operator ==(const GrEffectStage& other) const { | 36 GrEffectStage(const GrEffectStage& other) { |
| 37 *this = other; |
| 38 } |
| 39 |
| 40 GrEffectStage& operator= (const GrEffectStage& other) { |
| 41 fCoordChangeMatrixSet = other.fCoordChangeMatrixSet; |
| 42 if (other.fCoordChangeMatrixSet) { |
| 43 fCoordChangeMatrix = other.fCoordChangeMatrix; |
| 44 } |
| 45 fEffectRef.reset(SkSafeRef(other.fEffectRef.get())); |
| 46 memcpy(fVertexAttribIndices, other.fVertexAttribIndices, sizeof(fVertexA
ttribIndices)); |
| 47 return *this; |
| 48 } |
| 49 |
| 50 bool operator== (const GrEffectStage& other) const { |
| 34 // first handle cases where one or the other has no effect | 51 // first handle cases where one or the other has no effect |
| 35 if (NULL == fEffectRef) { | 52 if (NULL == fEffectRef.get()) { |
| 36 return NULL == other.fEffectRef; | 53 return NULL == other.fEffectRef.get(); |
| 37 } else if (NULL == other.fEffectRef) { | 54 } else if (NULL == other.fEffectRef.get()) { |
| 38 return false; | 55 return false; |
| 39 } | 56 } |
| 40 | 57 |
| 41 if (!(*this->getEffect())->isEqual(*other.getEffect())) { | 58 if (!(*this->getEffect())->isEqual(*other.getEffect())) { |
| 42 return false; | 59 return false; |
| 43 } | 60 } |
| 44 | 61 |
| 45 if (fCoordChangeMatrixSet != other.fCoordChangeMatrixSet) { | 62 if (fCoordChangeMatrixSet != other.fCoordChangeMatrixSet) { |
| 46 return false; | 63 return false; |
| 47 } | 64 } |
| 48 | 65 |
| 49 if (!fCoordChangeMatrixSet) { | 66 if (!fCoordChangeMatrixSet) { |
| 50 return true; | 67 return true; |
| 51 } | 68 } |
| 52 | 69 |
| 53 return fCoordChangeMatrix == other.fCoordChangeMatrix; | 70 return fCoordChangeMatrix == other.fCoordChangeMatrix; |
| 54 } | 71 } |
| 55 | 72 |
| 56 bool operator!= (const GrEffectStage& s) const { return !(*this == s); } | 73 bool operator!= (const GrEffectStage& s) const { return !(*this == s); } |
| 57 | 74 |
| 58 GrEffectStage& operator= (const GrEffectStage& other) { | |
| 59 GrSafeAssign(fEffectRef, other.fEffectRef); | |
| 60 fCoordChangeMatrixSet = other.fCoordChangeMatrixSet; | |
| 61 if (NULL != fEffectRef && fCoordChangeMatrixSet) { | |
| 62 fCoordChangeMatrix = other.fCoordChangeMatrix; | |
| 63 } | |
| 64 return *this; | |
| 65 } | |
| 66 | |
| 67 /** | 75 /** |
| 68 * This is called when the coordinate system in which the geometry is specif
ied will change. | 76 * This is called when the coordinate system in which the geometry is specif
ied will change. |
| 69 * | 77 * |
| 70 * @param matrix The transformation from the old coord system in which ge
ometry is specified | 78 * @param matrix The transformation from the old coord system in which ge
ometry is specified |
| 71 * to the new one from which it will actually be drawn. | 79 * to the new one from which it will actually be drawn. |
| 72 */ | 80 */ |
| 73 void localCoordChange(const SkMatrix& matrix) { | 81 void localCoordChange(const SkMatrix& matrix) { |
| 74 if (fCoordChangeMatrixSet) { | 82 if (fCoordChangeMatrixSet) { |
| 75 fCoordChangeMatrix.preConcat(matrix); | 83 fCoordChangeMatrix.preConcat(matrix); |
| 76 } else { | 84 } else { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 93 * localCoordChange calls since the effect was installed. It is used when th
en caller | 101 * localCoordChange calls since the effect was installed. It is used when th
en caller |
| 94 * wants to temporarily change the source geometry coord system, draw someth
ing, and then | 102 * wants to temporarily change the source geometry coord system, draw someth
ing, and then |
| 95 * restore the previous coord system (e.g. temporarily draw in device coords
). | 103 * restore the previous coord system (e.g. temporarily draw in device coords
). |
| 96 */ | 104 */ |
| 97 void saveCoordChange(SavedCoordChange* savedCoordChange) const { | 105 void saveCoordChange(SavedCoordChange* savedCoordChange) const { |
| 98 savedCoordChange->fCoordChangeMatrixSet = fCoordChangeMatrixSet; | 106 savedCoordChange->fCoordChangeMatrixSet = fCoordChangeMatrixSet; |
| 99 if (fCoordChangeMatrixSet) { | 107 if (fCoordChangeMatrixSet) { |
| 100 savedCoordChange->fCoordChangeMatrix = fCoordChangeMatrix; | 108 savedCoordChange->fCoordChangeMatrix = fCoordChangeMatrix; |
| 101 } | 109 } |
| 102 GrAssert(NULL == savedCoordChange->fEffectRef.get()); | 110 GrAssert(NULL == savedCoordChange->fEffectRef.get()); |
| 103 GR_DEBUGCODE(GrSafeRef(fEffectRef);) | 111 GR_DEBUGCODE(GrSafeRef(fEffectRef.get());) |
| 104 GR_DEBUGCODE(savedCoordChange->fEffectRef.reset(fEffectRef);) | 112 GR_DEBUGCODE(savedCoordChange->fEffectRef.reset(fEffectRef.get());) |
| 105 GR_DEBUGCODE(++fSavedCoordChangeCnt); | |
| 106 } | 113 } |
| 107 | 114 |
| 108 /** | 115 /** |
| 109 * This balances the saveCoordChange call. | 116 * This balances the saveCoordChange call. |
| 110 */ | 117 */ |
| 111 void restoreCoordChange(const SavedCoordChange& savedCoordChange) { | 118 void restoreCoordChange(const SavedCoordChange& savedCoordChange) { |
| 112 fCoordChangeMatrixSet = savedCoordChange.fCoordChangeMatrixSet; | 119 fCoordChangeMatrixSet = savedCoordChange.fCoordChangeMatrixSet; |
| 113 if (fCoordChangeMatrixSet) { | 120 if (fCoordChangeMatrixSet) { |
| 114 fCoordChangeMatrix = savedCoordChange.fCoordChangeMatrix; | 121 fCoordChangeMatrix = savedCoordChange.fCoordChangeMatrix; |
| 115 } | 122 } |
| 116 GrAssert(savedCoordChange.fEffectRef.get() == fEffectRef); | 123 GrAssert(savedCoordChange.fEffectRef.get() == fEffectRef); |
| 117 GR_DEBUGCODE(--fSavedCoordChangeCnt); | |
| 118 GR_DEBUGCODE(savedCoordChange.fEffectRef.reset(NULL);) | 124 GR_DEBUGCODE(savedCoordChange.fEffectRef.reset(NULL);) |
| 119 } | 125 } |
| 120 | 126 |
| 121 /** | 127 /** |
| 122 * Used when storing a deferred GrDrawState. The DeferredStage allows resour
ces owned by its | 128 * Used when storing a deferred GrDrawState. The DeferredStage allows resour
ces owned by its |
| 123 * GrEffect to be recycled through the cache. | 129 * GrEffect to be recycled through the cache. |
| 124 */ | 130 */ |
| 125 class DeferredStage { | 131 class DeferredStage { |
| 126 public: | 132 public: |
| 127 DeferredStage() : fEffect(NULL) { | 133 DeferredStage() : fEffect(NULL) { |
| 128 SkDEBUGCODE(fInitialized = false;) | 134 SkDEBUGCODE(fInitialized = false;) |
| 129 } | 135 } |
| 130 | 136 |
| 131 ~DeferredStage() { | 137 ~DeferredStage() { |
| 132 if (NULL != fEffect) { | 138 if (NULL != fEffect) { |
| 133 fEffect->decDeferredRefCounts(); | 139 fEffect->decDeferredRefCounts(); |
| 134 } | 140 } |
| 135 } | 141 } |
| 136 | 142 |
| 137 void saveFrom(const GrEffectStage& stage) { | 143 void saveFrom(const GrEffectStage& stage) { |
| 138 GrAssert(!fInitialized); | 144 GrAssert(!fInitialized); |
| 139 if (NULL != stage.fEffectRef) { | 145 if (NULL != stage.fEffectRef.get()) { |
| 140 stage.fEffectRef->get()->incDeferredRefCounts(); | 146 stage.fEffectRef->get()->incDeferredRefCounts(); |
| 141 fEffect = stage.fEffectRef->get(); | 147 fEffect = stage.fEffectRef->get(); |
| 142 fCoordChangeMatrixSet = stage.fCoordChangeMatrixSet; | 148 fCoordChangeMatrixSet = stage.fCoordChangeMatrixSet; |
| 143 if (fCoordChangeMatrixSet) { | 149 if (fCoordChangeMatrixSet) { |
| 144 fCoordChangeMatrix = stage.fCoordChangeMatrix; | 150 fCoordChangeMatrix = stage.fCoordChangeMatrix; |
| 145 } | 151 } |
| 146 fVertexAttribIndices[0] = stage.fVertexAttribIndices[0]; | 152 fVertexAttribIndices[0] = stage.fVertexAttribIndices[0]; |
| 147 fVertexAttribIndices[1] = stage.fVertexAttribIndices[1]; | 153 fVertexAttribIndices[1] = stage.fVertexAttribIndices[1]; |
| 148 } | 154 } |
| 149 SkDEBUGCODE(fInitialized = true;) | 155 SkDEBUGCODE(fInitialized = true;) |
| 150 } | 156 } |
| 151 | 157 |
| 152 void restoreTo(GrEffectStage* stage) { | 158 void restoreTo(GrEffectStage* stage) { |
| 153 GrAssert(fInitialized); | 159 GrAssert(fInitialized); |
| 154 const GrEffectRef* oldEffectRef = stage->fEffectRef; | |
| 155 if (NULL != fEffect) { | 160 if (NULL != fEffect) { |
| 156 stage->fEffectRef = GrEffect::CreateEffectRef(fEffect); | 161 stage->fEffectRef.reset(GrEffect::CreateEffectRef(fEffect)); |
| 157 stage->fCoordChangeMatrixSet = fCoordChangeMatrixSet; | 162 stage->fCoordChangeMatrixSet = fCoordChangeMatrixSet; |
| 158 if (fCoordChangeMatrixSet) { | 163 if (fCoordChangeMatrixSet) { |
| 159 stage->fCoordChangeMatrix = fCoordChangeMatrix; | 164 stage->fCoordChangeMatrix = fCoordChangeMatrix; |
| 160 } | 165 } |
| 161 stage->fVertexAttribIndices[0] = fVertexAttribIndices[0]; | 166 stage->fVertexAttribIndices[0] = fVertexAttribIndices[0]; |
| 162 stage->fVertexAttribIndices[1] = fVertexAttribIndices[1]; | 167 stage->fVertexAttribIndices[1] = fVertexAttribIndices[1]; |
| 163 } else { | 168 } else { |
| 164 stage->fEffectRef = NULL; | 169 stage->fEffectRef.reset(NULL); |
| 165 } | 170 } |
| 166 SkSafeUnref(oldEffectRef); | |
| 167 } | 171 } |
| 168 | 172 |
| 169 bool isEqual(const GrEffectStage& stage, bool ignoreCoordChange) const { | 173 bool isEqual(const GrEffectStage& stage, bool ignoreCoordChange) const { |
| 170 if (NULL == stage.fEffectRef) { | 174 if (NULL == stage.fEffectRef.get()) { |
| 171 return NULL == fEffect; | 175 return NULL == fEffect; |
| 172 } else if (NULL == fEffect) { | 176 } else if (NULL == fEffect) { |
| 173 return false; | 177 return false; |
| 174 } | 178 } |
| 175 | 179 |
| 176 if (fVertexAttribIndices[0] != stage.fVertexAttribIndices[0] | 180 if (fVertexAttribIndices[0] != stage.fVertexAttribIndices[0] |
| 177 || fVertexAttribIndices[1] != stage.fVertexAttribIndices[1]) { | 181 || fVertexAttribIndices[1] != stage.fVertexAttribIndices[1]) { |
| 178 return false; | 182 return false; |
| 179 } | 183 } |
| 180 | 184 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 * installed in the stage. | 216 * installed in the stage. |
| 213 */ | 217 */ |
| 214 const SkMatrix& getCoordChangeMatrix() const { | 218 const SkMatrix& getCoordChangeMatrix() const { |
| 215 if (fCoordChangeMatrixSet) { | 219 if (fCoordChangeMatrixSet) { |
| 216 return fCoordChangeMatrix; | 220 return fCoordChangeMatrix; |
| 217 } else { | 221 } else { |
| 218 return SkMatrix::I(); | 222 return SkMatrix::I(); |
| 219 } | 223 } |
| 220 } | 224 } |
| 221 | 225 |
| 222 void reset() { | 226 void reset() { fEffectRef.reset(NULL); } |
| 223 GrSafeSetNull(fEffectRef); | |
| 224 } | |
| 225 | 227 |
| 226 const GrEffectRef* setEffect(const GrEffectRef* EffectRef) { | 228 const GrEffectRef* setEffect(const GrEffectRef* effect, int attr0 = -1, int
attr1 = -1) { |
| 227 GrAssert(0 == fSavedCoordChangeCnt); | 229 fEffectRef.reset(SkSafeRef(effect)); |
| 228 GrSafeAssign(fEffectRef, EffectRef); | |
| 229 fCoordChangeMatrixSet = false; | |
| 230 | |
| 231 fVertexAttribIndices[0] = -1; | |
| 232 fVertexAttribIndices[1] = -1; | |
| 233 | |
| 234 return EffectRef; | |
| 235 } | |
| 236 | |
| 237 const GrEffectRef* setEffect(const GrEffectRef* EffectRef, int attr0, int at
tr1 = -1) { | |
| 238 GrAssert(0 == fSavedCoordChangeCnt); | |
| 239 GrSafeAssign(fEffectRef, EffectRef); | |
| 240 fCoordChangeMatrixSet = false; | 230 fCoordChangeMatrixSet = false; |
| 241 | 231 |
| 242 fVertexAttribIndices[0] = attr0; | 232 fVertexAttribIndices[0] = attr0; |
| 243 fVertexAttribIndices[1] = attr1; | 233 fVertexAttribIndices[1] = attr1; |
| 244 | 234 |
| 245 return EffectRef; | 235 return effect; |
| 246 } | 236 } |
| 247 | 237 |
| 248 const GrEffectRef* getEffect() const { return fEffectRef; } | 238 const GrEffectRef* getEffect() const { return fEffectRef.get(); } |
| 249 | 239 |
| 250 const int* getVertexAttribIndices() const { return fVertexAttribIndices; } | 240 const int* getVertexAttribIndices() const { return fVertexAttribIndices; } |
| 251 int getVertexAttribIndexCount() const { return fEffectRef->get()->numVertexA
ttribs(); } | 241 int getVertexAttribIndexCount() const { return fEffectRef->get()->numVertexA
ttribs(); } |
| 252 | 242 |
| 253 private: | 243 private: |
| 254 bool fCoordChangeMatrixSet; | 244 bool fCoordChangeMatrixSet; |
| 255 SkMatrix fCoordChangeMatrix; | 245 SkMatrix fCoordChangeMatrix; |
| 256 const GrEffectRef* fEffectRef; | 246 SkAutoTUnref<const GrEffectRef> fEffectRef; |
| 257 int fVertexAttribIndices[2]; | 247 int fVertexAttribIndices[2]; |
| 258 | |
| 259 GR_DEBUGCODE(mutable int fSavedCoordChangeCnt;) | |
| 260 }; | 248 }; |
| 261 | 249 |
| 262 #endif | 250 #endif |
| OLD | NEW |