| 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 "GrProcessor.h" | 10 #include "GrProcessor.h" |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 fInCircleEdge = &this->addVertexAttrib(GrAttribute("inCircleEdge", | 137 fInCircleEdge = &this->addVertexAttrib(GrAttribute("inCircleEdge", |
| 138 kVec4f_GrVertexAttrib
Type)); | 138 kVec4f_GrVertexAttrib
Type)); |
| 139 fStroke = stroke; | 139 fStroke = stroke; |
| 140 } | 140 } |
| 141 | 141 |
| 142 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { | 142 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { |
| 143 const CircleEdgeEffect& cee = other.cast<CircleEdgeEffect>(); | 143 const CircleEdgeEffect& cee = other.cast<CircleEdgeEffect>(); |
| 144 return cee.fStroke == fStroke; | 144 return cee.fStroke == fStroke; |
| 145 } | 145 } |
| 146 | 146 |
| 147 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE { | 147 virtual void onGetOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRI
DE { |
| 148 inout->mulByUnknownAlpha(); | 148 out->setUnknownSingleComponent(); |
| 149 } | 149 } |
| 150 | 150 |
| 151 const GrAttribute* fInPosition; | 151 const GrAttribute* fInPosition; |
| 152 const GrAttribute* fInCircleEdge; | 152 const GrAttribute* fInCircleEdge; |
| 153 bool fStroke; | 153 bool fStroke; |
| 154 | 154 |
| 155 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 155 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
| 156 | 156 |
| 157 typedef GrGeometryProcessor INHERITED; | 157 typedef GrGeometryProcessor INHERITED; |
| 158 }; | 158 }; |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 fInEllipseRadii = &this->addVertexAttrib(GrAttribute("inEllipseRadii", | 283 fInEllipseRadii = &this->addVertexAttrib(GrAttribute("inEllipseRadii", |
| 284 kVec4f_GrVertexAttr
ibType)); | 284 kVec4f_GrVertexAttr
ibType)); |
| 285 fStroke = stroke; | 285 fStroke = stroke; |
| 286 } | 286 } |
| 287 | 287 |
| 288 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { | 288 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { |
| 289 const EllipseEdgeEffect& eee = other.cast<EllipseEdgeEffect>(); | 289 const EllipseEdgeEffect& eee = other.cast<EllipseEdgeEffect>(); |
| 290 return eee.fStroke == fStroke; | 290 return eee.fStroke == fStroke; |
| 291 } | 291 } |
| 292 | 292 |
| 293 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE { | 293 virtual void onGetOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRI
DE { |
| 294 inout->mulByUnknownAlpha(); | 294 out->setUnknownSingleComponent(); |
| 295 } | 295 } |
| 296 | 296 |
| 297 const GrAttribute* fInPosition; | 297 const GrAttribute* fInPosition; |
| 298 const GrAttribute* fInEllipseOffset; | 298 const GrAttribute* fInEllipseOffset; |
| 299 const GrAttribute* fInEllipseRadii; | 299 const GrAttribute* fInEllipseRadii; |
| 300 bool fStroke; | 300 bool fStroke; |
| 301 | 301 |
| 302 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 302 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
| 303 | 303 |
| 304 typedef GrGeometryProcessor INHERITED; | 304 typedef GrGeometryProcessor INHERITED; |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 fInEllipseOffsets1 = &this->addVertexAttrib(GrAttribute("inEllipseOffset
s1", | 448 fInEllipseOffsets1 = &this->addVertexAttrib(GrAttribute("inEllipseOffset
s1", |
| 449 kVec2f_GrVertexA
ttribType)); | 449 kVec2f_GrVertexA
ttribType)); |
| 450 fMode = mode; | 450 fMode = mode; |
| 451 } | 451 } |
| 452 | 452 |
| 453 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { | 453 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { |
| 454 const DIEllipseEdgeEffect& eee = other.cast<DIEllipseEdgeEffect>(); | 454 const DIEllipseEdgeEffect& eee = other.cast<DIEllipseEdgeEffect>(); |
| 455 return eee.fMode == fMode; | 455 return eee.fMode == fMode; |
| 456 } | 456 } |
| 457 | 457 |
| 458 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE { | 458 virtual void onGetOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRI
DE { |
| 459 inout->mulByUnknownAlpha(); | 459 out->setUnknownSingleComponent(); |
| 460 } | 460 } |
| 461 | 461 |
| 462 const GrAttribute* fInPosition; | 462 const GrAttribute* fInPosition; |
| 463 const GrAttribute* fInEllipseOffsets0; | 463 const GrAttribute* fInEllipseOffsets0; |
| 464 const GrAttribute* fInEllipseOffsets1; | 464 const GrAttribute* fInEllipseOffsets1; |
| 465 Mode fMode; | 465 Mode fMode; |
| 466 | 466 |
| 467 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 467 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
| 468 | 468 |
| 469 typedef GrGeometryProcessor INHERITED; | 469 typedef GrGeometryProcessor INHERITED; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 } else { | 555 } else { |
| 556 halfWidth = SkScalarHalf(strokeWidth); | 556 halfWidth = SkScalarHalf(strokeWidth); |
| 557 } | 557 } |
| 558 | 558 |
| 559 outerRadius += halfWidth; | 559 outerRadius += halfWidth; |
| 560 if (isStrokeOnly) { | 560 if (isStrokeOnly) { |
| 561 innerRadius = radius - halfWidth; | 561 innerRadius = radius - halfWidth; |
| 562 } | 562 } |
| 563 } | 563 } |
| 564 | 564 |
| 565 GrGeometryProcessor* gp = CircleEdgeEffect::Create(color, isStrokeOnly && in
nerRadius > 0); | 565 SkAutoTUnref<GrGeometryProcessor> gp( |
| 566 drawState->setGeometryProcessor(gp)->unref(); | 566 CircleEdgeEffect::Create(color, isStrokeOnly && innerRadius > 0)); |
| 567 | 567 |
| 568 GrDrawTarget::AutoReleaseGeometry geo(target, 4, gp->getVertexStride(), 0); | 568 GrDrawTarget::AutoReleaseGeometry geo(target, 4, gp->getVertexStride(), 0); |
| 569 SkASSERT(gp->getVertexStride() == sizeof(CircleVertex)); | 569 SkASSERT(gp->getVertexStride() == sizeof(CircleVertex)); |
| 570 if (!geo.succeeded()) { | 570 if (!geo.succeeded()) { |
| 571 SkDebugf("Failed to get space for vertices!\n"); | 571 SkDebugf("Failed to get space for vertices!\n"); |
| 572 return; | 572 return; |
| 573 } | 573 } |
| 574 | 574 |
| 575 CircleVertex* verts = reinterpret_cast<CircleVertex*>(geo.vertices()); | 575 CircleVertex* verts = reinterpret_cast<CircleVertex*>(geo.vertices()); |
| 576 | 576 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 602 verts[2].fOffset = SkPoint::Make(outerRadius, outerRadius); | 602 verts[2].fOffset = SkPoint::Make(outerRadius, outerRadius); |
| 603 verts[2].fOuterRadius = outerRadius; | 603 verts[2].fOuterRadius = outerRadius; |
| 604 verts[2].fInnerRadius = innerRadius; | 604 verts[2].fInnerRadius = innerRadius; |
| 605 | 605 |
| 606 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); | 606 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); |
| 607 verts[3].fOffset = SkPoint::Make(outerRadius, -outerRadius); | 607 verts[3].fOffset = SkPoint::Make(outerRadius, -outerRadius); |
| 608 verts[3].fOuterRadius = outerRadius; | 608 verts[3].fOuterRadius = outerRadius; |
| 609 verts[3].fInnerRadius = innerRadius; | 609 verts[3].fInnerRadius = innerRadius; |
| 610 | 610 |
| 611 target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer()); | 611 target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer()); |
| 612 target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 4, 6,
&bounds); | 612 target->drawIndexedInstances(drawState, gp, kTriangles_GrPrimitiveType, 1, 4
, 6, &bounds); |
| 613 target->resetIndexSource(); | 613 target->resetIndexSource(); |
| 614 } | 614 } |
| 615 | 615 |
| 616 /////////////////////////////////////////////////////////////////////////////// | 616 /////////////////////////////////////////////////////////////////////////////// |
| 617 | 617 |
| 618 bool GrOvalRenderer::drawEllipse(GrDrawTarget* target, | 618 bool GrOvalRenderer::drawEllipse(GrDrawTarget* target, |
| 619 GrDrawState* drawState, | 619 GrDrawState* drawState, |
| 620 GrColor color, | 620 GrColor color, |
| 621 const GrContext* context, | 621 const GrContext* context, |
| 622 bool useCoverageAA, | 622 bool useCoverageAA, |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 682 | 682 |
| 683 xRadius += scaledStroke.fX; | 683 xRadius += scaledStroke.fX; |
| 684 yRadius += scaledStroke.fY; | 684 yRadius += scaledStroke.fY; |
| 685 } | 685 } |
| 686 | 686 |
| 687 GrDrawState::AutoViewMatrixRestore avmr; | 687 GrDrawState::AutoViewMatrixRestore avmr; |
| 688 if (!avmr.setIdentity(drawState)) { | 688 if (!avmr.setIdentity(drawState)) { |
| 689 return false; | 689 return false; |
| 690 } | 690 } |
| 691 | 691 |
| 692 GrGeometryProcessor* gp = EllipseEdgeEffect::Create(color, | 692 SkAutoTUnref<GrGeometryProcessor> gp( |
| 693 isStrokeOnly && | 693 EllipseEdgeEffect::Create(color, isStrokeOnly && innerXRadius > 0 &&
innerYRadius > 0)); |
| 694 innerXRadius > 0 && inne
rYRadius > 0); | |
| 695 | |
| 696 drawState->setGeometryProcessor(gp)->unref(); | |
| 697 | 694 |
| 698 GrDrawTarget::AutoReleaseGeometry geo(target, 4, gp->getVertexStride(), 0); | 695 GrDrawTarget::AutoReleaseGeometry geo(target, 4, gp->getVertexStride(), 0); |
| 699 SkASSERT(gp->getVertexStride() == sizeof(EllipseVertex)); | 696 SkASSERT(gp->getVertexStride() == sizeof(EllipseVertex)); |
| 700 if (!geo.succeeded()) { | 697 if (!geo.succeeded()) { |
| 701 SkDebugf("Failed to get space for vertices!\n"); | 698 SkDebugf("Failed to get space for vertices!\n"); |
| 702 return false; | 699 return false; |
| 703 } | 700 } |
| 704 | 701 |
| 705 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(geo.vertices()); | 702 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(geo.vertices()); |
| 706 | 703 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 737 verts[2].fOffset = SkPoint::Make(xRadius, yRadius); | 734 verts[2].fOffset = SkPoint::Make(xRadius, yRadius); |
| 738 verts[2].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 735 verts[2].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 739 verts[2].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip); | 736 verts[2].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip); |
| 740 | 737 |
| 741 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); | 738 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); |
| 742 verts[3].fOffset = SkPoint::Make(xRadius, -yRadius); | 739 verts[3].fOffset = SkPoint::Make(xRadius, -yRadius); |
| 743 verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 740 verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 744 verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip); | 741 verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip); |
| 745 | 742 |
| 746 target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer()); | 743 target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer()); |
| 747 target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 4, 6,
&bounds); | 744 target->drawIndexedInstances(drawState, gp, kTriangles_GrPrimitiveType, 1, 4
, 6, &bounds); |
| 748 target->resetIndexSource(); | 745 target->resetIndexSource(); |
| 749 | 746 |
| 750 return true; | 747 return true; |
| 751 } | 748 } |
| 752 | 749 |
| 753 bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target, | 750 bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target, |
| 754 GrDrawState* drawState, | 751 GrDrawState* drawState, |
| 755 GrColor color, | 752 GrColor color, |
| 756 const GrContext* context, | 753 const GrContext* context, |
| 757 bool useCoverageAA, | 754 bool useCoverageAA, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 802 xRadius += strokeWidth; | 799 xRadius += strokeWidth; |
| 803 yRadius += strokeWidth; | 800 yRadius += strokeWidth; |
| 804 } | 801 } |
| 805 if (DIEllipseEdgeEffect::kStroke == mode) { | 802 if (DIEllipseEdgeEffect::kStroke == mode) { |
| 806 mode = (innerXRadius > 0 && innerYRadius > 0) ? DIEllipseEdgeEffect::kSt
roke : | 803 mode = (innerXRadius > 0 && innerYRadius > 0) ? DIEllipseEdgeEffect::kSt
roke : |
| 807 DIEllipseEdgeEffect::kFi
ll; | 804 DIEllipseEdgeEffect::kFi
ll; |
| 808 } | 805 } |
| 809 SkScalar innerRatioX = SkScalarDiv(xRadius, innerXRadius); | 806 SkScalar innerRatioX = SkScalarDiv(xRadius, innerXRadius); |
| 810 SkScalar innerRatioY = SkScalarDiv(yRadius, innerYRadius); | 807 SkScalar innerRatioY = SkScalarDiv(yRadius, innerYRadius); |
| 811 | 808 |
| 812 GrGeometryProcessor* gp = DIEllipseEdgeEffect::Create(color, mode); | 809 SkAutoTUnref<GrGeometryProcessor> gp(DIEllipseEdgeEffect::Create(color, mode
)); |
| 813 | |
| 814 drawState->setGeometryProcessor(gp)->unref(); | |
| 815 | 810 |
| 816 GrDrawTarget::AutoReleaseGeometry geo(target, 4, gp->getVertexStride(), 0); | 811 GrDrawTarget::AutoReleaseGeometry geo(target, 4, gp->getVertexStride(), 0); |
| 817 SkASSERT(gp->getVertexStride() == sizeof(DIEllipseVertex)); | 812 SkASSERT(gp->getVertexStride() == sizeof(DIEllipseVertex)); |
| 818 if (!geo.succeeded()) { | 813 if (!geo.succeeded()) { |
| 819 SkDebugf("Failed to get space for vertices!\n"); | 814 SkDebugf("Failed to get space for vertices!\n"); |
| 820 return false; | 815 return false; |
| 821 } | 816 } |
| 822 | 817 |
| 823 DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>(geo.vertices()); | 818 DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>(geo.vertices()); |
| 824 | 819 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 850 | 845 |
| 851 verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); | 846 verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); |
| 852 verts[2].fOuterOffset = SkPoint::Make(1.0f + offsetDx, 1.0f + offsetDy); | 847 verts[2].fOuterOffset = SkPoint::Make(1.0f + offsetDx, 1.0f + offsetDy); |
| 853 verts[2].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, innerRatioY +
offsetDy); | 848 verts[2].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, innerRatioY +
offsetDy); |
| 854 | 849 |
| 855 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); | 850 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); |
| 856 verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offsetDy); | 851 verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offsetDy); |
| 857 verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -innerRatioY -
offsetDy); | 852 verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -innerRatioY -
offsetDy); |
| 858 | 853 |
| 859 target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer()); | 854 target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer()); |
| 860 target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 4, 6,
&bounds); | 855 target->drawIndexedInstances(drawState, gp, kTriangles_GrPrimitiveType, 1, 4
, 6, &bounds); |
| 861 target->resetIndexSource(); | 856 target->resetIndexSource(); |
| 862 | 857 |
| 863 return true; | 858 return true; |
| 864 } | 859 } |
| 865 | 860 |
| 866 /////////////////////////////////////////////////////////////////////////////// | 861 /////////////////////////////////////////////////////////////////////////////// |
| 867 | 862 |
| 868 static const uint16_t gRRectIndices[] = { | 863 static const uint16_t gRRectIndices[] = { |
| 869 // corners | 864 // corners |
| 870 0, 1, 5, 0, 5, 4, | 865 0, 1, 5, 0, 5, 4, |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1070 | 1065 |
| 1071 if (isStrokeOnly) { | 1066 if (isStrokeOnly) { |
| 1072 innerRadius = xRadius - halfWidth; | 1067 innerRadius = xRadius - halfWidth; |
| 1073 } | 1068 } |
| 1074 outerRadius += halfWidth; | 1069 outerRadius += halfWidth; |
| 1075 bounds.outset(halfWidth, halfWidth); | 1070 bounds.outset(halfWidth, halfWidth); |
| 1076 } | 1071 } |
| 1077 | 1072 |
| 1078 isStrokeOnly = (isStrokeOnly && innerRadius >= 0); | 1073 isStrokeOnly = (isStrokeOnly && innerRadius >= 0); |
| 1079 | 1074 |
| 1080 GrGeometryProcessor* effect = CircleEdgeEffect::Create(color, isStrokeOn
ly); | 1075 SkAutoTUnref<GrGeometryProcessor> effect(CircleEdgeEffect::Create(color,
isStrokeOnly)); |
| 1081 drawState->setGeometryProcessor(effect)->unref(); | |
| 1082 | 1076 |
| 1083 GrDrawTarget::AutoReleaseGeometry geo(target, 16, effect->getVertexStrid
e(), 0); | 1077 GrDrawTarget::AutoReleaseGeometry geo(target, 16, effect->getVertexStrid
e(), 0); |
| 1084 SkASSERT(effect->getVertexStride() == sizeof(CircleVertex)); | 1078 SkASSERT(effect->getVertexStride() == sizeof(CircleVertex)); |
| 1085 if (!geo.succeeded()) { | 1079 if (!geo.succeeded()) { |
| 1086 SkDebugf("Failed to get space for vertices!\n"); | 1080 SkDebugf("Failed to get space for vertices!\n"); |
| 1087 return false; | 1081 return false; |
| 1088 } | 1082 } |
| 1089 CircleVertex* verts = reinterpret_cast<CircleVertex*>(geo.vertices()); | 1083 CircleVertex* verts = reinterpret_cast<CircleVertex*>(geo.vertices()); |
| 1090 | 1084 |
| 1091 // The radii are outset for two reasons. First, it allows the shader to
simply perform | 1085 // The radii are outset for two reasons. First, it allows the shader to
simply perform |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1133 verts->fOffset = SkPoint::Make(outerRadius, yOuterRadii[i]); | 1127 verts->fOffset = SkPoint::Make(outerRadius, yOuterRadii[i]); |
| 1134 verts->fOuterRadius = outerRadius; | 1128 verts->fOuterRadius = outerRadius; |
| 1135 verts->fInnerRadius = innerRadius; | 1129 verts->fInnerRadius = innerRadius; |
| 1136 verts++; | 1130 verts++; |
| 1137 } | 1131 } |
| 1138 | 1132 |
| 1139 // drop out the middle quad if we're stroked | 1133 // drop out the middle quad if we're stroked |
| 1140 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : | 1134 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : |
| 1141 SK_ARRAY_COUNT(gRRectIndices); | 1135 SK_ARRAY_COUNT(gRRectIndices); |
| 1142 target->setIndexSourceToBuffer(indexBuffer); | 1136 target->setIndexSourceToBuffer(indexBuffer); |
| 1143 target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 1
6, indexCnt, | 1137 target->drawIndexedInstances(drawState, effect, kTriangles_GrPrimitiveTy
pe, 1, 16, indexCnt, |
| 1144 &bounds); | 1138 &bounds); |
| 1145 | 1139 |
| 1146 // otherwise we use the ellipse renderer | 1140 // otherwise we use the ellipse renderer |
| 1147 } else { | 1141 } else { |
| 1148 SkScalar innerXRadius = 0.0f; | 1142 SkScalar innerXRadius = 0.0f; |
| 1149 SkScalar innerYRadius = 0.0f; | 1143 SkScalar innerYRadius = 0.0f; |
| 1150 if (hasStroke) { | 1144 if (hasStroke) { |
| 1151 if (SkScalarNearlyZero(scaledStroke.length())) { | 1145 if (SkScalarNearlyZero(scaledStroke.length())) { |
| 1152 scaledStroke.set(SK_ScalarHalf, SK_ScalarHalf); | 1146 scaledStroke.set(SK_ScalarHalf, SK_ScalarHalf); |
| 1153 } else { | 1147 } else { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1172 innerYRadius = yRadius - scaledStroke.fY; | 1166 innerYRadius = yRadius - scaledStroke.fY; |
| 1173 } | 1167 } |
| 1174 | 1168 |
| 1175 xRadius += scaledStroke.fX; | 1169 xRadius += scaledStroke.fX; |
| 1176 yRadius += scaledStroke.fY; | 1170 yRadius += scaledStroke.fY; |
| 1177 bounds.outset(scaledStroke.fX, scaledStroke.fY); | 1171 bounds.outset(scaledStroke.fX, scaledStroke.fY); |
| 1178 } | 1172 } |
| 1179 | 1173 |
| 1180 isStrokeOnly = (isStrokeOnly && innerXRadius >= 0 && innerYRadius >= 0); | 1174 isStrokeOnly = (isStrokeOnly && innerXRadius >= 0 && innerYRadius >= 0); |
| 1181 | 1175 |
| 1182 GrGeometryProcessor* effect = EllipseEdgeEffect::Create(color, isStrokeO
nly); | 1176 SkAutoTUnref<GrGeometryProcessor> effect(EllipseEdgeEffect::Create(color
, isStrokeOnly)); |
| 1183 drawState->setGeometryProcessor(effect)->unref(); | |
| 1184 | 1177 |
| 1185 GrDrawTarget::AutoReleaseGeometry geo(target, 16, effect->getVertexStrid
e(), 0); | 1178 GrDrawTarget::AutoReleaseGeometry geo(target, 16, effect->getVertexStrid
e(), 0); |
| 1186 SkASSERT(effect->getVertexStride() == sizeof(EllipseVertex)); | 1179 SkASSERT(effect->getVertexStride() == sizeof(EllipseVertex)); |
| 1187 if (!geo.succeeded()) { | 1180 if (!geo.succeeded()) { |
| 1188 SkDebugf("Failed to get space for vertices!\n"); | 1181 SkDebugf("Failed to get space for vertices!\n"); |
| 1189 return false; | 1182 return false; |
| 1190 } | 1183 } |
| 1191 | 1184 |
| 1192 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(geo.vertices()); | 1185 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(geo.vertices()); |
| 1193 | 1186 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1240 verts->fOffset = SkPoint::Make(xOuterRadius, yOuterOffsets[i]); | 1233 verts->fOffset = SkPoint::Make(xOuterRadius, yOuterOffsets[i]); |
| 1241 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 1234 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 1242 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip); | 1235 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip); |
| 1243 verts++; | 1236 verts++; |
| 1244 } | 1237 } |
| 1245 | 1238 |
| 1246 // drop out the middle quad if we're stroked | 1239 // drop out the middle quad if we're stroked |
| 1247 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : | 1240 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : |
| 1248 SK_ARRAY_COUNT(gRRectIndices); | 1241 SK_ARRAY_COUNT(gRRectIndices); |
| 1249 target->setIndexSourceToBuffer(indexBuffer); | 1242 target->setIndexSourceToBuffer(indexBuffer); |
| 1250 target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 1
6, indexCnt, | 1243 target->drawIndexedInstances(drawState, effect, kTriangles_GrPrimitiveTy
pe, 1, 16, indexCnt, |
| 1251 &bounds); | 1244 &bounds); |
| 1252 } | 1245 } |
| 1253 | 1246 |
| 1254 target->resetIndexSource(); | 1247 target->resetIndexSource(); |
| 1255 return true; | 1248 return true; |
| 1256 } | 1249 } |
| OLD | NEW |