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 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 // Setup position | 154 // Setup position |
155 this->setupPosition(vertBuilder, gpArgs, cgp.fInPosition->fName); | 155 this->setupPosition(vertBuilder, gpArgs, cgp.fInPosition->fName); |
156 | 156 |
157 // emit transforms | 157 // emit transforms |
158 this->emitTransforms(vertBuilder, | 158 this->emitTransforms(vertBuilder, |
159 varyingHandler, | 159 varyingHandler, |
160 uniformHandler, | 160 uniformHandler, |
161 gpArgs->fPositionVar, | 161 gpArgs->fPositionVar, |
162 cgp.fInPosition->fName, | 162 cgp.fInPosition->fName, |
163 cgp.fLocalMatrix, | 163 cgp.fLocalMatrix, |
164 args.fTransformsIn, | 164 args.fFPCoordTransformHandler); |
165 args.fTransformsOut); | |
166 | 165 |
167 fragBuilder->codeAppend("float d = length(circleEdge.xy);"); | 166 fragBuilder->codeAppend("float d = length(circleEdge.xy);"); |
168 fragBuilder->codeAppend("float distanceToOuterEdge = circleEdge.z *
(1.0 - d);"); | 167 fragBuilder->codeAppend("float distanceToOuterEdge = circleEdge.z *
(1.0 - d);"); |
169 fragBuilder->codeAppend("float edgeAlpha = clamp(distanceToOuterEdge
, 0.0, 1.0);"); | 168 fragBuilder->codeAppend("float edgeAlpha = clamp(distanceToOuterEdge
, 0.0, 1.0);"); |
170 if (cgp.fStroke) { | 169 if (cgp.fStroke) { |
171 fragBuilder->codeAppend("float distanceToInnerEdge = circleEdge.
z * (d - circleEdge.w);"); | 170 fragBuilder->codeAppend("float distanceToInnerEdge = circleEdge.
z * (d - circleEdge.w);"); |
172 fragBuilder->codeAppend("float innerAlpha = clamp(distanceToInne
rEdge, 0.0, 1.0);"); | 171 fragBuilder->codeAppend("float innerAlpha = clamp(distanceToInne
rEdge, 0.0, 1.0);"); |
173 fragBuilder->codeAppend("edgeAlpha *= innerAlpha;"); | 172 fragBuilder->codeAppend("edgeAlpha *= innerAlpha;"); |
174 } | 173 } |
175 | 174 |
(...skipping 27 matching lines...) Expand all Loading... |
203 const CircleGeometryProcessor& cgp = gp.cast<CircleGeometryProcessor
>(); | 202 const CircleGeometryProcessor& cgp = gp.cast<CircleGeometryProcessor
>(); |
204 uint16_t key; | 203 uint16_t key; |
205 key = cgp.fStroke ? 0x01 : 0x0; | 204 key = cgp.fStroke ? 0x01 : 0x0; |
206 key |= cgp.fLocalMatrix.hasPerspective() ? 0x02 : 0x0; | 205 key |= cgp.fLocalMatrix.hasPerspective() ? 0x02 : 0x0; |
207 key |= cgp.fInClipPlane ? 0x04 : 0x0; | 206 key |= cgp.fInClipPlane ? 0x04 : 0x0; |
208 key |= cgp.fInIsectPlane ? 0x08 : 0x0; | 207 key |= cgp.fInIsectPlane ? 0x08 : 0x0; |
209 key |= cgp.fInUnionPlane ? 0x10 : 0x0; | 208 key |= cgp.fInUnionPlane ? 0x10 : 0x0; |
210 b->add32(key); | 209 b->add32(key); |
211 } | 210 } |
212 | 211 |
213 void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor
&) override {} | 212 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitivePro
cessor& primProc, |
214 | 213 FPCoordTransformIter&& transformIter) override { |
215 void setTransformData(const GrPrimitiveProcessor& primProc, | |
216 const GrGLSLProgramDataManager& pdman, | |
217 int index, | |
218 const SkTArray<const GrCoordTransform*, true>& tra
nsforms) override { | |
219 this->setTransformDataHelper(primProc.cast<CircleGeometryProcessor>(
).fLocalMatrix, | 214 this->setTransformDataHelper(primProc.cast<CircleGeometryProcessor>(
).fLocalMatrix, |
220 pdman, index, transforms); | 215 pdman, &transformIter); |
221 } | 216 } |
222 | 217 |
223 private: | 218 private: |
224 typedef GrGLSLGeometryProcessor INHERITED; | 219 typedef GrGLSLGeometryProcessor INHERITED; |
225 }; | 220 }; |
226 | 221 |
227 SkMatrix fLocalMatrix; | 222 SkMatrix fLocalMatrix; |
228 const Attribute* fInPosition; | 223 const Attribute* fInPosition; |
229 const Attribute* fInColor; | 224 const Attribute* fInColor; |
230 const Attribute* fInCircleEdge; | 225 const Attribute* fInCircleEdge; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 // Setup position | 307 // Setup position |
313 this->setupPosition(vertBuilder, gpArgs, egp.fInPosition->fName); | 308 this->setupPosition(vertBuilder, gpArgs, egp.fInPosition->fName); |
314 | 309 |
315 // emit transforms | 310 // emit transforms |
316 this->emitTransforms(vertBuilder, | 311 this->emitTransforms(vertBuilder, |
317 varyingHandler, | 312 varyingHandler, |
318 uniformHandler, | 313 uniformHandler, |
319 gpArgs->fPositionVar, | 314 gpArgs->fPositionVar, |
320 egp.fInPosition->fName, | 315 egp.fInPosition->fName, |
321 egp.fLocalMatrix, | 316 egp.fLocalMatrix, |
322 args.fTransformsIn, | 317 args.fFPCoordTransformHandler); |
323 args.fTransformsOut); | |
324 | 318 |
325 // for outer curve | 319 // for outer curve |
326 fragBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOff
sets.fsIn(), | 320 fragBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOff
sets.fsIn(), |
327 ellipseRadii.fsIn()); | 321 ellipseRadii.fsIn()); |
328 fragBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset
) - 1.0;"); | 322 fragBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset
) - 1.0;"); |
329 fragBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", elli
pseRadii.fsIn()); | 323 fragBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", elli
pseRadii.fsIn()); |
330 fragBuilder->codeAppend("float grad_dot = dot(grad, grad);"); | 324 fragBuilder->codeAppend("float grad_dot = dot(grad, grad);"); |
331 | 325 |
332 // avoid calling inversesqrt on zero. | 326 // avoid calling inversesqrt on zero. |
333 fragBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); | 327 fragBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); |
(...skipping 16 matching lines...) Expand all Loading... |
350 | 344 |
351 static void GenKey(const GrGeometryProcessor& gp, | 345 static void GenKey(const GrGeometryProcessor& gp, |
352 const GrGLSLCaps&, | 346 const GrGLSLCaps&, |
353 GrProcessorKeyBuilder* b) { | 347 GrProcessorKeyBuilder* b) { |
354 const EllipseGeometryProcessor& egp = gp.cast<EllipseGeometryProcess
or>(); | 348 const EllipseGeometryProcessor& egp = gp.cast<EllipseGeometryProcess
or>(); |
355 uint16_t key = egp.fStroke ? 0x1 : 0x0; | 349 uint16_t key = egp.fStroke ? 0x1 : 0x0; |
356 key |= egp.fLocalMatrix.hasPerspective() ? 0x2 : 0x0; | 350 key |= egp.fLocalMatrix.hasPerspective() ? 0x2 : 0x0; |
357 b->add32(key); | 351 b->add32(key); |
358 } | 352 } |
359 | 353 |
360 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitivePro
cessor& gp) override { | 354 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitivePro
cessor& primProc, |
361 } | 355 FPCoordTransformIter&& transformIter) override { |
362 | 356 const EllipseGeometryProcessor& egp = primProc.cast<EllipseGeometryP
rocessor>(); |
363 void setTransformData(const GrPrimitiveProcessor& primProc, | 357 this->setTransformDataHelper(egp.fLocalMatrix, pdman, &transformIter
); |
364 const GrGLSLProgramDataManager& pdman, | |
365 int index, | |
366 const SkTArray<const GrCoordTransform*, true>& tra
nsforms) override { | |
367 this->setTransformDataHelper(primProc.cast<EllipseGeometryProcessor>
().fLocalMatrix, | |
368 pdman, index, transforms); | |
369 } | 358 } |
370 | 359 |
371 private: | 360 private: |
372 typedef GrGLSLGeometryProcessor INHERITED; | 361 typedef GrGLSLGeometryProcessor INHERITED; |
373 }; | 362 }; |
374 | 363 |
375 const Attribute* fInPosition; | 364 const Attribute* fInPosition; |
376 const Attribute* fInColor; | 365 const Attribute* fInColor; |
377 const Attribute* fInEllipseOffset; | 366 const Attribute* fInEllipseOffset; |
378 const Attribute* fInEllipseRadii; | 367 const Attribute* fInEllipseRadii; |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 diegp.fInPosition->fName, | 454 diegp.fInPosition->fName, |
466 diegp.fViewMatrix, | 455 diegp.fViewMatrix, |
467 &fViewMatrixUniform); | 456 &fViewMatrixUniform); |
468 | 457 |
469 // emit transforms | 458 // emit transforms |
470 this->emitTransforms(vertBuilder, | 459 this->emitTransforms(vertBuilder, |
471 varyingHandler, | 460 varyingHandler, |
472 uniformHandler, | 461 uniformHandler, |
473 gpArgs->fPositionVar, | 462 gpArgs->fPositionVar, |
474 diegp.fInPosition->fName, | 463 diegp.fInPosition->fName, |
475 args.fTransformsIn, | 464 args.fFPCoordTransformHandler); |
476 args.fTransformsOut); | |
477 | 465 |
478 SkAssertResult(fragBuilder->enableFeature( | 466 SkAssertResult(fragBuilder->enableFeature( |
479 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); | 467 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
480 // for outer curve | 468 // for outer curve |
481 fragBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn
()); | 469 fragBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn
()); |
482 fragBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset
) - 1.0;"); | 470 fragBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset
) - 1.0;"); |
483 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn()); | 471 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn()); |
484 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn()); | 472 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn()); |
485 fragBuilder->codeAppendf("vec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s
.y*duvdx.y," | 473 fragBuilder->codeAppendf("vec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s
.y*duvdx.y," |
486 " 2.0*%s.x*duvdy.x + 2.0*%s
.y*duvdy.y);", | 474 " 2.0*%s.x*duvdy.x + 2.0*%s
.y*duvdy.y);", |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 | 506 |
519 static void GenKey(const GrGeometryProcessor& gp, | 507 static void GenKey(const GrGeometryProcessor& gp, |
520 const GrGLSLCaps&, | 508 const GrGLSLCaps&, |
521 GrProcessorKeyBuilder* b) { | 509 GrProcessorKeyBuilder* b) { |
522 const DIEllipseGeometryProcessor& diegp = gp.cast<DIEllipseGeometryP
rocessor>(); | 510 const DIEllipseGeometryProcessor& diegp = gp.cast<DIEllipseGeometryP
rocessor>(); |
523 uint16_t key = static_cast<uint16_t>(diegp.fStyle); | 511 uint16_t key = static_cast<uint16_t>(diegp.fStyle); |
524 key |= ComputePosKey(diegp.fViewMatrix) << 10; | 512 key |= ComputePosKey(diegp.fViewMatrix) << 10; |
525 b->add32(key); | 513 b->add32(key); |
526 } | 514 } |
527 | 515 |
528 void setData(const GrGLSLProgramDataManager& pdman, | 516 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitivePro
cessor& gp, |
529 const GrPrimitiveProcessor& gp) override { | 517 FPCoordTransformIter&& transformIter) override { |
530 const DIEllipseGeometryProcessor& diegp = gp.cast<DIEllipseGeometryP
rocessor>(); | 518 const DIEllipseGeometryProcessor& diegp = gp.cast<DIEllipseGeometryP
rocessor>(); |
531 | 519 |
532 if (!diegp.fViewMatrix.isIdentity() && !fViewMatrix.cheapEqualTo(die
gp.fViewMatrix)) { | 520 if (!diegp.fViewMatrix.isIdentity() && !fViewMatrix.cheapEqualTo(die
gp.fViewMatrix)) { |
533 fViewMatrix = diegp.fViewMatrix; | 521 fViewMatrix = diegp.fViewMatrix; |
534 float viewMatrix[3 * 3]; | 522 float viewMatrix[3 * 3]; |
535 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); | 523 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); |
536 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); | 524 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
537 } | 525 } |
| 526 this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter); |
538 } | 527 } |
539 | 528 |
540 private: | 529 private: |
541 SkMatrix fViewMatrix; | 530 SkMatrix fViewMatrix; |
542 UniformHandle fViewMatrixUniform; | 531 UniformHandle fViewMatrixUniform; |
543 | 532 |
544 typedef GrGLSLGeometryProcessor INHERITED; | 533 typedef GrGLSLGeometryProcessor INHERITED; |
545 }; | 534 }; |
546 | 535 |
547 const Attribute* fInPosition; | 536 const Attribute* fInPosition; |
(...skipping 1625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2173 } | 2162 } |
2174 | 2163 |
2175 DRAW_BATCH_TEST_DEFINE(RRectBatch) { | 2164 DRAW_BATCH_TEST_DEFINE(RRectBatch) { |
2176 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); | 2165 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); |
2177 GrColor color = GrRandomColor(random); | 2166 GrColor color = GrRandomColor(random); |
2178 const SkRRect& rrect = GrTest::TestRRectSimple(random); | 2167 const SkRRect& rrect = GrTest::TestRRectSimple(random); |
2179 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); | 2168 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); |
2180 } | 2169 } |
2181 | 2170 |
2182 #endif | 2171 #endif |
OLD | NEW |