| Index: src/gpu/effects/GrBicubicEffect.cpp
|
| diff --git a/src/gpu/effects/GrBicubicEffect.cpp b/src/gpu/effects/GrBicubicEffect.cpp
|
| index 89124ff66765f59547dc20899a32e161b182daac..9c6d1a3f8ca87206894603e43a3251a222cbe6b5 100644
|
| --- a/src/gpu/effects/GrBicubicEffect.cpp
|
| +++ b/src/gpu/effects/GrBicubicEffect.cpp
|
| @@ -177,3 +177,36 @@ GrEffectRef* GrBicubicEffect::TestCreate(SkRandom* random,
|
| }
|
| return GrBicubicEffect::Create(textures[texIdx], coefficients);
|
| }
|
| +
|
| +//////////////////////////////////////////////////////////////////////////////
|
| +
|
| +bool GrBicubicEffect::ShouldUseBicubic(const SkMatrix& matrix,
|
| + GrTextureParams::FilterMode* filterMode) {
|
| + if (matrix.isIdentity()) {
|
| + *filterMode = GrTextureParams::kNone_FilterMode;
|
| + return false;
|
| + }
|
| +
|
| + SkScalar scales[2];
|
| + if (!matrix.getMinMaxScales(scales) || scales[0] < SK_Scalar1) {
|
| + // Bicubic doesn't handle arbitrary minimization well, as src texels can be skipped
|
| + // entirely,
|
| + *filterMode = GrTextureParams::kMipMap_FilterMode;
|
| + return false;
|
| + }
|
| + // At this point if scales[1] == SK_Scalar1 then the matrix doesn't do any scaling.
|
| + if (scales[1] == SK_Scalar1) {
|
| + if (matrix.rectStaysRect() && SkScalarIsInt(matrix.getTranslateX()) &&
|
| + SkScalarIsInt(matrix.getTranslateY())) {
|
| + *filterMode = GrTextureParams::kNone_FilterMode;
|
| + } else {
|
| + // Use bilerp to handle rotation or fractional translation.
|
| + *filterMode = GrTextureParams::kBilerp_FilterMode;
|
| + }
|
| + return false;
|
| + }
|
| + // When we use the bicubic filtering effect each sample is read from the texture using
|
| + // nearest neighbor sampling.
|
| + *filterMode = GrTextureParams::kNone_FilterMode;
|
| + return true;
|
| +}
|
|
|