Index: src/gpu/GrAAHairLinePathRenderer.cpp |
=================================================================== |
--- src/gpu/GrAAHairLinePathRenderer.cpp (revision 8387) |
+++ src/gpu/GrAAHairLinePathRenderer.cpp (working copy) |
@@ -18,6 +18,8 @@ |
#include "SkStroke.h" |
#include "SkTemplates.h" |
+#include "effects/GrEdgeEffect.h" |
+ |
namespace { |
// quadratics are rendered as 5-sided polys in order to bound the |
// AA stroke around the center-curve. See comments in push_quad_index_buffer and |
@@ -508,7 +510,6 @@ |
{kVec2f_GrVertexAttribType, 0}, |
{kVec4f_GrVertexAttribType, sizeof(GrPoint)} |
}; |
- static const GrAttribBindings kBindings = GrDrawState::kEdge_AttribBindingsBit; |
SkMatrix viewM = drawState->getViewMatrix(); |
PREALLOC_PTARRAY(128) lines; |
@@ -522,8 +523,7 @@ |
target->drawState()->setVertexAttribs(kAttribs, SK_ARRAY_COUNT(kAttribs)); |
target->drawState()->setAttribIndex(GrDrawState::kPosition_AttribIndex, 0); |
- target->drawState()->setAttribIndex(GrDrawState::kEdge_AttribIndex, 1); |
- target->drawState()->setAttribBindings(kBindings); |
+ target->drawState()->setAttribBindings(GrDrawState::kDefault_AttribBindings); |
GrAssert(sizeof(Vertex) == target->getDrawState().getVertexSize()); |
if (!arg->set(target, vertCnt, 0)) { |
@@ -589,8 +589,10 @@ |
return false; |
} |
+ GrDrawTarget::AutoStateRestore asr(target, GrDrawTarget::kPreserve_ASRInit); |
+ GrDrawState* drawState = target->drawState(); |
+ |
GrDrawState::AutoDeviceCoordDraw adcd; |
- GrDrawState* drawState = target->drawState(); |
// createGeom transforms the geometry to device space when the matrix does not have |
// perspective. |
if (!drawState->getViewMatrix().hasPerspective()) { |
@@ -603,12 +605,21 @@ |
// TODO: See whether rendering lines as degenerate quads improves perf |
// when we have a mix |
- GrDrawState::VertexEdgeType oldEdgeType = drawState->getVertexEdgeType(); |
+ enum { |
+ // the edge effects share this stage with glyph rendering |
+ // (kGlyphMaskStage in GrTextContext) && SW path rendering |
+ // (kPathMaskStage in GrSWMaskHelper) |
+ kEdgeEffectStage = GrPaint::kTotalStages, |
+ }; |
+ static const int kEdgeAttrIndex = 1; |
+ GrEffectRef* hairLineEffect = GrEdgeEffect::Create(GrEdgeEffect::kHairLine_EdgeType); |
+ GrEffectRef* hairQuadEffect = GrEdgeEffect::Create(GrEdgeEffect::kHairQuad_EdgeType); |
+ |
target->setIndexSourceToBuffer(fLinesIndexBuffer); |
int lines = 0; |
int nBufLines = fLinesIndexBuffer->maxQuads(); |
- drawState->setVertexEdgeType(GrDrawState::kHairLine_EdgeType); |
+ drawState->setEffect(kEdgeEffectStage, hairLineEffect, kEdgeAttrIndex)->unref(); |
while (lines < lineCnt) { |
int n = GrMin(lineCnt - lines, nBufLines); |
target->drawIndexed(kTriangles_GrPrimitiveType, |
@@ -621,7 +632,7 @@ |
target->setIndexSourceToBuffer(fQuadsIndexBuffer); |
int quads = 0; |
- drawState->setVertexEdgeType(GrDrawState::kHairQuad_EdgeType); |
+ drawState->setEffect(kEdgeEffectStage, hairQuadEffect, kEdgeAttrIndex)->unref(); |
while (quads < quadCnt) { |
int n = GrMin(quadCnt - quads, kNumQuadsInIdxBuffer); |
target->drawIndexed(kTriangles_GrPrimitiveType, |
@@ -631,6 +642,6 @@ |
kIdxsPerQuad*n); // iCount |
quads += n; |
} |
- drawState->setVertexEdgeType(oldEdgeType); |
+ |
return true; |
} |