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 |