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