blob: 7337d8a7fc8f69bf7479565b3120b7f2e15ff31a [file] [log] [blame]
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "GrBezierEffect.h"
9
10#include "gl/GrGLEffect.h"
bsalomon848faf02014-07-11 10:01:02 -070011#include "gl/GrGLShaderBuilder.h"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000012#include "gl/GrGLSL.h"
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000013#include "gl/GrGLVertexEffect.h"
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000014#include "GrTBackendEffectFactory.h"
15
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000016class GrGLConicEffect : public GrGLVertexEffect {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000017public:
18 GrGLConicEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
19
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000020 virtual void emitCode(GrGLFullShaderBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000021 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -070022 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000023 const char* outputColor,
24 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +000025 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000026 const TextureSamplerArray&) SK_OVERRIDE;
27
bsalomon63e99f72014-07-21 08:03:14 -070028 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000029
30 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE {}
31
32private:
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +000033 GrEffectEdgeType fEdgeType;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000034
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000035 typedef GrGLVertexEffect INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000036};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +000037
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000038GrGLConicEffect::GrGLConicEffect(const GrBackendEffectFactory& factory,
39 const GrDrawEffect& drawEffect)
40 : INHERITED (factory) {
41 const GrConicEffect& ce = drawEffect.castEffect<GrConicEffect>();
42 fEdgeType = ce.getEdgeType();
43}
44
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000045void GrGLConicEffect::emitCode(GrGLFullShaderBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000046 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -070047 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000048 const char* outputColor,
49 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +000050 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000051 const TextureSamplerArray& samplers) {
52 const char *vsName, *fsName;
53
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000054 builder->addVarying(kVec4f_GrSLType, "ConicCoeffs",
commit-bot@chromium.org5a02cb42013-08-30 20:17:31 +000055 &vsName, &fsName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000056 const SkString* attr0Name =
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000057 builder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
58 builder->vsCodeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000059
60 builder->fsCodeAppend("\t\tfloat edgeAlpha;\n");
61
62 switch (fEdgeType) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +000063 case kHairlineAA_GrEffectEdgeType: {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000064 SkAssertResult(builder->enableFeature(
65 GrGLShaderBuilder::kStandardDerivatives_GLSLFeature));
66 builder->fsCodeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName);
67 builder->fsCodeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName);
68 builder->fsCodeAppendf("\t\tfloat dfdx =\n"
69 "\t\t\t2.0*%s.x*dklmdx.x - %s.y*dklmdx.z - %s.z*dklmdx.y;\n",
70 fsName, fsName, fsName);
71 builder->fsCodeAppendf("\t\tfloat dfdy =\n"
72 "\t\t\t2.0*%s.x*dklmdy.x - %s.y*dklmdy.z - %s.z*dklmdy.y;\n",
73 fsName, fsName, fsName);
74 builder->fsCodeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n");
75 builder->fsCodeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n");
76 builder->fsCodeAppendf("\t\tfloat func = %s.x*%s.x - %s.y*%s.z;\n", fsName, fsName,
77 fsName, fsName);
78 builder->fsCodeAppend("\t\tfunc = abs(func);\n");
79 builder->fsCodeAppend("\t\tedgeAlpha = func / gFM;\n");
80 builder->fsCodeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n");
81 // Add line below for smooth cubic ramp
82 // builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
83 break;
84 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +000085 case kFillAA_GrEffectEdgeType: {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +000086 SkAssertResult(builder->enableFeature(
87 GrGLShaderBuilder::kStandardDerivatives_GLSLFeature));
88 builder->fsCodeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName);
89 builder->fsCodeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName);
90 builder->fsCodeAppendf("\t\tfloat dfdx =\n"
91 "\t\t\t2.0*%s.x*dklmdx.x - %s.y*dklmdx.z - %s.z*dklmdx.y;\n",
92 fsName, fsName, fsName);
93 builder->fsCodeAppendf("\t\tfloat dfdy =\n"
94 "\t\t\t2.0*%s.x*dklmdy.x - %s.y*dklmdy.z - %s.z*dklmdy.y;\n",
95 fsName, fsName, fsName);
96 builder->fsCodeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n");
97 builder->fsCodeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n");
98 builder->fsCodeAppendf("\t\tfloat func = %s.x*%s.x - %s.y*%s.z;\n", fsName, fsName,
99 fsName, fsName);
100 builder->fsCodeAppend("\t\tedgeAlpha = func / gFM;\n");
101 builder->fsCodeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);\n");
102 // Add line below for smooth cubic ramp
103 // builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
104 break;
105 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000106 case kFillBW_GrEffectEdgeType: {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000107 builder->fsCodeAppendf("\t\tedgeAlpha = %s.x*%s.x - %s.y*%s.z;\n", fsName, fsName,
108 fsName, fsName);
109 builder->fsCodeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n");
110 break;
111 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000112 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000113 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000114 }
115
commit-bot@chromium.org824c3462013-10-10 06:30:18 +0000116 builder->fsCodeAppendf("\t%s = %s;\n", outputColor,
commit-bot@chromium.orga34995e2013-10-23 05:42:03 +0000117 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000118}
119
bsalomon63e99f72014-07-21 08:03:14 -0700120void GrGLConicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&,
121 GrEffectKeyBuilder* b) {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000122 const GrConicEffect& ce = drawEffect.castEffect<GrConicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700123 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
124 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000125}
126
127//////////////////////////////////////////////////////////////////////////////
128
129GrConicEffect::~GrConicEffect() {}
130
131const GrBackendEffectFactory& GrConicEffect::getFactory() const {
132 return GrTBackendEffectFactory<GrConicEffect>::getInstance();
133}
134
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000135GrConicEffect::GrConicEffect(GrEffectEdgeType edgeType) : GrVertexEffect() {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000136 this->addVertexAttrib(kVec4f_GrSLType);
137 fEdgeType = edgeType;
138}
139
140bool GrConicEffect::onIsEqual(const GrEffect& other) const {
141 const GrConicEffect& ce = CastEffect<GrConicEffect>(other);
142 return (ce.fEdgeType == fEdgeType);
143}
144
145//////////////////////////////////////////////////////////////////////////////
146
147GR_DEFINE_EFFECT_TEST(GrConicEffect);
148
bsalomon83d081a2014-07-08 09:56:10 -0700149GrEffect* GrConicEffect::TestCreate(SkRandom* random,
150 GrContext*,
151 const GrDrawTargetCaps& caps,
152 GrTexture*[]) {
153 GrEffect* effect;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000154 do {
155 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
156 random->nextULessThan(kGrEffectEdgeTypeCnt));
157 effect = GrConicEffect::Create(edgeType, caps);
158 } while (NULL == effect);
159 return effect;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000160}
161
162//////////////////////////////////////////////////////////////////////////////
163// Quad
164//////////////////////////////////////////////////////////////////////////////
165
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000166class GrGLQuadEffect : public GrGLVertexEffect {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000167public:
168 GrGLQuadEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
169
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000170 virtual void emitCode(GrGLFullShaderBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000171 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -0700172 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000173 const char* outputColor,
174 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +0000175 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000176 const TextureSamplerArray&) SK_OVERRIDE;
177
bsalomon63e99f72014-07-21 08:03:14 -0700178 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000179
180 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE {}
181
182private:
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000183 GrEffectEdgeType fEdgeType;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000184
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000185 typedef GrGLVertexEffect INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000186};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000187
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000188GrGLQuadEffect::GrGLQuadEffect(const GrBackendEffectFactory& factory,
189 const GrDrawEffect& drawEffect)
190 : INHERITED (factory) {
191 const GrQuadEffect& ce = drawEffect.castEffect<GrQuadEffect>();
192 fEdgeType = ce.getEdgeType();
193}
194
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000195void GrGLQuadEffect::emitCode(GrGLFullShaderBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000196 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -0700197 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000198 const char* outputColor,
199 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +0000200 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000201 const TextureSamplerArray& samplers) {
202 const char *vsName, *fsName;
203
204 const SkString* attrName =
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000205 builder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000206 builder->fsCodeAppendf("\t\tfloat edgeAlpha;\n");
207
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000208 builder->addVarying(kVec4f_GrSLType, "HairQuadEdge", &vsName, &fsName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000209
210 switch (fEdgeType) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000211 case kHairlineAA_GrEffectEdgeType: {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000212 SkAssertResult(builder->enableFeature(
213 GrGLShaderBuilder::kStandardDerivatives_GLSLFeature));
214 builder->fsCodeAppendf("\t\tvec2 duvdx = dFdx(%s.xy);\n", fsName);
215 builder->fsCodeAppendf("\t\tvec2 duvdy = dFdy(%s.xy);\n", fsName);
216 builder->fsCodeAppendf("\t\tvec2 gF = vec2(2.0*%s.x*duvdx.x - duvdx.y,\n"
217 "\t\t 2.0*%s.x*duvdy.x - duvdy.y);\n",
218 fsName, fsName);
219 builder->fsCodeAppendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsName, fsName,
220 fsName);
221 builder->fsCodeAppend("\t\tedgeAlpha = sqrt(edgeAlpha*edgeAlpha / dot(gF, gF));\n");
222 builder->fsCodeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n");
223 // Add line below for smooth cubic ramp
224 // builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
225 break;
226 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000227 case kFillAA_GrEffectEdgeType: {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000228 SkAssertResult(builder->enableFeature(
229 GrGLShaderBuilder::kStandardDerivatives_GLSLFeature));
230 builder->fsCodeAppendf("\t\tvec2 duvdx = dFdx(%s.xy);\n", fsName);
231 builder->fsCodeAppendf("\t\tvec2 duvdy = dFdy(%s.xy);\n", fsName);
232 builder->fsCodeAppendf("\t\tvec2 gF = vec2(2.0*%s.x*duvdx.x - duvdx.y,\n"
233 "\t\t 2.0*%s.x*duvdy.x - duvdy.y);\n",
234 fsName, fsName);
235 builder->fsCodeAppendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsName, fsName,
236 fsName);
237 builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha / sqrt(dot(gF, gF));\n");
238 builder->fsCodeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);\n");
239 // Add line below for smooth cubic ramp
240 // builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
241 break;
242 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000243 case kFillBW_GrEffectEdgeType: {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000244 builder->fsCodeAppendf("\t\tedgeAlpha = (%s.x*%s.x - %s.y);\n", fsName, fsName,
245 fsName);
246 builder->fsCodeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n");
247 break;
248 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000249 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000250 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000251 }
252
commit-bot@chromium.org824c3462013-10-10 06:30:18 +0000253 builder->fsCodeAppendf("\t%s = %s;\n", outputColor,
commit-bot@chromium.orga34995e2013-10-23 05:42:03 +0000254 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str());
commit-bot@chromium.org824c3462013-10-10 06:30:18 +0000255
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000256
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000257 builder->vsCodeAppendf("\t%s = %s;\n", vsName, attrName->c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000258}
259
bsalomon63e99f72014-07-21 08:03:14 -0700260void GrGLQuadEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&,
261 GrEffectKeyBuilder* b) {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000262 const GrQuadEffect& ce = drawEffect.castEffect<GrQuadEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700263 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
264 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000265}
266
267//////////////////////////////////////////////////////////////////////////////
268
269GrQuadEffect::~GrQuadEffect() {}
270
271const GrBackendEffectFactory& GrQuadEffect::getFactory() const {
272 return GrTBackendEffectFactory<GrQuadEffect>::getInstance();
273}
274
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000275GrQuadEffect::GrQuadEffect(GrEffectEdgeType edgeType) : GrVertexEffect() {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000276 this->addVertexAttrib(kVec4f_GrSLType);
277 fEdgeType = edgeType;
278}
279
280bool GrQuadEffect::onIsEqual(const GrEffect& other) const {
281 const GrQuadEffect& ce = CastEffect<GrQuadEffect>(other);
282 return (ce.fEdgeType == fEdgeType);
283}
284
285//////////////////////////////////////////////////////////////////////////////
286
287GR_DEFINE_EFFECT_TEST(GrQuadEffect);
288
bsalomon83d081a2014-07-08 09:56:10 -0700289GrEffect* GrQuadEffect::TestCreate(SkRandom* random,
290 GrContext*,
291 const GrDrawTargetCaps& caps,
292 GrTexture*[]) {
293 GrEffect* effect;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000294 do {
295 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
296 random->nextULessThan(kGrEffectEdgeTypeCnt));
297 effect = GrQuadEffect::Create(edgeType, caps);
298 } while (NULL == effect);
299 return effect;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000300}
301
302//////////////////////////////////////////////////////////////////////////////
303// Cubic
304//////////////////////////////////////////////////////////////////////////////
305
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000306class GrGLCubicEffect : public GrGLVertexEffect {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000307public:
308 GrGLCubicEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
309
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000310 virtual void emitCode(GrGLFullShaderBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000311 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -0700312 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000313 const char* outputColor,
314 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +0000315 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000316 const TextureSamplerArray&) SK_OVERRIDE;
317
bsalomon63e99f72014-07-21 08:03:14 -0700318 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000319
320 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE {}
321
322private:
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000323 GrEffectEdgeType fEdgeType;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000324
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000325 typedef GrGLVertexEffect INHERITED;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000326};
skia.committer@gmail.com44a77c82013-08-23 07:01:29 +0000327
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000328GrGLCubicEffect::GrGLCubicEffect(const GrBackendEffectFactory& factory,
329 const GrDrawEffect& drawEffect)
330 : INHERITED (factory) {
331 const GrCubicEffect& ce = drawEffect.castEffect<GrCubicEffect>();
332 fEdgeType = ce.getEdgeType();
333}
334
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000335void GrGLCubicEffect::emitCode(GrGLFullShaderBuilder* builder,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000336 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -0700337 const GrEffectKey& key,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000338 const char* outputColor,
339 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +0000340 const TransformedCoordsArray&,
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000341 const TextureSamplerArray& samplers) {
342 const char *vsName, *fsName;
343
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000344 builder->addVarying(kVec4f_GrSLType, "CubicCoeffs",
commit-bot@chromium.org5a02cb42013-08-30 20:17:31 +0000345 &vsName, &fsName);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000346 const SkString* attr0Name =
commit-bot@chromium.org261dc562013-10-04 15:42:56 +0000347 builder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]);
348 builder->vsCodeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000349
350 builder->fsCodeAppend("\t\tfloat edgeAlpha;\n");
351
352 switch (fEdgeType) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000353 case kHairlineAA_GrEffectEdgeType: {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000354 SkAssertResult(builder->enableFeature(
355 GrGLShaderBuilder::kStandardDerivatives_GLSLFeature));
356 builder->fsCodeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName);
357 builder->fsCodeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName);
358 builder->fsCodeAppendf("\t\tfloat dfdx =\n"
359 "\t\t3.0*%s.x*%s.x*dklmdx.x - %s.y*dklmdx.z - %s.z*dklmdx.y;\n",
360 fsName, fsName, fsName, fsName);
361 builder->fsCodeAppendf("\t\tfloat dfdy =\n"
362 "\t\t3.0*%s.x*%s.x*dklmdy.x - %s.y*dklmdy.z - %s.z*dklmdy.y;\n",
363 fsName, fsName, fsName, fsName);
364 builder->fsCodeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n");
365 builder->fsCodeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n");
366 builder->fsCodeAppendf("\t\tfloat func = %s.x*%s.x*%s.x - %s.y*%s.z;\n",
367 fsName, fsName, fsName, fsName, fsName);
368 builder->fsCodeAppend("\t\tfunc = abs(func);\n");
369 builder->fsCodeAppend("\t\tedgeAlpha = func / gFM;\n");
370 builder->fsCodeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n");
371 // Add line below for smooth cubic ramp
372 // builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
373 break;
374 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000375 case kFillAA_GrEffectEdgeType: {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000376 SkAssertResult(builder->enableFeature(
377 GrGLShaderBuilder::kStandardDerivatives_GLSLFeature));
378 builder->fsCodeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName);
379 builder->fsCodeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName);
380 builder->fsCodeAppendf("\t\tfloat dfdx =\n"
381 "\t\t3.0*%s.x*%s.x*dklmdx.x - %s.y*dklmdx.z - %s.z*dklmdx.y;\n",
382 fsName, fsName, fsName, fsName);
383 builder->fsCodeAppendf("\t\tfloat dfdy =\n"
384 "\t\t3.0*%s.x*%s.x*dklmdy.x - %s.y*dklmdy.z - %s.z*dklmdy.y;\n",
385 fsName, fsName, fsName, fsName);
386 builder->fsCodeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n");
387 builder->fsCodeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n");
388 builder->fsCodeAppendf("\t\tfloat func = %s.x*%s.x*%s.x - %s.y*%s.z;\n",
389 fsName, fsName, fsName, fsName, fsName);
390 builder->fsCodeAppend("\t\tedgeAlpha = func / gFM;\n");
391 builder->fsCodeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);\n");
392 // Add line below for smooth cubic ramp
393 // builder->fsCodeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);\n");
394 break;
395 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000396 case kFillBW_GrEffectEdgeType: {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000397 builder->fsCodeAppendf("\t\tedgeAlpha = %s.x*%s.x*%s.x - %s.y*%s.z;\n",
398 fsName, fsName, fsName, fsName, fsName);
399 builder->fsCodeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n");
400 break;
401 }
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000402 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000403 SkFAIL("Shouldn't get here");
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000404 }
405
commit-bot@chromium.org824c3462013-10-10 06:30:18 +0000406 builder->fsCodeAppendf("\t%s = %s;\n", outputColor,
commit-bot@chromium.orga34995e2013-10-23 05:42:03 +0000407 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str());
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000408}
409
bsalomon63e99f72014-07-21 08:03:14 -0700410void GrGLCubicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&,
411 GrEffectKeyBuilder* b) {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000412 const GrCubicEffect& ce = drawEffect.castEffect<GrCubicEffect>();
bsalomon63e99f72014-07-21 08:03:14 -0700413 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2;
414 b->add32(key);
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000415}
416
417//////////////////////////////////////////////////////////////////////////////
418
419GrCubicEffect::~GrCubicEffect() {}
420
421const GrBackendEffectFactory& GrCubicEffect::getFactory() const {
422 return GrTBackendEffectFactory<GrCubicEffect>::getInstance();
423}
424
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000425GrCubicEffect::GrCubicEffect(GrEffectEdgeType edgeType) : GrVertexEffect() {
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000426 this->addVertexAttrib(kVec4f_GrSLType);
427 fEdgeType = edgeType;
428}
429
430bool GrCubicEffect::onIsEqual(const GrEffect& other) const {
431 const GrCubicEffect& ce = CastEffect<GrCubicEffect>(other);
432 return (ce.fEdgeType == fEdgeType);
433}
434
435//////////////////////////////////////////////////////////////////////////////
436
437GR_DEFINE_EFFECT_TEST(GrCubicEffect);
438
bsalomon83d081a2014-07-08 09:56:10 -0700439GrEffect* GrCubicEffect::TestCreate(SkRandom* random,
440 GrContext*,
441 const GrDrawTargetCaps& caps,
442 GrTexture*[]) {
443 GrEffect* effect;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000444 do {
445 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
446 random->nextULessThan(kGrEffectEdgeTypeCnt));
447 effect = GrCubicEffect::Create(edgeType, caps);
448 } while (NULL == effect);
449 return effect;
commit-bot@chromium.org07e1c3f2013-08-22 20:41:15 +0000450}