| 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 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 685 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); | 685 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); |
| 686 | 686 |
| 687 // setup batch properties | 687 // setup batch properties |
| 688 fBatch.fColorIgnored = !overrides.readsColor(); | 688 fBatch.fColorIgnored = !overrides.readsColor(); |
| 689 fBatch.fColor = fGeoData[0].fColor; | 689 fBatch.fColor = fGeoData[0].fColor; |
| 690 fBatch.fStroke = fGeoData[0].fStroke; | 690 fBatch.fStroke = fGeoData[0].fStroke; |
| 691 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); | 691 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); |
| 692 fBatch.fCoverageIgnored = !overrides.readsCoverage(); | 692 fBatch.fCoverageIgnored = !overrides.readsCoverage(); |
| 693 } | 693 } |
| 694 | 694 |
| 695 void onPrepareDraws(Target* target) override { | 695 void onPrepareDraws(Target* target) const override { |
| 696 SkMatrix invert; | 696 SkMatrix invert; |
| 697 if (!this->viewMatrix().invert(&invert)) { | 697 if (!this->viewMatrix().invert(&invert)) { |
| 698 return; | 698 return; |
| 699 } | 699 } |
| 700 | 700 |
| 701 // Setup geometry processor | 701 // Setup geometry processor |
| 702 SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->colo
r(), | 702 SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->colo
r(), |
| 703 this->stro
ke(), | 703 this->stro
ke(), |
| 704 invert, | 704 invert, |
| 705 this->uses
LocalCoords())); | 705 this->uses
LocalCoords())); |
| 706 | 706 |
| 707 target->initDraw(gp, this->pipeline()); | 707 target->initDraw(gp, this->pipeline()); |
| 708 | 708 |
| 709 int instanceCount = fGeoData.count(); | 709 int instanceCount = fGeoData.count(); |
| 710 size_t vertexStride = gp->getVertexStride(); | 710 size_t vertexStride = gp->getVertexStride(); |
| 711 SkASSERT(vertexStride == sizeof(CircleVertex)); | 711 SkASSERT(vertexStride == sizeof(CircleVertex)); |
| 712 QuadHelper helper; | 712 QuadHelper helper; |
| 713 CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(target
, vertexStride, | 713 CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(target
, vertexStride, |
| 714 instan
ceCount)); | 714 instan
ceCount)); |
| 715 if (!verts) { | 715 if (!verts) { |
| 716 return; | 716 return; |
| 717 } | 717 } |
| 718 | 718 |
| 719 for (int i = 0; i < instanceCount; i++) { | 719 for (int i = 0; i < instanceCount; i++) { |
| 720 Geometry& geom = fGeoData[i]; | 720 const Geometry& geom = fGeoData[i]; |
| 721 | 721 |
| 722 SkScalar innerRadius = geom.fInnerRadius; | 722 SkScalar innerRadius = geom.fInnerRadius; |
| 723 SkScalar outerRadius = geom.fOuterRadius; | 723 SkScalar outerRadius = geom.fOuterRadius; |
| 724 | 724 |
| 725 const SkRect& bounds = geom.fDevBounds; | 725 const SkRect& bounds = geom.fDevBounds; |
| 726 | 726 |
| 727 // The inner radius in the vertex data must be specified in normaliz
ed space. | 727 // The inner radius in the vertex data must be specified in normaliz
ed space. |
| 728 innerRadius = innerRadius / outerRadius; | 728 innerRadius = innerRadius / outerRadius; |
| 729 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop); | 729 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop); |
| 730 verts[0].fOffset = SkPoint::Make(-1, -1); | 730 verts[0].fOffset = SkPoint::Make(-1, -1); |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 905 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); | 905 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); |
| 906 | 906 |
| 907 // setup batch properties | 907 // setup batch properties |
| 908 fBatch.fColorIgnored = !overrides.readsColor(); | 908 fBatch.fColorIgnored = !overrides.readsColor(); |
| 909 fBatch.fColor = fGeoData[0].fColor; | 909 fBatch.fColor = fGeoData[0].fColor; |
| 910 fBatch.fStroke = fGeoData[0].fStroke; | 910 fBatch.fStroke = fGeoData[0].fStroke; |
| 911 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); | 911 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); |
| 912 fBatch.fCoverageIgnored = !overrides.readsCoverage(); | 912 fBatch.fCoverageIgnored = !overrides.readsCoverage(); |
| 913 } | 913 } |
| 914 | 914 |
| 915 void onPrepareDraws(Target* target) override { | 915 void onPrepareDraws(Target* target) const override { |
| 916 SkMatrix invert; | 916 SkMatrix invert; |
| 917 if (!this->viewMatrix().invert(&invert)) { | 917 if (!this->viewMatrix().invert(&invert)) { |
| 918 return; | 918 return; |
| 919 } | 919 } |
| 920 | 920 |
| 921 // Setup geometry processor | 921 // Setup geometry processor |
| 922 SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->col
or(), | 922 SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->col
or(), |
| 923 this->str
oke(), | 923 this->str
oke(), |
| 924 invert, | 924 invert, |
| 925 this->use
sLocalCoords())); | 925 this->use
sLocalCoords())); |
| 926 | 926 |
| 927 target->initDraw(gp, this->pipeline()); | 927 target->initDraw(gp, this->pipeline()); |
| 928 | 928 |
| 929 int instanceCount = fGeoData.count(); | 929 int instanceCount = fGeoData.count(); |
| 930 QuadHelper helper; | 930 QuadHelper helper; |
| 931 size_t vertexStride = gp->getVertexStride(); | 931 size_t vertexStride = gp->getVertexStride(); |
| 932 SkASSERT(vertexStride == sizeof(EllipseVertex)); | 932 SkASSERT(vertexStride == sizeof(EllipseVertex)); |
| 933 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>( | 933 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>( |
| 934 helper.init(target, vertexStride, instanceCount)); | 934 helper.init(target, vertexStride, instanceCount)); |
| 935 if (!verts) { | 935 if (!verts) { |
| 936 return; | 936 return; |
| 937 } | 937 } |
| 938 | 938 |
| 939 for (int i = 0; i < instanceCount; i++) { | 939 for (int i = 0; i < instanceCount; i++) { |
| 940 Geometry& geom = fGeoData[i]; | 940 const Geometry& geom = fGeoData[i]; |
| 941 | 941 |
| 942 SkScalar xRadius = geom.fXRadius; | 942 SkScalar xRadius = geom.fXRadius; |
| 943 SkScalar yRadius = geom.fYRadius; | 943 SkScalar yRadius = geom.fYRadius; |
| 944 | 944 |
| 945 // Compute the reciprocals of the radii here to save time in the sha
der | 945 // Compute the reciprocals of the radii here to save time in the sha
der |
| 946 SkScalar xRadRecip = SkScalarInvert(xRadius); | 946 SkScalar xRadRecip = SkScalarInvert(xRadius); |
| 947 SkScalar yRadRecip = SkScalarInvert(yRadius); | 947 SkScalar yRadRecip = SkScalarInvert(yRadius); |
| 948 SkScalar xInnerRadRecip = SkScalarInvert(geom.fInnerXRadius); | 948 SkScalar xInnerRadRecip = SkScalarInvert(geom.fInnerXRadius); |
| 949 SkScalar yInnerRadRecip = SkScalarInvert(geom.fInnerYRadius); | 949 SkScalar yInnerRadRecip = SkScalarInvert(geom.fInnerYRadius); |
| 950 | 950 |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1178 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); | 1178 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); |
| 1179 | 1179 |
| 1180 // setup batch properties | 1180 // setup batch properties |
| 1181 fBatch.fColorIgnored = !overrides.readsColor(); | 1181 fBatch.fColorIgnored = !overrides.readsColor(); |
| 1182 fBatch.fColor = fGeoData[0].fColor; | 1182 fBatch.fColor = fGeoData[0].fColor; |
| 1183 fBatch.fMode = fGeoData[0].fMode; | 1183 fBatch.fMode = fGeoData[0].fMode; |
| 1184 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); | 1184 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); |
| 1185 fBatch.fCoverageIgnored = !overrides.readsCoverage(); | 1185 fBatch.fCoverageIgnored = !overrides.readsCoverage(); |
| 1186 } | 1186 } |
| 1187 | 1187 |
| 1188 void onPrepareDraws(Target* target) override { | 1188 void onPrepareDraws(Target* target) const override { |
| 1189 // Setup geometry processor | 1189 // Setup geometry processor |
| 1190 SkAutoTUnref<GrGeometryProcessor> gp(DIEllipseEdgeEffect::Create(this->c
olor(), | 1190 SkAutoTUnref<GrGeometryProcessor> gp(DIEllipseEdgeEffect::Create(this->c
olor(), |
| 1191 this->v
iewMatrix(), | 1191 this->v
iewMatrix(), |
| 1192 this->m
ode(), | 1192 this->m
ode(), |
| 1193 this->u
sesLocalCoords())); | 1193 this->u
sesLocalCoords())); |
| 1194 | 1194 |
| 1195 target->initDraw(gp, this->pipeline()); | 1195 target->initDraw(gp, this->pipeline()); |
| 1196 | 1196 |
| 1197 int instanceCount = fGeoData.count(); | 1197 int instanceCount = fGeoData.count(); |
| 1198 size_t vertexStride = gp->getVertexStride(); | 1198 size_t vertexStride = gp->getVertexStride(); |
| 1199 SkASSERT(vertexStride == sizeof(DIEllipseVertex)); | 1199 SkASSERT(vertexStride == sizeof(DIEllipseVertex)); |
| 1200 QuadHelper helper; | 1200 QuadHelper helper; |
| 1201 DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>( | 1201 DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>( |
| 1202 helper.init(target, vertexStride, instanceCount)); | 1202 helper.init(target, vertexStride, instanceCount)); |
| 1203 if (!verts) { | 1203 if (!verts) { |
| 1204 return; | 1204 return; |
| 1205 } | 1205 } |
| 1206 | 1206 |
| 1207 for (int i = 0; i < instanceCount; i++) { | 1207 for (int i = 0; i < instanceCount; i++) { |
| 1208 Geometry& geom = fGeoData[i]; | 1208 const Geometry& geom = fGeoData[i]; |
| 1209 | 1209 |
| 1210 SkScalar xRadius = geom.fXRadius; | 1210 SkScalar xRadius = geom.fXRadius; |
| 1211 SkScalar yRadius = geom.fYRadius; | 1211 SkScalar yRadius = geom.fYRadius; |
| 1212 | 1212 |
| 1213 const SkRect& bounds = geom.fBounds; | 1213 const SkRect& bounds = geom.fBounds; |
| 1214 | 1214 |
| 1215 // This adjusts the "radius" to include the half-pixel border | 1215 // This adjusts the "radius" to include the half-pixel border |
| 1216 SkScalar offsetDx = geom.fGeoDx / xRadius; | 1216 SkScalar offsetDx = geom.fGeoDx / xRadius; |
| 1217 SkScalar offsetDy = geom.fGeoDy / yRadius; | 1217 SkScalar offsetDy = geom.fGeoDy / yRadius; |
| 1218 | 1218 |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1533 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); | 1533 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); |
| 1534 | 1534 |
| 1535 // setup batch properties | 1535 // setup batch properties |
| 1536 fBatch.fColorIgnored = !overrides.readsColor(); | 1536 fBatch.fColorIgnored = !overrides.readsColor(); |
| 1537 fBatch.fColor = fGeoData[0].fColor; | 1537 fBatch.fColor = fGeoData[0].fColor; |
| 1538 fBatch.fStroke = fGeoData[0].fStroke; | 1538 fBatch.fStroke = fGeoData[0].fStroke; |
| 1539 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); | 1539 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); |
| 1540 fBatch.fCoverageIgnored = !overrides.readsCoverage(); | 1540 fBatch.fCoverageIgnored = !overrides.readsCoverage(); |
| 1541 } | 1541 } |
| 1542 | 1542 |
| 1543 void onPrepareDraws(Target* target) override { | 1543 void onPrepareDraws(Target* target) const override { |
| 1544 // reset to device coordinates | 1544 // reset to device coordinates |
| 1545 SkMatrix invert; | 1545 SkMatrix invert; |
| 1546 if (!this->viewMatrix().invert(&invert)) { | 1546 if (!this->viewMatrix().invert(&invert)) { |
| 1547 SkDebugf("Failed to invert\n"); | 1547 SkDebugf("Failed to invert\n"); |
| 1548 return; | 1548 return; |
| 1549 } | 1549 } |
| 1550 | 1550 |
| 1551 // Setup geometry processor | 1551 // Setup geometry processor |
| 1552 SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->colo
r(), | 1552 SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->colo
r(), |
| 1553 this->stro
ke(), | 1553 this->stro
ke(), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1568 InstancedHelper helper; | 1568 InstancedHelper helper; |
| 1569 CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(target
, | 1569 CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(target
, |
| 1570 kTriangles_GrPrimitiveType, vertexStride, indexBuffer, kVertsPerRRec
t, | 1570 kTriangles_GrPrimitiveType, vertexStride, indexBuffer, kVertsPerRRec
t, |
| 1571 indicesPerInstance, instanceCount)); | 1571 indicesPerInstance, instanceCount)); |
| 1572 if (!verts || !indexBuffer) { | 1572 if (!verts || !indexBuffer) { |
| 1573 SkDebugf("Could not allocate vertices\n"); | 1573 SkDebugf("Could not allocate vertices\n"); |
| 1574 return; | 1574 return; |
| 1575 } | 1575 } |
| 1576 | 1576 |
| 1577 for (int i = 0; i < instanceCount; i++) { | 1577 for (int i = 0; i < instanceCount; i++) { |
| 1578 Geometry& args = fGeoData[i]; | 1578 const Geometry& args = fGeoData[i]; |
| 1579 | 1579 |
| 1580 SkScalar outerRadius = args.fOuterRadius; | 1580 SkScalar outerRadius = args.fOuterRadius; |
| 1581 | 1581 |
| 1582 const SkRect& bounds = args.fDevBounds; | 1582 const SkRect& bounds = args.fDevBounds; |
| 1583 | 1583 |
| 1584 SkScalar yCoords[4] = { | 1584 SkScalar yCoords[4] = { |
| 1585 bounds.fTop, | 1585 bounds.fTop, |
| 1586 bounds.fTop + outerRadius, | 1586 bounds.fTop + outerRadius, |
| 1587 bounds.fBottom - outerRadius, | 1587 bounds.fBottom - outerRadius, |
| 1588 bounds.fBottom | 1588 bounds.fBottom |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1713 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); | 1713 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); |
| 1714 | 1714 |
| 1715 // setup batch properties | 1715 // setup batch properties |
| 1716 fBatch.fColorIgnored = !overrides.readsColor(); | 1716 fBatch.fColorIgnored = !overrides.readsColor(); |
| 1717 fBatch.fColor = fGeoData[0].fColor; | 1717 fBatch.fColor = fGeoData[0].fColor; |
| 1718 fBatch.fStroke = fGeoData[0].fStroke; | 1718 fBatch.fStroke = fGeoData[0].fStroke; |
| 1719 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); | 1719 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); |
| 1720 fBatch.fCoverageIgnored = !overrides.readsCoverage(); | 1720 fBatch.fCoverageIgnored = !overrides.readsCoverage(); |
| 1721 } | 1721 } |
| 1722 | 1722 |
| 1723 void onPrepareDraws(Target* target) override { | 1723 void onPrepareDraws(Target* target) const override { |
| 1724 // reset to device coordinates | 1724 // reset to device coordinates |
| 1725 SkMatrix invert; | 1725 SkMatrix invert; |
| 1726 if (!this->viewMatrix().invert(&invert)) { | 1726 if (!this->viewMatrix().invert(&invert)) { |
| 1727 SkDebugf("Failed to invert\n"); | 1727 SkDebugf("Failed to invert\n"); |
| 1728 return; | 1728 return; |
| 1729 } | 1729 } |
| 1730 | 1730 |
| 1731 // Setup geometry processor | 1731 // Setup geometry processor |
| 1732 SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->col
or(), | 1732 SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->col
or(), |
| 1733 this->str
oke(), | 1733 this->str
oke(), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1748 InstancedHelper helper; | 1748 InstancedHelper helper; |
| 1749 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>( | 1749 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>( |
| 1750 helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexB
uffer, | 1750 helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexB
uffer, |
| 1751 kVertsPerRRect, indicesPerInstance, instanceCount)); | 1751 kVertsPerRRect, indicesPerInstance, instanceCount)); |
| 1752 if (!verts || !indexBuffer) { | 1752 if (!verts || !indexBuffer) { |
| 1753 SkDebugf("Could not allocate vertices\n"); | 1753 SkDebugf("Could not allocate vertices\n"); |
| 1754 return; | 1754 return; |
| 1755 } | 1755 } |
| 1756 | 1756 |
| 1757 for (int i = 0; i < instanceCount; i++) { | 1757 for (int i = 0; i < instanceCount; i++) { |
| 1758 Geometry& args = fGeoData[i]; | 1758 const Geometry& args = fGeoData[i]; |
| 1759 | 1759 |
| 1760 // Compute the reciprocals of the radii here to save time in the sha
der | 1760 // Compute the reciprocals of the radii here to save time in the sha
der |
| 1761 SkScalar xRadRecip = SkScalarInvert(args.fXRadius); | 1761 SkScalar xRadRecip = SkScalarInvert(args.fXRadius); |
| 1762 SkScalar yRadRecip = SkScalarInvert(args.fYRadius); | 1762 SkScalar yRadRecip = SkScalarInvert(args.fYRadius); |
| 1763 SkScalar xInnerRadRecip = SkScalarInvert(args.fInnerXRadius); | 1763 SkScalar xInnerRadRecip = SkScalarInvert(args.fInnerXRadius); |
| 1764 SkScalar yInnerRadRecip = SkScalarInvert(args.fInnerYRadius); | 1764 SkScalar yInnerRadRecip = SkScalarInvert(args.fInnerYRadius); |
| 1765 | 1765 |
| 1766 // Extend the radii out half a pixel to antialias. | 1766 // Extend the radii out half a pixel to antialias. |
| 1767 SkScalar xOuterRadius = args.fXRadius + SK_ScalarHalf; | 1767 SkScalar xOuterRadius = args.fXRadius + SK_ScalarHalf; |
| 1768 SkScalar yOuterRadius = args.fYRadius + SK_ScalarHalf; | 1768 SkScalar yOuterRadius = args.fYRadius + SK_ScalarHalf; |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2077 } | 2077 } |
| 2078 | 2078 |
| 2079 DRAW_BATCH_TEST_DEFINE(RRectBatch) { | 2079 DRAW_BATCH_TEST_DEFINE(RRectBatch) { |
| 2080 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); | 2080 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); |
| 2081 GrColor color = GrRandomColor(random); | 2081 GrColor color = GrRandomColor(random); |
| 2082 const SkRRect& rrect = GrTest::TestRRectSimple(random); | 2082 const SkRRect& rrect = GrTest::TestRRectSimple(random); |
| 2083 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); | 2083 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); |
| 2084 } | 2084 } |
| 2085 | 2085 |
| 2086 #endif | 2086 #endif |
| OLD | NEW |