107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org/*
207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Copyright 2013 Google Inc.
307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org *
407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * found in the LICENSE file.
607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org */
707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org#include "GrBezierEffect.h"
907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
1007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org#include "gl/GrGLEffect.h"
1107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org#include "gl/GrGLSL.h"
12261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org#include "gl/GrGLVertexEffect.h"
1307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org#include "GrTBackendEffectFactory.h"
1407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
15261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgclass GrGLConicEffect : public GrGLVertexEffect {
1607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgpublic:
1707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    GrGLConicEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
1807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
19261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org    virtual void emitCode(GrGLFullShaderBuilder* builder,
2007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          const GrDrawEffect& drawEffect,
2107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          EffectKey key,
2207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          const char* outputColor,
2307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          const char* inputColor,
2477af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com                          const TransformedCoordsArray&,
2507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          const TextureSamplerArray&) SK_OVERRIDE;
2607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
2707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&);
2807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
2907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE {}
3007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
3107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgprivate:
32cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    GrEffectEdgeType fEdgeType;
3307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
34261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org    typedef GrGLVertexEffect INHERITED;
3507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org};
3644a77c8158016996f79eb0ac98bb85996174bb89skia.committer@gmail.com
3707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgGrGLConicEffect::GrGLConicEffect(const GrBackendEffectFactory& factory,
3807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                 const GrDrawEffect& drawEffect)
3907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    : INHERITED (factory) {
4007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const GrConicEffect& ce = drawEffect.castEffect<GrConicEffect>();
4107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    fEdgeType = ce.getEdgeType();
4207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
4307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
44261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgvoid GrGLConicEffect::emitCode(GrGLFullShaderBuilder* builder,
4507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                               const GrDrawEffect& drawEffect,
4607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                               EffectKey key,
4707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                               const char* outputColor,
4807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                               const char* inputColor,
4977af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com                               const TransformedCoordsArray&,
5007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                               const TextureSamplerArray& samplers) {
5107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const char *vsName, *fsName;
5207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
53261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org    builder->addVarying(kVec4f_GrSLType, "ConicCoeffs",
545a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org                              &vsName, &fsName);
5507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const SkString* attr0Name =
56261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org        builder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
57261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org    builder->vsCodeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str());
5807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
5907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    builder->fsCodeAppend("\t\tfloat edgeAlpha;\n");
6007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
6107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    switch (fEdgeType) {
62cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        case kHairlineAA_GrEffectEdgeType: {
6307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            SkAssertResult(builder->enableFeature(
6407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                    GrGLShaderBuilder::kStandardDerivatives_GLSLFeature));
6507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName);
6607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName);
6707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tfloat dfdx =\n"
6807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   "\t\t\t2.0*%s.x*dklmdx.x - %s.y*dklmdx.z - %s.z*dklmdx.y;\n",
6907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName, fsName);
7007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tfloat dfdy =\n"
7107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   "\t\t\t2.0*%s.x*dklmdy.x - %s.y*dklmdy.z - %s.z*dklmdy.y;\n",
7207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName, fsName);
7307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n");
7407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n");
7507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tfloat func = %s.x*%s.x - %s.y*%s.z;\n", fsName, fsName,
7607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName);
7707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tfunc = abs(func);\n");
7807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = func / gFM;\n");
7907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n");
8007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            // Add line below for smooth cubic ramp
8107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            // builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
8207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            break;
8307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        }
84cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        case kFillAA_GrEffectEdgeType: {
8507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            SkAssertResult(builder->enableFeature(
8607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                    GrGLShaderBuilder::kStandardDerivatives_GLSLFeature));
8707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName);
8807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName);
8907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tfloat dfdx =\n"
9007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   "\t\t\t2.0*%s.x*dklmdx.x - %s.y*dklmdx.z - %s.z*dklmdx.y;\n",
9107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName, fsName);
9207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tfloat dfdy =\n"
9307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   "\t\t\t2.0*%s.x*dklmdy.x - %s.y*dklmdy.z - %s.z*dklmdy.y;\n",
9407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName, fsName);
9507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n");
9607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n");
9707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tfloat func = %s.x*%s.x - %s.y*%s.z;\n", fsName, fsName,
9807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName);
9907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = func / gFM;\n");
10007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);\n");
10107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            // Add line below for smooth cubic ramp
10207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            // builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
10307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            break;
10407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        }
105cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        case kFillBW_GrEffectEdgeType: {
10607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tedgeAlpha = %s.x*%s.x - %s.y*%s.z;\n", fsName, fsName,
10707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName);
10807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n");
10907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            break;
11007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        }
111cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        default:
11288cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org            SkFAIL("Shouldn't get here");
11307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    }
11407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
115824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org    builder->fsCodeAppendf("\t%s = %s;\n", outputColor,
116a34995e18b1f0a7d8c9f23451718bb30ff0105b0commit-bot@chromium.org                           (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str());
11707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
11807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
11907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgGrGLEffect::EffectKey GrGLConicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&) {
12007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const GrConicEffect& ce = drawEffect.castEffect<GrConicEffect>();
12107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    return ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
12207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
12307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
12407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
12507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
12607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgGrConicEffect::~GrConicEffect() {}
12707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
12807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgconst GrBackendEffectFactory& GrConicEffect::getFactory() const {
12907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    return GrTBackendEffectFactory<GrConicEffect>::getInstance();
13007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
13107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
132cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.orgGrConicEffect::GrConicEffect(GrEffectEdgeType edgeType) : GrVertexEffect() {
13307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    this->addVertexAttrib(kVec4f_GrSLType);
13407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    fEdgeType = edgeType;
13507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
13607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
13707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgbool GrConicEffect::onIsEqual(const GrEffect& other) const {
13807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const GrConicEffect& ce = CastEffect<GrConicEffect>(other);
13907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    return (ce.fEdgeType == fEdgeType);
14007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
14107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
14207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
14307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
14407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgGR_DEFINE_EFFECT_TEST(GrConicEffect);
14507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
146e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgGrEffectRef* GrConicEffect::TestCreate(SkRandom* random,
14707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                             GrContext*,
14807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                             const GrDrawTargetCaps& caps,
14907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                             GrTexture*[]) {
150cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    GrEffectRef* effect;
151cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    do {
152cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
153cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                                                    random->nextULessThan(kGrEffectEdgeTypeCnt));
154cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        effect = GrConicEffect::Create(edgeType, caps);
155cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    } while (NULL == effect);
156cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    return effect;
15707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
15807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
15907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
16007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org// Quad
16107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
16207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
163261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgclass GrGLQuadEffect : public GrGLVertexEffect {
16407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgpublic:
16507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    GrGLQuadEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
16607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
167261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org    virtual void emitCode(GrGLFullShaderBuilder* builder,
16807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          const GrDrawEffect& drawEffect,
16907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          EffectKey key,
17007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          const char* outputColor,
17107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          const char* inputColor,
17277af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com                          const TransformedCoordsArray&,
17307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          const TextureSamplerArray&) SK_OVERRIDE;
17407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
17507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&);
17607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
17707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE {}
17807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
17907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgprivate:
180cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    GrEffectEdgeType fEdgeType;
18107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
182261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org    typedef GrGLVertexEffect INHERITED;
18307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org};
18444a77c8158016996f79eb0ac98bb85996174bb89skia.committer@gmail.com
18507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgGrGLQuadEffect::GrGLQuadEffect(const GrBackendEffectFactory& factory,
18607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                 const GrDrawEffect& drawEffect)
18707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    : INHERITED (factory) {
18807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const GrQuadEffect& ce = drawEffect.castEffect<GrQuadEffect>();
18907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    fEdgeType = ce.getEdgeType();
19007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
19107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
192261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgvoid GrGLQuadEffect::emitCode(GrGLFullShaderBuilder* builder,
19307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                              const GrDrawEffect& drawEffect,
19407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                              EffectKey key,
19507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                              const char* outputColor,
19607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                              const char* inputColor,
19777af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com                              const TransformedCoordsArray&,
19807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                              const TextureSamplerArray& samplers) {
19907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const char *vsName, *fsName;
20007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
20107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const SkString* attrName =
202261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org        builder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
20307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    builder->fsCodeAppendf("\t\tfloat edgeAlpha;\n");
20407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
205261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org    builder->addVarying(kVec4f_GrSLType, "HairQuadEdge", &vsName, &fsName);
20607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
20707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    switch (fEdgeType) {
208cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        case kHairlineAA_GrEffectEdgeType: {
20907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            SkAssertResult(builder->enableFeature(
21007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                    GrGLShaderBuilder::kStandardDerivatives_GLSLFeature));
21107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec2 duvdx = dFdx(%s.xy);\n", fsName);
21207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec2 duvdy = dFdy(%s.xy);\n", fsName);
21307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec2 gF = vec2(2.0*%s.x*duvdx.x - duvdx.y,\n"
21407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   "\t\t               2.0*%s.x*duvdy.x - duvdy.y);\n",
21507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName);
21607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsName, fsName,
21707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName);
21807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = sqrt(edgeAlpha*edgeAlpha / dot(gF, gF));\n");
21907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n");
22007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            // Add line below for smooth cubic ramp
22107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            // builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
22207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            break;
22307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        }
224cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        case kFillAA_GrEffectEdgeType: {
22507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            SkAssertResult(builder->enableFeature(
22607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                    GrGLShaderBuilder::kStandardDerivatives_GLSLFeature));
22707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec2 duvdx = dFdx(%s.xy);\n", fsName);
22807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec2 duvdy = dFdy(%s.xy);\n", fsName);
22907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec2 gF = vec2(2.0*%s.x*duvdx.x - duvdx.y,\n"
23007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   "\t\t               2.0*%s.x*duvdy.x - duvdy.y);\n",
23107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName);
23207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsName, fsName,
23307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName);
23407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha / sqrt(dot(gF, gF));\n");
23507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);\n");
23607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            // Add line below for smooth cubic ramp
23707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            // builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
23807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            break;
23907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        }
240cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        case kFillBW_GrEffectEdgeType: {
24107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsName, fsName,
24207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName);
24307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n");
24407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            break;
24507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        }
246cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        default:
24788cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org            SkFAIL("Shouldn't get here");
24807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    }
24907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
250824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org    builder->fsCodeAppendf("\t%s = %s;\n", outputColor,
251a34995e18b1f0a7d8c9f23451718bb30ff0105b0commit-bot@chromium.org                           (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str());
252824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org
25307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
254261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org    builder->vsCodeAppendf("\t%s = %s;\n", vsName, attrName->c_str());
25507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
25607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
25707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgGrGLEffect::EffectKey GrGLQuadEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&) {
25807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const GrQuadEffect& ce = drawEffect.castEffect<GrQuadEffect>();
25907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    return ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
26007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
26107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
26207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
26307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
26407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgGrQuadEffect::~GrQuadEffect() {}
26507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
26607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgconst GrBackendEffectFactory& GrQuadEffect::getFactory() const {
26707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    return GrTBackendEffectFactory<GrQuadEffect>::getInstance();
26807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
26907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
270cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.orgGrQuadEffect::GrQuadEffect(GrEffectEdgeType edgeType) : GrVertexEffect() {
27107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    this->addVertexAttrib(kVec4f_GrSLType);
27207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    fEdgeType = edgeType;
27307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
27407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
27507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgbool GrQuadEffect::onIsEqual(const GrEffect& other) const {
27607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const GrQuadEffect& ce = CastEffect<GrQuadEffect>(other);
27707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    return (ce.fEdgeType == fEdgeType);
27807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
27907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
28007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
28107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
28207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgGR_DEFINE_EFFECT_TEST(GrQuadEffect);
28307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
284e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgGrEffectRef* GrQuadEffect::TestCreate(SkRandom* random,
28507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                             GrContext*,
28607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                             const GrDrawTargetCaps& caps,
28707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                             GrTexture*[]) {
288cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    GrEffectRef* effect;
289cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    do {
290cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
291cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                                                    random->nextULessThan(kGrEffectEdgeTypeCnt));
292cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        effect = GrQuadEffect::Create(edgeType, caps);
293cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    } while (NULL == effect);
294cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    return effect;
29507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
29607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
29707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
29807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org// Cubic
29907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
30007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
301261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgclass GrGLCubicEffect : public GrGLVertexEffect {
30207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgpublic:
30307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    GrGLCubicEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
30407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
305261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org    virtual void emitCode(GrGLFullShaderBuilder* builder,
30607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          const GrDrawEffect& drawEffect,
30707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          EffectKey key,
30807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          const char* outputColor,
30907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          const char* inputColor,
31077af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com                          const TransformedCoordsArray&,
31107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                          const TextureSamplerArray&) SK_OVERRIDE;
31207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
31307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&);
31407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
31507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE {}
31607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
31707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgprivate:
318cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    GrEffectEdgeType fEdgeType;
31907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
320261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org    typedef GrGLVertexEffect INHERITED;
32107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org};
32244a77c8158016996f79eb0ac98bb85996174bb89skia.committer@gmail.com
32307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgGrGLCubicEffect::GrGLCubicEffect(const GrBackendEffectFactory& factory,
32407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                 const GrDrawEffect& drawEffect)
32507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    : INHERITED (factory) {
32607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const GrCubicEffect& ce = drawEffect.castEffect<GrCubicEffect>();
32707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    fEdgeType = ce.getEdgeType();
32807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
32907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
330261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgvoid GrGLCubicEffect::emitCode(GrGLFullShaderBuilder* builder,
33107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                               const GrDrawEffect& drawEffect,
33207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                               EffectKey key,
33307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                               const char* outputColor,
33407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                               const char* inputColor,
33577af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com                               const TransformedCoordsArray&,
33607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                               const TextureSamplerArray& samplers) {
33707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const char *vsName, *fsName;
33807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
339261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org    builder->addVarying(kVec4f_GrSLType, "CubicCoeffs",
3405a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org                              &vsName, &fsName);
34107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const SkString* attr0Name =
342261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org        builder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
343261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org    builder->vsCodeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str());
34407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
34507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    builder->fsCodeAppend("\t\tfloat edgeAlpha;\n");
34607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
34707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    switch (fEdgeType) {
348cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        case kHairlineAA_GrEffectEdgeType: {
34907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            SkAssertResult(builder->enableFeature(
35007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                    GrGLShaderBuilder::kStandardDerivatives_GLSLFeature));
35107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName);
35207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName);
35307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tfloat dfdx =\n"
35407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   "\t\t3.0*%s.x*%s.x*dklmdx.x - %s.y*dklmdx.z - %s.z*dklmdx.y;\n",
35507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName, fsName, fsName);
35607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tfloat dfdy =\n"
35707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   "\t\t3.0*%s.x*%s.x*dklmdy.x - %s.y*dklmdy.z - %s.z*dklmdy.y;\n",
35807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName, fsName, fsName);
35907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n");
36007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n");
36107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tfloat func = %s.x*%s.x*%s.x - %s.y*%s.z;\n",
36207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName, fsName, fsName, fsName);
36307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tfunc = abs(func);\n");
36407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = func / gFM;\n");
36507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n");
36607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            // Add line below for smooth cubic ramp
36707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            // builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
36807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            break;
36907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        }
370cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        case kFillAA_GrEffectEdgeType: {
37107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            SkAssertResult(builder->enableFeature(
37207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                    GrGLShaderBuilder::kStandardDerivatives_GLSLFeature));
37307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName);
37407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName);
37507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tfloat dfdx =\n"
37607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   "\t\t3.0*%s.x*%s.x*dklmdx.x - %s.y*dklmdx.z - %s.z*dklmdx.y;\n",
37707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName, fsName, fsName);
37807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tfloat dfdy =\n"
37907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   "\t\t3.0*%s.x*%s.x*dklmdy.x - %s.y*dklmdy.z - %s.z*dklmdy.y;\n",
38007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName, fsName, fsName);
38107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n");
38207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n");
38307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tfloat func = %s.x*%s.x*%s.x - %s.y*%s.z;\n",
38407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName, fsName, fsName, fsName);
38507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = func / gFM;\n");
38607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);\n");
38707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            // Add line below for smooth cubic ramp
38807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            // builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
38907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            break;
39007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        }
391cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        case kFillBW_GrEffectEdgeType: {
39207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppendf("\t\tedgeAlpha = %s.x*%s.x*%s.x - %s.y*%s.z;\n",
39307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                   fsName, fsName, fsName, fsName, fsName);
39407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            builder->fsCodeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n");
39507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org            break;
39607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        }
397cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        default:
39888cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org            SkFAIL("Shouldn't get here");
39907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    }
40007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
401824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org    builder->fsCodeAppendf("\t%s = %s;\n", outputColor,
402a34995e18b1f0a7d8c9f23451718bb30ff0105b0commit-bot@chromium.org                           (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str());
40307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
40407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
40507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgGrGLEffect::EffectKey GrGLCubicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&) {
40607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const GrCubicEffect& ce = drawEffect.castEffect<GrCubicEffect>();
40707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    return ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
40807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
40907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
41007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
41107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
41207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgGrCubicEffect::~GrCubicEffect() {}
41307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
41407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgconst GrBackendEffectFactory& GrCubicEffect::getFactory() const {
41507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    return GrTBackendEffectFactory<GrCubicEffect>::getInstance();
41607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
41707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
418cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.orgGrCubicEffect::GrCubicEffect(GrEffectEdgeType edgeType) : GrVertexEffect() {
41907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    this->addVertexAttrib(kVec4f_GrSLType);
42007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    fEdgeType = edgeType;
42107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
42207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
42307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgbool GrCubicEffect::onIsEqual(const GrEffect& other) const {
42407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    const GrCubicEffect& ce = CastEffect<GrCubicEffect>(other);
42507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    return (ce.fEdgeType == fEdgeType);
42607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
42707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
42807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
42907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
43007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgGR_DEFINE_EFFECT_TEST(GrCubicEffect);
43107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
432e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgGrEffectRef* GrCubicEffect::TestCreate(SkRandom* random,
43307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                             GrContext*,
43407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                             const GrDrawTargetCaps& caps,
43507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                             GrTexture*[]) {
436cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    GrEffectRef* effect;
437cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    do {
438cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
439cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                                                    random->nextULessThan(kGrEffectEdgeTypeCnt));
440cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        effect = GrCubicEffect::Create(edgeType, caps);
441cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    } while (NULL == effect);
442cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org    return effect;
44307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org}
444