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