| 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 "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 inline bool isStroked() const { return fStroke; } | 91 inline bool isStroked() const { return fStroke; } |
| 92 | 92 |
| 93 class GLSLProcessor : public GrGLSLGeometryProcessor { | 93 class GLSLProcessor : public GrGLSLGeometryProcessor { |
| 94 public: | 94 public: |
| 95 GLSLProcessor() | 95 GLSLProcessor() |
| 96 : fColor(GrColor_ILLEGAL) {} | 96 : fColor(GrColor_ILLEGAL) {} |
| 97 | 97 |
| 98 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 98 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
| 99 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); | 99 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); |
| 100 GrGLSLGPBuilder* pb = args.fPB; | 100 GrGLSLGPBuilder* pb = args.fPB; |
| 101 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 101 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
| 102 | 102 |
| 103 // emit attributes | 103 // emit attributes |
| 104 vsBuilder->emitAttributes(ce); | 104 vertBuilder->emitAttributes(ce); |
| 105 | 105 |
| 106 GrGLSLVertToFrag v(kVec4f_GrSLType); | 106 GrGLSLVertToFrag v(kVec4f_GrSLType); |
| 107 args.fPB->addVarying("CircleEdge", &v); | 107 args.fPB->addVarying("CircleEdge", &v); |
| 108 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa
me); | 108 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->f
Name); |
| 109 | 109 |
| 110 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 110 // setup pass through color | 111 // setup pass through color |
| 111 if (!ce.colorIgnored()) { | 112 if (!ce.colorIgnored()) { |
| 112 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); | 113 this->setupUniformColor(pb, fragBuilder, args.fOutputColor, &fCo
lorUniform); |
| 113 } | 114 } |
| 114 | 115 |
| 115 // Setup position | 116 // Setup position |
| 116 this->setupPosition(pb, gpArgs, ce.inPosition()->fName); | 117 this->setupPosition(pb, vertBuilder, gpArgs, ce.inPosition()->fName)
; |
| 117 | 118 |
| 118 // emit transforms | 119 // emit transforms |
| 119 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ce.inPosition()
->fName, | 120 this->emitTransforms(args.fPB, |
| 120 ce.localMatrix(), args.fTransformsIn, args.fTra
nsformsOut); | 121 vertBuilder, |
| 122 gpArgs->fPositionVar, |
| 123 ce.inPosition()->fName, |
| 124 ce.localMatrix(), |
| 125 args.fTransformsIn, |
| 126 args.fTransformsOut); |
| 121 | 127 |
| 122 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 128 fragBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); |
| 123 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); | 129 fragBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d),
0.0, 1.0);", |
| 124 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d), 0.
0, 1.0);", v.fsIn()); | 130 v.fsIn()); |
| 125 if (ce.isStroked()) { | 131 if (ce.isStroked()) { |
| 126 fsBuilder->codeAppendf("float innerAlpha = clamp(%s.z * (d - %s.
w), 0.0, 1.0);", | 132 fragBuilder->codeAppendf("float innerAlpha = clamp(%s.z * (d - %
s.w), 0.0, 1.0);", |
| 127 v.fsIn(), v.fsIn()); | 133 v.fsIn(), v.fsIn()); |
| 128 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); | 134 fragBuilder->codeAppend("edgeAlpha *= innerAlpha;"); |
| 129 } | 135 } |
| 130 | 136 |
| 131 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 137 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCovera
ge); |
| 132 } | 138 } |
| 133 | 139 |
| 134 static void GenKey(const GrGeometryProcessor& gp, | 140 static void GenKey(const GrGeometryProcessor& gp, |
| 135 const GrGLSLCaps&, | 141 const GrGLSLCaps&, |
| 136 GrProcessorKeyBuilder* b) { | 142 GrProcessorKeyBuilder* b) { |
| 137 const CircleEdgeEffect& ce = gp.cast<CircleEdgeEffect>(); | 143 const CircleEdgeEffect& ce = gp.cast<CircleEdgeEffect>(); |
| 138 uint16_t key = ce.isStroked() ? 0x1 : 0x0; | 144 uint16_t key = ce.isStroked() ? 0x1 : 0x0; |
| 139 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0
x2 : 0x0; | 145 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0
x2 : 0x0; |
| 140 key |= ce.colorIgnored() ? 0x4 : 0x0; | 146 key |= ce.colorIgnored() ? 0x4 : 0x0; |
| 141 b->add32(key); | 147 b->add32(key); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 inline bool isStroked() const { return fStroke; } | 245 inline bool isStroked() const { return fStroke; } |
| 240 | 246 |
| 241 class GLSLProcessor : public GrGLSLGeometryProcessor { | 247 class GLSLProcessor : public GrGLSLGeometryProcessor { |
| 242 public: | 248 public: |
| 243 GLSLProcessor() | 249 GLSLProcessor() |
| 244 : fColor(GrColor_ILLEGAL) {} | 250 : fColor(GrColor_ILLEGAL) {} |
| 245 | 251 |
| 246 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 252 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
| 247 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); | 253 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); |
| 248 GrGLSLGPBuilder* pb = args.fPB; | 254 GrGLSLGPBuilder* pb = args.fPB; |
| 249 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 255 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
| 250 | 256 |
| 251 // emit attributes | 257 // emit attributes |
| 252 vsBuilder->emitAttributes(ee); | 258 vertBuilder->emitAttributes(ee); |
| 253 | 259 |
| 254 GrGLSLVertToFrag ellipseOffsets(kVec2f_GrSLType); | 260 GrGLSLVertToFrag ellipseOffsets(kVec2f_GrSLType); |
| 255 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets); | 261 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets); |
| 256 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), | 262 vertBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), |
| 257 ee.inEllipseOffset()->fName); | 263 ee.inEllipseOffset()->fName); |
| 258 | 264 |
| 259 GrGLSLVertToFrag ellipseRadii(kVec4f_GrSLType); | 265 GrGLSLVertToFrag ellipseRadii(kVec4f_GrSLType); |
| 260 args.fPB->addVarying("EllipseRadii", &ellipseRadii); | 266 args.fPB->addVarying("EllipseRadii", &ellipseRadii); |
| 261 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), | 267 vertBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), |
| 262 ee.inEllipseRadii()->fName); | 268 ee.inEllipseRadii()->fName); |
| 263 | 269 |
| 270 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 264 // setup pass through color | 271 // setup pass through color |
| 265 if (!ee.colorIgnored()) { | 272 if (!ee.colorIgnored()) { |
| 266 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); | 273 this->setupUniformColor(pb, fragBuilder, args.fOutputColor, &fCo
lorUniform); |
| 267 } | 274 } |
| 268 | 275 |
| 269 // Setup position | 276 // Setup position |
| 270 this->setupPosition(pb, gpArgs, ee.inPosition()->fName); | 277 this->setupPosition(pb, vertBuilder, gpArgs, ee.inPosition()->fName)
; |
| 271 | 278 |
| 272 // emit transforms | 279 // emit transforms |
| 273 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ee.inPosition()
->fName, | 280 this->emitTransforms(args.fPB, |
| 274 ee.localMatrix(), args.fTransformsIn, args.fTra
nsformsOut); | 281 vertBuilder, |
| 282 gpArgs->fPositionVar, |
| 283 ee.inPosition()->fName, |
| 284 ee.localMatrix(), |
| 285 args.fTransformsIn, |
| 286 args.fTransformsOut); |
| 275 | 287 |
| 276 // for outer curve | 288 // for outer curve |
| 277 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 289 fragBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOff
sets.fsIn(), |
| 278 fsBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOffse
ts.fsIn(), | 290 ellipseRadii.fsIn()); |
| 279 ellipseRadii.fsIn()); | 291 fragBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset
) - 1.0;"); |
| 280 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); | 292 fragBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", elli
pseRadii.fsIn()); |
| 281 fsBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", ellips
eRadii.fsIn()); | 293 fragBuilder->codeAppend("float grad_dot = dot(grad, grad);"); |
| 282 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);"); | |
| 283 | 294 |
| 284 // avoid calling inversesqrt on zero. | 295 // avoid calling inversesqrt on zero. |
| 285 fsBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); | 296 fragBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); |
| 286 fsBuilder->codeAppend("float invlen = inversesqrt(grad_dot);"); | 297 fragBuilder->codeAppend("float invlen = inversesqrt(grad_dot);"); |
| 287 fsBuilder->codeAppend("float edgeAlpha = clamp(0.5-test*invlen, 0.0,
1.0);"); | 298 fragBuilder->codeAppend("float edgeAlpha = clamp(0.5-test*invlen, 0.
0, 1.0);"); |
| 288 | 299 |
| 289 // for inner curve | 300 // for inner curve |
| 290 if (ee.isStroked()) { | 301 if (ee.isStroked()) { |
| 291 fsBuilder->codeAppendf("scaledOffset = %s*%s.zw;", | 302 fragBuilder->codeAppendf("scaledOffset = %s*%s.zw;", |
| 292 ellipseOffsets.fsIn(), ellipseRadii.fsIn(
)); | 303 ellipseOffsets.fsIn(), ellipseRadii.fsI
n()); |
| 293 fsBuilder->codeAppend("test = dot(scaledOffset, scaledOffset) -
1.0;"); | 304 fragBuilder->codeAppend("test = dot(scaledOffset, scaledOffset)
- 1.0;"); |
| 294 fsBuilder->codeAppendf("grad = 2.0*scaledOffset*%s.zw;", | 305 fragBuilder->codeAppendf("grad = 2.0*scaledOffset*%s.zw;", |
| 295 ellipseRadii.fsIn()); | 306 ellipseRadii.fsIn()); |
| 296 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); | 307 fragBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"
); |
| 297 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); | 308 fragBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0
, 1.0);"); |
| 298 } | 309 } |
| 299 | 310 |
| 300 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 311 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCovera
ge); |
| 301 } | 312 } |
| 302 | 313 |
| 303 static void GenKey(const GrGeometryProcessor& gp, | 314 static void GenKey(const GrGeometryProcessor& gp, |
| 304 const GrGLSLCaps&, | 315 const GrGLSLCaps&, |
| 305 GrProcessorKeyBuilder* b) { | 316 GrProcessorKeyBuilder* b) { |
| 306 const EllipseEdgeEffect& ee = gp.cast<EllipseEdgeEffect>(); | 317 const EllipseEdgeEffect& ee = gp.cast<EllipseEdgeEffect>(); |
| 307 uint16_t key = ee.isStroked() ? 0x1 : 0x0; | 318 uint16_t key = ee.isStroked() ? 0x1 : 0x0; |
| 308 key |= ee.usesLocalCoords() && ee.localMatrix().hasPerspective() ? 0
x2 : 0x0; | 319 key |= ee.usesLocalCoords() && ee.localMatrix().hasPerspective() ? 0
x2 : 0x0; |
| 309 key |= ee.colorIgnored() ? 0x4 : 0x0; | 320 key |= ee.colorIgnored() ? 0x4 : 0x0; |
| 310 b->add32(key); | 321 b->add32(key); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 inline Mode getMode() const { return fMode; } | 425 inline Mode getMode() const { return fMode; } |
| 415 | 426 |
| 416 class GLSLProcessor : public GrGLSLGeometryProcessor { | 427 class GLSLProcessor : public GrGLSLGeometryProcessor { |
| 417 public: | 428 public: |
| 418 GLSLProcessor() | 429 GLSLProcessor() |
| 419 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {} | 430 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {} |
| 420 | 431 |
| 421 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { | 432 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { |
| 422 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; | 433 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; |
| 423 GrGLSLGPBuilder* pb = args.fPB; | 434 GrGLSLGPBuilder* pb = args.fPB; |
| 424 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 435 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
| 425 | 436 |
| 426 // emit attributes | 437 // emit attributes |
| 427 vsBuilder->emitAttributes(ee); | 438 vertBuilder->emitAttributes(ee); |
| 428 | 439 |
| 429 GrGLSLVertToFrag offsets0(kVec2f_GrSLType); | 440 GrGLSLVertToFrag offsets0(kVec2f_GrSLType); |
| 430 args.fPB->addVarying("EllipseOffsets0", &offsets0); | 441 args.fPB->addVarying("EllipseOffsets0", &offsets0); |
| 431 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), | 442 vertBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), |
| 432 ee.inEllipseOffsets0()->fName); | 443 ee.inEllipseOffsets0()->fName); |
| 433 | 444 |
| 434 GrGLSLVertToFrag offsets1(kVec2f_GrSLType); | 445 GrGLSLVertToFrag offsets1(kVec2f_GrSLType); |
| 435 args.fPB->addVarying("EllipseOffsets1", &offsets1); | 446 args.fPB->addVarying("EllipseOffsets1", &offsets1); |
| 436 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), | 447 vertBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), |
| 437 ee.inEllipseOffsets1()->fName); | 448 ee.inEllipseOffsets1()->fName); |
| 438 | 449 |
| 450 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 439 // setup pass through color | 451 // setup pass through color |
| 440 if (!ee.colorIgnored()) { | 452 if (!ee.colorIgnored()) { |
| 441 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); | 453 this->setupUniformColor(pb, fragBuilder, args.fOutputColor, &fCo
lorUniform); |
| 442 } | 454 } |
| 443 | 455 |
| 444 // Setup position | 456 // Setup position |
| 445 this->setupPosition(pb, gpArgs, ee.inPosition()->fName, ee.viewMatri
x(), | 457 this->setupPosition(pb, |
| 458 vertBuilder, |
| 459 gpArgs, |
| 460 ee.inPosition()->fName, |
| 461 ee.viewMatrix(), |
| 446 &fViewMatrixUniform); | 462 &fViewMatrixUniform); |
| 447 | 463 |
| 448 // emit transforms | 464 // emit transforms |
| 449 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ee.inPosition()
->fName, | 465 this->emitTransforms(args.fPB, |
| 450 args.fTransformsIn, args.fTransformsOut); | 466 vertBuilder, |
| 467 gpArgs->fPositionVar, |
| 468 ee.inPosition()->fName, |
| 469 args.fTransformsIn, |
| 470 args.fTransformsOut); |
| 451 | 471 |
| 452 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 472 SkAssertResult(fragBuilder->enableFeature( |
| 453 SkAssertResult(fsBuilder->enableFeature( | |
| 454 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); | 473 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
| 455 // for outer curve | 474 // for outer curve |
| 456 fsBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn()
); | 475 fragBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn
()); |
| 457 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); | 476 fragBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset
) - 1.0;"); |
| 458 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn()); | 477 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn()); |
| 459 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn()); | 478 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn()); |
| 460 fsBuilder->codeAppendf("vec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s.y
*duvdx.y," | 479 fragBuilder->codeAppendf("vec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s
.y*duvdx.y," |
| 461 " 2.0*%s.x*duvdy.x + 2.0*%s.y
*duvdy.y);", | 480 " 2.0*%s.x*duvdy.x + 2.0*%s
.y*duvdy.y);", |
| 462 offsets0.fsIn(), offsets0.fsIn(), offsets0.fs
In(), offsets0.fsIn()); | 481 offsets0.fsIn(), offsets0.fsIn(), offsets0.
fsIn(), offsets0.fsIn()); |
| 463 | 482 |
| 464 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);"); | 483 fragBuilder->codeAppend("float grad_dot = dot(grad, grad);"); |
| 465 // avoid calling inversesqrt on zero. | 484 // avoid calling inversesqrt on zero. |
| 466 fsBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); | 485 fragBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); |
| 467 fsBuilder->codeAppend("float invlen = inversesqrt(grad_dot);"); | 486 fragBuilder->codeAppend("float invlen = inversesqrt(grad_dot);"); |
| 468 if (kHairline == ee.getMode()) { | 487 if (kHairline == ee.getMode()) { |
| 469 // can probably do this with one step | 488 // can probably do this with one step |
| 470 fsBuilder->codeAppend("float edgeAlpha = clamp(1.0-test*invlen,
0.0, 1.0);"); | 489 fragBuilder->codeAppend("float edgeAlpha = clamp(1.0-test*invlen
, 0.0, 1.0);"); |
| 471 fsBuilder->codeAppend("edgeAlpha *= clamp(1.0+test*invlen, 0.0,
1.0);"); | 490 fragBuilder->codeAppend("edgeAlpha *= clamp(1.0+test*invlen, 0.0
, 1.0);"); |
| 472 } else { | 491 } else { |
| 473 fsBuilder->codeAppend("float edgeAlpha = clamp(0.5-test*invlen,
0.0, 1.0);"); | 492 fragBuilder->codeAppend("float edgeAlpha = clamp(0.5-test*invlen
, 0.0, 1.0);"); |
| 474 } | 493 } |
| 475 | 494 |
| 476 // for inner curve | 495 // for inner curve |
| 477 if (kStroke == ee.getMode()) { | 496 if (kStroke == ee.getMode()) { |
| 478 fsBuilder->codeAppendf("scaledOffset = %s.xy;", offsets1.fsIn())
; | 497 fragBuilder->codeAppendf("scaledOffset = %s.xy;", offsets1.fsIn(
)); |
| 479 fsBuilder->codeAppend("test = dot(scaledOffset, scaledOffset) -
1.0;"); | 498 fragBuilder->codeAppend("test = dot(scaledOffset, scaledOffset)
- 1.0;"); |
| 480 fsBuilder->codeAppendf("duvdx = dFdx(%s);", offsets1.fsIn()); | 499 fragBuilder->codeAppendf("duvdx = dFdx(%s);", offsets1.fsIn()); |
| 481 fsBuilder->codeAppendf("duvdy = dFdy(%s);", offsets1.fsIn()); | 500 fragBuilder->codeAppendf("duvdy = dFdy(%s);", offsets1.fsIn()); |
| 482 fsBuilder->codeAppendf("grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s.y*
duvdx.y," | 501 fragBuilder->codeAppendf("grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s.
y*duvdx.y," |
| 483 " 2.0*%s.x*duvdy.x + 2.0*%s.y*
duvdy.y);", | 502 " 2.0*%s.x*duvdy.x + 2.0*%s.
y*duvdy.y);", |
| 484 offsets1.fsIn(), offsets1.fsIn(), offsets
1.fsIn(), | 503 offsets1.fsIn(), offsets1.fsIn(), offse
ts1.fsIn(), |
| 485 offsets1.fsIn()); | 504 offsets1.fsIn()); |
| 486 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); | 505 fragBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"
); |
| 487 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); | 506 fragBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0
, 1.0);"); |
| 488 } | 507 } |
| 489 | 508 |
| 490 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 509 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCovera
ge); |
| 491 } | 510 } |
| 492 | 511 |
| 493 static void GenKey(const GrGeometryProcessor& gp, | 512 static void GenKey(const GrGeometryProcessor& gp, |
| 494 const GrGLSLCaps&, | 513 const GrGLSLCaps&, |
| 495 GrProcessorKeyBuilder* b) { | 514 GrProcessorKeyBuilder* b) { |
| 496 const DIEllipseEdgeEffect& ellipseEffect = gp.cast<DIEllipseEdgeEffe
ct>(); | 515 const DIEllipseEdgeEffect& ellipseEffect = gp.cast<DIEllipseEdgeEffe
ct>(); |
| 497 uint16_t key = ellipseEffect.getMode(); | 516 uint16_t key = ellipseEffect.getMode(); |
| 498 key |= ellipseEffect.colorIgnored() << 9; | 517 key |= ellipseEffect.colorIgnored() << 9; |
| 499 key |= ComputePosKey(ellipseEffect.viewMatrix()) << 10; | 518 key |= ComputePosKey(ellipseEffect.viewMatrix()) << 10; |
| 500 b->add32(key); | 519 b->add32(key); |
| (...skipping 1546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2047 } | 2066 } |
| 2048 | 2067 |
| 2049 DRAW_BATCH_TEST_DEFINE(RRectBatch) { | 2068 DRAW_BATCH_TEST_DEFINE(RRectBatch) { |
| 2050 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); | 2069 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); |
| 2051 GrColor color = GrRandomColor(random); | 2070 GrColor color = GrRandomColor(random); |
| 2052 const SkRRect& rrect = GrTest::TestRRectSimple(random); | 2071 const SkRRect& rrect = GrTest::TestRRectSimple(random); |
| 2053 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); | 2072 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); |
| 2054 } | 2073 } |
| 2055 | 2074 |
| 2056 #endif | 2075 #endif |
| OLD | NEW |