Chromium Code Reviews| Index: src/gpu/GrDrawState.h |
| diff --git a/src/gpu/GrDrawState.h b/src/gpu/GrDrawState.h |
| index bf3ef74e9411ca6c088889c5db904e54116c958e..79abe1c0f520013008ac7b75a8067992babba723 100644 |
| --- a/src/gpu/GrDrawState.h |
| +++ b/src/gpu/GrDrawState.h |
| @@ -56,43 +56,39 @@ public: |
| kNumStages = GrPaint::kTotalStages + 2, |
| }; |
| - GrDrawState() { |
| - this->reset(); |
| - } |
| + GrDrawState() { this->reset(); } |
| + |
| + GrDrawState(const SkMatrix& initialViewMatrix) { this->reset(initialViewMatrix); } |
| + /** |
| + * Copies another draw state. |
| + **/ |
| GrDrawState(const GrDrawState& state) { |
| *this = state; |
| } |
| - virtual ~GrDrawState() { |
| - this->disableStages(); |
| + /** |
| + * Copies another draw state with a preconcat to the view matrix. |
| + **/ |
| + GrDrawState(const GrDrawState& state, const SkMatrix& preConcatMatrix) { |
| + *this = state; |
| + if (!preConcatMatrix.isIdentity()) { |
| + for (int i = 0; i < kNumStages; ++i) { |
| + if (this->isStageEnabled(i)) { |
| + fStages[i].localCoordChange(preConcatMatrix); |
| + } |
| + } |
| + } |
| } |
| + virtual ~GrDrawState() { this->disableStages(); } |
| + |
| /** |
| - * Resets to the default state. |
| - * GrEffects will be removed from all stages. |
| + * Resets to the default state. GrEffects will be removed from all stages. |
| */ |
| - void reset() { |
| - |
| - this->disableStages(); |
| - |
| - fRenderTarget.reset(NULL); |
| + void reset() { this->onReset(NULL); } |
| - this->setDefaultVertexAttribs(); |
| - |
| - fCommon.fColor = 0xffffffff; |
| - fCommon.fViewMatrix.reset(); |
| - fCommon.fSrcBlend = kOne_GrBlendCoeff; |
| - fCommon.fDstBlend = kZero_GrBlendCoeff; |
| - fCommon.fBlendConstant = 0x0; |
| - fCommon.fFlagBits = 0x0; |
| - fCommon.fStencilSettings.setDisabled(); |
| - fCommon.fFirstCoverageStage = kNumStages; |
| - fCommon.fCoverage = 0xffffffff; |
| - fCommon.fColorFilterMode = SkXfermode::kDst_Mode; |
| - fCommon.fColorFilterColor = 0x0; |
| - fCommon.fDrawFace = kBoth_DrawFace; |
| - } |
| + void reset(const SkMatrix& initialViewMatrix) { this->onReset(&initialViewMatrix); } |
| /** |
| * Initializes the GrDrawState based on a GrPaint, view matrix and render target. Note that |
| @@ -616,42 +612,10 @@ public: |
| //// |
| /** |
| - * Sets the matrix applied to vertex positions. |
| - * |
| - * In the post-view-matrix space the rectangle [0,w]x[0,h] |
| - * fully covers the render target. (w and h are the width and height of the |
| - * the render-target.) |
| - */ |
| - void setViewMatrix(const SkMatrix& m) { fCommon.fViewMatrix = m; } |
| - |
| - /** |
| - * Gets a writable pointer to the view matrix. |
| - */ |
| - SkMatrix* viewMatrix() { return &fCommon.fViewMatrix; } |
| - |
| - /** |
| - * Multiplies the current view matrix by a matrix |
| - * |
| - * After this call V' = V*m where V is the old view matrix, |
| - * m is the parameter to this function, and V' is the new view matrix. |
| - * (We consider positions to be column vectors so position vector p is |
| - * transformed by matrix X as p' = X*p.) |
| - * |
| - * @param m the matrix used to modify the view matrix. |
| - */ |
| - void preConcatViewMatrix(const SkMatrix& m) { fCommon.fViewMatrix.preConcat(m); } |
| - |
| - /** |
| - * Multiplies the current view matrix by a matrix |
| - * |
| - * After this call V' = m*V where V is the old view matrix, |
| - * m is the parameter to this function, and V' is the new view matrix. |
| - * (We consider positions to be column vectors so position vector p is |
| - * transformed by matrix X as p' = X*p.) |
| - * |
| - * @param m the matrix used to modify the view matrix. |
| + * Sets the view matrix to identity and updates any installed effects to compensate for the |
| + * coord system change. |
| */ |
| - void postConcatViewMatrix(const SkMatrix& m) { fCommon.fViewMatrix.postConcat(m); } |
| + bool setIdentityViewMatrix(); |
| /** |
| * Retrieves the current view matrix |
| @@ -685,7 +649,7 @@ public: |
| /** |
| * Preconcats the current view matrix and restores the previous view matrix in the destructor. |
| - * Effect matrices are automatically adjusted to compensate. |
| + * Effect matrices are automatically adjusted to compensate and adjusted back in the destructor. |
| */ |
| class AutoViewMatrixRestore : public ::GrNoncopyable { |
| public: |
| @@ -705,60 +669,9 @@ public: |
| void set(GrDrawState* drawState, const SkMatrix& preconcatMatrix); |
| - bool isSet() const { return NULL != fDrawState; } |
| - |
| - private: |
| - GrDrawState* fDrawState; |
| - SkMatrix fViewMatrix; |
| - GrEffectStage::SavedCoordChange fSavedCoordChanges[GrDrawState::kNumStages]; |
| - uint32_t fRestoreMask; |
| - }; |
| - |
| - //////////////////////////////////////////////////////////////////////////// |
| - |
| - /** |
| - * This sets the view matrix to identity and adjusts stage matrices to compensate. The |
| - * destructor undoes the changes, restoring the view matrix that was set before the |
| - * constructor. It is similar to passing the inverse of the current view matrix to |
| - * AutoViewMatrixRestore, but lazily computes the inverse only if necessary. |
| - */ |
| - class AutoDeviceCoordDraw : ::GrNoncopyable { |
| - public: |
| - AutoDeviceCoordDraw() : fDrawState(NULL) {} |
| - /** |
| - * If a stage's texture matrix is applied to explicit per-vertex coords, rather than to |
| - * positions, then we don't want to modify its matrix. The explicitCoordStageMask is used |
| - * to specify such stages. |
| - */ |
| - AutoDeviceCoordDraw(GrDrawState* drawState) { |
| - fDrawState = NULL; |
| - this->set(drawState); |
| - } |
| - |
| - ~AutoDeviceCoordDraw() { this->restore(); } |
| - |
| - bool set(GrDrawState* drawState); |
| - |
| - /** |
| - * Returns true if this object was successfully initialized on to a GrDrawState. It may |
| - * return false because a non-default constructor or set() were never called or because |
| - * the view matrix was not invertible. |
| - */ |
| - bool succeeded() const { return NULL != fDrawState; } |
| - |
| - /** |
| - * Returns the matrix that was set previously set on the drawState. This is only valid |
| - * if succeeded returns true. |
| - */ |
| - const SkMatrix& getOriginalMatrix() const { |
| - GrAssert(this->succeeded()); |
| - return fViewMatrix; |
| - } |
| - |
| - /** |
| - * Can be called prior to destructor to restore the original matrix. |
| - */ |
| - void restore(); |
| + /** Sets the draw state's matrix to identity. This can fail because the current view matrix |
| + is not invertible. */ |
| + bool setIdentity(GrDrawState* drawState); |
| private: |
| GrDrawState* fDrawState; |
| @@ -1027,6 +940,32 @@ public: |
| private: |
| + void onReset(const SkMatrix* initialViewMatrix) { |
| + |
| + this->disableStages(); |
| + |
| + fRenderTarget.reset(NULL); |
| + |
| + this->setDefaultVertexAttribs(); |
| + |
| + fCommon.fColor = 0xffffffff; |
| + if (NULL == initialViewMatrix) { |
| + fCommon.fViewMatrix.reset(); |
| + } else { |
|
robertphillips
2013/05/29 21:16:20
fViewMatrix = -- add space
bsalomon
2013/06/03 14:31:40
Done.
|
| + fCommon.fViewMatrix= *initialViewMatrix; |
| + } |
| + fCommon.fSrcBlend = kOne_GrBlendCoeff; |
| + fCommon.fDstBlend = kZero_GrBlendCoeff; |
| + fCommon.fBlendConstant = 0x0; |
| + fCommon.fFlagBits = 0x0; |
| + fCommon.fStencilSettings.setDisabled(); |
| + fCommon.fFirstCoverageStage = kNumStages; |
| + fCommon.fCoverage = 0xffffffff; |
| + fCommon.fColorFilterMode = SkXfermode::kDst_Mode; |
| + fCommon.fColorFilterColor = 0x0; |
| + fCommon.fDrawFace = kBoth_DrawFace; |
| + } |
| + |
| /** Fields that are identical in GrDrawState and GrDrawState::DeferredState. */ |
| struct CommonState { |
| // These fields are roughly sorted by decreasing likelihood of being different in op== |