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 "gl/builders/GrGLProgramBuilder.h" | 10 #include "gl/builders/GrGLProgramBuilder.h" |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 : INHERITED (factory) {} | 93 : INHERITED (factory) {} |
94 | 94 |
95 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 95 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
96 const CircleEdgeEffect& circleEffect = args.fGP.cast<CircleEdgeEffec
t>(); | 96 const CircleEdgeEffect& circleEffect = args.fGP.cast<CircleEdgeEffec
t>(); |
97 GrGLVertToFrag v(kVec4f_GrSLType); | 97 GrGLVertToFrag v(kVec4f_GrSLType); |
98 args.fPB->addVarying("CircleEdge", &v); | 98 args.fPB->addVarying("CircleEdge", &v); |
99 | 99 |
100 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();; | 100 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();; |
101 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), circleEffect.inCircleE
dge().c_str()); | 101 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), circleEffect.inCircleE
dge().c_str()); |
102 | 102 |
103 // setup position varying | |
104 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), | |
105 vsBuilder->uViewM(), vsBuilder->inPosition())
; | |
106 | |
107 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 103 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); |
108 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); | 104 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); |
109 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z - d, 0.0, 1.0);
", v.fsIn()); | 105 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z - d, 0.0, 1.0);
", v.fsIn()); |
110 if (circleEffect.isStroked()) { | 106 if (circleEffect.isStroked()) { |
111 fsBuilder->codeAppendf("float innerAlpha = clamp(d - %s.w, 0.0,
1.0);", | 107 fsBuilder->codeAppendf("float innerAlpha = clamp(d - %s.w, 0.0,
1.0);", |
112 v.fsIn()); | 108 v.fsIn()); |
113 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); | 109 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); |
114 } | 110 } |
115 | 111 |
116 fsBuilder->codeAppendf("%s = %s;\n", args.fOutput, | 112 fsBuilder->codeAppendf("%s = %s;\n", args.fOutput, |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 | 212 |
217 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 213 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
218 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), | 214 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), |
219 ellipseEffect.inEllipseOffset().c_str()); | 215 ellipseEffect.inEllipseOffset().c_str()); |
220 | 216 |
221 GrGLVertToFrag ellipseRadii(kVec4f_GrSLType); | 217 GrGLVertToFrag ellipseRadii(kVec4f_GrSLType); |
222 args.fPB->addVarying("EllipseRadii", &ellipseRadii); | 218 args.fPB->addVarying("EllipseRadii", &ellipseRadii); |
223 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), | 219 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), |
224 ellipseEffect.inEllipseRadii().c_str()); | 220 ellipseEffect.inEllipseRadii().c_str()); |
225 | 221 |
226 // setup position varying | |
227 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), | |
228 vsBuilder->uViewM(), vsBuilder->inPosition())
; | |
229 | |
230 // for outer curve | 222 // for outer curve |
231 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 223 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); |
232 fsBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOffse
ts.fsIn(), | 224 fsBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOffse
ts.fsIn(), |
233 ellipseRadii.fsIn()); | 225 ellipseRadii.fsIn()); |
234 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); | 226 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); |
235 fsBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", ellips
eRadii.fsIn()); | 227 fsBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", ellips
eRadii.fsIn()); |
236 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);"); | 228 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);"); |
237 | 229 |
238 // avoid calling inversesqrt on zero. | 230 // avoid calling inversesqrt on zero. |
239 fsBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); | 231 fsBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 | 358 |
367 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 359 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
368 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), | 360 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), |
369 ellipseEffect.inEllipseOffsets0().c_str()); | 361 ellipseEffect.inEllipseOffsets0().c_str()); |
370 | 362 |
371 GrGLVertToFrag offsets1(kVec2f_GrSLType); | 363 GrGLVertToFrag offsets1(kVec2f_GrSLType); |
372 args.fPB->addVarying("EllipseOffsets1", &offsets1); | 364 args.fPB->addVarying("EllipseOffsets1", &offsets1); |
373 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), | 365 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), |
374 ellipseEffect.inEllipseOffsets1().c_str()); | 366 ellipseEffect.inEllipseOffsets1().c_str()); |
375 | 367 |
376 // setup position varying | |
377 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), | |
378 vsBuilder->uViewM(), vsBuilder->inPosition())
; | |
379 | |
380 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 368 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); |
381 SkAssertResult(fsBuilder->enableFeature( | 369 SkAssertResult(fsBuilder->enableFeature( |
382 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 370 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); |
383 // for outer curve | 371 // for outer curve |
384 fsBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn()
); | 372 fsBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn()
); |
385 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); | 373 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); |
386 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn()); | 374 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn()); |
387 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn()); | 375 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn()); |
388 fsBuilder->codeAppendf("vec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s.y
*duvdx.y," | 376 fsBuilder->codeAppendf("vec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s.y
*duvdx.y," |
389 " 2.0*%s.x*duvdy.x + 2.0*%s.y
*duvdy.y);", | 377 " 2.0*%s.x*duvdy.x + 2.0*%s.y
*duvdy.y);", |
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1251 // drop out the middle quad if we're stroked | 1239 // drop out the middle quad if we're stroked |
1252 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : | 1240 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : |
1253 SK_ARRAY_COUNT(gRRectIndices); | 1241 SK_ARRAY_COUNT(gRRectIndices); |
1254 target->setIndexSourceToBuffer(indexBuffer); | 1242 target->setIndexSourceToBuffer(indexBuffer); |
1255 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 16, indexCnt
, &bounds); | 1243 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 16, indexCnt
, &bounds); |
1256 } | 1244 } |
1257 | 1245 |
1258 target->resetIndexSource(); | 1246 target->resetIndexSource(); |
1259 return true; | 1247 return true; |
1260 } | 1248 } |
OLD | NEW |