diff options
author | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-07-25 21:27:09 +0000 |
---|---|---|
committer | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-07-25 21:27:09 +0000 |
commit | b8670998a59d305cd22a3c0cbdc6e075b0a37a6e (patch) | |
tree | 76791b806a3a6608e5a5735150c0535dc50a872a /include/gpu/GrSamplerState.h | |
parent | cc90505674cd845fcbebd7e0654c3ff04a2e4f25 (diff) |
Move filter/wrap out of GrSamplerState into GrTextureParams
Review URL: http://codereview.appspot.com/6440046/
git-svn-id: http://skia.googlecode.com/svn/trunk@4773 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'include/gpu/GrSamplerState.h')
-rw-r--r-- | include/gpu/GrSamplerState.h | 125 |
1 files changed, 77 insertions, 48 deletions
diff --git a/include/gpu/GrSamplerState.h b/include/gpu/GrSamplerState.h index 07318486bb..04fbe00738 100644 --- a/include/gpu/GrSamplerState.h +++ b/include/gpu/GrSamplerState.h @@ -15,31 +15,76 @@ #include "GrMatrix.h" #include "GrTypes.h" -class GrSamplerState { +#include "SkShader.h" + +class GrTextureParams { public: - enum Filter { - /** - * Read the closest src texel to the sample position - */ - kNearest_Filter, - /** - * Blend between closest 4 src texels to sample position (tent filter) - */ - kBilinear_Filter, - kDefault_Filter = kNearest_Filter - }; + GrTextureParams() { + this->reset(); + } - /** - * Describes how a texture is sampled when coordinates are outside the - * texture border - */ - enum WrapMode { - kClamp_WrapMode, - kRepeat_WrapMode, - kMirror_WrapMode, + GrTextureParams(const GrTextureParams& params) { + *this = params; + } + + GrTextureParams& operator =(const GrTextureParams& params) { + fTileModes[0] = params.fTileModes[0]; + fTileModes[1] = params.fTileModes[1]; + fBilerp = params.fBilerp; + return *this; + } - kDefault_WrapMode = kClamp_WrapMode - }; + void reset() { + this->reset(SkShader::kClamp_TileMode, false); + } + + void reset(SkShader::TileMode tileXAndY, bool filter) { + fTileModes[0] = fTileModes[1] = tileXAndY; + fBilerp = filter; + } + void reset(SkShader::TileMode tileModes[2], bool filter) { + fTileModes[0] = tileModes[0]; + fTileModes[1] = tileModes[1]; + fBilerp = filter; + } + + void setClampNoFilter() { + fTileModes[0] = fTileModes[1] = SkShader::kClamp_TileMode; + fBilerp = false; + } + + void setClamp() { + fTileModes[0] = fTileModes[1] = SkShader::kClamp_TileMode; + } + + void setBilerp(bool bilerp) { fBilerp = bilerp; } + + void setTileModeX(const SkShader::TileMode tm) { fTileModes[0] = tm; } + void setTileModeY(const SkShader::TileMode tm) { fTileModes[1] = tm; } + void setTileModeXAndY(const SkShader::TileMode tm) { fTileModes[0] = fTileModes[1] = tm; } + + SkShader::TileMode getTileModeX() const { return fTileModes[0]; } + + SkShader::TileMode getTileModeY() const { return fTileModes[1]; } + + bool isTiled() const { + return SkShader::kClamp_TileMode != fTileModes[0] || + SkShader::kClamp_TileMode != fTileModes[1]; + } + + bool isBilerp() const { return fBilerp; } + +private: + + SkShader::TileMode fTileModes[2]; + bool fBilerp; +}; + +class GrSamplerState { +public: + static const bool kBilerpDefault = false; + + static const SkShader::TileMode kTileModeDefault = SkShader::kClamp_TileMode; /** * Default sampler state is set to clamp, use normal sampling mode, be @@ -74,9 +119,7 @@ public: GrSamplerState& operator =(const GrSamplerState& s) { // memcpy() breaks refcounting - fWrapX = s.fWrapX; - fWrapY = s.fWrapY; - fFilter = s.fFilter; + fTextureParams = s.fTextureParams; fMatrix = s.fMatrix; fSwapRAndB = s.fSwapRAndB; @@ -85,15 +128,11 @@ public: return *this; } - WrapMode getWrapX() const { return fWrapX; } - WrapMode getWrapY() const { return fWrapY; } const GrMatrix& getMatrix() const { return fMatrix; } - Filter getFilter() const { return fFilter; } bool swapsRAndB() const { return fSwapRAndB; } - void setWrapX(WrapMode mode) { fWrapX = mode; } - void setWrapY(WrapMode mode) { fWrapY = mode; } - + GrTextureParams* textureParams() { return &fTextureParams; } + const GrTextureParams& getTextureParams() const { return fTextureParams; } /** * Access the sampler's matrix. See SampleMode for explanation of * relationship between the matrix and sample mode. @@ -118,30 +157,22 @@ public: */ void preConcatMatrix(const GrMatrix& matrix) { fMatrix.preConcat(matrix); } - /** - * Sets filtering type. - * @param filter type of filtering to apply - */ - void setFilter(Filter filter) { fFilter = filter; } - - void reset(WrapMode wrapXAndY, - Filter filter, + void reset(SkShader::TileMode tileXAndY, + bool filter, const GrMatrix& matrix) { - fWrapX = wrapXAndY; - fWrapY = wrapXAndY; - fFilter = filter; + fTextureParams.reset(tileXAndY, filter); fMatrix = matrix; fSwapRAndB = false; GrSafeSetNull(fCustomStage); } - void reset(WrapMode wrapXAndY, Filter filter) { + void reset(SkShader::TileMode wrapXAndY, bool filter) { this->reset(wrapXAndY, filter, GrMatrix::I()); } void reset(const GrMatrix& matrix) { - this->reset(kDefault_WrapMode, kDefault_Filter, matrix); + this->reset(kTileModeDefault, kBilerpDefault, matrix); } void reset() { - this->reset(kDefault_WrapMode, kDefault_Filter, GrMatrix::I()); + this->reset(kTileModeDefault, kBilerpDefault, GrMatrix::I()); } GrCustomStage* setCustomStage(GrCustomStage* stage) { @@ -151,9 +182,7 @@ public: GrCustomStage* getCustomStage() const { return fCustomStage; } private: - WrapMode fWrapX : 8; - WrapMode fWrapY : 8; - Filter fFilter : 8; + GrTextureParams fTextureParams; bool fSwapRAndB; GrMatrix fMatrix; |