OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 "GrDashingEffect.h" | 8 #include "GrDashingEffect.h" |
9 | 9 |
10 #include "../GrAARectRenderer.h" | 10 #include "../GrAARectRenderer.h" |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 | 497 |
498 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 498 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
499 | 499 |
500 typedef GrGeometryProcessor INHERITED; | 500 typedef GrGeometryProcessor INHERITED; |
501 }; | 501 }; |
502 | 502 |
503 ////////////////////////////////////////////////////////////////////////////// | 503 ////////////////////////////////////////////////////////////////////////////// |
504 | 504 |
505 class GLDashingCircleEffect : public GrGLGeometryProcessor { | 505 class GLDashingCircleEffect : public GrGLGeometryProcessor { |
506 public: | 506 public: |
507 GLDashingCircleEffect(const GrBackendProcessorFactory&, const GrProcessor&); | 507 GLDashingCircleEffect(const GrBackendProcessorFactory&, |
| 508 const GrGeometryProcessor&, |
| 509 const GrBatchTracker&); |
508 | 510 |
509 virtual void emitCode(const EmitArgs&) SK_OVERRIDE; | 511 virtual void emitCode(const EmitArgs&) SK_OVERRIDE; |
510 | 512 |
511 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); | 513 static inline void GenKey(const GrGeometryProcessor&, |
| 514 const GrBatchTracker&, |
| 515 const GrGLCaps&, |
| 516 GrProcessorKeyBuilder*); |
512 | 517 |
513 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 518 virtual void setData(const GrGLProgramDataManager&, |
| 519 const GrGeometryProcessor&, |
| 520 const GrBatchTracker&) SK_OVERRIDE; |
514 | 521 |
515 private: | 522 private: |
516 GrGLProgramDataManager::UniformHandle fParamUniform; | 523 GrGLProgramDataManager::UniformHandle fParamUniform; |
517 SkScalar fPrevRadius; | 524 SkScalar fPrevRadius; |
518 SkScalar fPrevCenterX; | 525 SkScalar fPrevCenterX; |
519 SkScalar fPrevIntervalLength; | 526 SkScalar fPrevIntervalLength; |
520 typedef GrGLGeometryProcessor INHERITED; | 527 typedef GrGLGeometryProcessor INHERITED; |
521 }; | 528 }; |
522 | 529 |
523 GLDashingCircleEffect::GLDashingCircleEffect(const GrBackendProcessorFactory& fa
ctory, | 530 GLDashingCircleEffect::GLDashingCircleEffect(const GrBackendProcessorFactory& fa
ctory, |
524 const GrProcessor&) | 531 const GrGeometryProcessor&, |
| 532 const GrBatchTracker&) |
525 : INHERITED (factory) { | 533 : INHERITED (factory) { |
526 fPrevRadius = SK_ScalarMin; | 534 fPrevRadius = SK_ScalarMin; |
527 fPrevCenterX = SK_ScalarMin; | 535 fPrevCenterX = SK_ScalarMin; |
528 fPrevIntervalLength = SK_ScalarMax; | 536 fPrevIntervalLength = SK_ScalarMax; |
529 } | 537 } |
530 | 538 |
531 void GLDashingCircleEffect::emitCode(const EmitArgs& args) { | 539 void GLDashingCircleEffect::emitCode(const EmitArgs& args) { |
532 const DashingCircleEffect& dce = args.fGP.cast<DashingCircleEffect>(); | 540 const DashingCircleEffect& dce = args.fGP.cast<DashingCircleEffect>(); |
533 const char *paramName; | 541 const char *paramName; |
534 // The param uniforms, xyz, refer to circle radius - 0.5, cicles center x co
ord, and | 542 // The param uniforms, xyz, refer to circle radius - 0.5, cicles center x co
ord, and |
(...skipping 28 matching lines...) Expand all Loading... |
563 fsBuilder->codeAppendf("\t\tfloat diff = dist - %s.x;\n", paramName); | 571 fsBuilder->codeAppendf("\t\tfloat diff = dist - %s.x;\n", paramName); |
564 fsBuilder->codeAppend("\t\tdiff = 1.0 - diff;\n"); | 572 fsBuilder->codeAppend("\t\tdiff = 1.0 - diff;\n"); |
565 fsBuilder->codeAppend("\t\tfloat alpha = clamp(diff, 0.0, 1.0);\n"); | 573 fsBuilder->codeAppend("\t\tfloat alpha = clamp(diff, 0.0, 1.0);\n"); |
566 } else { | 574 } else { |
567 fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n"); | 575 fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n"); |
568 fsBuilder->codeAppendf("\t\talpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;\n",
paramName); | 576 fsBuilder->codeAppendf("\t\talpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;\n",
paramName); |
569 } | 577 } |
570 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | 578 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
571 } | 579 } |
572 | 580 |
573 void GLDashingCircleEffect::setData(const GrGLProgramDataManager& pdman | 581 void GLDashingCircleEffect::setData(const GrGLProgramDataManager& pdman, |
574 , const GrProcessor& processor) { | 582 const GrGeometryProcessor& processor, |
| 583 const GrBatchTracker&) { |
575 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); | 584 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); |
576 SkScalar radius = dce.getRadius(); | 585 SkScalar radius = dce.getRadius(); |
577 SkScalar centerX = dce.getCenterX(); | 586 SkScalar centerX = dce.getCenterX(); |
578 SkScalar intervalLength = dce.getIntervalLength(); | 587 SkScalar intervalLength = dce.getIntervalLength(); |
579 if (radius != fPrevRadius || centerX != fPrevCenterX || intervalLength != fP
revIntervalLength) { | 588 if (radius != fPrevRadius || centerX != fPrevCenterX || intervalLength != fP
revIntervalLength) { |
580 pdman.set3f(fParamUniform, radius - 0.5f, centerX, intervalLength); | 589 pdman.set3f(fParamUniform, radius - 0.5f, centerX, intervalLength); |
581 fPrevRadius = radius; | 590 fPrevRadius = radius; |
582 fPrevCenterX = centerX; | 591 fPrevCenterX = centerX; |
583 fPrevIntervalLength = intervalLength; | 592 fPrevIntervalLength = intervalLength; |
584 } | 593 } |
585 } | 594 } |
586 | 595 |
587 void GLDashingCircleEffect::GenKey(const GrProcessor& processor, const GrGLCaps&
, | 596 void GLDashingCircleEffect::GenKey(const GrGeometryProcessor& processor, |
| 597 const GrBatchTracker&, |
| 598 const GrGLCaps&, |
588 GrProcessorKeyBuilder* b) { | 599 GrProcessorKeyBuilder* b) { |
589 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); | 600 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); |
590 b->add32(dce.getEdgeType()); | 601 b->add32(dce.getEdgeType()); |
591 } | 602 } |
592 | 603 |
593 ////////////////////////////////////////////////////////////////////////////// | 604 ////////////////////////////////////////////////////////////////////////////// |
594 | 605 |
595 GrGeometryProcessor* DashingCircleEffect::Create(GrPrimitiveEdgeType edgeType, c
onst DashInfo& info, | 606 GrGeometryProcessor* DashingCircleEffect::Create(GrPrimitiveEdgeType edgeType, c
onst DashInfo& info, |
596 SkScalar radius) { | 607 SkScalar radius) { |
597 if (info.fCount != 2 || info.fIntervals[0] != 0) { | 608 if (info.fCount != 2 || info.fIntervals[0] != 0) { |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 | 716 |
706 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 717 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
707 | 718 |
708 typedef GrGeometryProcessor INHERITED; | 719 typedef GrGeometryProcessor INHERITED; |
709 }; | 720 }; |
710 | 721 |
711 ////////////////////////////////////////////////////////////////////////////// | 722 ////////////////////////////////////////////////////////////////////////////// |
712 | 723 |
713 class GLDashingLineEffect : public GrGLGeometryProcessor { | 724 class GLDashingLineEffect : public GrGLGeometryProcessor { |
714 public: | 725 public: |
715 GLDashingLineEffect(const GrBackendProcessorFactory&, const GrProcessor&); | 726 GLDashingLineEffect(const GrBackendProcessorFactory&, |
| 727 const GrGeometryProcessor&, |
| 728 const GrBatchTracker&); |
716 | 729 |
717 virtual void emitCode(const EmitArgs&) SK_OVERRIDE; | 730 virtual void emitCode(const EmitArgs&) SK_OVERRIDE; |
718 | 731 |
719 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); | 732 static inline void GenKey(const GrGeometryProcessor&, |
| 733 const GrBatchTracker&, |
| 734 const GrGLCaps&, |
| 735 GrProcessorKeyBuilder*); |
720 | 736 |
721 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 737 virtual void setData(const GrGLProgramDataManager&, |
| 738 const GrGeometryProcessor&, |
| 739 const GrBatchTracker&) SK_OVERRIDE; |
722 | 740 |
723 private: | 741 private: |
724 GrGLProgramDataManager::UniformHandle fRectUniform; | 742 GrGLProgramDataManager::UniformHandle fRectUniform; |
725 GrGLProgramDataManager::UniformHandle fIntervalUniform; | 743 GrGLProgramDataManager::UniformHandle fIntervalUniform; |
726 SkRect fPrevRect; | 744 SkRect fPrevRect; |
727 SkScalar fPrevIntervalLength; | 745 SkScalar fPrevIntervalLength; |
728 typedef GrGLGeometryProcessor INHERITED; | 746 typedef GrGLGeometryProcessor INHERITED; |
729 }; | 747 }; |
730 | 748 |
731 GLDashingLineEffect::GLDashingLineEffect(const GrBackendProcessorFactory& factor
y, | 749 GLDashingLineEffect::GLDashingLineEffect(const GrBackendProcessorFactory& factor
y, |
732 const GrProcessor&) | 750 const GrGeometryProcessor&, |
| 751 const GrBatchTracker&) |
733 : INHERITED (factory) { | 752 : INHERITED (factory) { |
734 fPrevRect.fLeft = SK_ScalarNaN; | 753 fPrevRect.fLeft = SK_ScalarNaN; |
735 fPrevIntervalLength = SK_ScalarMax; | 754 fPrevIntervalLength = SK_ScalarMax; |
736 } | 755 } |
737 | 756 |
738 void GLDashingLineEffect::emitCode(const EmitArgs& args) { | 757 void GLDashingLineEffect::emitCode(const EmitArgs& args) { |
739 const DashingLineEffect& de = args.fGP.cast<DashingLineEffect>(); | 758 const DashingLineEffect& de = args.fGP.cast<DashingLineEffect>(); |
740 const char *rectName; | 759 const char *rectName; |
741 // The rect uniform's xyzw refer to (left + 0.5, top + 0.5, right - 0.5, bot
tom - 0.5), | 760 // The rect uniform's xyzw refer to (left + 0.5, top + 0.5, right - 0.5, bot
tom - 0.5), |
742 // respectively. | 761 // respectively. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
785 } else { | 804 } else { |
786 // Assuming the bounding geometry is tight so no need to check y values | 805 // Assuming the bounding geometry is tight so no need to check y values |
787 fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n"); | 806 fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n"); |
788 fsBuilder->codeAppendf("\t\talpha *= (fragPosShifted.x - %s.x) > -0.5 ?
1.0 : 0.0;\n", rectName); | 807 fsBuilder->codeAppendf("\t\talpha *= (fragPosShifted.x - %s.x) > -0.5 ?
1.0 : 0.0;\n", rectName); |
789 fsBuilder->codeAppendf("\t\talpha *= (%s.z - fragPosShifted.x) >= -0.5 ?
1.0 : 0.0;\n", rectName); | 808 fsBuilder->codeAppendf("\t\talpha *= (%s.z - fragPosShifted.x) >= -0.5 ?
1.0 : 0.0;\n", rectName); |
790 } | 809 } |
791 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | 810 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
792 } | 811 } |
793 | 812 |
794 void GLDashingLineEffect::setData(const GrGLProgramDataManager& pdman, | 813 void GLDashingLineEffect::setData(const GrGLProgramDataManager& pdman, |
795 const GrProcessor& processor) { | 814 const GrGeometryProcessor& processor, |
| 815 const GrBatchTracker&) { |
796 const DashingLineEffect& de = processor.cast<DashingLineEffect>(); | 816 const DashingLineEffect& de = processor.cast<DashingLineEffect>(); |
797 const SkRect& rect = de.getRect(); | 817 const SkRect& rect = de.getRect(); |
798 SkScalar intervalLength = de.getIntervalLength(); | 818 SkScalar intervalLength = de.getIntervalLength(); |
799 if (rect != fPrevRect || intervalLength != fPrevIntervalLength) { | 819 if (rect != fPrevRect || intervalLength != fPrevIntervalLength) { |
800 pdman.set4f(fRectUniform, rect.fLeft + 0.5f, rect.fTop + 0.5f, | 820 pdman.set4f(fRectUniform, rect.fLeft + 0.5f, rect.fTop + 0.5f, |
801 rect.fRight - 0.5f, rect.fBottom - 0.5f); | 821 rect.fRight - 0.5f, rect.fBottom - 0.5f); |
802 pdman.set1f(fIntervalUniform, intervalLength); | 822 pdman.set1f(fIntervalUniform, intervalLength); |
803 fPrevRect = rect; | 823 fPrevRect = rect; |
804 fPrevIntervalLength = intervalLength; | 824 fPrevIntervalLength = intervalLength; |
805 } | 825 } |
806 } | 826 } |
807 | 827 |
808 void GLDashingLineEffect::GenKey(const GrProcessor& processor, const GrGLCaps&, | 828 void GLDashingLineEffect::GenKey(const GrGeometryProcessor& processor, |
| 829 const GrBatchTracker&, |
| 830 const GrGLCaps&, |
809 GrProcessorKeyBuilder* b) { | 831 GrProcessorKeyBuilder* b) { |
810 const DashingLineEffect& de = processor.cast<DashingLineEffect>(); | 832 const DashingLineEffect& de = processor.cast<DashingLineEffect>(); |
811 b->add32(de.getEdgeType()); | 833 b->add32(de.getEdgeType()); |
812 } | 834 } |
813 | 835 |
814 ////////////////////////////////////////////////////////////////////////////// | 836 ////////////////////////////////////////////////////////////////////////////// |
815 | 837 |
816 GrGeometryProcessor* DashingLineEffect::Create(GrPrimitiveEdgeType edgeType, | 838 GrGeometryProcessor* DashingLineEffect::Create(GrPrimitiveEdgeType edgeType, |
817 const DashInfo& info, | 839 const DashInfo& info, |
818 SkScalar strokeWidth) { | 840 SkScalar strokeWidth) { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 switch (cap) { | 904 switch (cap) { |
883 case GrDashingEffect::kRound_DashCap: | 905 case GrDashingEffect::kRound_DashCap: |
884 return DashingCircleEffect::Create(edgeType, info, SkScalarHalf(stro
keWidth)); | 906 return DashingCircleEffect::Create(edgeType, info, SkScalarHalf(stro
keWidth)); |
885 case GrDashingEffect::kNonRound_DashCap: | 907 case GrDashingEffect::kNonRound_DashCap: |
886 return DashingLineEffect::Create(edgeType, info, strokeWidth); | 908 return DashingLineEffect::Create(edgeType, info, strokeWidth); |
887 default: | 909 default: |
888 SkFAIL("Unexpected dashed cap."); | 910 SkFAIL("Unexpected dashed cap."); |
889 } | 911 } |
890 return NULL; | 912 return NULL; |
891 } | 913 } |
OLD | NEW |