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