13aad3b01afc77993ff051c02e49186294e312980humper@google.com#include "GrBicubicEffect.h" 23aad3b01afc77993ff051c02e49186294e312980humper@google.com 33aad3b01afc77993ff051c02e49186294e312980humper@google.com#define DS(x) SkDoubleToScalar(x) 43aad3b01afc77993ff051c02e49186294e312980humper@google.com 53aad3b01afc77993ff051c02e49186294e312980humper@google.comconst SkScalar GrBicubicEffect::gMitchellCoefficients[16] = { 63aad3b01afc77993ff051c02e49186294e312980humper@google.com DS( 1.0 / 18.0), DS(-9.0 / 18.0), DS( 15.0 / 18.0), DS( -7.0 / 18.0), 73aad3b01afc77993ff051c02e49186294e312980humper@google.com DS(16.0 / 18.0), DS( 0.0 / 18.0), DS(-36.0 / 18.0), DS( 21.0 / 18.0), 83aad3b01afc77993ff051c02e49186294e312980humper@google.com DS( 1.0 / 18.0), DS( 9.0 / 18.0), DS( 27.0 / 18.0), DS(-21.0 / 18.0), 93aad3b01afc77993ff051c02e49186294e312980humper@google.com DS( 0.0 / 18.0), DS( 0.0 / 18.0), DS( -6.0 / 18.0), DS( 7.0 / 18.0), 103aad3b01afc77993ff051c02e49186294e312980humper@google.com}; 113aad3b01afc77993ff051c02e49186294e312980humper@google.com 123aad3b01afc77993ff051c02e49186294e312980humper@google.com 133aad3b01afc77993ff051c02e49186294e312980humper@google.comclass GrGLBicubicEffect : public GrGLEffect { 143aad3b01afc77993ff051c02e49186294e312980humper@google.compublic: 153aad3b01afc77993ff051c02e49186294e312980humper@google.com GrGLBicubicEffect(const GrBackendEffectFactory& factory, 163aad3b01afc77993ff051c02e49186294e312980humper@google.com const GrDrawEffect&); 177d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org 183aad3b01afc77993ff051c02e49186294e312980humper@google.com virtual void emitCode(GrGLShaderBuilder*, 193aad3b01afc77993ff051c02e49186294e312980humper@google.com const GrDrawEffect&, 203aad3b01afc77993ff051c02e49186294e312980humper@google.com EffectKey, 213aad3b01afc77993ff051c02e49186294e312980humper@google.com const char* outputColor, 223aad3b01afc77993ff051c02e49186294e312980humper@google.com const char* inputColor, 2377af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com const TransformedCoordsArray&, 243aad3b01afc77993ff051c02e49186294e312980humper@google.com const TextureSamplerArray&) SK_OVERRIDE; 253aad3b01afc77993ff051c02e49186294e312980humper@google.com 263aad3b01afc77993ff051c02e49186294e312980humper@google.com virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; 273aad3b01afc77993ff051c02e49186294e312980humper@google.com 287d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org static inline EffectKey GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&) { 297d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const GrTextureDomain& domain = drawEffect.castEffect<GrBicubicEffect>().domain(); 307d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org return GrTextureDomain::GLDomain::DomainKey(domain); 317d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org } 327d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org 333aad3b01afc77993ff051c02e49186294e312980humper@google.comprivate: 343aad3b01afc77993ff051c02e49186294e312980humper@google.com typedef GrGLUniformManager::UniformHandle UniformHandle; 353aad3b01afc77993ff051c02e49186294e312980humper@google.com 367d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org UniformHandle fCoefficientsUni; 377d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org UniformHandle fImageIncrementUni; 387d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org GrTextureDomain::GLDomain fDomain; 393aad3b01afc77993ff051c02e49186294e312980humper@google.com 403aad3b01afc77993ff051c02e49186294e312980humper@google.com typedef GrGLEffect INHERITED; 413aad3b01afc77993ff051c02e49186294e312980humper@google.com}; 423aad3b01afc77993ff051c02e49186294e312980humper@google.com 4377af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.comGrGLBicubicEffect::GrGLBicubicEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) 4477af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com : INHERITED(factory) { 453aad3b01afc77993ff051c02e49186294e312980humper@google.com} 463aad3b01afc77993ff051c02e49186294e312980humper@google.com 473aad3b01afc77993ff051c02e49186294e312980humper@google.comvoid GrGLBicubicEffect::emitCode(GrGLShaderBuilder* builder, 487d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const GrDrawEffect& drawEffect, 493aad3b01afc77993ff051c02e49186294e312980humper@google.com EffectKey key, 503aad3b01afc77993ff051c02e49186294e312980humper@google.com const char* outputColor, 513aad3b01afc77993ff051c02e49186294e312980humper@google.com const char* inputColor, 5277af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com const TransformedCoordsArray& coords, 533aad3b01afc77993ff051c02e49186294e312980humper@google.com const TextureSamplerArray& samplers) { 547d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const GrTextureDomain& domain = drawEffect.castEffect<GrBicubicEffect>().domain(); 55a34995e18b1f0a7d8c9f23451718bb30ff0105b0commit-bot@chromium.org 5677af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com SkString coords2D = builder->ensureFSCoords2D(coords, 0); 573aad3b01afc77993ff051c02e49186294e312980humper@google.com fCoefficientsUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 583aad3b01afc77993ff051c02e49186294e312980humper@google.com kMat44f_GrSLType, "Coefficients"); 593aad3b01afc77993ff051c02e49186294e312980humper@google.com fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 603aad3b01afc77993ff051c02e49186294e312980humper@google.com kVec2f_GrSLType, "ImageIncrement"); 613aad3b01afc77993ff051c02e49186294e312980humper@google.com 623aad3b01afc77993ff051c02e49186294e312980humper@google.com const char* imgInc = builder->getUniformCStr(fImageIncrementUni); 633aad3b01afc77993ff051c02e49186294e312980humper@google.com const char* coeff = builder->getUniformCStr(fCoefficientsUni); 643aad3b01afc77993ff051c02e49186294e312980humper@google.com 653aad3b01afc77993ff051c02e49186294e312980humper@google.com SkString cubicBlendName; 663aad3b01afc77993ff051c02e49186294e312980humper@google.com 673aad3b01afc77993ff051c02e49186294e312980humper@google.com static const GrGLShaderVar gCubicBlendArgs[] = { 683aad3b01afc77993ff051c02e49186294e312980humper@google.com GrGLShaderVar("coefficients", kMat44f_GrSLType), 693aad3b01afc77993ff051c02e49186294e312980humper@google.com GrGLShaderVar("t", kFloat_GrSLType), 703aad3b01afc77993ff051c02e49186294e312980humper@google.com GrGLShaderVar("c0", kVec4f_GrSLType), 713aad3b01afc77993ff051c02e49186294e312980humper@google.com GrGLShaderVar("c1", kVec4f_GrSLType), 723aad3b01afc77993ff051c02e49186294e312980humper@google.com GrGLShaderVar("c2", kVec4f_GrSLType), 733aad3b01afc77993ff051c02e49186294e312980humper@google.com GrGLShaderVar("c3", kVec4f_GrSLType), 743aad3b01afc77993ff051c02e49186294e312980humper@google.com }; 753aad3b01afc77993ff051c02e49186294e312980humper@google.com builder->fsEmitFunction(kVec4f_GrSLType, 763aad3b01afc77993ff051c02e49186294e312980humper@google.com "cubicBlend", 773aad3b01afc77993ff051c02e49186294e312980humper@google.com SK_ARRAY_COUNT(gCubicBlendArgs), 783aad3b01afc77993ff051c02e49186294e312980humper@google.com gCubicBlendArgs, 793aad3b01afc77993ff051c02e49186294e312980humper@google.com "\tvec4 ts = vec4(1.0, t, t * t, t * t * t);\n" 803aad3b01afc77993ff051c02e49186294e312980humper@google.com "\tvec4 c = coefficients * ts;\n" 813aad3b01afc77993ff051c02e49186294e312980humper@google.com "\treturn c.x * c0 + c.y * c1 + c.z * c2 + c.w * c3;\n", 823aad3b01afc77993ff051c02e49186294e312980humper@google.com &cubicBlendName); 83dec61503d02862760f3c91203a698636a02c882acommit-bot@chromium.org builder->fsCodeAppendf("\tvec2 coord = %s - %s * vec2(0.5);\n", coords2D.c_str(), imgInc); 84dec61503d02862760f3c91203a698636a02c882acommit-bot@chromium.org // We unnormalize the coord in order to determine our fractional offset (f) within the texel 85dec61503d02862760f3c91203a698636a02c882acommit-bot@chromium.org // We then snap coord to a texel center and renormalize. The snap prevents cases where the 86dec61503d02862760f3c91203a698636a02c882acommit-bot@chromium.org // starting coords are near a texel boundary and accumulations of imgInc would cause us to skip/ 87dec61503d02862760f3c91203a698636a02c882acommit-bot@chromium.org // double hit a texel. 88dec61503d02862760f3c91203a698636a02c882acommit-bot@chromium.org builder->fsCodeAppendf("\tcoord /= %s;\n", imgInc); 89dec61503d02862760f3c91203a698636a02c882acommit-bot@chromium.org builder->fsCodeAppend("\tvec2 f = fract(coord);\n"); 90dec61503d02862760f3c91203a698636a02c882acommit-bot@chromium.org builder->fsCodeAppendf("\tcoord = (coord - f + vec2(0.5)) * %s;\n", imgInc); 917d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org builder->fsCodeAppend("\tvec4 rowColors[4];\n"); 923aad3b01afc77993ff051c02e49186294e312980humper@google.com for (int y = 0; y < 4; ++y) { 933aad3b01afc77993ff051c02e49186294e312980humper@google.com for (int x = 0; x < 4; ++x) { 943aad3b01afc77993ff051c02e49186294e312980humper@google.com SkString coord; 953aad3b01afc77993ff051c02e49186294e312980humper@google.com coord.printf("coord + %s * vec2(%d, %d)", imgInc, x - 1, y - 1); 967d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org SkString sampleVar; 977d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org sampleVar.printf("rowColors[%d]", x); 987d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org fDomain.sampleTexture(builder, domain, sampleVar.c_str(), coord, samplers[0]); 993aad3b01afc77993ff051c02e49186294e312980humper@google.com } 1007d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org builder->fsCodeAppendf("\tvec4 s%d = %s(%s, f.x, rowColors[0], rowColors[1], rowColors[2], rowColors[3]);\n", y, cubicBlendName.c_str(), coeff); 1013aad3b01afc77993ff051c02e49186294e312980humper@google.com } 1027d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org SkString bicubicColor; 1037d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org bicubicColor.printf("%s(%s, f.y, s0, s1, s2, s3)", cubicBlendName.c_str(), coeff); 1047d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org builder->fsCodeAppendf("\t%s = %s;\n", outputColor, (GrGLSLExpr4(bicubicColor.c_str()) * GrGLSLExpr4(inputColor)).c_str()); 1053aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1063aad3b01afc77993ff051c02e49186294e312980humper@google.com 1073aad3b01afc77993ff051c02e49186294e312980humper@google.comvoid GrGLBicubicEffect::setData(const GrGLUniformManager& uman, 1083aad3b01afc77993ff051c02e49186294e312980humper@google.com const GrDrawEffect& drawEffect) { 1093aad3b01afc77993ff051c02e49186294e312980humper@google.com const GrBicubicEffect& effect = drawEffect.castEffect<GrBicubicEffect>(); 1107d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const GrTexture& texture = *effect.texture(0); 1113aad3b01afc77993ff051c02e49186294e312980humper@google.com float imageIncrement[2]; 1123aad3b01afc77993ff051c02e49186294e312980humper@google.com imageIncrement[0] = 1.0f / texture.width(); 1133aad3b01afc77993ff051c02e49186294e312980humper@google.com imageIncrement[1] = 1.0f / texture.height(); 114d3baf20dd1de9940717dd50b5c9ff6061561342ecommit-bot@chromium.org uman.set2fv(fImageIncrementUni, 1, imageIncrement); 1153aad3b01afc77993ff051c02e49186294e312980humper@google.com uman.setMatrix4f(fCoefficientsUni, effect.coefficients()); 1167d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org fDomain.setData(uman, effect.domain(), texture.origin()); 1173aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1183aad3b01afc77993ff051c02e49186294e312980humper@google.com 1197d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.orgstatic inline void convert_row_major_scalar_coeffs_to_column_major_floats(float dst[16], 1207d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkScalar src[16]) { 1213aad3b01afc77993ff051c02e49186294e312980humper@google.com for (int y = 0; y < 4; y++) { 1223aad3b01afc77993ff051c02e49186294e312980humper@google.com for (int x = 0; x < 4; x++) { 1237d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org dst[x * 4 + y] = SkScalarToFloat(src[y * 4 + x]); 1243aad3b01afc77993ff051c02e49186294e312980humper@google.com } 1253aad3b01afc77993ff051c02e49186294e312980humper@google.com } 1267d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org} 1277d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org 1287d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.orgGrBicubicEffect::GrBicubicEffect(GrTexture* texture, 1297d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkScalar coefficients[16], 1307d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkMatrix &matrix, 1317d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkShader::TileMode tileModes[2]) 1327d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org : INHERITED(texture, matrix, GrTextureParams(tileModes, GrTextureParams::kNone_FilterMode)) 1337d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org , fDomain(GrTextureDomain::IgnoredDomain()) { 1347d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org convert_row_major_scalar_coeffs_to_column_major_floats(fCoefficients, coefficients); 1357d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org} 1367d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org 1377d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.orgGrBicubicEffect::GrBicubicEffect(GrTexture* texture, 1387d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkScalar coefficients[16], 1397d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkMatrix &matrix, 1407d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkRect& domain) 1417d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org : INHERITED(texture, matrix, GrTextureParams(SkShader::kClamp_TileMode, 1427d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org GrTextureParams::kNone_FilterMode)) 1437d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org , fDomain(domain, GrTextureDomain::kClamp_Mode) { 1447d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org convert_row_major_scalar_coeffs_to_column_major_floats(fCoefficients, coefficients); 1453aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1463aad3b01afc77993ff051c02e49186294e312980humper@google.com 1473aad3b01afc77993ff051c02e49186294e312980humper@google.comGrBicubicEffect::~GrBicubicEffect() { 1483aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1493aad3b01afc77993ff051c02e49186294e312980humper@google.com 1503aad3b01afc77993ff051c02e49186294e312980humper@google.comconst GrBackendEffectFactory& GrBicubicEffect::getFactory() const { 1513aad3b01afc77993ff051c02e49186294e312980humper@google.com return GrTBackendEffectFactory<GrBicubicEffect>::getInstance(); 1523aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1533aad3b01afc77993ff051c02e49186294e312980humper@google.com 1543aad3b01afc77993ff051c02e49186294e312980humper@google.combool GrBicubicEffect::onIsEqual(const GrEffect& sBase) const { 1553aad3b01afc77993ff051c02e49186294e312980humper@google.com const GrBicubicEffect& s = CastEffect<GrBicubicEffect>(sBase); 156d1af237d7d52e23bc08ccaf73eddaadddeab6758humper@google.com return this->textureAccess(0) == s.textureAccess(0) && 1573aad3b01afc77993ff051c02e49186294e312980humper@google.com !memcmp(fCoefficients, s.coefficients(), 16); 1583aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1593aad3b01afc77993ff051c02e49186294e312980humper@google.com 1603aad3b01afc77993ff051c02e49186294e312980humper@google.comvoid GrBicubicEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { 1617d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org // FIXME: Perhaps we can do better. 1623aad3b01afc77993ff051c02e49186294e312980humper@google.com *validFlags = 0; 1633aad3b01afc77993ff051c02e49186294e312980humper@google.com return; 1643aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1653aad3b01afc77993ff051c02e49186294e312980humper@google.com 1663aad3b01afc77993ff051c02e49186294e312980humper@google.comGR_DEFINE_EFFECT_TEST(GrBicubicEffect); 1673aad3b01afc77993ff051c02e49186294e312980humper@google.com 168e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgGrEffectRef* GrBicubicEffect::TestCreate(SkRandom* random, 1693aad3b01afc77993ff051c02e49186294e312980humper@google.com GrContext* context, 1703aad3b01afc77993ff051c02e49186294e312980humper@google.com const GrDrawTargetCaps&, 1713aad3b01afc77993ff051c02e49186294e312980humper@google.com GrTexture* textures[]) { 1723aad3b01afc77993ff051c02e49186294e312980humper@google.com int texIdx = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx : 1733aad3b01afc77993ff051c02e49186294e312980humper@google.com GrEffectUnitTest::kAlphaTextureIdx; 1743aad3b01afc77993ff051c02e49186294e312980humper@google.com SkScalar coefficients[16]; 1753aad3b01afc77993ff051c02e49186294e312980humper@google.com for (int i = 0; i < 16; i++) { 1763aad3b01afc77993ff051c02e49186294e312980humper@google.com coefficients[i] = random->nextSScalar1(); 1773aad3b01afc77993ff051c02e49186294e312980humper@google.com } 1783aad3b01afc77993ff051c02e49186294e312980humper@google.com return GrBicubicEffect::Create(textures[texIdx], coefficients); 1793aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1809927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org 1819927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 1829927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org 1839927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.orgbool GrBicubicEffect::ShouldUseBicubic(const SkMatrix& matrix, 1849927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org GrTextureParams::FilterMode* filterMode) { 1859927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org if (matrix.isIdentity()) { 1869927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org *filterMode = GrTextureParams::kNone_FilterMode; 1879927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org return false; 1889927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org } 1899927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org 1909927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org SkScalar scales[2]; 1919927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org if (!matrix.getMinMaxScales(scales) || scales[0] < SK_Scalar1) { 1929927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org // Bicubic doesn't handle arbitrary minimization well, as src texels can be skipped 1939927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org // entirely, 1949927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org *filterMode = GrTextureParams::kMipMap_FilterMode; 1959927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org return false; 1969927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org } 1979927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org // At this point if scales[1] == SK_Scalar1 then the matrix doesn't do any scaling. 1989927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org if (scales[1] == SK_Scalar1) { 1999927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org if (matrix.rectStaysRect() && SkScalarIsInt(matrix.getTranslateX()) && 2009927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org SkScalarIsInt(matrix.getTranslateY())) { 2019927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org *filterMode = GrTextureParams::kNone_FilterMode; 2029927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org } else { 2039927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org // Use bilerp to handle rotation or fractional translation. 2049927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org *filterMode = GrTextureParams::kBilerp_FilterMode; 2059927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org } 2069927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org return false; 2079927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org } 2089927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org // When we use the bicubic filtering effect each sample is read from the texture using 2099927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org // nearest neighbor sampling. 2109927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org *filterMode = GrTextureParams::kNone_FilterMode; 2119927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org return true; 2129927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org} 213