| Index: src/gpu/GrDrawState.h
|
| diff --git a/src/gpu/GrDrawState.h b/src/gpu/GrDrawState.h
|
| index bf3ef74e9411ca6c088889c5db904e54116c958e..26422aafe75b7ad11b2c846bc881d0df4b7f8394 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 {
|
| + 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==
|
|
|