Index: include/gpu/GrEffectStage.h |
=================================================================== |
--- include/gpu/GrEffectStage.h (revision 8840) |
+++ include/gpu/GrEffectStage.h (working copy) |
@@ -42,6 +42,14 @@ |
return false; |
} |
+ if (fCoordChangeMatrixSet != other.fCoordChangeMatrixSet) { |
+ return false; |
+ } |
+ |
+ if (!fCoordChangeMatrixSet) { |
+ return true; |
+ } |
+ |
return fCoordChangeMatrix == other.fCoordChangeMatrix; |
} |
@@ -49,7 +57,8 @@ |
GrEffectStage& operator =(const GrEffectStage& other) { |
GrSafeAssign(fEffectRef, other.fEffectRef); |
- if (NULL != fEffectRef) { |
+ fCoordChangeMatrixSet = other.fCoordChangeMatrixSet; |
+ if (NULL != fEffectRef && fCoordChangeMatrixSet) { |
fCoordChangeMatrix = other.fCoordChangeMatrix; |
} |
return *this; |
@@ -61,10 +70,18 @@ |
* @param matrix The transformation from the old coord system in which geometry is specified |
* to the new one from which it will actually be drawn. |
*/ |
- void localCoordChange(const SkMatrix& matrix) { fCoordChangeMatrix.preConcat(matrix); } |
+ void localCoordChange(const SkMatrix& matrix) { |
+ if (fCoordChangeMatrixSet) { |
+ fCoordChangeMatrix.preConcat(matrix); |
+ } else { |
+ fCoordChangeMatrixSet = true; |
+ fCoordChangeMatrix = matrix; |
+ } |
+ } |
class SavedCoordChange { |
private: |
+ bool fCoordChangeMatrixSet; |
SkMatrix fCoordChangeMatrix; |
GR_DEBUGCODE(mutable SkAutoTUnref<const GrEffectRef> fEffectRef;) |
@@ -78,7 +95,10 @@ |
* restore the previous coord system (e.g. temporarily draw in device coords). |
*/ |
void saveCoordChange(SavedCoordChange* savedCoordChange) const { |
- savedCoordChange->fCoordChangeMatrix = fCoordChangeMatrix; |
+ savedCoordChange->fCoordChangeMatrixSet = fCoordChangeMatrixSet; |
+ if (fCoordChangeMatrixSet) { |
+ savedCoordChange->fCoordChangeMatrix = fCoordChangeMatrix; |
+ } |
GrAssert(NULL == savedCoordChange->fEffectRef.get()); |
GR_DEBUGCODE(GrSafeRef(fEffectRef);) |
GR_DEBUGCODE(savedCoordChange->fEffectRef.reset(fEffectRef);) |
@@ -89,7 +109,10 @@ |
* This balances the saveCoordChange call. |
*/ |
void restoreCoordChange(const SavedCoordChange& savedCoordChange) { |
- fCoordChangeMatrix = savedCoordChange.fCoordChangeMatrix; |
+ fCoordChangeMatrixSet = savedCoordChange.fCoordChangeMatrixSet; |
+ if (fCoordChangeMatrixSet) { |
+ fCoordChangeMatrix = savedCoordChange.fCoordChangeMatrix; |
+ } |
GrAssert(savedCoordChange.fEffectRef.get() == fEffectRef); |
GR_DEBUGCODE(--fSavedCoordChangeCnt); |
GR_DEBUGCODE(savedCoordChange.fEffectRef.reset(NULL);) |
@@ -116,7 +139,10 @@ |
if (NULL != stage.fEffectRef) { |
stage.fEffectRef->get()->incDeferredRefCounts(); |
fEffect = stage.fEffectRef->get(); |
- fCoordChangeMatrix = stage.fCoordChangeMatrix; |
+ fCoordChangeMatrixSet = stage.fCoordChangeMatrixSet; |
+ if (fCoordChangeMatrixSet) { |
+ fCoordChangeMatrix = stage.fCoordChangeMatrix; |
+ } |
fVertexAttribIndices[0] = stage.fVertexAttribIndices[0]; |
fVertexAttribIndices[1] = stage.fVertexAttribIndices[1]; |
} |
@@ -128,7 +154,10 @@ |
const GrEffectRef* oldEffectRef = stage->fEffectRef; |
if (NULL != fEffect) { |
stage->fEffectRef = GrEffect::CreateEffectRef(fEffect); |
- stage->fCoordChangeMatrix = fCoordChangeMatrix; |
+ stage->fCoordChangeMatrixSet = fCoordChangeMatrixSet; |
+ if (fCoordChangeMatrixSet) { |
+ stage->fCoordChangeMatrix = fCoordChangeMatrix; |
+ } |
stage->fVertexAttribIndices[0] = fVertexAttribIndices[0]; |
stage->fVertexAttribIndices[1] = fVertexAttribIndices[1]; |
} else { |
@@ -153,11 +182,20 @@ |
return false; |
} |
+ if (fCoordChangeMatrixSet != stage.fCoordChangeMatrixSet) { |
+ return false; |
+ } |
+ |
+ if (!fCoordChangeMatrixSet) { |
+ return true; |
+ } |
+ |
return fCoordChangeMatrix == stage.fCoordChangeMatrix; |
} |
private: |
const GrEffect* fEffect; |
+ bool fCoordChangeMatrixSet; |
SkMatrix fCoordChangeMatrix; |
int fVertexAttribIndices[2]; |
SkDEBUGCODE(bool fInitialized;) |
@@ -167,7 +205,13 @@ |
* Gets the matrix representing all changes of coordinate system since the GrEffect was |
* installed in the stage. |
*/ |
- const SkMatrix& getCoordChangeMatrix() const { return fCoordChangeMatrix; } |
+ const SkMatrix& getCoordChangeMatrix() const { |
+ if (fCoordChangeMatrixSet) { |
+ return fCoordChangeMatrix; |
+ } else { |
+ return SkMatrix::I(); |
+ } |
+ } |
void reset() { |
GrSafeSetNull(fEffectRef); |
@@ -176,7 +220,7 @@ |
const GrEffectRef* setEffect(const GrEffectRef* EffectRef) { |
GrAssert(0 == fSavedCoordChangeCnt); |
GrSafeAssign(fEffectRef, EffectRef); |
- fCoordChangeMatrix.reset(); |
+ fCoordChangeMatrixSet = false; |
fVertexAttribIndices[0] = -1; |
fVertexAttribIndices[1] = -1; |
@@ -187,7 +231,7 @@ |
const GrEffectRef* setEffect(const GrEffectRef* EffectRef, int attr0, int attr1 = -1) { |
GrAssert(0 == fSavedCoordChangeCnt); |
GrSafeAssign(fEffectRef, EffectRef); |
- fCoordChangeMatrix.reset(); |
+ fCoordChangeMatrixSet = false; |
fVertexAttribIndices[0] = attr0; |
fVertexAttribIndices[1] = attr1; |
@@ -201,6 +245,7 @@ |
int getVertexAttribIndexCount() const { return fEffectRef->get()->numVertexAttribs(); } |
private: |
+ bool fCoordChangeMatrixSet; |
SkMatrix fCoordChangeMatrix; |
const GrEffectRef* fEffectRef; |
int fVertexAttribIndices[2]; |