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 "GrBatch.h" | 10 #include "GrBatch.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 if (pts[0].fX != pts[1].fX && pts[0].fY != pts[1].fY) { | 36 if (pts[0].fX != pts[1].fX && pts[0].fY != pts[1].fY) { |
37 return false; | 37 return false; |
38 } | 38 } |
39 | 39 |
40 // May be able to relax this to include skew. As of now cannot do perspectiv
e | 40 // May be able to relax this to include skew. As of now cannot do perspectiv
e |
41 // because of the non uniform scaling of bloating a rect | 41 // because of the non uniform scaling of bloating a rect |
42 if (!viewMatrix.preservesRightAngles()) { | 42 if (!viewMatrix.preservesRightAngles()) { |
43 return false; | 43 return false; |
44 } | 44 } |
45 | 45 |
46 if (!strokeInfo.isDashed() || 2 != strokeInfo.dashCount()) { | 46 if (!strokeInfo.isDashed() || 2 != strokeInfo.getDashCount()) { |
47 return false; | 47 return false; |
48 } | 48 } |
49 | 49 |
50 const SkPathEffect::DashInfo& info = strokeInfo.getDashInfo(); | 50 const SkScalar* intervals = strokeInfo.getDashIntervals(); |
51 if (0 == info.fIntervals[0] && 0 == info.fIntervals[1]) { | 51 if (0 == intervals[0] && 0 == intervals[1]) { |
52 return false; | 52 return false; |
53 } | 53 } |
54 | 54 |
55 SkPaint::Cap cap = strokeInfo.getStrokeRec().getCap(); | 55 SkPaint::Cap cap = strokeInfo.getStrokeRec().getCap(); |
56 // Current we do don't handle Round or Square cap dashes | 56 // Current we do don't handle Round or Square cap dashes |
57 if (SkPaint::kRound_Cap == cap && info.fIntervals[0] != 0.f) { | 57 if (SkPaint::kRound_Cap == cap && intervals[0] != 0.f) { |
58 return false; | 58 return false; |
59 } | 59 } |
60 | 60 |
61 return true; | 61 return true; |
62 } | 62 } |
63 | 63 |
64 namespace { | 64 namespace { |
65 struct DashLineVertex { | 65 struct DashLineVertex { |
66 SkPoint fPos; | 66 SkPoint fPos; |
67 SkPoint fDashPos; | 67 SkPoint fDashPos; |
(...skipping 636 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
704 | 704 |
705 static const int kVertsPerDash = 4; | 705 static const int kVertsPerDash = 4; |
706 static const int kIndicesPerDash = 6; | 706 static const int kIndicesPerDash = 6; |
707 | 707 |
708 BatchTracker fBatch; | 708 BatchTracker fBatch; |
709 SkSTArray<1, Geometry, true> fGeoData; | 709 SkSTArray<1, Geometry, true> fGeoData; |
710 }; | 710 }; |
711 | 711 |
712 static GrBatch* create_batch(GrColor color, const SkMatrix& viewMatrix, const Sk
Point pts[2], | 712 static GrBatch* create_batch(GrColor color, const SkMatrix& viewMatrix, const Sk
Point pts[2], |
713 bool useAA, const GrStrokeInfo& strokeInfo, bool ms
aaRT) { | 713 bool useAA, const GrStrokeInfo& strokeInfo, bool ms
aaRT) { |
714 const SkPathEffect::DashInfo& info = strokeInfo.getDashInfo(); | 714 const SkScalar* intervals = strokeInfo.getDashIntervals(); |
| 715 SkScalar phase = strokeInfo.getDashPhase(); |
715 | 716 |
716 SkPaint::Cap cap = strokeInfo.getStrokeRec().getCap(); | 717 SkPaint::Cap cap = strokeInfo.getStrokeRec().getCap(); |
717 | 718 |
718 DashBatch::Geometry geometry; | 719 DashBatch::Geometry geometry; |
719 geometry.fSrcStrokeWidth = strokeInfo.getStrokeRec().getWidth(); | 720 geometry.fSrcStrokeWidth = strokeInfo.getStrokeRec().getWidth(); |
720 | 721 |
721 // the phase should be normalized to be [0, sum of all intervals) | 722 // the phase should be normalized to be [0, sum of all intervals) |
722 SkASSERT(info.fPhase >= 0 && info.fPhase < info.fIntervals[0] + info.fInterv
als[1]); | 723 SkASSERT(phase >= 0 && phase < intervals[0] + intervals[1]); |
723 | 724 |
724 // Rotate the src pts so they are aligned horizontally with pts[0].fX < pts[
1].fX | 725 // Rotate the src pts so they are aligned horizontally with pts[0].fX < pts[
1].fX |
725 if (pts[0].fY != pts[1].fY || pts[0].fX > pts[1].fX) { | 726 if (pts[0].fY != pts[1].fY || pts[0].fX > pts[1].fX) { |
726 SkMatrix rotMatrix; | 727 SkMatrix rotMatrix; |
727 align_to_x_axis(pts, &rotMatrix, geometry.fPtsRot); | 728 align_to_x_axis(pts, &rotMatrix, geometry.fPtsRot); |
728 if(!rotMatrix.invert(&geometry.fSrcRotInv)) { | 729 if(!rotMatrix.invert(&geometry.fSrcRotInv)) { |
729 SkDebugf("Failed to create invertible rotation matrix!\n"); | 730 SkDebugf("Failed to create invertible rotation matrix!\n"); |
730 return NULL; | 731 return NULL; |
731 } | 732 } |
732 } else { | 733 } else { |
733 geometry.fSrcRotInv.reset(); | 734 geometry.fSrcRotInv.reset(); |
734 memcpy(geometry.fPtsRot, pts, 2 * sizeof(SkPoint)); | 735 memcpy(geometry.fPtsRot, pts, 2 * sizeof(SkPoint)); |
735 } | 736 } |
736 | 737 |
737 // Scale corrections of intervals and stroke from view matrix | 738 // Scale corrections of intervals and stroke from view matrix |
738 calc_dash_scaling(&geometry.fParallelScale, &geometry.fPerpendicularScale, v
iewMatrix, | 739 calc_dash_scaling(&geometry.fParallelScale, &geometry.fPerpendicularScale, v
iewMatrix, |
739 geometry.fPtsRot); | 740 geometry.fPtsRot); |
740 | 741 |
741 SkScalar offInterval = info.fIntervals[1] * geometry.fParallelScale; | 742 SkScalar offInterval = intervals[1] * geometry.fParallelScale; |
742 SkScalar strokeWidth = geometry.fSrcStrokeWidth * geometry.fPerpendicularSca
le; | 743 SkScalar strokeWidth = geometry.fSrcStrokeWidth * geometry.fPerpendicularSca
le; |
743 | 744 |
744 if (SkPaint::kSquare_Cap == cap && 0 != geometry.fSrcStrokeWidth) { | 745 if (SkPaint::kSquare_Cap == cap && 0 != geometry.fSrcStrokeWidth) { |
745 // add cap to on interveal and remove from off interval | 746 // add cap to on interveal and remove from off interval |
746 offInterval -= strokeWidth; | 747 offInterval -= strokeWidth; |
747 } | 748 } |
748 | 749 |
749 DashAAMode aaMode = msaaRT ? kMSAA_DashAAMode : | 750 DashAAMode aaMode = msaaRT ? kMSAA_DashAAMode : |
750 useAA ? kEdgeAA_DashAAMode : kBW_DashAAMode; | 751 useAA ? kEdgeAA_DashAAMode : kBW_DashAAMode; |
751 | 752 |
752 // TODO we can do a real rect call if not using fulldash(ie no off interval,
not using AA) | 753 // TODO we can do a real rect call if not using fulldash(ie no off interval,
not using AA) |
753 bool fullDash = offInterval > 0.f || aaMode != kBW_DashAAMode; | 754 bool fullDash = offInterval > 0.f || aaMode != kBW_DashAAMode; |
754 | 755 |
755 geometry.fColor = color; | 756 geometry.fColor = color; |
756 geometry.fViewMatrix = viewMatrix; | 757 geometry.fViewMatrix = viewMatrix; |
757 geometry.fPhase = info.fPhase; | 758 geometry.fPhase = phase; |
758 geometry.fIntervals[0] = info.fIntervals[0]; | 759 geometry.fIntervals[0] = intervals[0]; |
759 geometry.fIntervals[1] = info.fIntervals[1]; | 760 geometry.fIntervals[1] = intervals[1]; |
760 | 761 |
761 return DashBatch::Create(geometry, cap, aaMode, fullDash); | 762 return DashBatch::Create(geometry, cap, aaMode, fullDash); |
762 } | 763 } |
763 | 764 |
764 bool GrDashingEffect::DrawDashLine(GrGpu* gpu, GrDrawTarget* target, | 765 bool GrDashingEffect::DrawDashLine(GrGpu* gpu, GrDrawTarget* target, |
765 GrPipelineBuilder* pipelineBuilder, GrColor c
olor, | 766 GrPipelineBuilder* pipelineBuilder, GrColor c
olor, |
766 const SkMatrix& viewMatrix, const SkPoint pts
[2], | 767 const SkMatrix& viewMatrix, const SkPoint pts
[2], |
767 bool useAA, const GrStrokeInfo& strokeInfo) { | 768 bool useAA, const GrStrokeInfo& strokeInfo) { |
768 SkAutoTUnref<GrBatch> batch(create_batch(color, viewMatrix, pts, useAA, stro
keInfo, | 769 SkAutoTUnref<GrBatch> batch(create_batch(color, viewMatrix, pts, useAA, stro
keInfo, |
769 pipelineBuilder->getRenderTarget()-
>isMultisampled())); | 770 pipelineBuilder->getRenderTarget()-
>isMultisampled())); |
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1372 info.fIntervals = intervals; | 1373 info.fIntervals = intervals; |
1373 info.fCount = 2; | 1374 info.fCount = 2; |
1374 info.fPhase = phase; | 1375 info.fPhase = phase; |
1375 SkDEBUGCODE(bool success = ) strokeInfo.setDashInfo(info); | 1376 SkDEBUGCODE(bool success = ) strokeInfo.setDashInfo(info); |
1376 SkASSERT(success); | 1377 SkASSERT(success); |
1377 | 1378 |
1378 return create_batch(color, viewMatrix, pts, useAA, strokeInfo, msaaRT); | 1379 return create_batch(color, viewMatrix, pts, useAA, strokeInfo, msaaRT); |
1379 } | 1380 } |
1380 | 1381 |
1381 #endif | 1382 #endif |
OLD | NEW |