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 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 return true; | 438 return true; |
439 } | 439 } |
440 | 440 |
441 ////////////////////////////////////////////////////////////////////////////// | 441 ////////////////////////////////////////////////////////////////////////////// |
442 | 442 |
443 class GLDashingCircleEffect; | 443 class GLDashingCircleEffect; |
444 | 444 |
445 struct DashingCircleBatchTracker { | 445 struct DashingCircleBatchTracker { |
446 GrGPInput fInputColorType; | 446 GrGPInput fInputColorType; |
447 GrColor fColor; | 447 GrColor fColor; |
| 448 bool fUsesLocalCoords; |
448 }; | 449 }; |
449 | 450 |
450 /* | 451 /* |
451 * This effect will draw a dotted line (defined as a dashed lined with round cap
s and no on | 452 * This effect will draw a dotted line (defined as a dashed lined with round cap
s and no on |
452 * interval). The radius of the dots is given by the strokeWidth and the spacing
by the DashInfo. | 453 * interval). The radius of the dots is given by the strokeWidth and the spacing
by the DashInfo. |
453 * Both of the previous two parameters are in device space. This effect also req
uires the setting of | 454 * Both of the previous two parameters are in device space. This effect also req
uires the setting of |
454 * a vec2 vertex attribute for the the four corners of the bounding rect. This a
ttribute is the | 455 * a vec2 vertex attribute for the the four corners of the bounding rect. This a
ttribute is the |
455 * "dash position" of each vertex. In other words it is the vertex coords (in de
vice space) if we | 456 * "dash position" of each vertex. In other words it is the vertex coords (in de
vice space) if we |
456 * transform the line to be horizontal, with the start of line at the origin the
n shifted to the | 457 * transform the line to be horizontal, with the start of line at the origin the
n shifted to the |
457 * right by half the off interval. The line then goes in the positive x directio
n. | 458 * right by half the off interval. The line then goes in the positive x directio
n. |
(...skipping 24 matching lines...) Expand all Loading... |
482 SkScalar getIntervalLength() const { return fIntervalLength; } | 483 SkScalar getIntervalLength() const { return fIntervalLength; } |
483 | 484 |
484 virtual void getGLProcessorKey(const GrBatchTracker&, | 485 virtual void getGLProcessorKey(const GrBatchTracker&, |
485 const GrGLCaps&, | 486 const GrGLCaps&, |
486 GrProcessorKeyBuilder* b) const SK_OVERRIDE; | 487 GrProcessorKeyBuilder* b) const SK_OVERRIDE; |
487 | 488 |
488 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker&) const
SK_OVERRIDE; | 489 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker&) const
SK_OVERRIDE; |
489 | 490 |
490 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR
IDE; | 491 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR
IDE; |
491 | 492 |
492 bool onCanMakeEqual(const GrBatchTracker&, const GrBatchTracker&) const SK_O
VERRIDE; | 493 bool onCanMakeEqual(const GrBatchTracker&, |
| 494 const GrGeometryProcessor&, |
| 495 const GrBatchTracker&) const SK_OVERRIDE; |
493 | 496 |
494 private: | 497 private: |
495 DashingCircleEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& i
nfo, | 498 DashingCircleEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& i
nfo, |
496 SkScalar radius); | 499 SkScalar radius); |
497 | 500 |
498 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; | 501 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; |
499 | 502 |
500 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_O
VERRIDE; | 503 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_O
VERRIDE; |
501 | 504 |
502 GrPrimitiveEdgeType fEdgeType; | 505 GrPrimitiveEdgeType fEdgeType; |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 const DashingCircleEffect& dce = other.cast<DashingCircleEffect>(); | 675 const DashingCircleEffect& dce = other.cast<DashingCircleEffect>(); |
673 return (fEdgeType == dce.fEdgeType && | 676 return (fEdgeType == dce.fEdgeType && |
674 fIntervalLength == dce.fIntervalLength && | 677 fIntervalLength == dce.fIntervalLength && |
675 fRadius == dce.fRadius && | 678 fRadius == dce.fRadius && |
676 fCenterX == dce.fCenterX); | 679 fCenterX == dce.fCenterX); |
677 } | 680 } |
678 | 681 |
679 void DashingCircleEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& ini
t) const { | 682 void DashingCircleEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& ini
t) const { |
680 DashingCircleBatchTracker* local = bt->cast<DashingCircleBatchTracker>(); | 683 DashingCircleBatchTracker* local = bt->cast<DashingCircleBatchTracker>(); |
681 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in
it, false); | 684 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in
it, false); |
| 685 local->fUsesLocalCoords = init.fUsesLocalCoords; |
682 } | 686 } |
683 | 687 |
684 bool DashingCircleEffect::onCanMakeEqual(const GrBatchTracker& m, const GrBatchT
racker& t) const { | 688 bool DashingCircleEffect::onCanMakeEqual(const GrBatchTracker& m, |
| 689 const GrGeometryProcessor& that, |
| 690 const GrBatchTracker& t) const { |
685 const DashingCircleBatchTracker& mine = m.cast<DashingCircleBatchTracker>(); | 691 const DashingCircleBatchTracker& mine = m.cast<DashingCircleBatchTracker>(); |
686 const DashingCircleBatchTracker& theirs = t.cast<DashingCircleBatchTracker>(
); | 692 const DashingCircleBatchTracker& theirs = t.cast<DashingCircleBatchTracker>(
); |
687 return CanCombineOutput(mine.fInputColorType, mine.fColor, | 693 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, |
| 694 that, theirs.fUsesLocalCoords) && |
| 695 CanCombineOutput(mine.fInputColorType, mine.fColor, |
688 theirs.fInputColorType, theirs.fColor); | 696 theirs.fInputColorType, theirs.fColor); |
689 } | 697 } |
690 | 698 |
691 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingCircleEffect); | 699 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingCircleEffect); |
692 | 700 |
693 GrGeometryProcessor* DashingCircleEffect::TestCreate(SkRandom* random, | 701 GrGeometryProcessor* DashingCircleEffect::TestCreate(SkRandom* random, |
694 GrContext*, | 702 GrContext*, |
695 const GrDrawTargetCaps& cap
s, | 703 const GrDrawTargetCaps& cap
s, |
696 GrTexture*[]) { | 704 GrTexture*[]) { |
697 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(random->next
ULessThan( | 705 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(random->next
ULessThan( |
(...skipping 10 matching lines...) Expand all Loading... |
708 return DashingCircleEffect::Create(GrRandomColor(random), edgeType, info, st
rokeWidth); | 716 return DashingCircleEffect::Create(GrRandomColor(random), edgeType, info, st
rokeWidth); |
709 } | 717 } |
710 | 718 |
711 ////////////////////////////////////////////////////////////////////////////// | 719 ////////////////////////////////////////////////////////////////////////////// |
712 | 720 |
713 class GLDashingLineEffect; | 721 class GLDashingLineEffect; |
714 | 722 |
715 struct DashingLineBatchTracker { | 723 struct DashingLineBatchTracker { |
716 GrGPInput fInputColorType; | 724 GrGPInput fInputColorType; |
717 GrColor fColor; | 725 GrColor fColor; |
| 726 bool fUsesLocalCoords; |
718 }; | 727 }; |
719 | 728 |
720 /* | 729 /* |
721 * This effect will draw a dashed line. The width of the dash is given by the st
rokeWidth and the | 730 * This effect will draw a dashed line. The width of the dash is given by the st
rokeWidth and the |
722 * length and spacing by the DashInfo. Both of the previous two parameters are i
n device space. | 731 * length and spacing by the DashInfo. Both of the previous two parameters are i
n device space. |
723 * This effect also requires the setting of a vec2 vertex attribute for the the
four corners of the | 732 * This effect also requires the setting of a vec2 vertex attribute for the the
four corners of the |
724 * bounding rect. This attribute is the "dash position" of each vertex. In other
words it is the | 733 * bounding rect. This attribute is the "dash position" of each vertex. In other
words it is the |
725 * vertex coords (in device space) if we transform the line to be horizontal, wi
th the start of | 734 * vertex coords (in device space) if we transform the line to be horizontal, wi
th the start of |
726 * line at the origin then shifted to the right by half the off interval. The li
ne then goes in the | 735 * line at the origin then shifted to the right by half the off interval. The li
ne then goes in the |
727 * positive x direction. | 736 * positive x direction. |
(...skipping 22 matching lines...) Expand all Loading... |
750 SkScalar getIntervalLength() const { return fIntervalLength; } | 759 SkScalar getIntervalLength() const { return fIntervalLength; } |
751 | 760 |
752 virtual void getGLProcessorKey(const GrBatchTracker& bt, | 761 virtual void getGLProcessorKey(const GrBatchTracker& bt, |
753 const GrGLCaps& caps, | 762 const GrGLCaps& caps, |
754 GrProcessorKeyBuilder* b) const SK_OVERRIDE; | 763 GrProcessorKeyBuilder* b) const SK_OVERRIDE; |
755 | 764 |
756 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE; | 765 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE; |
757 | 766 |
758 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR
IDE; | 767 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR
IDE; |
759 | 768 |
760 bool onCanMakeEqual(const GrBatchTracker&, const GrBatchTracker&) const SK_O
VERRIDE; | 769 bool onCanMakeEqual(const GrBatchTracker&, |
| 770 const GrGeometryProcessor&, |
| 771 const GrBatchTracker&) const SK_OVERRIDE; |
761 | 772 |
762 private: | 773 private: |
763 DashingLineEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& inf
o, | 774 DashingLineEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& inf
o, |
764 SkScalar strokeWidth); | 775 SkScalar strokeWidth); |
765 | 776 |
766 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; | 777 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; |
767 | 778 |
768 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_O
VERRIDE; | 779 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_O
VERRIDE; |
769 | 780 |
770 GrPrimitiveEdgeType fEdgeType; | 781 GrPrimitiveEdgeType fEdgeType; |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 bool DashingLineEffect::onIsEqual(const GrGeometryProcessor& other) const { | 964 bool DashingLineEffect::onIsEqual(const GrGeometryProcessor& other) const { |
954 const DashingLineEffect& de = other.cast<DashingLineEffect>(); | 965 const DashingLineEffect& de = other.cast<DashingLineEffect>(); |
955 return (fEdgeType == de.fEdgeType && | 966 return (fEdgeType == de.fEdgeType && |
956 fRect == de.fRect && | 967 fRect == de.fRect && |
957 fIntervalLength == de.fIntervalLength); | 968 fIntervalLength == de.fIntervalLength); |
958 } | 969 } |
959 | 970 |
960 void DashingLineEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& init)
const { | 971 void DashingLineEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& init)
const { |
961 DashingLineBatchTracker* local = bt->cast<DashingLineBatchTracker>(); | 972 DashingLineBatchTracker* local = bt->cast<DashingLineBatchTracker>(); |
962 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in
it, false); | 973 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in
it, false); |
| 974 local->fUsesLocalCoords = init.fUsesLocalCoords; |
963 } | 975 } |
964 | 976 |
965 bool DashingLineEffect::onCanMakeEqual(const GrBatchTracker& m, const GrBatchTra
cker& t) const { | 977 bool DashingLineEffect::onCanMakeEqual(const GrBatchTracker& m, |
| 978 const GrGeometryProcessor& that, |
| 979 const GrBatchTracker& t) const { |
966 const DashingLineBatchTracker& mine = m.cast<DashingLineBatchTracker>(); | 980 const DashingLineBatchTracker& mine = m.cast<DashingLineBatchTracker>(); |
967 const DashingLineBatchTracker& theirs = t.cast<DashingLineBatchTracker>(); | 981 const DashingLineBatchTracker& theirs = t.cast<DashingLineBatchTracker>(); |
968 return CanCombineOutput(mine.fInputColorType, mine.fColor, | 982 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, |
| 983 that, theirs.fUsesLocalCoords) && |
| 984 CanCombineOutput(mine.fInputColorType, mine.fColor, |
969 theirs.fInputColorType, theirs.fColor); | 985 theirs.fInputColorType, theirs.fColor); |
970 } | 986 } |
971 | 987 |
972 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingLineEffect); | 988 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingLineEffect); |
973 | 989 |
974 GrGeometryProcessor* DashingLineEffect::TestCreate(SkRandom* random, | 990 GrGeometryProcessor* DashingLineEffect::TestCreate(SkRandom* random, |
975 GrContext*, | 991 GrContext*, |
976 const GrDrawTargetCaps& caps, | 992 const GrDrawTargetCaps& caps, |
977 GrTexture*[]) { | 993 GrTexture*[]) { |
978 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(random->next
ULessThan( | 994 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>(random->next
ULessThan( |
(...skipping 20 matching lines...) Expand all Loading... |
999 switch (cap) { | 1015 switch (cap) { |
1000 case GrDashingEffect::kRound_DashCap: | 1016 case GrDashingEffect::kRound_DashCap: |
1001 return DashingCircleEffect::Create(color, edgeType, info, SkScalarHa
lf(strokeWidth)); | 1017 return DashingCircleEffect::Create(color, edgeType, info, SkScalarHa
lf(strokeWidth)); |
1002 case GrDashingEffect::kNonRound_DashCap: | 1018 case GrDashingEffect::kNonRound_DashCap: |
1003 return DashingLineEffect::Create(color, edgeType, info, strokeWidth)
; | 1019 return DashingLineEffect::Create(color, edgeType, info, strokeWidth)
; |
1004 default: | 1020 default: |
1005 SkFAIL("Unexpected dashed cap."); | 1021 SkFAIL("Unexpected dashed cap."); |
1006 } | 1022 } |
1007 return NULL; | 1023 return NULL; |
1008 } | 1024 } |
OLD | NEW |