| /* |
| * Copyright 2014 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef GrPendingProcessorStage_DEFINED |
| #define GrPendingProcessorStage_DEFINED |
| |
| #include "GrFragmentStage.h" |
| #include "GrCoordTransform.h" |
| #include "GrFragmentProcessor.h" |
| #include "GrPendingProgramElement.h" |
| #include "SkMatrix.h" |
| |
| /** |
| * This a baked variant of GrFragmentStage, as recorded in GrOptDrawState. |
| */ |
| class GrPendingFragmentStage { |
| public: |
| GrPendingFragmentStage(const GrFragmentStage& stage, bool ignoreMatrix) |
| : fProc(stage.getProcessor()) |
| , fCoordChangeMatrix(ignoreMatrix ? SkMatrix::I() : stage.getCoordChangeMatrix()) { |
| } |
| |
| GrPendingFragmentStage(const GrPendingFragmentStage& that) { *this = that; } |
| |
| GrPendingFragmentStage& operator=(const GrPendingFragmentStage& that) { |
| fProc.reset(that.fProc.get()); |
| fCoordChangeMatrix = that.fCoordChangeMatrix; |
| return *this; |
| } |
| |
| bool operator==(const GrPendingFragmentStage& that) const { |
| return this->getProcessor()->isEqual(*that.getProcessor()) && |
| fCoordChangeMatrix == that.fCoordChangeMatrix; |
| } |
| |
| bool operator!=(const GrPendingFragmentStage& that) const { return !(*this == that); } |
| |
| const SkMatrix& getCoordChangeMatrix() const { return fCoordChangeMatrix; } |
| |
| /** |
| * For a coord transform on the fragment processor, does it or the coord change matrix (if |
| * relevant) contain perspective? |
| */ |
| bool isPerspectiveCoordTransform(int matrixIndex) const { |
| const GrCoordTransform& coordTransform = this->getProcessor()->coordTransform(matrixIndex); |
| uint32_t type = coordTransform.getMatrix().getType(); |
| if (kLocal_GrCoordSet == coordTransform.sourceCoords()) { |
| type |= this->getCoordChangeMatrix().getType(); |
| } |
| |
| return SkToBool(SkMatrix::kPerspective_Mask & type); |
| } |
| |
| const char* name() const { return fProc->name(); } |
| |
| const GrFragmentProcessor* getProcessor() const { return fProc.get(); } |
| |
| protected: |
| GrPendingProgramElement<const GrFragmentProcessor> fProc; |
| SkMatrix fCoordChangeMatrix; |
| }; |
| #endif |