GrTextureDomain.cpp revision fd03d4a829efe2d77a712fd991927c55f59a2ffe
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2012 Google Inc. 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use of this source code is governed by a BSD-style license that can be 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * found in the LICENSE file. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GrTextureDomainEffect.h" 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GrSimpleTextureEffect.h" 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GrTBackendEffectFactory.h" 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "gl/GrGLEffect.h" 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "gl/GrGLEffectMatrix.h" 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkFloatingPoint.h" 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass GrGLTextureDomainEffect : public GrGLEffect { 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrGLTextureDomainEffect(const GrBackendEffectFactory&, const GrDrawEffect&); 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19e982dfc1bae36620f67371efc7b0a0f8adc9450dJeff Sharkey virtual void emitCode(GrGLShaderBuilder*, 20e982dfc1bae36620f67371efc7b0a0f8adc9450dJeff Sharkey const GrDrawEffect&, 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EffectKey, 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* outputColor, 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* inputColor, 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const TextureSamplerArray&) SK_OVERRIDE; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrGLUniformManager::UniformHandle fNameUni; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrGLEffectMatrix fEffectMatrix; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrGLfloat fPrevDomain[4]; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typedef GrGLEffect INHERITED; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGrGLTextureDomainEffect::GrGLTextureDomainEffect(const GrBackendEffectFactory& factory, 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GrDrawEffect& drawEffect) 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : INHERITED(factory) 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , fNameUni(GrGLUniformManager::kInvalidUniformHandle) 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , fEffectMatrix(drawEffect.castEffect<GrTextureDomainEffect>().coordsType()) { 43e982dfc1bae36620f67371efc7b0a0f8adc9450dJeff Sharkey fPrevDomain[0] = SK_FloatNaN; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid GrGLTextureDomainEffect::emitCode(GrGLShaderBuilder* builder, 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GrDrawEffect& drawEffect, 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EffectKey key, 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* outputColor, 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* inputColor, 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const TextureSamplerArray& samplers) { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GrTextureDomainEffect& texDom = drawEffect.castEffect<GrTextureDomainEffect>(); 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* coords; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* domain; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fNameUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kVec4f_GrSLType, "TexDom", &domain); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (GrTextureDomainEffect::kClamp_WrapMode == texDom.wrapMode()) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppendf("\tvec2 clampCoord = clamp(%s, %s.xy, %s.zw);\n", 62e982dfc1bae36620f67371efc7b0a0f8adc9450dJeff Sharkey coords, domain, domain); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppendf("\t%s = ", outputColor); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->appendTextureLookupAndModulate(GrGLShaderBuilder::kFragment_ShaderType, 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inputColor, 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project samplers[0], 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "clampCoord"); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppend(";\n"); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrAssert(GrTextureDomainEffect::kDecal_WrapMode == texDom.wrapMode()); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (kImagination_GrGLVendor == builder->ctxInfo().vendor()) { 74e982dfc1bae36620f67371efc7b0a0f8adc9450dJeff Sharkey // On the NexusS and GalaxyNexus, the other path (with the 'any' 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // call) causes the compilation error "Calls to any function that 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // may require a gradient calculation inside a conditional block 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // may return undefined results". This appears to be an issue with 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the 'any' call since even the simple "result=black; if (any()) 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // result=white;" code fails to compile. 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppend("\tvec4 outside = vec4(0.0, 0.0, 0.0, 0.0);\n"); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppend("\tvec4 inside = "); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->appendTextureLookupAndModulate(GrGLShaderBuilder::kFragment_ShaderType, 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inputColor, 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project samplers[0], 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coords); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppend(";\n"); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppendf("\tfloat x = abs(2.0*(%s.x - %s.x)/(%s.z - %s.x) - 1.0);\n", 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coords, domain, domain, domain); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppendf("\tfloat y = abs(2.0*(%s.y - %s.y)/(%s.w - %s.y) - 1.0);\n", 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coords, domain, domain, domain); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppend("\tfloat blend = step(1.0, max(x, y));\n"); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppendf("\t%s = mix(inside, outside, blend);\n", outputColor); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppend("\tbvec4 outside;\n"); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppendf("\toutside.xy = lessThan(%s, %s.xy);\n", coords, domain); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppendf("\toutside.zw = greaterThan(%s, %s.zw);\n", coords, domain); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppendf("\t%s = any(outside) ? vec4(0.0, 0.0, 0.0, 0.0) : ", outputColor); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->appendTextureLookupAndModulate(GrGLShaderBuilder::kFragment_ShaderType, 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inputColor, 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project samplers[0], 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coords); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project builder->fsCodeAppend(";\n"); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid GrGLTextureDomainEffect::setData(const GrGLUniformManager& uman, 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GrDrawEffect& drawEffect) { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GrTextureDomainEffect& texDom = drawEffect.castEffect<GrTextureDomainEffect>(); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SkRect& domain = texDom.domain(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float values[4] = { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkScalarToFloat(domain.left()), 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkScalarToFloat(domain.top()), 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkScalarToFloat(domain.right()), 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkScalarToFloat(domain.bottom()) 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 119fb0431b5253346feb38677138e1a0a5458abaf57Raph Levien // vertical flip if necessary 120fb0431b5253346feb38677138e1a0a5458abaf57Raph Levien if (kBottomLeft_GrSurfaceOrigin == texDom.texture(0)->origin()) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values[1] = 1.0f - values[1]; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values[3] = 1.0f - values[3]; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The top and bottom were just flipped, so correct the ordering 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // of elements so that values = (l, t, r, b). 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkTSwap(values[1], values[3]); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 != memcmp(values, fPrevDomain, 4 * sizeof(GrGLfloat))) { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uman.set4fv(fNameUni, 0, 1, values); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(fPrevDomain, values, 4 * sizeof(GrGLfloat)); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fEffectMatrix.setData(uman, 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project texDom.getMatrix(), 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawEffect, 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project texDom.texture(0)); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGrGLEffect::EffectKey GrGLTextureDomainEffect::GenKey(const GrDrawEffect& drawEffect, 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GrGLCaps&) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GrTextureDomainEffect& texDom = drawEffect.castEffect<GrTextureDomainEffect>(); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EffectKey key = texDom.wrapMode(); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project key <<= GrGLEffectMatrix::kKeyBits; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EffectKey matrixKey = GrGLEffectMatrix::GenKey(texDom.getMatrix(), 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawEffect, 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project texDom.coordsType(), 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project texDom.texture(0)); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return key | matrixKey; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGrEffectRef* GrTextureDomainEffect::Create(GrTexture* texture, 153fb0431b5253346feb38677138e1a0a5458abaf57Raph Levien const SkMatrix& matrix, 154fb0431b5253346feb38677138e1a0a5458abaf57Raph Levien const SkRect& domain, 155fb0431b5253346feb38677138e1a0a5458abaf57Raph Levien WrapMode wrapMode, 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool bilerp, 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CoordsType coordsType) { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const SkRect kFullRect = {0, 0, SK_Scalar1, SK_Scalar1}; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (kClamp_WrapMode == wrapMode && domain.contains(kFullRect)) { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GrSimpleTextureEffect::Create(texture, matrix, bilerp); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkRect clippedDomain; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We don't currently handle domains that are empty or don't intersect the texture. 164fb0431b5253346feb38677138e1a0a5458abaf57Raph Levien // It is OK if the domain rect is a line or point, but it should not be inverted. We do not 165fb0431b5253346feb38677138e1a0a5458abaf57Raph Levien // handle rects that do not intersect the [0..1]x[0..1] rect. 166fb0431b5253346feb38677138e1a0a5458abaf57Raph Levien GrAssert(domain.fLeft <= domain.fRight); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrAssert(domain.fTop <= domain.fBottom); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clippedDomain.fLeft = SkMaxScalar(domain.fLeft, kFullRect.fLeft); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clippedDomain.fRight = SkMinScalar(domain.fRight, kFullRect.fRight); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clippedDomain.fTop = SkMaxScalar(domain.fTop, kFullRect.fTop); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clippedDomain.fBottom = SkMinScalar(domain.fBottom, kFullRect.fBottom); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrAssert(clippedDomain.fLeft <= clippedDomain.fRight); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrAssert(clippedDomain.fTop <= clippedDomain.fBottom); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoEffectUnref effect(SkNEW_ARGS(GrTextureDomainEffect, (texture, 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project matrix, 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clippedDomain, 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wrapMode, 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bilerp, 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordsType))); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return CreateEffectRef(effect); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGrTextureDomainEffect::GrTextureDomainEffect(GrTexture* texture, 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SkMatrix& matrix, 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SkRect& domain, 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WrapMode wrapMode, 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool bilerp, 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CoordsType coordsType) 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : GrSingleTextureEffect(texture, matrix, bilerp, coordsType) 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , fWrapMode(wrapMode) 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , fTextureDomain(domain) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGrTextureDomainEffect::~GrTextureDomainEffect() { 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199fb0431b5253346feb38677138e1a0a5458abaf57Raph Levien} 200fb0431b5253346feb38677138e1a0a5458abaf57Raph Levien 201fb0431b5253346feb38677138e1a0a5458abaf57Raph Levienconst GrBackendEffectFactory& GrTextureDomainEffect::getFactory() const { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GrTBackendEffectFactory<GrTextureDomainEffect>::getInstance(); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool GrTextureDomainEffect::onIsEqual(const GrEffect& sBase) const { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GrTextureDomainEffect& s = CastEffect<GrTextureDomainEffect>(sBase); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this->hasSameTextureParamsMatrixAndCoordsType(s) && 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->fTextureDomain == s.fTextureDomain; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid GrTextureDomainEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (kDecal_WrapMode == fWrapMode) { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *validFlags = 0; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->updateConstantColorComponentsForModulation(color, validFlags); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGR_DEFINE_EFFECT_TEST(GrTextureDomainEffect); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGrEffectRef* GrTextureDomainEffect::TestCreate(SkMWCRandom* random, 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrContext*, 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GrDrawTargetCaps&, 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrTexture* textures[]) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int texIdx = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx : 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrEffectUnitTest::kAlphaTextureIdx; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkRect domain; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project domain.fLeft = random->nextUScalar1(); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project domain.fRight = random->nextRangeScalar(domain.fLeft, SK_Scalar1); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project domain.fTop = random->nextUScalar1(); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project domain.fBottom = random->nextRangeScalar(domain.fTop, SK_Scalar1); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WrapMode wrapMode = random->nextBool() ? kClamp_WrapMode : kDecal_WrapMode; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SkMatrix& matrix = GrEffectUnitTest::TestMatrix(random); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool bilerp = random->nextBool(); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CoordsType coords = random->nextBool() ? kLocal_CoordsType : kPosition_CoordsType; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GrTextureDomainEffect::Create(textures[texIdx], 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project matrix, 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project domain, 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wrapMode, 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bilerp, 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coords); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project