OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrOvalRenderer.h" | 8 #include "GrOvalRenderer.h" |
9 | 9 |
10 #include "GrEffect.h" | 10 #include "GrEffect.h" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 public: | 84 public: |
85 GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) | 85 GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) |
86 : INHERITED (factory) {} | 86 : INHERITED (factory) {} |
87 | 87 |
88 virtual void emitCode(GrGLShaderBuilder* builder, | 88 virtual void emitCode(GrGLShaderBuilder* builder, |
89 const GrDrawEffect& drawEffect, | 89 const GrDrawEffect& drawEffect, |
90 EffectKey key, | 90 EffectKey key, |
91 const char* outputColor, | 91 const char* outputColor, |
92 const char* inputColor, | 92 const char* inputColor, |
93 const TextureSamplerArray& samplers) SK_OVERRIDE { | 93 const TextureSamplerArray& samplers) SK_OVERRIDE { |
| 94 GrGLShaderBuilder::VertexBuilder* vertexBuilder = builder->getVertex
Builder(); |
| 95 SkASSERT(NULL != vertexBuilder); |
| 96 |
94 const CircleEdgeEffect& circleEffect = drawEffect.castEffect<CircleE
dgeEffect>(); | 97 const CircleEdgeEffect& circleEffect = drawEffect.castEffect<CircleE
dgeEffect>(); |
95 const char *vsName, *fsName; | 98 const char *vsName, *fsName; |
96 builder->addVarying(kVec4f_GrSLType, "CircleEdge", &vsName, &fsName)
; | 99 vertexBuilder->addVarying(kVec4f_GrSLType, "CircleEdge", &vsName, &f
sName); |
97 | 100 |
98 const SkString* attrName = | 101 const SkString* attrName = |
99 builder->getEffectAttributeName(drawEffect.getVertexAttribIndice
s()[0]); | 102 vertexBuilder->getEffectAttributeName(drawEffect.getVertexAttrib
Indices()[0]); |
100 builder->vsCodeAppendf("\t%s = %s;\n", vsName, attrName->c_str()); | 103 vertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsName, attrName->c_str
()); |
101 | 104 |
102 builder->fsCodeAppendf("\tfloat d = length(%s.xy);\n", fsName); | 105 builder->fsCodeAppendf("\tfloat d = length(%s.xy);\n", fsName); |
103 builder->fsCodeAppendf("\tfloat edgeAlpha = clamp(%s.z - d, 0.0, 1.0
);\n", fsName); | 106 builder->fsCodeAppendf("\tfloat edgeAlpha = clamp(%s.z - d, 0.0, 1.0
);\n", fsName); |
104 if (circleEffect.isStroked()) { | 107 if (circleEffect.isStroked()) { |
105 builder->fsCodeAppendf("\tfloat innerAlpha = clamp(d - %s.w, 0.0
, 1.0);\n", fsName); | 108 builder->fsCodeAppendf("\tfloat innerAlpha = clamp(d - %s.w, 0.0
, 1.0);\n", fsName); |
106 builder->fsCodeAppend("\tedgeAlpha *= innerAlpha;\n"); | 109 builder->fsCodeAppend("\tedgeAlpha *= innerAlpha;\n"); |
107 } | 110 } |
108 | 111 |
109 SkString modulate; | 112 SkString modulate; |
110 GrGLSLModulatef<4>(&modulate, inputColor, "edgeAlpha"); | 113 GrGLSLModulatef<4>(&modulate, inputColor, "edgeAlpha"); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 public: | 198 public: |
196 GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) | 199 GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) |
197 : INHERITED (factory) {} | 200 : INHERITED (factory) {} |
198 | 201 |
199 virtual void emitCode(GrGLShaderBuilder* builder, | 202 virtual void emitCode(GrGLShaderBuilder* builder, |
200 const GrDrawEffect& drawEffect, | 203 const GrDrawEffect& drawEffect, |
201 EffectKey key, | 204 EffectKey key, |
202 const char* outputColor, | 205 const char* outputColor, |
203 const char* inputColor, | 206 const char* inputColor, |
204 const TextureSamplerArray& samplers) SK_OVERRIDE { | 207 const TextureSamplerArray& samplers) SK_OVERRIDE { |
| 208 GrGLShaderBuilder::VertexBuilder* vertexBuilder = builder->getVertex
Builder(); |
| 209 SkASSERT(NULL != vertexBuilder); |
| 210 |
205 const EllipseEdgeEffect& ellipseEffect = drawEffect.castEffect<Ellip
seEdgeEffect>(); | 211 const EllipseEdgeEffect& ellipseEffect = drawEffect.castEffect<Ellip
seEdgeEffect>(); |
206 | 212 |
207 const char *vsOffsetName, *fsOffsetName; | 213 const char *vsOffsetName, *fsOffsetName; |
208 const char *vsRadiiName, *fsRadiiName; | 214 const char *vsRadiiName, *fsRadiiName; |
209 | 215 |
210 builder->addVarying(kVec2f_GrSLType, "EllipseOffsets", &vsOffsetName
, &fsOffsetName); | 216 vertexBuilder->addVarying(kVec2f_GrSLType, "EllipseOffsets", &vsOffs
etName, &fsOffsetName); |
211 const SkString* attr0Name = | 217 const SkString* attr0Name = |
212 builder->getEffectAttributeName(drawEffect.getVertexAttribIndice
s()[0]); | 218 vertexBuilder->getEffectAttributeName(drawEffect.getVertexAttrib
Indices()[0]); |
213 builder->vsCodeAppendf("\t%s = %s;\n", vsOffsetName, attr0Name->c_st
r()); | 219 vertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsOffsetName, attr0Name
->c_str()); |
214 | 220 |
215 builder->addVarying(kVec4f_GrSLType, "EllipseRadii", &vsRadiiName, &
fsRadiiName); | 221 vertexBuilder->addVarying(kVec4f_GrSLType, "EllipseRadii", &vsRadiiN
ame, &fsRadiiName); |
216 const SkString* attr1Name = | 222 const SkString* attr1Name = |
217 builder->getEffectAttributeName(drawEffect.getVertexAttribIndice
s()[1]); | 223 vertexBuilder->getEffectAttributeName(drawEffect.getVertexAttrib
Indices()[1]); |
218 builder->vsCodeAppendf("\t%s = %s;\n", vsRadiiName, attr1Name->c_str
()); | 224 vertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsRadiiName, attr1Name-
>c_str()); |
219 | 225 |
220 // for outer curve | 226 // for outer curve |
221 builder->fsCodeAppendf("\tvec2 scaledOffset = %s*%s.xy;\n", fsOffset
Name, fsRadiiName); | 227 builder->fsCodeAppendf("\tvec2 scaledOffset = %s*%s.xy;\n", fsOffset
Name, fsRadiiName); |
222 builder->fsCodeAppend("\tfloat test = dot(scaledOffset, scaledOffset
) - 1.0;\n"); | 228 builder->fsCodeAppend("\tfloat test = dot(scaledOffset, scaledOffset
) - 1.0;\n"); |
223 builder->fsCodeAppendf("\tvec2 grad = 2.0*scaledOffset*%s.xy;\n", fs
RadiiName); | 229 builder->fsCodeAppendf("\tvec2 grad = 2.0*scaledOffset*%s.xy;\n", fs
RadiiName); |
224 builder->fsCodeAppend("\tfloat grad_dot = dot(grad, grad);\n"); | 230 builder->fsCodeAppend("\tfloat grad_dot = dot(grad, grad);\n"); |
225 // we need to clamp the length^2 of the gradiant vector to a non-zer
o value, because | 231 // we need to clamp the length^2 of the gradiant vector to a non-zer
o value, because |
226 // on the Nexus 4 the undefined result of inversesqrt(0) drops out a
n entire tile | 232 // on the Nexus 4 the undefined result of inversesqrt(0) drops out a
n entire tile |
227 // TODO: restrict this to Adreno-only | 233 // TODO: restrict this to Adreno-only |
228 builder->fsCodeAppend("\tgrad_dot = max(grad_dot, 1.0e-4);\n"); | 234 builder->fsCodeAppend("\tgrad_dot = max(grad_dot, 1.0e-4);\n"); |
(...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
851 } | 857 } |
852 | 858 |
853 // drop out the middle quad if we're stroked | 859 // drop out the middle quad if we're stroked |
854 int indexCnt = isStroked ? GR_ARRAY_COUNT(gRRectIndices)-6 : GR_ARRAY_CO
UNT(gRRectIndices); | 860 int indexCnt = isStroked ? GR_ARRAY_COUNT(gRRectIndices)-6 : GR_ARRAY_CO
UNT(gRRectIndices); |
855 target->setIndexSourceToBuffer(indexBuffer); | 861 target->setIndexSourceToBuffer(indexBuffer); |
856 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou
nds); | 862 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou
nds); |
857 } | 863 } |
858 | 864 |
859 return true; | 865 return true; |
860 } | 866 } |
OLD | NEW |