| 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 "gl/builders/GrGLProgramBuilder.h" | 8 #include "gl/builders/GrGLProgramBuilder.h" |
| 9 #include "GrOvalRenderer.h" | 9 #include "GrOvalRenderer.h" |
| 10 | 10 |
| (...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 546 } | 546 } |
| 547 | 547 |
| 548 outerRadius += halfWidth; | 548 outerRadius += halfWidth; |
| 549 if (isStrokeOnly) { | 549 if (isStrokeOnly) { |
| 550 innerRadius = radius - halfWidth; | 550 innerRadius = radius - halfWidth; |
| 551 } | 551 } |
| 552 } | 552 } |
| 553 | 553 |
| 554 GrEffect* effect = CircleEdgeEffect::Create(isStrokeOnly && innerRadius > 0)
; | 554 GrEffect* effect = CircleEdgeEffect::Create(isStrokeOnly && innerRadius > 0)
; |
| 555 static const int kCircleEdgeAttrIndex = 1; | 555 static const int kCircleEdgeAttrIndex = 1; |
| 556 drawState->addCoverageEffect(effect, kCircleEdgeAttrIndex)->unref(); | 556 drawState->setGeometryProcessor(effect, kCircleEdgeAttrIndex)->unref(); |
| 557 | 557 |
| 558 // The radii are outset for two reasons. First, it allows the shader to simp
ly perform | 558 // The radii are outset for two reasons. First, it allows the shader to simp
ly perform |
| 559 // clamp(distance-to-center - radius, 0, 1). Second, the outer radius is use
d to compute the | 559 // clamp(distance-to-center - radius, 0, 1). Second, the outer radius is use
d to compute the |
| 560 // verts of the bounding box that is rendered and the outset ensures the box
will cover all | 560 // verts of the bounding box that is rendered and the outset ensures the box
will cover all |
| 561 // pixels partially covered by the circle. | 561 // pixels partially covered by the circle. |
| 562 outerRadius += SK_ScalarHalf; | 562 outerRadius += SK_ScalarHalf; |
| 563 innerRadius -= SK_ScalarHalf; | 563 innerRadius -= SK_ScalarHalf; |
| 564 | 564 |
| 565 SkRect bounds = SkRect::MakeLTRB( | 565 SkRect bounds = SkRect::MakeLTRB( |
| 566 center.fX - outerRadius, | 566 center.fX - outerRadius, |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 689 return false; | 689 return false; |
| 690 } | 690 } |
| 691 | 691 |
| 692 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(geo.vertices()); | 692 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(geo.vertices()); |
| 693 | 693 |
| 694 GrEffect* effect = EllipseEdgeEffect::Create(isStrokeOnly && | 694 GrEffect* effect = EllipseEdgeEffect::Create(isStrokeOnly && |
| 695 innerXRadius > 0 && innerYRadiu
s > 0); | 695 innerXRadius > 0 && innerYRadiu
s > 0); |
| 696 | 696 |
| 697 static const int kEllipseCenterAttrIndex = 1; | 697 static const int kEllipseCenterAttrIndex = 1; |
| 698 static const int kEllipseEdgeAttrIndex = 2; | 698 static const int kEllipseEdgeAttrIndex = 2; |
| 699 drawState->addCoverageEffect(effect, kEllipseCenterAttrIndex, kEllipseEdgeAt
trIndex)->unref(); | 699 drawState->setGeometryProcessor(effect, kEllipseCenterAttrIndex, kEllipseEdg
eAttrIndex)->unref(); |
| 700 | 700 |
| 701 // Compute the reciprocals of the radii here to save time in the shader | 701 // Compute the reciprocals of the radii here to save time in the shader |
| 702 SkScalar xRadRecip = SkScalarInvert(xRadius); | 702 SkScalar xRadRecip = SkScalarInvert(xRadius); |
| 703 SkScalar yRadRecip = SkScalarInvert(yRadius); | 703 SkScalar yRadRecip = SkScalarInvert(yRadius); |
| 704 SkScalar xInnerRadRecip = SkScalarInvert(innerXRadius); | 704 SkScalar xInnerRadRecip = SkScalarInvert(innerXRadius); |
| 705 SkScalar yInnerRadRecip = SkScalarInvert(innerYRadius); | 705 SkScalar yInnerRadRecip = SkScalarInvert(innerYRadius); |
| 706 | 706 |
| 707 // We've extended the outer x radius out half a pixel to antialias. | 707 // We've extended the outer x radius out half a pixel to antialias. |
| 708 // This will also expand the rect so all the pixels will be captured. | 708 // This will also expand the rect so all the pixels will be captured. |
| 709 // TODO: Consider if we should use sqrt(2)/2 instead | 709 // TODO: Consider if we should use sqrt(2)/2 instead |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 GrPrintf("Failed to get space for vertices!\n"); | 807 GrPrintf("Failed to get space for vertices!\n"); |
| 808 return false; | 808 return false; |
| 809 } | 809 } |
| 810 | 810 |
| 811 DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>(geo.vertices()); | 811 DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>(geo.vertices()); |
| 812 | 812 |
| 813 GrEffect* effect = DIEllipseEdgeEffect::Create(mode); | 813 GrEffect* effect = DIEllipseEdgeEffect::Create(mode); |
| 814 | 814 |
| 815 static const int kEllipseOuterOffsetAttrIndex = 1; | 815 static const int kEllipseOuterOffsetAttrIndex = 1; |
| 816 static const int kEllipseInnerOffsetAttrIndex = 2; | 816 static const int kEllipseInnerOffsetAttrIndex = 2; |
| 817 drawState->addCoverageEffect(effect, kEllipseOuterOffsetAttrIndex, | 817 drawState->setGeometryProcessor(effect, kEllipseOuterOffsetAttrIndex, |
| 818 kEllipseInnerOffsetAttrIndex)->unref(); | 818 kEllipseInnerOffsetAttrIndex)->unref(); |
| 819 | 819 |
| 820 // This expands the outer rect so that after CTM we end up with a half-pixel
border | 820 // This expands the outer rect so that after CTM we end up with a half-pixel
border |
| 821 SkScalar a = vm[SkMatrix::kMScaleX]; | 821 SkScalar a = vm[SkMatrix::kMScaleX]; |
| 822 SkScalar b = vm[SkMatrix::kMSkewX]; | 822 SkScalar b = vm[SkMatrix::kMSkewX]; |
| 823 SkScalar c = vm[SkMatrix::kMSkewY]; | 823 SkScalar c = vm[SkMatrix::kMSkewY]; |
| 824 SkScalar d = vm[SkMatrix::kMScaleY]; | 824 SkScalar d = vm[SkMatrix::kMScaleY]; |
| 825 SkScalar geoDx = SkScalarDiv(SK_ScalarHalf, SkScalarSqrt(a*a + c*c)); | 825 SkScalar geoDx = SkScalarDiv(SK_ScalarHalf, SkScalarSqrt(a*a + c*c)); |
| 826 SkScalar geoDy = SkScalarDiv(SK_ScalarHalf, SkScalarSqrt(b*b + d*d)); | 826 SkScalar geoDy = SkScalarDiv(SK_ScalarHalf, SkScalarSqrt(b*b + d*d)); |
| 827 // This adjusts the "radius" to include the half-pixel border | 827 // This adjusts the "radius" to include the half-pixel border |
| 828 SkScalar offsetDx = SkScalarDiv(geoDx, xRadius); | 828 SkScalar offsetDx = SkScalarDiv(geoDx, xRadius); |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1056 innerRadius = xRadius - halfWidth; | 1056 innerRadius = xRadius - halfWidth; |
| 1057 } | 1057 } |
| 1058 outerRadius += halfWidth; | 1058 outerRadius += halfWidth; |
| 1059 bounds.outset(halfWidth, halfWidth); | 1059 bounds.outset(halfWidth, halfWidth); |
| 1060 } | 1060 } |
| 1061 | 1061 |
| 1062 isStrokeOnly = (isStrokeOnly && innerRadius >= 0); | 1062 isStrokeOnly = (isStrokeOnly && innerRadius >= 0); |
| 1063 | 1063 |
| 1064 GrEffect* effect = CircleEdgeEffect::Create(isStrokeOnly); | 1064 GrEffect* effect = CircleEdgeEffect::Create(isStrokeOnly); |
| 1065 static const int kCircleEdgeAttrIndex = 1; | 1065 static const int kCircleEdgeAttrIndex = 1; |
| 1066 drawState->addCoverageEffect(effect, kCircleEdgeAttrIndex)->unref(); | 1066 drawState->setGeometryProcessor(effect, kCircleEdgeAttrIndex)->unref(); |
| 1067 | 1067 |
| 1068 // The radii are outset for two reasons. First, it allows the shader to
simply perform | 1068 // The radii are outset for two reasons. First, it allows the shader to
simply perform |
| 1069 // clamp(distance-to-center - radius, 0, 1). Second, the outer radius is
used to compute the | 1069 // clamp(distance-to-center - radius, 0, 1). Second, the outer radius is
used to compute the |
| 1070 // verts of the bounding box that is rendered and the outset ensures the
box will cover all | 1070 // verts of the bounding box that is rendered and the outset ensures the
box will cover all |
| 1071 // pixels partially covered by the circle. | 1071 // pixels partially covered by the circle. |
| 1072 outerRadius += SK_ScalarHalf; | 1072 outerRadius += SK_ScalarHalf; |
| 1073 innerRadius -= SK_ScalarHalf; | 1073 innerRadius -= SK_ScalarHalf; |
| 1074 | 1074 |
| 1075 // Expand the rect so all the pixels will be captured. | 1075 // Expand the rect so all the pixels will be captured. |
| 1076 bounds.outset(SK_ScalarHalf, SK_ScalarHalf); | 1076 bounds.outset(SK_ScalarHalf, SK_ScalarHalf); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1161 GrDrawTarget::AutoReleaseGeometry geo(target, 16, 0); | 1161 GrDrawTarget::AutoReleaseGeometry geo(target, 16, 0); |
| 1162 if (!geo.succeeded()) { | 1162 if (!geo.succeeded()) { |
| 1163 GrPrintf("Failed to get space for vertices!\n"); | 1163 GrPrintf("Failed to get space for vertices!\n"); |
| 1164 return false; | 1164 return false; |
| 1165 } | 1165 } |
| 1166 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(geo.vertices()); | 1166 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(geo.vertices()); |
| 1167 | 1167 |
| 1168 GrEffect* effect = EllipseEdgeEffect::Create(isStrokeOnly); | 1168 GrEffect* effect = EllipseEdgeEffect::Create(isStrokeOnly); |
| 1169 static const int kEllipseOffsetAttrIndex = 1; | 1169 static const int kEllipseOffsetAttrIndex = 1; |
| 1170 static const int kEllipseRadiiAttrIndex = 2; | 1170 static const int kEllipseRadiiAttrIndex = 2; |
| 1171 drawState->addCoverageEffect(effect, | 1171 drawState->setGeometryProcessor(effect, |
| 1172 kEllipseOffsetAttrIndex, kEllipseRadiiAttrI
ndex)->unref(); | 1172 kEllipseOffsetAttrIndex, |
| 1173 kEllipseRadiiAttrIndex)->unref(); |
| 1173 | 1174 |
| 1174 // Compute the reciprocals of the radii here to save time in the shader | 1175 // Compute the reciprocals of the radii here to save time in the shader |
| 1175 SkScalar xRadRecip = SkScalarInvert(xRadius); | 1176 SkScalar xRadRecip = SkScalarInvert(xRadius); |
| 1176 SkScalar yRadRecip = SkScalarInvert(yRadius); | 1177 SkScalar yRadRecip = SkScalarInvert(yRadius); |
| 1177 SkScalar xInnerRadRecip = SkScalarInvert(innerXRadius); | 1178 SkScalar xInnerRadRecip = SkScalarInvert(innerXRadius); |
| 1178 SkScalar yInnerRadRecip = SkScalarInvert(innerYRadius); | 1179 SkScalar yInnerRadRecip = SkScalarInvert(innerYRadius); |
| 1179 | 1180 |
| 1180 // Extend the radii out half a pixel to antialias. | 1181 // Extend the radii out half a pixel to antialias. |
| 1181 SkScalar xOuterRadius = xRadius + SK_ScalarHalf; | 1182 SkScalar xOuterRadius = xRadius + SK_ScalarHalf; |
| 1182 SkScalar yOuterRadius = yRadius + SK_ScalarHalf; | 1183 SkScalar yOuterRadius = yRadius + SK_ScalarHalf; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1225 | 1226 |
| 1226 // drop out the middle quad if we're stroked | 1227 // drop out the middle quad if we're stroked |
| 1227 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : | 1228 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : |
| 1228 SK_ARRAY_COUNT(gRRectIndices); | 1229 SK_ARRAY_COUNT(gRRectIndices); |
| 1229 target->setIndexSourceToBuffer(indexBuffer); | 1230 target->setIndexSourceToBuffer(indexBuffer); |
| 1230 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou
nds); | 1231 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou
nds); |
| 1231 } | 1232 } |
| 1232 | 1233 |
| 1233 return true; | 1234 return true; |
| 1234 } | 1235 } |
| OLD | NEW |