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