1848faf00ec33d39ab3e31e9a11d805cae6ac6562bsalomon/* 2848faf00ec33d39ab3e31e9a11d805cae6ac6562bsalomon * Copyright 2014 Google Inc. 3848faf00ec33d39ab3e31e9a11d805cae6ac6562bsalomon * 4848faf00ec33d39ab3e31e9a11d805cae6ac6562bsalomon * Use of this source code is governed by a BSD-style license that can be 5848faf00ec33d39ab3e31e9a11d805cae6ac6562bsalomon * found in the LICENSE file. 6848faf00ec33d39ab3e31e9a11d805cae6ac6562bsalomon */ 7848faf00ec33d39ab3e31e9a11d805cae6ac6562bsalomon 830ba436f04e61d4505fb854d5fc56079636e0788joshualitt#include "gl/builders/GrGLProgramBuilder.h" 93aad3b01afc77993ff051c02e49186294e312980humper@google.com#include "GrBicubicEffect.h" 103aad3b01afc77993ff051c02e49186294e312980humper@google.com 11848faf00ec33d39ab3e31e9a11d805cae6ac6562bsalomon 123aad3b01afc77993ff051c02e49186294e312980humper@google.com#define DS(x) SkDoubleToScalar(x) 133aad3b01afc77993ff051c02e49186294e312980humper@google.com 143aad3b01afc77993ff051c02e49186294e312980humper@google.comconst SkScalar GrBicubicEffect::gMitchellCoefficients[16] = { 153aad3b01afc77993ff051c02e49186294e312980humper@google.com DS( 1.0 / 18.0), DS(-9.0 / 18.0), DS( 15.0 / 18.0), DS( -7.0 / 18.0), 163aad3b01afc77993ff051c02e49186294e312980humper@google.com DS(16.0 / 18.0), DS( 0.0 / 18.0), DS(-36.0 / 18.0), DS( 21.0 / 18.0), 173aad3b01afc77993ff051c02e49186294e312980humper@google.com DS( 1.0 / 18.0), DS( 9.0 / 18.0), DS( 27.0 / 18.0), DS(-21.0 / 18.0), 183aad3b01afc77993ff051c02e49186294e312980humper@google.com DS( 0.0 / 18.0), DS( 0.0 / 18.0), DS( -6.0 / 18.0), DS( 7.0 / 18.0), 193aad3b01afc77993ff051c02e49186294e312980humper@google.com}; 203aad3b01afc77993ff051c02e49186294e312980humper@google.com 213aad3b01afc77993ff051c02e49186294e312980humper@google.com 22b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrGLBicubicEffect : public GrGLFragmentProcessor { 233aad3b01afc77993ff051c02e49186294e312980humper@google.compublic: 24b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrGLBicubicEffect(const GrBackendProcessorFactory& factory, 25b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessor&); 267d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org 2730ba436f04e61d4505fb854d5fc56079636e0788joshualitt virtual void emitCode(GrGLProgramBuilder*, 28b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor&, 29b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessorKey&, 303aad3b01afc77993ff051c02e49186294e312980humper@google.com const char* outputColor, 313aad3b01afc77993ff051c02e49186294e312980humper@google.com const char* inputColor, 3277af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com const TransformedCoordsArray&, 333aad3b01afc77993ff051c02e49186294e312980humper@google.com const TextureSamplerArray&) SK_OVERRIDE; 343aad3b01afc77993ff051c02e49186294e312980humper@google.com 35b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE; 363aad3b01afc77993ff051c02e49186294e312980humper@google.com 37b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static inline void GenKey(const GrProcessor& effect, const GrGLCaps&, 38b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrProcessorKeyBuilder* b) { 3949586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const GrTextureDomain& domain = effect.cast<GrBicubicEffect>().domain(); 4063e99f7a03b2ac90ae7a00232674fd39c0bdcc68bsalomon b->add32(GrTextureDomain::GLDomain::DomainKey(domain)); 417d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org } 427d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org 433aad3b01afc77993ff051c02e49186294e312980humper@google.comprivate: 447510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen typedef GrGLProgramDataManager::UniformHandle UniformHandle; 453aad3b01afc77993ff051c02e49186294e312980humper@google.com 467d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org UniformHandle fCoefficientsUni; 477d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org UniformHandle fImageIncrementUni; 487d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org GrTextureDomain::GLDomain fDomain; 493aad3b01afc77993ff051c02e49186294e312980humper@google.com 50b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GrGLFragmentProcessor INHERITED; 513aad3b01afc77993ff051c02e49186294e312980humper@google.com}; 523aad3b01afc77993ff051c02e49186294e312980humper@google.com 53b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrGLBicubicEffect::GrGLBicubicEffect(const GrBackendProcessorFactory& factory, const GrProcessor&) 5477af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com : INHERITED(factory) { 553aad3b01afc77993ff051c02e49186294e312980humper@google.com} 563aad3b01afc77993ff051c02e49186294e312980humper@google.com 5730ba436f04e61d4505fb854d5fc56079636e0788joshualittvoid GrGLBicubicEffect::emitCode(GrGLProgramBuilder* builder, 58b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor& effect, 59b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessorKey& key, 603aad3b01afc77993ff051c02e49186294e312980humper@google.com const char* outputColor, 613aad3b01afc77993ff051c02e49186294e312980humper@google.com const char* inputColor, 6277af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com const TransformedCoordsArray& coords, 633aad3b01afc77993ff051c02e49186294e312980humper@google.com const TextureSamplerArray& samplers) { 6449586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const GrTextureDomain& domain = effect.cast<GrBicubicEffect>().domain(); 65a34995e18b1f0a7d8c9f23451718bb30ff0105b0commit-bot@chromium.org 6630ba436f04e61d4505fb854d5fc56079636e0788joshualitt fCoefficientsUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 673aad3b01afc77993ff051c02e49186294e312980humper@google.com kMat44f_GrSLType, "Coefficients"); 6830ba436f04e61d4505fb854d5fc56079636e0788joshualitt fImageIncrementUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 693aad3b01afc77993ff051c02e49186294e312980humper@google.com kVec2f_GrSLType, "ImageIncrement"); 703aad3b01afc77993ff051c02e49186294e312980humper@google.com 713aad3b01afc77993ff051c02e49186294e312980humper@google.com const char* imgInc = builder->getUniformCStr(fImageIncrementUni); 723aad3b01afc77993ff051c02e49186294e312980humper@google.com const char* coeff = builder->getUniformCStr(fCoefficientsUni); 733aad3b01afc77993ff051c02e49186294e312980humper@google.com 743aad3b01afc77993ff051c02e49186294e312980humper@google.com SkString cubicBlendName; 753aad3b01afc77993ff051c02e49186294e312980humper@google.com 763aad3b01afc77993ff051c02e49186294e312980humper@google.com static const GrGLShaderVar gCubicBlendArgs[] = { 773aad3b01afc77993ff051c02e49186294e312980humper@google.com GrGLShaderVar("coefficients", kMat44f_GrSLType), 783aad3b01afc77993ff051c02e49186294e312980humper@google.com GrGLShaderVar("t", kFloat_GrSLType), 793aad3b01afc77993ff051c02e49186294e312980humper@google.com GrGLShaderVar("c0", kVec4f_GrSLType), 803aad3b01afc77993ff051c02e49186294e312980humper@google.com GrGLShaderVar("c1", kVec4f_GrSLType), 813aad3b01afc77993ff051c02e49186294e312980humper@google.com GrGLShaderVar("c2", kVec4f_GrSLType), 823aad3b01afc77993ff051c02e49186294e312980humper@google.com GrGLShaderVar("c3", kVec4f_GrSLType), 833aad3b01afc77993ff051c02e49186294e312980humper@google.com }; 8430ba436f04e61d4505fb854d5fc56079636e0788joshualitt GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 8530ba436f04e61d4505fb854d5fc56079636e0788joshualitt SkString coords2D = fsBuilder->ensureFSCoords2D(coords, 0); 8630ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->emitFunction(kVec4f_GrSLType, 873aad3b01afc77993ff051c02e49186294e312980humper@google.com "cubicBlend", 883aad3b01afc77993ff051c02e49186294e312980humper@google.com SK_ARRAY_COUNT(gCubicBlendArgs), 893aad3b01afc77993ff051c02e49186294e312980humper@google.com gCubicBlendArgs, 903aad3b01afc77993ff051c02e49186294e312980humper@google.com "\tvec4 ts = vec4(1.0, t, t * t, t * t * t);\n" 913aad3b01afc77993ff051c02e49186294e312980humper@google.com "\tvec4 c = coefficients * ts;\n" 923aad3b01afc77993ff051c02e49186294e312980humper@google.com "\treturn c.x * c0 + c.y * c1 + c.z * c2 + c.w * c3;\n", 933aad3b01afc77993ff051c02e49186294e312980humper@google.com &cubicBlendName); 9430ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\tvec2 coord = %s - %s * vec2(0.5);\n", coords2D.c_str(), imgInc); 95dec61503d02862760f3c91203a698636a02c882acommit-bot@chromium.org // We unnormalize the coord in order to determine our fractional offset (f) within the texel 96dec61503d02862760f3c91203a698636a02c882acommit-bot@chromium.org // We then snap coord to a texel center and renormalize. The snap prevents cases where the 97dec61503d02862760f3c91203a698636a02c882acommit-bot@chromium.org // starting coords are near a texel boundary and accumulations of imgInc would cause us to skip/ 98dec61503d02862760f3c91203a698636a02c882acommit-bot@chromium.org // double hit a texel. 9930ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\tcoord /= %s;\n", imgInc); 10030ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\tvec2 f = fract(coord);\n"); 10130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\tcoord = (coord - f + vec2(0.5)) * %s;\n", imgInc); 10230ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend("\tvec4 rowColors[4];\n"); 1033aad3b01afc77993ff051c02e49186294e312980humper@google.com for (int y = 0; y < 4; ++y) { 1043aad3b01afc77993ff051c02e49186294e312980humper@google.com for (int x = 0; x < 4; ++x) { 1053aad3b01afc77993ff051c02e49186294e312980humper@google.com SkString coord; 1063aad3b01afc77993ff051c02e49186294e312980humper@google.com coord.printf("coord + %s * vec2(%d, %d)", imgInc, x - 1, y - 1); 1077d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org SkString sampleVar; 1087d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org sampleVar.printf("rowColors[%d]", x); 10930ba436f04e61d4505fb854d5fc56079636e0788joshualitt fDomain.sampleTexture(fsBuilder, domain, sampleVar.c_str(), coord, samplers[0]); 1103aad3b01afc77993ff051c02e49186294e312980humper@google.com } 11130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\tvec4 s%d = %s(%s, f.x, rowColors[0], rowColors[1], rowColors[2], rowColors[3]);\n", y, cubicBlendName.c_str(), coeff); 1123aad3b01afc77993ff051c02e49186294e312980humper@google.com } 1137d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org SkString bicubicColor; 1147d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org bicubicColor.printf("%s(%s, f.y, s0, s1, s2, s3)", cubicBlendName.c_str(), coeff); 11530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, (GrGLSLExpr4(bicubicColor.c_str()) * GrGLSLExpr4(inputColor)).c_str()); 1163aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1173aad3b01afc77993ff051c02e49186294e312980humper@google.com 1187510b224e52b9518a8ddf7418db0e9c258f79539kkinnunenvoid GrGLBicubicEffect::setData(const GrGLProgramDataManager& pdman, 119b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessor& processor) { 120b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrBicubicEffect& bicubicEffect = processor.cast<GrBicubicEffect>(); 121b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrTexture& texture = *processor.texture(0); 1223aad3b01afc77993ff051c02e49186294e312980humper@google.com float imageIncrement[2]; 1233aad3b01afc77993ff051c02e49186294e312980humper@google.com imageIncrement[0] = 1.0f / texture.width(); 1243aad3b01afc77993ff051c02e49186294e312980humper@google.com imageIncrement[1] = 1.0f / texture.height(); 1257510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen pdman.set2fv(fImageIncrementUni, 1, imageIncrement); 12649586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt pdman.setMatrix4f(fCoefficientsUni, bicubicEffect.coefficients()); 12749586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt fDomain.setData(pdman, bicubicEffect.domain(), texture.origin()); 1283aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1293aad3b01afc77993ff051c02e49186294e312980humper@google.com 1307d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.orgstatic inline void convert_row_major_scalar_coeffs_to_column_major_floats(float dst[16], 1317d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkScalar src[16]) { 1323aad3b01afc77993ff051c02e49186294e312980humper@google.com for (int y = 0; y < 4; y++) { 1333aad3b01afc77993ff051c02e49186294e312980humper@google.com for (int x = 0; x < 4; x++) { 1347d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org dst[x * 4 + y] = SkScalarToFloat(src[y * 4 + x]); 1353aad3b01afc77993ff051c02e49186294e312980humper@google.com } 1363aad3b01afc77993ff051c02e49186294e312980humper@google.com } 1377d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org} 1387d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org 1397d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.orgGrBicubicEffect::GrBicubicEffect(GrTexture* texture, 1407d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkScalar coefficients[16], 1417d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkMatrix &matrix, 1427d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkShader::TileMode tileModes[2]) 1437d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org : INHERITED(texture, matrix, GrTextureParams(tileModes, GrTextureParams::kNone_FilterMode)) 1447d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org , fDomain(GrTextureDomain::IgnoredDomain()) { 1457d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org convert_row_major_scalar_coeffs_to_column_major_floats(fCoefficients, coefficients); 1467d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org} 1477d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org 1487d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.orgGrBicubicEffect::GrBicubicEffect(GrTexture* texture, 1497d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkScalar coefficients[16], 1507d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkMatrix &matrix, 1517d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org const SkRect& domain) 1527d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org : INHERITED(texture, matrix, GrTextureParams(SkShader::kClamp_TileMode, 1537d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org GrTextureParams::kNone_FilterMode)) 1547d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org , fDomain(domain, GrTextureDomain::kClamp_Mode) { 1557d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org convert_row_major_scalar_coeffs_to_column_major_floats(fCoefficients, coefficients); 1563aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1573aad3b01afc77993ff051c02e49186294e312980humper@google.com 1583aad3b01afc77993ff051c02e49186294e312980humper@google.comGrBicubicEffect::~GrBicubicEffect() { 1593aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1603aad3b01afc77993ff051c02e49186294e312980humper@google.com 161b0a8a377f832c59cee939ad721e1f87d378b7142joshualittconst GrBackendFragmentProcessorFactory& GrBicubicEffect::getFactory() const { 162b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt return GrTBackendFragmentProcessorFactory<GrBicubicEffect>::getInstance(); 1633aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1643aad3b01afc77993ff051c02e49186294e312980humper@google.com 165b0a8a377f832c59cee939ad721e1f87d378b7142joshualittbool GrBicubicEffect::onIsEqual(const GrProcessor& sBase) const { 16649586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const GrBicubicEffect& s = sBase.cast<GrBicubicEffect>(); 167d1af237d7d52e23bc08ccaf73eddaadddeab6758humper@google.com return this->textureAccess(0) == s.textureAccess(0) && 168838f62db0a77487f6732ed13a0972a1e646ae16absalomon !memcmp(fCoefficients, s.coefficients(), 16) && 169838f62db0a77487f6732ed13a0972a1e646ae16absalomon fDomain == s.fDomain; 1703aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1713aad3b01afc77993ff051c02e49186294e312980humper@google.com 1723aad3b01afc77993ff051c02e49186294e312980humper@google.comvoid GrBicubicEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { 1737d7f31433b627e62f518e9186d3f2d9bd44662e0commit-bot@chromium.org // FIXME: Perhaps we can do better. 1743aad3b01afc77993ff051c02e49186294e312980humper@google.com *validFlags = 0; 1753aad3b01afc77993ff051c02e49186294e312980humper@google.com return; 1763aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1773aad3b01afc77993ff051c02e49186294e312980humper@google.com 178b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrBicubicEffect); 1793aad3b01afc77993ff051c02e49186294e312980humper@google.com 180b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* GrBicubicEffect::TestCreate(SkRandom* random, 181b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrContext* context, 182b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrDrawTargetCaps&, 183b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTexture* textures[]) { 184b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : 185b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrProcessorUnitTest::kAlphaTextureIdx; 1863aad3b01afc77993ff051c02e49186294e312980humper@google.com SkScalar coefficients[16]; 1873aad3b01afc77993ff051c02e49186294e312980humper@google.com for (int i = 0; i < 16; i++) { 1883aad3b01afc77993ff051c02e49186294e312980humper@google.com coefficients[i] = random->nextSScalar1(); 1893aad3b01afc77993ff051c02e49186294e312980humper@google.com } 1903aad3b01afc77993ff051c02e49186294e312980humper@google.com return GrBicubicEffect::Create(textures[texIdx], coefficients); 1913aad3b01afc77993ff051c02e49186294e312980humper@google.com} 1929927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org 1939927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 1949927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org 1959927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.orgbool GrBicubicEffect::ShouldUseBicubic(const SkMatrix& matrix, 1969927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org GrTextureParams::FilterMode* filterMode) { 1979927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org if (matrix.isIdentity()) { 1989927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org *filterMode = GrTextureParams::kNone_FilterMode; 1999927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org return false; 2009927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org } 2019927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org 2029927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org SkScalar scales[2]; 2039927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org if (!matrix.getMinMaxScales(scales) || scales[0] < SK_Scalar1) { 2049927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org // Bicubic doesn't handle arbitrary minimization well, as src texels can be skipped 2059927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org // entirely, 2069927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org *filterMode = GrTextureParams::kMipMap_FilterMode; 2079927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org return false; 2089927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org } 2099927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org // At this point if scales[1] == SK_Scalar1 then the matrix doesn't do any scaling. 2109927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org if (scales[1] == SK_Scalar1) { 2119927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org if (matrix.rectStaysRect() && SkScalarIsInt(matrix.getTranslateX()) && 2129927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org SkScalarIsInt(matrix.getTranslateY())) { 2139927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org *filterMode = GrTextureParams::kNone_FilterMode; 2149927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org } else { 2159927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org // Use bilerp to handle rotation or fractional translation. 2169927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org *filterMode = GrTextureParams::kBilerp_FilterMode; 2179927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org } 2189927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org return false; 2199927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org } 2209927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org // When we use the bicubic filtering effect each sample is read from the texture using 2219927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org // nearest neighbor sampling. 2229927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org *filterMode = GrTextureParams::kNone_FilterMode; 2239927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org return true; 2249927bd355fc1557aa2c98900266ba6f49f806889commit-bot@chromium.org} 225