/* * 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 fProc; SkMatrix fCoordChangeMatrix; }; #endif