| 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 |