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