Index: src/gpu/GrDefaultPathRenderer.cpp |
diff --git a/src/gpu/GrDefaultPathRenderer.cpp b/src/gpu/GrDefaultPathRenderer.cpp |
index e4ac225d72ace455f5897d66ab61a15508db1df4..3b31e876a236af01ce4ed793e8a6203caa987847 100644 |
--- a/src/gpu/GrDefaultPathRenderer.cpp |
+++ b/src/gpu/GrDefaultPathRenderer.cpp |
@@ -163,10 +163,11 @@ static inline bool single_pass_path(const SkPath& path, const SkStrokeRec& strok |
#endif |
} |
-GrPathRenderer::StencilSupport GrDefaultPathRenderer::onGetStencilSupport( |
- const SkPath& path, |
- const SkStrokeRec& stroke, |
- const GrDrawTarget*) const { |
+GrPathRenderer::StencilSupport |
+GrDefaultPathRenderer::onGetStencilSupport(const GrDrawTarget*, |
+ const GrDrawState*, |
+ const SkPath& path, |
+ const SkStrokeRec& stroke) const { |
if (single_pass_path(path, stroke)) { |
return GrPathRenderer::kNoRestriction_StencilSupport; |
} else { |
@@ -188,14 +189,15 @@ static inline void append_countour_edge_indices(bool hairLine, |
*((*indices)++) = edgeV0Idx + 1; |
} |
-bool GrDefaultPathRenderer::createGeom(const SkPath& path, |
- const SkStrokeRec& stroke, |
- SkScalar srcSpaceTol, |
- GrDrawTarget* target, |
+bool GrDefaultPathRenderer::createGeom(GrDrawTarget* target, |
+ GrDrawState* drawState, |
GrPrimitiveType* primType, |
int* vertexCnt, |
int* indexCnt, |
- GrDrawTarget::AutoReleaseGeometry* arg) { |
+ GrDrawTarget::AutoReleaseGeometry* arg, |
+ const SkPath& path, |
+ const SkStrokeRec& stroke, |
+ SkScalar srcSpaceTol) { |
{ |
SkScalar srcSpaceTolSqd = SkScalarMul(srcSpaceTol, srcSpaceTol); |
int contourCnt; |
@@ -231,8 +233,8 @@ bool GrDefaultPathRenderer::createGeom(const SkPath& path, |
} |
} |
- target->drawState()->setDefaultVertexAttribs(); |
- if (!arg->set(target, maxPts, maxIdxs)) { |
+ drawState->setDefaultVertexAttribs(); |
+ if (!arg->set(target, maxPts, drawState->getVertexStride(), maxIdxs)) { |
return false; |
} |
@@ -324,20 +326,19 @@ FINISHED: |
return true; |
} |
-bool GrDefaultPathRenderer::internalDrawPath(const SkPath& path, |
+bool GrDefaultPathRenderer::internalDrawPath(GrDrawTarget* target, |
+ GrDrawState* drawState, |
+ const SkPath& path, |
const SkStrokeRec& origStroke, |
- GrDrawTarget* target, |
bool stencilOnly) { |
- |
- SkMatrix viewM = target->getDrawState().getViewMatrix(); |
+ SkMatrix viewM = drawState->getViewMatrix(); |
SkTCopyOnFirstWrite<SkStrokeRec> stroke(origStroke); |
SkScalar hairlineCoverage; |
- if (IsStrokeHairlineOrEquivalent(*stroke, target->getDrawState().getViewMatrix(), |
+ if (IsStrokeHairlineOrEquivalent(*stroke, drawState->getViewMatrix(), |
&hairlineCoverage)) { |
- uint8_t newCoverage = SkScalarRoundToInt(hairlineCoverage * |
- target->getDrawState().getCoverage()); |
- target->drawState()->setCoverage(newCoverage); |
+ uint8_t newCoverage = SkScalarRoundToInt(hairlineCoverage * drawState->getCoverage()); |
+ drawState->setCoverage(newCoverage); |
if (!stroke->isHairlineStyle()) { |
stroke.writable()->setHairlineStyle(); |
@@ -351,20 +352,18 @@ bool GrDefaultPathRenderer::internalDrawPath(const SkPath& path, |
int indexCnt; |
GrPrimitiveType primType; |
GrDrawTarget::AutoReleaseGeometry arg; |
- if (!this->createGeom(path, |
- *stroke, |
- tol, |
- target, |
+ if (!this->createGeom(target, |
+ drawState, |
&primType, |
&vertexCnt, |
&indexCnt, |
- &arg)) { |
+ &arg, |
+ path, |
+ *stroke, |
+ tol)) { |
return false; |
} |
- SkASSERT(target); |
- GrDrawTarget::AutoStateRestore asr(target, GrDrawTarget::kPreserve_ASRInit); |
- GrDrawState* drawState = target->drawState(); |
bool colorWritesWereDisabled = drawState->isColorWriteDisabled(); |
// face culling doesn't make sense here |
SkASSERT(GrDrawState::kBoth_DrawFace == drawState->getDrawFace()); |
@@ -491,8 +490,8 @@ bool GrDefaultPathRenderer::internalDrawPath(const SkPath& path, |
} else { |
bounds = path.getBounds(); |
} |
- GrDrawTarget::AutoGeometryAndStatePush agasp(target, GrDrawTarget::kPreserve_ASRInit); |
- target->drawSimpleRect(bounds); |
+ GrDrawTarget::AutoGeometryPush agp(target); |
+ target->drawSimpleRect(drawState, bounds); |
} else { |
if (passCount > 1) { |
drawState->enableState(GrDrawState::kNoColorWrites_StateBit); |
@@ -500,41 +499,50 @@ bool GrDefaultPathRenderer::internalDrawPath(const SkPath& path, |
GrDrawState::AutoRestoreEffects are(drawState); |
drawState->setGeometryProcessor(GrDefaultGeoProcFactory::Create(false))->unref(); |
if (indexCnt) { |
- target->drawIndexed(primType, 0, 0, |
- vertexCnt, indexCnt, &devBounds); |
+ target->drawIndexed(drawState, |
+ primType, |
+ 0, |
+ 0, |
+ vertexCnt, |
+ indexCnt, |
+ &devBounds); |
} else { |
- target->drawNonIndexed(primType, 0, vertexCnt, &devBounds); |
+ target->drawNonIndexed(drawState, primType, 0, vertexCnt, &devBounds); |
} |
} |
} |
return true; |
} |
-bool GrDefaultPathRenderer::canDrawPath(const SkPath& path, |
+bool GrDefaultPathRenderer::canDrawPath(const GrDrawTarget* target, |
+ const GrDrawState* drawState, |
+ const SkPath& path, |
const SkStrokeRec& stroke, |
- const GrDrawTarget* target, |
bool antiAlias) const { |
// this class can draw any path with any fill but doesn't do any anti-aliasing. |
return !antiAlias && !(SkPath::kConic_SegmentMask & path.getSegmentMasks()) && |
(stroke.isFillStyle() || |
- IsStrokeHairlineOrEquivalent(stroke, target->getDrawState().getViewMatrix(), NULL)); |
+ IsStrokeHairlineOrEquivalent(stroke, drawState->getViewMatrix(), NULL)); |
} |
-bool GrDefaultPathRenderer::onDrawPath(const SkPath& path, |
+bool GrDefaultPathRenderer::onDrawPath(GrDrawTarget* target, |
+ GrDrawState* drawState, |
+ const SkPath& path, |
const SkStrokeRec& stroke, |
- GrDrawTarget* target, |
bool antiAlias) { |
- return this->internalDrawPath(path, |
+ return this->internalDrawPath(target, |
+ drawState, |
+ path, |
stroke, |
- target, |
false); |
} |
-void GrDefaultPathRenderer::onStencilPath(const SkPath& path, |
- const SkStrokeRec& stroke, |
- GrDrawTarget* target) { |
+void GrDefaultPathRenderer::onStencilPath(GrDrawTarget* target, |
+ GrDrawState* drawState, |
+ const SkPath& path, |
+ const SkStrokeRec& stroke) { |
SkASSERT(SkPath::kInverseEvenOdd_FillType != path.getFillType()); |
SkASSERT(SkPath::kInverseWinding_FillType != path.getFillType()); |
- this->internalDrawPath(path, stroke, target, true); |
+ this->internalDrawPath(target, drawState, path, stroke, true); |
} |