OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2013 Google Inc. | 3 * Copyright 2013 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 // This test only works with the GPU backend. | 9 // This test only works with the GPU backend. |
10 | 10 |
(...skipping 15 matching lines...) Expand all Loading... |
26 | 26 |
27 static inline SkScalar eval_line(const SkPoint& p, const SkScalar lineEq[3], SkS
calar sign) { | 27 static inline SkScalar eval_line(const SkPoint& p, const SkScalar lineEq[3], SkS
calar sign) { |
28 return sign * (lineEq[0] * p.fX + lineEq[1] * p.fY + lineEq[2]); | 28 return sign * (lineEq[0] * p.fX + lineEq[1] * p.fY + lineEq[2]); |
29 } | 29 } |
30 | 30 |
31 namespace skiagm { | 31 namespace skiagm { |
32 | 32 |
33 class BezierCubicOrConicTestBatch : public GrTestBatch { | 33 class BezierCubicOrConicTestBatch : public GrTestBatch { |
34 public: | 34 public: |
35 DEFINE_BATCH_CLASS_ID | 35 DEFINE_BATCH_CLASS_ID |
36 struct Geometry : public GrTestBatch::Geometry { | |
37 SkRect fBounds; | |
38 }; | |
39 | 36 |
40 const char* name() const override { return "BezierCubicOrConicTestBatch"; } | 37 const char* name() const override { return "BezierCubicOrConicTestBatch"; } |
41 | 38 |
42 static GrDrawBatch* Create(const GrGeometryProcessor* gp, const Geometry& ge
o, | 39 BezierCubicOrConicTestBatch(const GrGeometryProcessor* gp, const SkRect& bou
nds, |
43 const SkScalar klmEqs[9], SkScalar sign) { | 40 GrColor color, const SkScalar klmEqs[9], SkScala
r sign) |
44 return new BezierCubicOrConicTestBatch(gp, geo, klmEqs, sign); | 41 : INHERITED(ClassID(), bounds, color) |
| 42 , fGeometryProcessor(SkRef(gp)) { |
| 43 for (int i = 0; i < 9; i++) { |
| 44 fKlmEqs[i] = klmEqs[i]; |
| 45 } |
| 46 fSign = sign; |
45 } | 47 } |
46 | 48 |
47 private: | 49 private: |
48 BezierCubicOrConicTestBatch(const GrGeometryProcessor* gp, const Geometry& g
eo, | |
49 const SkScalar klmEqs[9], SkScalar sign) | |
50 : INHERITED(ClassID(), gp, geo.fBounds) { | |
51 for (int i = 0; i < 9; i++) { | |
52 fKlmEqs[i] = klmEqs[i]; | |
53 } | |
54 | |
55 fGeometry = geo; | |
56 fSign = sign; | |
57 } | |
58 | 50 |
59 struct Vertex { | 51 struct Vertex { |
60 SkPoint fPosition; | 52 SkPoint fPosition; |
61 float fKLM[4]; // The last value is ignored. The effect expects a vec4
f. | 53 float fKLM[4]; // The last value is ignored. The effect expects a vec4
f. |
62 }; | 54 }; |
63 | 55 |
64 Geometry* geoData(int index) override { | 56 void onPrepareDraws(Target* target) const override { |
65 SkASSERT(0 == index); | |
66 return &fGeometry; | |
67 } | |
68 | |
69 const Geometry* geoData(int index) const override { | |
70 SkASSERT(0 == index); | |
71 return &fGeometry; | |
72 } | |
73 | |
74 void generateGeometry(Target* target) const override { | |
75 QuadHelper helper; | 57 QuadHelper helper; |
76 size_t vertexStride = this->geometryProcessor()->getVertexStride(); | 58 size_t vertexStride = fGeometryProcessor->getVertexStride(); |
77 SkASSERT(vertexStride == sizeof(Vertex)); | 59 SkASSERT(vertexStride == sizeof(Vertex)); |
78 Vertex* verts = reinterpret_cast<Vertex*>(helper.init(target, vertexStri
de, 1)); | 60 Vertex* verts = reinterpret_cast<Vertex*>(helper.init(target, vertexStri
de, 1)); |
79 if (!verts) { | 61 if (!verts) { |
80 return; | 62 return; |
81 } | 63 } |
82 | 64 const SkRect& bounds = this->bounds(); |
83 verts[0].fPosition.setRectFan(fGeometry.fBounds.fLeft, fGeometry.fBounds
.fTop, | 65 verts[0].fPosition.setRectFan(bounds.fLeft, bounds.fTop, bounds.fRight,
bounds.fBottom, |
84 fGeometry.fBounds.fRight, fGeometry.fBound
s.fBottom, | |
85 sizeof(Vertex)); | 66 sizeof(Vertex)); |
86 for (int v = 0; v < 4; ++v) { | 67 for (int v = 0; v < 4; ++v) { |
87 verts[v].fKLM[0] = eval_line(verts[v].fPosition, fKlmEqs + 0, fSign)
; | 68 verts[v].fKLM[0] = eval_line(verts[v].fPosition, fKlmEqs + 0, fSign)
; |
88 verts[v].fKLM[1] = eval_line(verts[v].fPosition, fKlmEqs + 3, fSign)
; | 69 verts[v].fKLM[1] = eval_line(verts[v].fPosition, fKlmEqs + 3, fSign)
; |
89 verts[v].fKLM[2] = eval_line(verts[v].fPosition, fKlmEqs + 6, 1.f); | 70 verts[v].fKLM[2] = eval_line(verts[v].fPosition, fKlmEqs + 6, 1.f); |
90 } | 71 } |
91 helper.recordDraw(target); | 72 helper.recordDraw(target, fGeometryProcessor); |
92 } | 73 } |
93 | 74 |
94 Geometry fGeometry; | 75 SkScalar fKlmEqs[9]; |
95 SkScalar fKlmEqs[9]; | 76 SkScalar fSign; |
96 SkScalar fSign; | 77 SkAutoTUnref<const GrGeometryProcessor> fGeometryProcessor; |
97 | 78 |
98 static const int kVertsPerCubic = 4; | 79 static const int kVertsPerCubic = 4; |
99 static const int kIndicesPerCubic = 6; | 80 static const int kIndicesPerCubic = 6; |
100 | 81 |
101 typedef GrTestBatch INHERITED; | 82 typedef GrTestBatch INHERITED; |
102 }; | 83 }; |
103 | 84 |
104 /** | 85 /** |
105 * This GM directly exercises effects that draw Bezier curves in the GPU backend
. | 86 * This GM directly exercises effects that draw Bezier curves in the GPU backend
. |
106 */ | 87 */ |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 boundsPaint.setColor(0xff808080); | 193 boundsPaint.setColor(0xff808080); |
213 boundsPaint.setStrokeWidth(0); | 194 boundsPaint.setStrokeWidth(0); |
214 boundsPaint.setStyle(SkPaint::kStroke_Style); | 195 boundsPaint.setStyle(SkPaint::kStroke_Style); |
215 canvas->drawRect(bounds, boundsPaint); | 196 canvas->drawRect(bounds, boundsPaint); |
216 | 197 |
217 GrPipelineBuilder pipelineBuilder; | 198 GrPipelineBuilder pipelineBuilder; |
218 pipelineBuilder.setXPFactory( | 199 pipelineBuilder.setXPFactory( |
219 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->u
nref(); | 200 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->u
nref(); |
220 pipelineBuilder.setRenderTarget(rt); | 201 pipelineBuilder.setRenderTarget(rt); |
221 | 202 |
222 BezierCubicOrConicTestBatch::Geometry geometry; | |
223 geometry.fColor = color; | |
224 geometry.fBounds = bounds; | |
225 | |
226 SkAutoTUnref<GrDrawBatch> batch( | 203 SkAutoTUnref<GrDrawBatch> batch( |
227 BezierCubicOrConicTestBatch::Create(gp, geometry, kl
mEqs, klmSigns[c])); | 204 new BezierCubicOrConicTestBatch(gp, bounds, color, klmEq
s, klmSigns[c])); |
228 | 205 |
229 drawContext->drawContextPriv().testingOnly_drawBatch(pipelin
eBuilder, batch); | 206 drawContext->drawContextPriv().testingOnly_drawBatch(pipelin
eBuilder, batch); |
230 } | 207 } |
231 ++col; | 208 ++col; |
232 if (numCols == col) { | 209 if (numCols == col) { |
233 col = 0; | 210 col = 0; |
234 ++row; | 211 ++row; |
235 } | 212 } |
236 } | 213 } |
237 } | 214 } |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 boundsPaint.setColor(0xff808080); | 330 boundsPaint.setColor(0xff808080); |
354 boundsPaint.setStrokeWidth(0); | 331 boundsPaint.setStrokeWidth(0); |
355 boundsPaint.setStyle(SkPaint::kStroke_Style); | 332 boundsPaint.setStyle(SkPaint::kStroke_Style); |
356 canvas->drawRect(bounds, boundsPaint); | 333 canvas->drawRect(bounds, boundsPaint); |
357 | 334 |
358 GrPipelineBuilder pipelineBuilder; | 335 GrPipelineBuilder pipelineBuilder; |
359 pipelineBuilder.setXPFactory( | 336 pipelineBuilder.setXPFactory( |
360 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->u
nref(); | 337 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->u
nref(); |
361 pipelineBuilder.setRenderTarget(rt); | 338 pipelineBuilder.setRenderTarget(rt); |
362 | 339 |
363 BezierCubicOrConicTestBatch::Geometry geometry; | |
364 geometry.fColor = color; | |
365 geometry.fBounds = bounds; | |
366 | |
367 SkAutoTUnref<GrDrawBatch> batch( | 340 SkAutoTUnref<GrDrawBatch> batch( |
368 BezierCubicOrConicTestBatch::Create(gp, geometry, kl
mEqs, 1.f)); | 341 new BezierCubicOrConicTestBatch(gp, bounds, color, klmEq
s, 1.f)); |
369 | 342 |
370 drawContext->drawContextPriv().testingOnly_drawBatch(pipelin
eBuilder, batch); | 343 drawContext->drawContextPriv().testingOnly_drawBatch(pipelin
eBuilder, batch); |
371 } | 344 } |
372 ++col; | 345 ++col; |
373 if (numCols == col) { | 346 if (numCols == col) { |
374 col = 0; | 347 col = 0; |
375 ++row; | 348 ++row; |
376 } | 349 } |
377 } | 350 } |
378 } | 351 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 } | 390 } |
418 | 391 |
419 typedef GM INHERITED; | 392 typedef GM INHERITED; |
420 }; | 393 }; |
421 | 394 |
422 ////////////////////////////////////////////////////////////////////////////// | 395 ////////////////////////////////////////////////////////////////////////////// |
423 | 396 |
424 class BezierQuadTestBatch : public GrTestBatch { | 397 class BezierQuadTestBatch : public GrTestBatch { |
425 public: | 398 public: |
426 DEFINE_BATCH_CLASS_ID | 399 DEFINE_BATCH_CLASS_ID |
427 struct Geometry : public GrTestBatch::Geometry { | |
428 SkRect fBounds; | |
429 }; | |
430 | |
431 const char* name() const override { return "BezierQuadTestBatch"; } | 400 const char* name() const override { return "BezierQuadTestBatch"; } |
432 | 401 |
433 static GrDrawBatch* Create(const GrGeometryProcessor* gp, const Geometry& ge
o, | 402 BezierQuadTestBatch(const GrGeometryProcessor* gp, const SkRect& bounds, GrC
olor color, |
434 const GrPathUtils::QuadUVMatrix& devToUV) { | 403 const GrPathUtils::QuadUVMatrix& devToUV) |
435 return new BezierQuadTestBatch(gp, geo, devToUV); | 404 : INHERITED(ClassID(), bounds, color) |
| 405 , fDevToUV(devToUV) |
| 406 , fGeometryProcessor(SkRef(gp)) { |
436 } | 407 } |
437 | 408 |
438 private: | 409 private: |
439 BezierQuadTestBatch(const GrGeometryProcessor* gp, const Geometry& geo, | |
440 const GrPathUtils::QuadUVMatrix& devToUV) | |
441 : INHERITED(ClassID(), gp, geo.fBounds) | |
442 , fGeometry(geo) | |
443 , fDevToUV(devToUV) { | |
444 } | |
445 | 410 |
446 struct Vertex { | 411 struct Vertex { |
447 SkPoint fPosition; | 412 SkPoint fPosition; |
448 float fKLM[4]; // The last value is ignored. The effect expects a vec4
f. | 413 float fKLM[4]; // The last value is ignored. The effect expects a vec4
f. |
449 }; | 414 }; |
450 | 415 |
451 Geometry* geoData(int index) override { | 416 void onPrepareDraws(Target* target) const override { |
452 SkASSERT(0 == index); | |
453 return &fGeometry; | |
454 } | |
455 | |
456 const Geometry* geoData(int index) const override { | |
457 SkASSERT(0 == index); | |
458 return &fGeometry; | |
459 } | |
460 | |
461 void generateGeometry(Target* target) const override { | |
462 QuadHelper helper; | 417 QuadHelper helper; |
463 size_t vertexStride = this->geometryProcessor()->getVertexStride(); | 418 size_t vertexStride = fGeometryProcessor->getVertexStride(); |
464 SkASSERT(vertexStride == sizeof(Vertex)); | 419 SkASSERT(vertexStride == sizeof(Vertex)); |
465 Vertex* verts = reinterpret_cast<Vertex*>(helper.init(target, vertexStri
de, 1)); | 420 Vertex* verts = reinterpret_cast<Vertex*>(helper.init(target, vertexStri
de, 1)); |
466 if (!verts) { | 421 if (!verts) { |
467 return; | 422 return; |
468 } | 423 } |
469 verts[0].fPosition.setRectFan(fGeometry.fBounds.fLeft, fGeometry.fBounds
.fTop, | 424 const SkRect& bounds = this->bounds(); |
470 fGeometry.fBounds.fRight, fGeometry.fBound
s.fBottom, | 425 verts[0].fPosition.setRectFan(bounds.fLeft, bounds.fTop, bounds.fRight,
bounds.fBottom, |
471 sizeof(Vertex)); | 426 sizeof(Vertex)); |
472 fDevToUV.apply<4, sizeof(Vertex), sizeof(SkPoint)>(verts); | 427 fDevToUV.apply<4, sizeof(Vertex), sizeof(SkPoint)>(verts); |
473 helper.recordDraw(target); | 428 helper.recordDraw(target, fGeometryProcessor); |
474 } | 429 } |
475 | 430 |
476 Geometry fGeometry; | 431 GrPathUtils::QuadUVMatrix fDevToUV; |
477 GrPathUtils::QuadUVMatrix fDevToUV; | 432 SkAutoTUnref<const GrGeometryProcessor> fGeometryProcessor; |
478 | 433 |
479 static const int kVertsPerCubic = 4; | 434 static const int kVertsPerCubic = 4; |
480 static const int kIndicesPerCubic = 6; | 435 static const int kIndicesPerCubic = 6; |
481 | 436 |
482 typedef GrTestBatch INHERITED; | 437 typedef GrTestBatch INHERITED; |
483 }; | 438 }; |
484 | 439 |
485 /** | 440 /** |
486 * This GM directly exercises effects that draw Bezier quad curves in the GPU ba
ckend. | 441 * This GM directly exercises effects that draw Bezier quad curves in the GPU ba
ckend. |
487 */ | 442 */ |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 boundsPaint.setStyle(SkPaint::kStroke_Style); | 544 boundsPaint.setStyle(SkPaint::kStroke_Style); |
590 canvas->drawRect(bounds, boundsPaint); | 545 canvas->drawRect(bounds, boundsPaint); |
591 | 546 |
592 GrPipelineBuilder pipelineBuilder; | 547 GrPipelineBuilder pipelineBuilder; |
593 pipelineBuilder.setXPFactory( | 548 pipelineBuilder.setXPFactory( |
594 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->u
nref(); | 549 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->u
nref(); |
595 pipelineBuilder.setRenderTarget(rt); | 550 pipelineBuilder.setRenderTarget(rt); |
596 | 551 |
597 GrPathUtils::QuadUVMatrix DevToUV(pts); | 552 GrPathUtils::QuadUVMatrix DevToUV(pts); |
598 | 553 |
599 BezierQuadTestBatch::Geometry geometry; | 554 SkAutoTUnref<GrDrawBatch> batch( |
600 geometry.fColor = color; | 555 new BezierQuadTestBatch(gp, bounds, color, DevToUV)); |
601 geometry.fBounds = bounds; | |
602 | |
603 SkAutoTUnref<GrDrawBatch> batch(BezierQuadTestBatch::Create(
gp, geometry, | |
604
DevToUV)); | |
605 | 556 |
606 drawContext->drawContextPriv().testingOnly_drawBatch(pipelin
eBuilder, batch); | 557 drawContext->drawContextPriv().testingOnly_drawBatch(pipelin
eBuilder, batch); |
607 } | 558 } |
608 ++col; | 559 ++col; |
609 if (numCols == col) { | 560 if (numCols == col) { |
610 col = 0; | 561 col = 0; |
611 ++row; | 562 ++row; |
612 } | 563 } |
613 } | 564 } |
614 } | 565 } |
615 } | 566 } |
616 | 567 |
617 private: | 568 private: |
618 typedef GM INHERITED; | 569 typedef GM INHERITED; |
619 }; | 570 }; |
620 | 571 |
621 DEF_GM(return new BezierCubicEffects;) | 572 DEF_GM(return new BezierCubicEffects;) |
622 DEF_GM(return new BezierConicEffects;) | 573 DEF_GM(return new BezierConicEffects;) |
623 DEF_GM(return new BezierQuadEffects;) | 574 DEF_GM(return new BezierQuadEffects;) |
624 } | 575 } |
625 | 576 |
626 #endif | 577 #endif |
OLD | NEW |