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