| |
| /* |
| * Copyright 2010 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| |
| |
| #ifndef GrSamplerState_DEFINED |
| #define GrSamplerState_DEFINED |
| |
| #include "GrCustomStage.h" |
| #include "GrMatrix.h" |
| #include "GrTypes.h" |
| |
| #include "SkShader.h" |
| |
| class GrSamplerState { |
| public: |
| |
| GrSamplerState() |
| : fCustomStage (NULL) { |
| memset(this, 0, sizeof(GrSamplerState)); |
| this->reset(); |
| } |
| |
| ~GrSamplerState() { |
| GrSafeUnref(fCustomStage); |
| } |
| |
| bool operator ==(const GrSamplerState& s) const { |
| /* We must be bit-identical as far as the CustomStage; |
| there may be multiple CustomStages that will produce |
| the same shader code and so are equivalent. |
| Can't take the address of fWrapX because it's :8 */ |
| int bitwiseRegion = (intptr_t) &fCustomStage - (intptr_t) this; |
| GrAssert(sizeof(GrSamplerState) == |
| bitwiseRegion + sizeof(fCustomStage)); |
| return !memcmp(this, &s, bitwiseRegion) && |
| ((fCustomStage == s.fCustomStage) || |
| (fCustomStage && s.fCustomStage && |
| (fCustomStage->getFactory() == |
| s.fCustomStage->getFactory()) && |
| fCustomStage->isEqual(*s.fCustomStage))); |
| } |
| bool operator !=(const GrSamplerState& s) const { return !(*this == s); } |
| |
| GrSamplerState& operator =(const GrSamplerState& s) { |
| fMatrix = s.fMatrix; |
| GrSafeAssign(fCustomStage, s.fCustomStage); |
| return *this; |
| } |
| |
| const GrMatrix& getMatrix() const { return fMatrix; } |
| |
| /** |
| * Multiplies the current sampler matrix a matrix |
| * |
| * After this call M' = M*m where M is the old matrix, m is the parameter |
| * to this function, and M' is the new matrix. (We consider points to |
| * be column vectors so tex cood vector t is transformed by matrix X as |
| * t' = X*t.) |
| * |
| * @param matrix the matrix used to modify the matrix. |
| */ |
| void preConcatMatrix(const GrMatrix& matrix) { fMatrix.preConcat(matrix); } |
| |
| /** |
| * Do not call this function. It will be removed soon. |
| */ |
| void setMatrixDeprecated(const GrMatrix& matrix) { fMatrix = matrix; } |
| |
| void reset() { |
| fMatrix.reset(); |
| GrSafeSetNull(fCustomStage); |
| } |
| |
| GrCustomStage* setCustomStage(GrCustomStage* stage) { |
| GrSafeAssign(fCustomStage, stage); |
| fMatrix.reset(); |
| return stage; |
| } |
| |
| GrCustomStage* setCustomStage(GrCustomStage* stage, const GrMatrix& matrix) { |
| GrSafeAssign(fCustomStage, stage); |
| fMatrix = matrix; |
| return stage; |
| } |
| |
| const GrCustomStage* getCustomStage() const { return fCustomStage; } |
| |
| private: |
| GrMatrix fMatrix; |
| |
| GrCustomStage* fCustomStage; |
| }; |
| |
| #endif |
| |