| 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 #include "GrOvalRenderer.h" | 8 #include "GrOvalRenderer.h" |
| 9 | 9 |
| 10 #include "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" |
| (...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 return false; | 599 return false; |
| 600 } | 600 } |
| 601 | 601 |
| 602 return true; | 602 return true; |
| 603 } | 603 } |
| 604 | 604 |
| 605 /////////////////////////////////////////////////////////////////////////////// | 605 /////////////////////////////////////////////////////////////////////////////// |
| 606 | 606 |
| 607 class CircleBatch : public GrVertexBatch { | 607 class CircleBatch : public GrVertexBatch { |
| 608 public: | 608 public: |
| 609 DEFINE_BATCH_CLASS_ID |
| 610 |
| 609 struct Geometry { | 611 struct Geometry { |
| 610 GrColor fColor; | |
| 611 SkMatrix fViewMatrix; | 612 SkMatrix fViewMatrix; |
| 613 SkRect fDevBounds; |
| 612 SkScalar fInnerRadius; | 614 SkScalar fInnerRadius; |
| 613 SkScalar fOuterRadius; | 615 SkScalar fOuterRadius; |
| 616 GrColor fColor; |
| 614 bool fStroke; | 617 bool fStroke; |
| 615 SkRect fDevBounds; | |
| 616 }; | 618 }; |
| 617 | 619 |
| 618 static GrDrawBatch* Create(const Geometry& geometry) { return new CircleBatc
h(geometry); } | 620 static GrDrawBatch* Create(const Geometry& geometry) { return new CircleBatc
h(geometry); } |
| 619 | 621 |
| 620 const char* name() const override { return "CircleBatch"; } | 622 const char* name() const override { return "CircleBatch"; } |
| 621 | 623 |
| 622 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { | 624 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { |
| 623 // When this is called on a batch, there is only one geometry bundle | 625 // When this is called on a batch, there is only one geometry bundle |
| 624 out->setKnownFourComponents(fGeoData[0].fColor); | 626 out->setKnownFourComponents(fGeoData[0].fColor); |
| 625 } | 627 } |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 verts[3].fOuterRadius = outerRadius; | 700 verts[3].fOuterRadius = outerRadius; |
| 699 verts[3].fInnerRadius = innerRadius; | 701 verts[3].fInnerRadius = innerRadius; |
| 700 | 702 |
| 701 verts += kVerticesPerQuad; | 703 verts += kVerticesPerQuad; |
| 702 } | 704 } |
| 703 helper.recordDraw(target); | 705 helper.recordDraw(target); |
| 704 } | 706 } |
| 705 | 707 |
| 706 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 708 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 707 | 709 |
| 708 CircleBatch(const Geometry& geometry) { | 710 CircleBatch(const Geometry& geometry) : INHERITED(ClassID()) { |
| 709 this->initClassID<CircleBatch>(); | |
| 710 fGeoData.push_back(geometry); | 711 fGeoData.push_back(geometry); |
| 711 | 712 |
| 712 this->setBounds(geometry.fDevBounds); | 713 this->setBounds(geometry.fDevBounds); |
| 713 } | 714 } |
| 714 | 715 |
| 715 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 716 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| 716 CircleBatch* that = t->cast<CircleBatch>(); | 717 CircleBatch* that = t->cast<CircleBatch>(); |
| 717 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), | 718 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), |
| 718 that->bounds(), caps)) { | 719 that->bounds(), caps)) { |
| 719 return false; | 720 return false; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 746 struct BatchTracker { | 747 struct BatchTracker { |
| 747 GrColor fColor; | 748 GrColor fColor; |
| 748 bool fStroke; | 749 bool fStroke; |
| 749 bool fUsesLocalCoords; | 750 bool fUsesLocalCoords; |
| 750 bool fColorIgnored; | 751 bool fColorIgnored; |
| 751 bool fCoverageIgnored; | 752 bool fCoverageIgnored; |
| 752 }; | 753 }; |
| 753 | 754 |
| 754 BatchTracker fBatch; | 755 BatchTracker fBatch; |
| 755 SkSTArray<1, Geometry, true> fGeoData; | 756 SkSTArray<1, Geometry, true> fGeoData; |
| 757 |
| 758 typedef GrVertexBatch INHERITED; |
| 756 }; | 759 }; |
| 757 | 760 |
| 758 static GrDrawBatch* create_circle_batch(GrColor color, | 761 static GrDrawBatch* create_circle_batch(GrColor color, |
| 759 const SkMatrix& viewMatrix, | 762 const SkMatrix& viewMatrix, |
| 760 bool useCoverageAA, | 763 bool useCoverageAA, |
| 761 const SkRect& circle, | 764 const SkRect& circle, |
| 762 const SkStrokeRec& stroke) { | 765 const SkStrokeRec& stroke) { |
| 763 SkPoint center = SkPoint::Make(circle.centerX(), circle.centerY()); | 766 SkPoint center = SkPoint::Make(circle.centerX(), circle.centerY()); |
| 764 viewMatrix.mapPoints(¢er, 1); | 767 viewMatrix.mapPoints(¢er, 1); |
| 765 SkScalar radius = viewMatrix.mapRadius(SkScalarHalf(circle.width())); | 768 SkScalar radius = viewMatrix.mapRadius(SkScalarHalf(circle.width())); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 const SkStrokeRec& stroke) { | 817 const SkStrokeRec& stroke) { |
| 815 SkAutoTUnref<GrDrawBatch> batch(create_circle_batch(color, viewMatrix, useCo
verageAA, circle, | 818 SkAutoTUnref<GrDrawBatch> batch(create_circle_batch(color, viewMatrix, useCo
verageAA, circle, |
| 816 stroke)); | 819 stroke)); |
| 817 target->drawBatch(pipelineBuilder, batch); | 820 target->drawBatch(pipelineBuilder, batch); |
| 818 } | 821 } |
| 819 | 822 |
| 820 /////////////////////////////////////////////////////////////////////////////// | 823 /////////////////////////////////////////////////////////////////////////////// |
| 821 | 824 |
| 822 class EllipseBatch : public GrVertexBatch { | 825 class EllipseBatch : public GrVertexBatch { |
| 823 public: | 826 public: |
| 827 DEFINE_BATCH_CLASS_ID |
| 828 |
| 824 struct Geometry { | 829 struct Geometry { |
| 825 GrColor fColor; | |
| 826 SkMatrix fViewMatrix; | 830 SkMatrix fViewMatrix; |
| 831 SkRect fDevBounds; |
| 827 SkScalar fXRadius; | 832 SkScalar fXRadius; |
| 828 SkScalar fYRadius; | 833 SkScalar fYRadius; |
| 829 SkScalar fInnerXRadius; | 834 SkScalar fInnerXRadius; |
| 830 SkScalar fInnerYRadius; | 835 SkScalar fInnerYRadius; |
| 836 GrColor fColor; |
| 831 bool fStroke; | 837 bool fStroke; |
| 832 SkRect fDevBounds; | |
| 833 }; | 838 }; |
| 834 | 839 |
| 835 static GrDrawBatch* Create(const Geometry& geometry) { return new EllipseBat
ch(geometry); } | 840 static GrDrawBatch* Create(const Geometry& geometry) { return new EllipseBat
ch(geometry); } |
| 836 | 841 |
| 837 const char* name() const override { return "EllipseBatch"; } | 842 const char* name() const override { return "EllipseBatch"; } |
| 838 | 843 |
| 839 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { | 844 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { |
| 840 // When this is called on a batch, there is only one geometry bundle | 845 // When this is called on a batch, there is only one geometry bundle |
| 841 out->setKnownFourComponents(fGeoData[0].fColor); | 846 out->setKnownFourComponents(fGeoData[0].fColor); |
| 842 } | 847 } |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 919 verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 924 verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 920 verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; | 925 verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; |
| 921 | 926 |
| 922 verts += kVerticesPerQuad; | 927 verts += kVerticesPerQuad; |
| 923 } | 928 } |
| 924 helper.recordDraw(target); | 929 helper.recordDraw(target); |
| 925 } | 930 } |
| 926 | 931 |
| 927 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 932 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 928 | 933 |
| 929 EllipseBatch(const Geometry& geometry) { | 934 EllipseBatch(const Geometry& geometry) : INHERITED(ClassID()) { |
| 930 this->initClassID<EllipseBatch>(); | |
| 931 fGeoData.push_back(geometry); | 935 fGeoData.push_back(geometry); |
| 932 | 936 |
| 933 this->setBounds(geometry.fDevBounds); | 937 this->setBounds(geometry.fDevBounds); |
| 934 } | 938 } |
| 935 | 939 |
| 936 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 940 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| 937 EllipseBatch* that = t->cast<EllipseBatch>(); | 941 EllipseBatch* that = t->cast<EllipseBatch>(); |
| 938 | 942 |
| 939 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), | 943 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), |
| 940 that->bounds(), caps)) { | 944 that->bounds(), caps)) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 968 struct BatchTracker { | 972 struct BatchTracker { |
| 969 GrColor fColor; | 973 GrColor fColor; |
| 970 bool fStroke; | 974 bool fStroke; |
| 971 bool fUsesLocalCoords; | 975 bool fUsesLocalCoords; |
| 972 bool fColorIgnored; | 976 bool fColorIgnored; |
| 973 bool fCoverageIgnored; | 977 bool fCoverageIgnored; |
| 974 }; | 978 }; |
| 975 | 979 |
| 976 BatchTracker fBatch; | 980 BatchTracker fBatch; |
| 977 SkSTArray<1, Geometry, true> fGeoData; | 981 SkSTArray<1, Geometry, true> fGeoData; |
| 982 |
| 983 typedef GrVertexBatch INHERITED; |
| 978 }; | 984 }; |
| 979 | 985 |
| 980 static GrDrawBatch* create_ellipse_batch(GrColor color, | 986 static GrDrawBatch* create_ellipse_batch(GrColor color, |
| 981 const SkMatrix& viewMatrix, | 987 const SkMatrix& viewMatrix, |
| 982 bool useCoverageAA, | 988 bool useCoverageAA, |
| 983 const SkRect& ellipse, | 989 const SkRect& ellipse, |
| 984 const SkStrokeRec& stroke) { | 990 const SkStrokeRec& stroke) { |
| 985 #ifdef SK_DEBUG | 991 #ifdef SK_DEBUG |
| 986 { | 992 { |
| 987 // we should have checked for this previously | 993 // we should have checked for this previously |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1078 } | 1084 } |
| 1079 | 1085 |
| 1080 target->drawBatch(pipelineBuilder, batch); | 1086 target->drawBatch(pipelineBuilder, batch); |
| 1081 return true; | 1087 return true; |
| 1082 } | 1088 } |
| 1083 | 1089 |
| 1084 ////////////////////////////////////////////////////////////////////////////////
///////////////// | 1090 ////////////////////////////////////////////////////////////////////////////////
///////////////// |
| 1085 | 1091 |
| 1086 class DIEllipseBatch : public GrVertexBatch { | 1092 class DIEllipseBatch : public GrVertexBatch { |
| 1087 public: | 1093 public: |
| 1094 DEFINE_BATCH_CLASS_ID |
| 1095 |
| 1088 struct Geometry { | 1096 struct Geometry { |
| 1089 GrColor fColor; | |
| 1090 SkMatrix fViewMatrix; | 1097 SkMatrix fViewMatrix; |
| 1098 SkRect fBounds; |
| 1091 SkScalar fXRadius; | 1099 SkScalar fXRadius; |
| 1092 SkScalar fYRadius; | 1100 SkScalar fYRadius; |
| 1093 SkScalar fInnerXRadius; | 1101 SkScalar fInnerXRadius; |
| 1094 SkScalar fInnerYRadius; | 1102 SkScalar fInnerYRadius; |
| 1095 SkScalar fGeoDx; | 1103 SkScalar fGeoDx; |
| 1096 SkScalar fGeoDy; | 1104 SkScalar fGeoDy; |
| 1105 GrColor fColor; |
| 1097 DIEllipseEdgeEffect::Mode fMode; | 1106 DIEllipseEdgeEffect::Mode fMode; |
| 1098 SkRect fBounds; | |
| 1099 }; | 1107 }; |
| 1100 | 1108 |
| 1101 static GrDrawBatch* Create(const Geometry& geometry, const SkRect& bounds) { | 1109 static GrDrawBatch* Create(const Geometry& geometry, const SkRect& bounds) { |
| 1102 return new DIEllipseBatch(geometry, bounds); | 1110 return new DIEllipseBatch(geometry, bounds); |
| 1103 } | 1111 } |
| 1104 | 1112 |
| 1105 const char* name() const override { return "DIEllipseBatch"; } | 1113 const char* name() const override { return "DIEllipseBatch"; } |
| 1106 | 1114 |
| 1107 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { | 1115 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { |
| 1108 // When this is called on a batch, there is only one geometry bundle | 1116 // When this is called on a batch, there is only one geometry bundle |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1179 verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offse
tDy); | 1187 verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offse
tDy); |
| 1180 verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -inner
RatioY - offsetDy); | 1188 verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -inner
RatioY - offsetDy); |
| 1181 | 1189 |
| 1182 verts += kVerticesPerQuad; | 1190 verts += kVerticesPerQuad; |
| 1183 } | 1191 } |
| 1184 helper.recordDraw(target); | 1192 helper.recordDraw(target); |
| 1185 } | 1193 } |
| 1186 | 1194 |
| 1187 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 1195 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 1188 | 1196 |
| 1189 DIEllipseBatch(const Geometry& geometry, const SkRect& bounds) { | 1197 DIEllipseBatch(const Geometry& geometry, const SkRect& bounds) : INHERITED(C
lassID()) { |
| 1190 this->initClassID<DIEllipseBatch>(); | |
| 1191 fGeoData.push_back(geometry); | 1198 fGeoData.push_back(geometry); |
| 1192 | 1199 |
| 1193 this->setBounds(bounds); | 1200 this->setBounds(bounds); |
| 1194 } | 1201 } |
| 1195 | 1202 |
| 1196 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 1203 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| 1197 DIEllipseBatch* that = t->cast<DIEllipseBatch>(); | 1204 DIEllipseBatch* that = t->cast<DIEllipseBatch>(); |
| 1198 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), | 1205 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), |
| 1199 that->bounds(), caps)) { | 1206 that->bounds(), caps)) { |
| 1200 return false; | 1207 return false; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1227 struct BatchTracker { | 1234 struct BatchTracker { |
| 1228 GrColor fColor; | 1235 GrColor fColor; |
| 1229 DIEllipseEdgeEffect::Mode fMode; | 1236 DIEllipseEdgeEffect::Mode fMode; |
| 1230 bool fUsesLocalCoords; | 1237 bool fUsesLocalCoords; |
| 1231 bool fColorIgnored; | 1238 bool fColorIgnored; |
| 1232 bool fCoverageIgnored; | 1239 bool fCoverageIgnored; |
| 1233 }; | 1240 }; |
| 1234 | 1241 |
| 1235 BatchTracker fBatch; | 1242 BatchTracker fBatch; |
| 1236 SkSTArray<1, Geometry, true> fGeoData; | 1243 SkSTArray<1, Geometry, true> fGeoData; |
| 1244 |
| 1245 typedef GrVertexBatch INHERITED; |
| 1237 }; | 1246 }; |
| 1238 | 1247 |
| 1239 static GrDrawBatch* create_diellipse_batch(GrColor color, | 1248 static GrDrawBatch* create_diellipse_batch(GrColor color, |
| 1240 const SkMatrix& viewMatrix, | 1249 const SkMatrix& viewMatrix, |
| 1241 bool useCoverageAA, | 1250 bool useCoverageAA, |
| 1242 const SkRect& ellipse, | 1251 const SkRect& ellipse, |
| 1243 const SkStrokeRec& stroke) { | 1252 const SkStrokeRec& stroke) { |
| 1244 SkPoint center = SkPoint::Make(ellipse.centerX(), ellipse.centerY()); | 1253 SkPoint center = SkPoint::Make(ellipse.centerX(), ellipse.centerY()); |
| 1245 SkScalar xRadius = SkScalarHalf(ellipse.width()); | 1254 SkScalar xRadius = SkScalarHalf(ellipse.width()); |
| 1246 SkScalar yRadius = SkScalarHalf(ellipse.height()); | 1255 SkScalar yRadius = SkScalarHalf(ellipse.height()); |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1434 bounds.outset(SK_ScalarHalf, SK_ScalarHalf); | 1443 bounds.outset(SK_ScalarHalf, SK_ScalarHalf); |
| 1435 } | 1444 } |
| 1436 target->drawNonAARect(pipelineBuilder, color, SkMatrix::I(), bounds, invert)
; | 1445 target->drawNonAARect(pipelineBuilder, color, SkMatrix::I(), bounds, invert)
; |
| 1437 return true; | 1446 return true; |
| 1438 } | 1447 } |
| 1439 | 1448 |
| 1440 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 1449 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 1441 | 1450 |
| 1442 class RRectCircleRendererBatch : public GrVertexBatch { | 1451 class RRectCircleRendererBatch : public GrVertexBatch { |
| 1443 public: | 1452 public: |
| 1453 DEFINE_BATCH_CLASS_ID |
| 1454 |
| 1444 struct Geometry { | 1455 struct Geometry { |
| 1445 GrColor fColor; | |
| 1446 SkMatrix fViewMatrix; | 1456 SkMatrix fViewMatrix; |
| 1457 SkRect fDevBounds; |
| 1447 SkScalar fInnerRadius; | 1458 SkScalar fInnerRadius; |
| 1448 SkScalar fOuterRadius; | 1459 SkScalar fOuterRadius; |
| 1460 GrColor fColor; |
| 1449 bool fStroke; | 1461 bool fStroke; |
| 1450 SkRect fDevBounds; | |
| 1451 }; | 1462 }; |
| 1452 | 1463 |
| 1453 static GrDrawBatch* Create(const Geometry& geometry) { | 1464 static GrDrawBatch* Create(const Geometry& geometry) { |
| 1454 return new RRectCircleRendererBatch(geometry); | 1465 return new RRectCircleRendererBatch(geometry); |
| 1455 } | 1466 } |
| 1456 | 1467 |
| 1457 const char* name() const override { return "RRectCircleBatch"; } | 1468 const char* name() const override { return "RRectCircleBatch"; } |
| 1458 | 1469 |
| 1459 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { | 1470 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { |
| 1460 // When this is called on a batch, there is only one geometry bundle | 1471 // When this is called on a batch, there is only one geometry bundle |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1556 verts->fInnerRadius = innerRadius; | 1567 verts->fInnerRadius = innerRadius; |
| 1557 verts++; | 1568 verts++; |
| 1558 } | 1569 } |
| 1559 } | 1570 } |
| 1560 | 1571 |
| 1561 helper.recordDraw(target); | 1572 helper.recordDraw(target); |
| 1562 } | 1573 } |
| 1563 | 1574 |
| 1564 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 1575 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 1565 | 1576 |
| 1566 RRectCircleRendererBatch(const Geometry& geometry) { | 1577 RRectCircleRendererBatch(const Geometry& geometry) : INHERITED(ClassID()) { |
| 1567 this->initClassID<RRectCircleRendererBatch>(); | |
| 1568 fGeoData.push_back(geometry); | 1578 fGeoData.push_back(geometry); |
| 1569 | 1579 |
| 1570 this->setBounds(geometry.fDevBounds); | 1580 this->setBounds(geometry.fDevBounds); |
| 1571 } | 1581 } |
| 1572 | 1582 |
| 1573 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 1583 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| 1574 RRectCircleRendererBatch* that = t->cast<RRectCircleRendererBatch>(); | 1584 RRectCircleRendererBatch* that = t->cast<RRectCircleRendererBatch>(); |
| 1575 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), | 1585 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), |
| 1576 that->bounds(), caps)) { | 1586 that->bounds(), caps)) { |
| 1577 return false; | 1587 return false; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1604 struct BatchTracker { | 1614 struct BatchTracker { |
| 1605 GrColor fColor; | 1615 GrColor fColor; |
| 1606 bool fStroke; | 1616 bool fStroke; |
| 1607 bool fUsesLocalCoords; | 1617 bool fUsesLocalCoords; |
| 1608 bool fColorIgnored; | 1618 bool fColorIgnored; |
| 1609 bool fCoverageIgnored; | 1619 bool fCoverageIgnored; |
| 1610 }; | 1620 }; |
| 1611 | 1621 |
| 1612 BatchTracker fBatch; | 1622 BatchTracker fBatch; |
| 1613 SkSTArray<1, Geometry, true> fGeoData; | 1623 SkSTArray<1, Geometry, true> fGeoData; |
| 1624 |
| 1625 typedef GrVertexBatch INHERITED; |
| 1614 }; | 1626 }; |
| 1615 | 1627 |
| 1616 class RRectEllipseRendererBatch : public GrVertexBatch { | 1628 class RRectEllipseRendererBatch : public GrVertexBatch { |
| 1617 public: | 1629 public: |
| 1630 DEFINE_BATCH_CLASS_ID |
| 1631 |
| 1618 struct Geometry { | 1632 struct Geometry { |
| 1619 GrColor fColor; | |
| 1620 SkMatrix fViewMatrix; | 1633 SkMatrix fViewMatrix; |
| 1634 SkRect fDevBounds; |
| 1621 SkScalar fXRadius; | 1635 SkScalar fXRadius; |
| 1622 SkScalar fYRadius; | 1636 SkScalar fYRadius; |
| 1623 SkScalar fInnerXRadius; | 1637 SkScalar fInnerXRadius; |
| 1624 SkScalar fInnerYRadius; | 1638 SkScalar fInnerYRadius; |
| 1639 GrColor fColor; |
| 1625 bool fStroke; | 1640 bool fStroke; |
| 1626 SkRect fDevBounds; | |
| 1627 }; | 1641 }; |
| 1628 | 1642 |
| 1629 static GrDrawBatch* Create(const Geometry& geometry) { | 1643 static GrDrawBatch* Create(const Geometry& geometry) { |
| 1630 return new RRectEllipseRendererBatch(geometry); | 1644 return new RRectEllipseRendererBatch(geometry); |
| 1631 } | 1645 } |
| 1632 | 1646 |
| 1633 const char* name() const override { return "RRectEllipseRendererBatch"; } | 1647 const char* name() const override { return "RRectEllipseRendererBatch"; } |
| 1634 | 1648 |
| 1635 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { | 1649 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { |
| 1636 // When this is called on a batch, there is only one geometry bundle | 1650 // When this is called on a batch, there is only one geometry bundle |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1742 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 1756 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 1743 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); | 1757 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); |
| 1744 verts++; | 1758 verts++; |
| 1745 } | 1759 } |
| 1746 } | 1760 } |
| 1747 helper.recordDraw(target); | 1761 helper.recordDraw(target); |
| 1748 } | 1762 } |
| 1749 | 1763 |
| 1750 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 1764 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 1751 | 1765 |
| 1752 RRectEllipseRendererBatch(const Geometry& geometry) { | 1766 RRectEllipseRendererBatch(const Geometry& geometry) : INHERITED(ClassID()) { |
| 1753 this->initClassID<RRectEllipseRendererBatch>(); | |
| 1754 fGeoData.push_back(geometry); | 1767 fGeoData.push_back(geometry); |
| 1755 | 1768 |
| 1756 this->setBounds(geometry.fDevBounds); | 1769 this->setBounds(geometry.fDevBounds); |
| 1757 } | 1770 } |
| 1758 | 1771 |
| 1759 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 1772 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| 1760 RRectEllipseRendererBatch* that = t->cast<RRectEllipseRendererBatch>(); | 1773 RRectEllipseRendererBatch* that = t->cast<RRectEllipseRendererBatch>(); |
| 1761 | 1774 |
| 1762 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), | 1775 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), |
| 1763 that->bounds(), caps)) { | 1776 that->bounds(), caps)) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1791 struct BatchTracker { | 1804 struct BatchTracker { |
| 1792 GrColor fColor; | 1805 GrColor fColor; |
| 1793 bool fStroke; | 1806 bool fStroke; |
| 1794 bool fUsesLocalCoords; | 1807 bool fUsesLocalCoords; |
| 1795 bool fColorIgnored; | 1808 bool fColorIgnored; |
| 1796 bool fCoverageIgnored; | 1809 bool fCoverageIgnored; |
| 1797 }; | 1810 }; |
| 1798 | 1811 |
| 1799 BatchTracker fBatch; | 1812 BatchTracker fBatch; |
| 1800 SkSTArray<1, Geometry, true> fGeoData; | 1813 SkSTArray<1, Geometry, true> fGeoData; |
| 1814 |
| 1815 typedef GrVertexBatch INHERITED; |
| 1801 }; | 1816 }; |
| 1802 | 1817 |
| 1803 static GrDrawBatch* create_rrect_batch(GrColor color, | 1818 static GrDrawBatch* create_rrect_batch(GrColor color, |
| 1804 const SkMatrix& viewMatrix, | 1819 const SkMatrix& viewMatrix, |
| 1805 const SkRRect& rrect, | 1820 const SkRRect& rrect, |
| 1806 const SkStrokeRec& stroke) { | 1821 const SkStrokeRec& stroke) { |
| 1807 SkASSERT(viewMatrix.rectStaysRect()); | 1822 SkASSERT(viewMatrix.rectStaysRect()); |
| 1808 SkASSERT(rrect.isSimple()); | 1823 SkASSERT(rrect.isSimple()); |
| 1809 SkASSERT(!rrect.isOval()); | 1824 SkASSERT(!rrect.isOval()); |
| 1810 | 1825 |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2012 } | 2027 } |
| 2013 | 2028 |
| 2014 DRAW_BATCH_TEST_DEFINE(RRectBatch) { | 2029 DRAW_BATCH_TEST_DEFINE(RRectBatch) { |
| 2015 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); | 2030 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); |
| 2016 GrColor color = GrRandomColor(random); | 2031 GrColor color = GrRandomColor(random); |
| 2017 const SkRRect& rrect = GrTest::TestRRectSimple(random); | 2032 const SkRRect& rrect = GrTest::TestRRectSimple(random); |
| 2018 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); | 2033 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); |
| 2019 } | 2034 } |
| 2020 | 2035 |
| 2021 #endif | 2036 #endif |
| OLD | NEW |