| 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 "GrBatchTarget.h" | 10 #include "GrBatchFlushState.h" |
| 11 #include "GrBatchTest.h" | 11 #include "GrBatchTest.h" |
| 12 #include "GrDrawTarget.h" | 12 #include "GrDrawTarget.h" |
| 13 #include "GrGeometryProcessor.h" | 13 #include "GrGeometryProcessor.h" |
| 14 #include "GrInvariantOutput.h" | 14 #include "GrInvariantOutput.h" |
| 15 #include "GrPipelineBuilder.h" | 15 #include "GrPipelineBuilder.h" |
| 16 #include "GrProcessor.h" | 16 #include "GrProcessor.h" |
| 17 #include "GrResourceProvider.h" | 17 #include "GrResourceProvider.h" |
| 18 #include "GrVertexBuffer.h" | 18 #include "GrVertexBuffer.h" |
| 19 #include "SkRRect.h" | 19 #include "SkRRect.h" |
| 20 #include "SkStrokeRec.h" | 20 #include "SkStrokeRec.h" |
| (...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 opt.getOverrideColorIfSet(&fGeoData[0].fColor); | 659 opt.getOverrideColorIfSet(&fGeoData[0].fColor); |
| 660 | 660 |
| 661 // setup batch properties | 661 // setup batch properties |
| 662 fBatch.fColorIgnored = !opt.readsColor(); | 662 fBatch.fColorIgnored = !opt.readsColor(); |
| 663 fBatch.fColor = fGeoData[0].fColor; | 663 fBatch.fColor = fGeoData[0].fColor; |
| 664 fBatch.fStroke = fGeoData[0].fStroke; | 664 fBatch.fStroke = fGeoData[0].fStroke; |
| 665 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); | 665 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); |
| 666 fBatch.fCoverageIgnored = !opt.readsCoverage(); | 666 fBatch.fCoverageIgnored = !opt.readsCoverage(); |
| 667 } | 667 } |
| 668 | 668 |
| 669 void generateGeometry(GrBatchTarget* batchTarget) override { | 669 void onPrepareDraws(Target* target) override { |
| 670 SkMatrix invert; | 670 SkMatrix invert; |
| 671 if (!this->viewMatrix().invert(&invert)) { | 671 if (!this->viewMatrix().invert(&invert)) { |
| 672 return; | 672 return; |
| 673 } | 673 } |
| 674 | 674 |
| 675 // Setup geometry processor | 675 // Setup geometry processor |
| 676 SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->colo
r(), | 676 SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->colo
r(), |
| 677 this->stro
ke(), | 677 this->stro
ke(), |
| 678 invert, | 678 invert, |
| 679 this->uses
LocalCoords())); | 679 this->uses
LocalCoords())); |
| 680 | 680 |
| 681 batchTarget->initDraw(gp, this->pipeline()); | 681 target->initDraw(gp, this->pipeline()); |
| 682 | 682 |
| 683 int instanceCount = fGeoData.count(); | 683 int instanceCount = fGeoData.count(); |
| 684 size_t vertexStride = gp->getVertexStride(); | 684 size_t vertexStride = gp->getVertexStride(); |
| 685 SkASSERT(vertexStride == sizeof(CircleVertex)); | 685 SkASSERT(vertexStride == sizeof(CircleVertex)); |
| 686 QuadHelper helper; | 686 QuadHelper helper; |
| 687 CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(batchT
arget, vertexStride, | 687 CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(target
, vertexStride, |
| 688 instan
ceCount)); | 688 instan
ceCount)); |
| 689 if (!verts) { | 689 if (!verts) { |
| 690 return; | 690 return; |
| 691 } | 691 } |
| 692 | 692 |
| 693 for (int i = 0; i < instanceCount; i++) { | 693 for (int i = 0; i < instanceCount; i++) { |
| 694 Geometry& geom = fGeoData[i]; | 694 Geometry& geom = fGeoData[i]; |
| 695 | 695 |
| 696 SkScalar innerRadius = geom.fInnerRadius; | 696 SkScalar innerRadius = geom.fInnerRadius; |
| 697 SkScalar outerRadius = geom.fOuterRadius; | 697 SkScalar outerRadius = geom.fOuterRadius; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 715 verts[2].fOuterRadius = outerRadius; | 715 verts[2].fOuterRadius = outerRadius; |
| 716 verts[2].fInnerRadius = innerRadius; | 716 verts[2].fInnerRadius = innerRadius; |
| 717 | 717 |
| 718 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); | 718 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); |
| 719 verts[3].fOffset = SkPoint::Make(1, -1); | 719 verts[3].fOffset = SkPoint::Make(1, -1); |
| 720 verts[3].fOuterRadius = outerRadius; | 720 verts[3].fOuterRadius = outerRadius; |
| 721 verts[3].fInnerRadius = innerRadius; | 721 verts[3].fInnerRadius = innerRadius; |
| 722 | 722 |
| 723 verts += kVerticesPerQuad; | 723 verts += kVerticesPerQuad; |
| 724 } | 724 } |
| 725 helper.issueDraw(batchTarget); | 725 helper.recordDraw(target); |
| 726 } | 726 } |
| 727 | 727 |
| 728 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 728 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 729 | 729 |
| 730 private: | 730 private: |
| 731 CircleBatch(const Geometry& geometry) { | 731 CircleBatch(const Geometry& geometry) { |
| 732 this->initClassID<CircleBatch>(); | 732 this->initClassID<CircleBatch>(); |
| 733 fGeoData.push_back(geometry); | 733 fGeoData.push_back(geometry); |
| 734 | 734 |
| 735 this->setBounds(geometry.fDevBounds); | 735 this->setBounds(geometry.fDevBounds); |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 877 opt.getOverrideColorIfSet(&fGeoData[0].fColor); | 877 opt.getOverrideColorIfSet(&fGeoData[0].fColor); |
| 878 | 878 |
| 879 // setup batch properties | 879 // setup batch properties |
| 880 fBatch.fColorIgnored = !opt.readsColor(); | 880 fBatch.fColorIgnored = !opt.readsColor(); |
| 881 fBatch.fColor = fGeoData[0].fColor; | 881 fBatch.fColor = fGeoData[0].fColor; |
| 882 fBatch.fStroke = fGeoData[0].fStroke; | 882 fBatch.fStroke = fGeoData[0].fStroke; |
| 883 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); | 883 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); |
| 884 fBatch.fCoverageIgnored = !opt.readsCoverage(); | 884 fBatch.fCoverageIgnored = !opt.readsCoverage(); |
| 885 } | 885 } |
| 886 | 886 |
| 887 void generateGeometry(GrBatchTarget* batchTarget) override { | 887 void onPrepareDraws(Target* target) override { |
| 888 SkMatrix invert; | 888 SkMatrix invert; |
| 889 if (!this->viewMatrix().invert(&invert)) { | 889 if (!this->viewMatrix().invert(&invert)) { |
| 890 return; | 890 return; |
| 891 } | 891 } |
| 892 | 892 |
| 893 // Setup geometry processor | 893 // Setup geometry processor |
| 894 SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->col
or(), | 894 SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->col
or(), |
| 895 this->str
oke(), | 895 this->str
oke(), |
| 896 invert, | 896 invert, |
| 897 this->use
sLocalCoords())); | 897 this->use
sLocalCoords())); |
| 898 | 898 |
| 899 batchTarget->initDraw(gp, this->pipeline()); | 899 target->initDraw(gp, this->pipeline()); |
| 900 | 900 |
| 901 int instanceCount = fGeoData.count(); | 901 int instanceCount = fGeoData.count(); |
| 902 QuadHelper helper; | 902 QuadHelper helper; |
| 903 size_t vertexStride = gp->getVertexStride(); | 903 size_t vertexStride = gp->getVertexStride(); |
| 904 SkASSERT(vertexStride == sizeof(EllipseVertex)); | 904 SkASSERT(vertexStride == sizeof(EllipseVertex)); |
| 905 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>( | 905 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>( |
| 906 helper.init(batchTarget, vertexStride, instanceCount)); | 906 helper.init(target, vertexStride, instanceCount)); |
| 907 if (!verts) { | 907 if (!verts) { |
| 908 return; | 908 return; |
| 909 } | 909 } |
| 910 | 910 |
| 911 for (int i = 0; i < instanceCount; i++) { | 911 for (int i = 0; i < instanceCount; i++) { |
| 912 Geometry& geom = fGeoData[i]; | 912 Geometry& geom = fGeoData[i]; |
| 913 | 913 |
| 914 SkScalar xRadius = geom.fXRadius; | 914 SkScalar xRadius = geom.fXRadius; |
| 915 SkScalar yRadius = geom.fYRadius; | 915 SkScalar yRadius = geom.fYRadius; |
| 916 | 916 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 938 verts[2].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 938 verts[2].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 939 verts[2].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; | 939 verts[2].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; |
| 940 | 940 |
| 941 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); | 941 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); |
| 942 verts[3].fOffset = SkPoint::Make(xRadius, -yRadius); | 942 verts[3].fOffset = SkPoint::Make(xRadius, -yRadius); |
| 943 verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 943 verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 944 verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; | 944 verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; |
| 945 | 945 |
| 946 verts += kVerticesPerQuad; | 946 verts += kVerticesPerQuad; |
| 947 } | 947 } |
| 948 helper.issueDraw(batchTarget); | 948 helper.recordDraw(target); |
| 949 } | 949 } |
| 950 | 950 |
| 951 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 951 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 952 | 952 |
| 953 private: | 953 private: |
| 954 EllipseBatch(const Geometry& geometry) { | 954 EllipseBatch(const Geometry& geometry) { |
| 955 this->initClassID<EllipseBatch>(); | 955 this->initClassID<EllipseBatch>(); |
| 956 fGeoData.push_back(geometry); | 956 fGeoData.push_back(geometry); |
| 957 | 957 |
| 958 this->setBounds(geometry.fDevBounds); | 958 this->setBounds(geometry.fDevBounds); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1145 opt.getOverrideColorIfSet(&fGeoData[0].fColor); | 1145 opt.getOverrideColorIfSet(&fGeoData[0].fColor); |
| 1146 | 1146 |
| 1147 // setup batch properties | 1147 // setup batch properties |
| 1148 fBatch.fColorIgnored = !opt.readsColor(); | 1148 fBatch.fColorIgnored = !opt.readsColor(); |
| 1149 fBatch.fColor = fGeoData[0].fColor; | 1149 fBatch.fColor = fGeoData[0].fColor; |
| 1150 fBatch.fMode = fGeoData[0].fMode; | 1150 fBatch.fMode = fGeoData[0].fMode; |
| 1151 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); | 1151 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); |
| 1152 fBatch.fCoverageIgnored = !opt.readsCoverage(); | 1152 fBatch.fCoverageIgnored = !opt.readsCoverage(); |
| 1153 } | 1153 } |
| 1154 | 1154 |
| 1155 void generateGeometry(GrBatchTarget* batchTarget) override { | 1155 void onPrepareDraws(Target* target) override { |
| 1156 // Setup geometry processor | 1156 // Setup geometry processor |
| 1157 SkAutoTUnref<GrGeometryProcessor> gp(DIEllipseEdgeEffect::Create(this->c
olor(), | 1157 SkAutoTUnref<GrGeometryProcessor> gp(DIEllipseEdgeEffect::Create(this->c
olor(), |
| 1158 this->v
iewMatrix(), | 1158 this->v
iewMatrix(), |
| 1159 this->m
ode(), | 1159 this->m
ode(), |
| 1160 this->u
sesLocalCoords())); | 1160 this->u
sesLocalCoords())); |
| 1161 | 1161 |
| 1162 batchTarget->initDraw(gp, this->pipeline()); | 1162 target->initDraw(gp, this->pipeline()); |
| 1163 | 1163 |
| 1164 int instanceCount = fGeoData.count(); | 1164 int instanceCount = fGeoData.count(); |
| 1165 size_t vertexStride = gp->getVertexStride(); | 1165 size_t vertexStride = gp->getVertexStride(); |
| 1166 SkASSERT(vertexStride == sizeof(DIEllipseVertex)); | 1166 SkASSERT(vertexStride == sizeof(DIEllipseVertex)); |
| 1167 QuadHelper helper; | 1167 QuadHelper helper; |
| 1168 DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>( | 1168 DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>( |
| 1169 helper.init(batchTarget, vertexStride, instanceCount)); | 1169 helper.init(target, vertexStride, instanceCount)); |
| 1170 if (!verts) { | 1170 if (!verts) { |
| 1171 return; | 1171 return; |
| 1172 } | 1172 } |
| 1173 | 1173 |
| 1174 for (int i = 0; i < instanceCount; i++) { | 1174 for (int i = 0; i < instanceCount; i++) { |
| 1175 Geometry& geom = fGeoData[i]; | 1175 Geometry& geom = fGeoData[i]; |
| 1176 | 1176 |
| 1177 SkScalar xRadius = geom.fXRadius; | 1177 SkScalar xRadius = geom.fXRadius; |
| 1178 SkScalar yRadius = geom.fYRadius; | 1178 SkScalar yRadius = geom.fYRadius; |
| 1179 | 1179 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1197 verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); | 1197 verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); |
| 1198 verts[2].fOuterOffset = SkPoint::Make(1.0f + offsetDx, 1.0f + offset
Dy); | 1198 verts[2].fOuterOffset = SkPoint::Make(1.0f + offsetDx, 1.0f + offset
Dy); |
| 1199 verts[2].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, innerR
atioY + offsetDy); | 1199 verts[2].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, innerR
atioY + offsetDy); |
| 1200 | 1200 |
| 1201 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); | 1201 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); |
| 1202 verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offse
tDy); | 1202 verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offse
tDy); |
| 1203 verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -inner
RatioY - offsetDy); | 1203 verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -inner
RatioY - offsetDy); |
| 1204 | 1204 |
| 1205 verts += kVerticesPerQuad; | 1205 verts += kVerticesPerQuad; |
| 1206 } | 1206 } |
| 1207 helper.issueDraw(batchTarget); | 1207 helper.recordDraw(target); |
| 1208 } | 1208 } |
| 1209 | 1209 |
| 1210 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 1210 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 1211 | 1211 |
| 1212 private: | 1212 private: |
| 1213 DIEllipseBatch(const Geometry& geometry, const SkRect& bounds) { | 1213 DIEllipseBatch(const Geometry& geometry, const SkRect& bounds) { |
| 1214 this->initClassID<DIEllipseBatch>(); | 1214 this->initClassID<DIEllipseBatch>(); |
| 1215 fGeoData.push_back(geometry); | 1215 fGeoData.push_back(geometry); |
| 1216 | 1216 |
| 1217 this->setBounds(bounds); | 1217 this->setBounds(bounds); |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1496 opt.getOverrideColorIfSet(&fGeoData[0].fColor); | 1496 opt.getOverrideColorIfSet(&fGeoData[0].fColor); |
| 1497 | 1497 |
| 1498 // setup batch properties | 1498 // setup batch properties |
| 1499 fBatch.fColorIgnored = !opt.readsColor(); | 1499 fBatch.fColorIgnored = !opt.readsColor(); |
| 1500 fBatch.fColor = fGeoData[0].fColor; | 1500 fBatch.fColor = fGeoData[0].fColor; |
| 1501 fBatch.fStroke = fGeoData[0].fStroke; | 1501 fBatch.fStroke = fGeoData[0].fStroke; |
| 1502 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); | 1502 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); |
| 1503 fBatch.fCoverageIgnored = !opt.readsCoverage(); | 1503 fBatch.fCoverageIgnored = !opt.readsCoverage(); |
| 1504 } | 1504 } |
| 1505 | 1505 |
| 1506 void generateGeometry(GrBatchTarget* batchTarget) override { | 1506 void onPrepareDraws(Target* target) override { |
| 1507 // reset to device coordinates | 1507 // reset to device coordinates |
| 1508 SkMatrix invert; | 1508 SkMatrix invert; |
| 1509 if (!this->viewMatrix().invert(&invert)) { | 1509 if (!this->viewMatrix().invert(&invert)) { |
| 1510 SkDebugf("Failed to invert\n"); | 1510 SkDebugf("Failed to invert\n"); |
| 1511 return; | 1511 return; |
| 1512 } | 1512 } |
| 1513 | 1513 |
| 1514 // Setup geometry processor | 1514 // Setup geometry processor |
| 1515 SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->colo
r(), | 1515 SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->colo
r(), |
| 1516 this->stro
ke(), | 1516 this->stro
ke(), |
| 1517 invert, | 1517 invert, |
| 1518 this->uses
LocalCoords())); | 1518 this->uses
LocalCoords())); |
| 1519 | 1519 |
| 1520 batchTarget->initDraw(gp, this->pipeline()); | 1520 target->initDraw(gp, this->pipeline()); |
| 1521 | 1521 |
| 1522 int instanceCount = fGeoData.count(); | 1522 int instanceCount = fGeoData.count(); |
| 1523 size_t vertexStride = gp->getVertexStride(); | 1523 size_t vertexStride = gp->getVertexStride(); |
| 1524 SkASSERT(vertexStride == sizeof(CircleVertex)); | 1524 SkASSERT(vertexStride == sizeof(CircleVertex)); |
| 1525 | 1525 |
| 1526 // drop out the middle quad if we're stroked | 1526 // drop out the middle quad if we're stroked |
| 1527 int indicesPerInstance = this->stroke() ? kIndicesPerStrokeRRect : kIndi
cesPerRRect; | 1527 int indicesPerInstance = this->stroke() ? kIndicesPerStrokeRRect : kIndi
cesPerRRect; |
| 1528 SkAutoTUnref<const GrIndexBuffer> indexBuffer( | 1528 SkAutoTUnref<const GrIndexBuffer> indexBuffer( |
| 1529 ref_rrect_index_buffer(this->stroke(), batchTarget->resourceProvider
())); | 1529 ref_rrect_index_buffer(this->stroke(), target->resourceProvider())); |
| 1530 | 1530 |
| 1531 InstancedHelper helper; | 1531 InstancedHelper helper; |
| 1532 CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(batchT
arget, | 1532 CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(target
, |
| 1533 kTriangles_GrPrimitiveType, vertexStride, indexBuffer, kVertsPerRRec
t, | 1533 kTriangles_GrPrimitiveType, vertexStride, indexBuffer, kVertsPerRRec
t, |
| 1534 indicesPerInstance, instanceCount)); | 1534 indicesPerInstance, instanceCount)); |
| 1535 if (!verts || !indexBuffer) { | 1535 if (!verts || !indexBuffer) { |
| 1536 SkDebugf("Could not allocate vertices\n"); | 1536 SkDebugf("Could not allocate vertices\n"); |
| 1537 return; | 1537 return; |
| 1538 } | 1538 } |
| 1539 | 1539 |
| 1540 for (int i = 0; i < instanceCount; i++) { | 1540 for (int i = 0; i < instanceCount; i++) { |
| 1541 Geometry& args = fGeoData[i]; | 1541 Geometry& args = fGeoData[i]; |
| 1542 | 1542 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1574 verts++; | 1574 verts++; |
| 1575 | 1575 |
| 1576 verts->fPos = SkPoint::Make(bounds.fRight, yCoords[i]); | 1576 verts->fPos = SkPoint::Make(bounds.fRight, yCoords[i]); |
| 1577 verts->fOffset = SkPoint::Make(1, yOuterRadii[i]); | 1577 verts->fOffset = SkPoint::Make(1, yOuterRadii[i]); |
| 1578 verts->fOuterRadius = outerRadius; | 1578 verts->fOuterRadius = outerRadius; |
| 1579 verts->fInnerRadius = innerRadius; | 1579 verts->fInnerRadius = innerRadius; |
| 1580 verts++; | 1580 verts++; |
| 1581 } | 1581 } |
| 1582 } | 1582 } |
| 1583 | 1583 |
| 1584 helper.issueDraw(batchTarget); | 1584 helper.recordDraw(target); |
| 1585 } | 1585 } |
| 1586 | 1586 |
| 1587 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 1587 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 1588 | 1588 |
| 1589 private: | 1589 private: |
| 1590 RRectCircleRendererBatch(const Geometry& geometry) { | 1590 RRectCircleRendererBatch(const Geometry& geometry) { |
| 1591 this->initClassID<RRectCircleRendererBatch>(); | 1591 this->initClassID<RRectCircleRendererBatch>(); |
| 1592 fGeoData.push_back(geometry); | 1592 fGeoData.push_back(geometry); |
| 1593 | 1593 |
| 1594 this->setBounds(geometry.fDevBounds); | 1594 this->setBounds(geometry.fDevBounds); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1672 opt.getOverrideColorIfSet(&fGeoData[0].fColor); | 1672 opt.getOverrideColorIfSet(&fGeoData[0].fColor); |
| 1673 | 1673 |
| 1674 // setup batch properties | 1674 // setup batch properties |
| 1675 fBatch.fColorIgnored = !opt.readsColor(); | 1675 fBatch.fColorIgnored = !opt.readsColor(); |
| 1676 fBatch.fColor = fGeoData[0].fColor; | 1676 fBatch.fColor = fGeoData[0].fColor; |
| 1677 fBatch.fStroke = fGeoData[0].fStroke; | 1677 fBatch.fStroke = fGeoData[0].fStroke; |
| 1678 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); | 1678 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); |
| 1679 fBatch.fCoverageIgnored = !opt.readsCoverage(); | 1679 fBatch.fCoverageIgnored = !opt.readsCoverage(); |
| 1680 } | 1680 } |
| 1681 | 1681 |
| 1682 void generateGeometry(GrBatchTarget* batchTarget) override { | 1682 void onPrepareDraws(Target* target) override { |
| 1683 // reset to device coordinates | 1683 // reset to device coordinates |
| 1684 SkMatrix invert; | 1684 SkMatrix invert; |
| 1685 if (!this->viewMatrix().invert(&invert)) { | 1685 if (!this->viewMatrix().invert(&invert)) { |
| 1686 SkDebugf("Failed to invert\n"); | 1686 SkDebugf("Failed to invert\n"); |
| 1687 return; | 1687 return; |
| 1688 } | 1688 } |
| 1689 | 1689 |
| 1690 // Setup geometry processor | 1690 // Setup geometry processor |
| 1691 SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->col
or(), | 1691 SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->col
or(), |
| 1692 this->str
oke(), | 1692 this->str
oke(), |
| 1693 invert, | 1693 invert, |
| 1694 this->use
sLocalCoords())); | 1694 this->use
sLocalCoords())); |
| 1695 | 1695 |
| 1696 batchTarget->initDraw(gp, this->pipeline()); | 1696 target->initDraw(gp, this->pipeline()); |
| 1697 | 1697 |
| 1698 int instanceCount = fGeoData.count(); | 1698 int instanceCount = fGeoData.count(); |
| 1699 size_t vertexStride = gp->getVertexStride(); | 1699 size_t vertexStride = gp->getVertexStride(); |
| 1700 SkASSERT(vertexStride == sizeof(EllipseVertex)); | 1700 SkASSERT(vertexStride == sizeof(EllipseVertex)); |
| 1701 | 1701 |
| 1702 // drop out the middle quad if we're stroked | 1702 // drop out the middle quad if we're stroked |
| 1703 int indicesPerInstance = this->stroke() ? kIndicesPerStrokeRRect : kIndi
cesPerRRect; | 1703 int indicesPerInstance = this->stroke() ? kIndicesPerStrokeRRect : kIndi
cesPerRRect; |
| 1704 SkAutoTUnref<const GrIndexBuffer> indexBuffer( | 1704 SkAutoTUnref<const GrIndexBuffer> indexBuffer( |
| 1705 ref_rrect_index_buffer(this->stroke(), batchTarget->resourceProvider
())); | 1705 ref_rrect_index_buffer(this->stroke(), target->resourceProvider())); |
| 1706 | 1706 |
| 1707 InstancedHelper helper; | 1707 InstancedHelper helper; |
| 1708 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>( | 1708 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>( |
| 1709 helper.init(batchTarget, kTriangles_GrPrimitiveType, vertexStride, i
ndexBuffer, | 1709 helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexB
uffer, |
| 1710 kVertsPerRRect, indicesPerInstance, instanceCount)); | 1710 kVertsPerRRect, indicesPerInstance, instanceCount)); |
| 1711 if (!verts || !indexBuffer) { | 1711 if (!verts || !indexBuffer) { |
| 1712 SkDebugf("Could not allocate vertices\n"); | 1712 SkDebugf("Could not allocate vertices\n"); |
| 1713 return; | 1713 return; |
| 1714 } | 1714 } |
| 1715 | 1715 |
| 1716 for (int i = 0; i < instanceCount; i++) { | 1716 for (int i = 0; i < instanceCount; i++) { |
| 1717 Geometry& args = fGeoData[i]; | 1717 Geometry& args = fGeoData[i]; |
| 1718 | 1718 |
| 1719 // Compute the reciprocals of the radii here to save time in the sha
der | 1719 // Compute the reciprocals of the radii here to save time in the sha
der |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1760 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); | 1760 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); |
| 1761 verts++; | 1761 verts++; |
| 1762 | 1762 |
| 1763 verts->fPos = SkPoint::Make(bounds.fRight, yCoords[i]); | 1763 verts->fPos = SkPoint::Make(bounds.fRight, yCoords[i]); |
| 1764 verts->fOffset = SkPoint::Make(xOuterRadius, yOuterOffsets[i]); | 1764 verts->fOffset = SkPoint::Make(xOuterRadius, yOuterOffsets[i]); |
| 1765 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 1765 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 1766 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); | 1766 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); |
| 1767 verts++; | 1767 verts++; |
| 1768 } | 1768 } |
| 1769 } | 1769 } |
| 1770 helper.issueDraw(batchTarget); | 1770 helper.recordDraw(target); |
| 1771 } | 1771 } |
| 1772 | 1772 |
| 1773 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 1773 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 1774 | 1774 |
| 1775 private: | 1775 private: |
| 1776 RRectEllipseRendererBatch(const Geometry& geometry) { | 1776 RRectEllipseRendererBatch(const Geometry& geometry) { |
| 1777 this->initClassID<RRectEllipseRendererBatch>(); | 1777 this->initClassID<RRectEllipseRendererBatch>(); |
| 1778 fGeoData.push_back(geometry); | 1778 fGeoData.push_back(geometry); |
| 1779 | 1779 |
| 1780 this->setBounds(geometry.fDevBounds); | 1780 this->setBounds(geometry.fDevBounds); |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2036 } | 2036 } |
| 2037 | 2037 |
| 2038 DRAW_BATCH_TEST_DEFINE(RRectBatch) { | 2038 DRAW_BATCH_TEST_DEFINE(RRectBatch) { |
| 2039 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); | 2039 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); |
| 2040 GrColor color = GrRandomColor(random); | 2040 GrColor color = GrRandomColor(random); |
| 2041 const SkRRect& rrect = GrTest::TestRRectSimple(random); | 2041 const SkRRect& rrect = GrTest::TestRRectSimple(random); |
| 2042 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); | 2042 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); |
| 2043 } | 2043 } |
| 2044 | 2044 |
| 2045 #endif | 2045 #endif |
| OLD | NEW |