Index: src/gpu/batches/GrMSAAPathRenderer.cpp |
diff --git a/src/gpu/batches/GrMSAAPathRenderer.cpp b/src/gpu/batches/GrMSAAPathRenderer.cpp |
index edc285e41132bc8248f4a6045cdcbf169d025f41..31b9ebf48c29dbe64b277243609d6a24951c94bd 100644 |
--- a/src/gpu/batches/GrMSAAPathRenderer.cpp |
+++ b/src/gpu/batches/GrMSAAPathRenderer.cpp |
@@ -31,16 +31,15 @@ static const float kTolerance = 0.5f; |
//////////////////////////////////////////////////////////////////////////////// |
// Helpers for drawPath |
-static inline bool single_pass_path(const SkPath& path) { |
- if (!path.isInverseFillType()) { |
- return path.isConvex(); |
+static inline bool single_pass_shape(const GrShape& shape) { |
+ if (!shape.inverseFilled()) { |
+ return shape.knownToBeConvex(); |
} |
return false; |
} |
-GrPathRenderer::StencilSupport |
-GrMSAAPathRenderer::onGetStencilSupport(const SkPath& path) const { |
- if (single_pass_path(path)) { |
+GrPathRenderer::StencilSupport GrMSAAPathRenderer::onGetStencilSupport(const GrShape& shape) const { |
+ if (single_pass_shape(shape)) { |
return GrPathRenderer::kNoRestriction_StencilSupport; |
} else { |
return GrPathRenderer::kStencilOnly_StencilSupport; |
@@ -574,15 +573,19 @@ bool GrMSAAPathRenderer::internalDrawPath(GrDrawContext* drawContext, |
const GrClip& clip, |
GrColor color, |
const SkMatrix& viewMatrix, |
- const SkPath& path, |
+ const GrShape& shape, |
bool stencilOnly) { |
+ SkASSERT(shape.style().isSimpleFill()); |
+ SkPath path; |
+ shape.asPath(&path); |
+ |
int passCount = 0; |
const GrUserStencilSettings* passes[3]; |
GrPipelineBuilder::DrawFace drawFace[3]; |
bool reverse = false; |
bool lastPassIsBounds; |
- if (single_pass_path(path)) { |
+ if (single_pass_shape(shape)) { |
passCount = 1; |
if (stencilOnly) { |
passes[0] = &gDirectToStencil; |
@@ -709,28 +712,19 @@ bool GrMSAAPathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const { |
// This path renderer does not support hairlines. We defer on anything that could be handled |
// as a hairline by another path renderer. Also, arbitrary path effects could produce |
// a hairline result. |
- return !IsStrokeHairlineOrEquivalent(*args.fStyle, *args.fViewMatrix, nullptr) && |
- !args.fStyle->strokeRec().isHairlineStyle() && |
- !args.fStyle->hasNonDashPathEffect() && !args.fAntiAlias; |
+ return !IsStrokeHairlineOrEquivalent(args.fShape->style(), *args.fViewMatrix, nullptr) && |
+ !args.fShape->style().couldBeHairline() && !args.fAntiAlias; |
} |
bool GrMSAAPathRenderer::onDrawPath(const DrawPathArgs& args) { |
GR_AUDIT_TRAIL_AUTO_FRAME(args.fDrawContext->auditTrail(), |
"GrMSAAPathRenderer::onDrawPath"); |
- SkPath tmpPath; |
- const SkPath* path; |
- if (args.fStyle->applies()) { |
- SkStrokeRec::InitStyle fill; |
+ SkTLazy<GrShape> tmpShape; |
+ const GrShape* shape = args.fShape; |
+ if (shape->style().applies()) { |
SkScalar styleScale = GrStyle::MatrixToScaleFactor(*args.fViewMatrix); |
- if (!args.fStyle->applyToPath(&tmpPath, &fill, *args.fPath, styleScale)) { |
- return false; |
- } |
- // We don't accept styles that are hairlines or have path effects that could produce |
- // hairlines. |
- SkASSERT(SkStrokeRec::kFill_InitStyle == fill); |
- path = &tmpPath; |
- } else { |
- path = args.fPath; |
+ tmpShape.init(args.fShape->applyStyle(GrStyle::Apply::kPathEffectAndStrokeRec, styleScale)); |
+ shape = tmpShape.get(); |
} |
return this->internalDrawPath(args.fDrawContext, |
*args.fPaint, |
@@ -738,28 +732,22 @@ bool GrMSAAPathRenderer::onDrawPath(const DrawPathArgs& args) { |
*args.fClip, |
args.fColor, |
*args.fViewMatrix, |
- *path, |
+ *shape, |
false); |
} |
void GrMSAAPathRenderer::onStencilPath(const StencilPathArgs& args) { |
GR_AUDIT_TRAIL_AUTO_FRAME(args.fDrawContext->auditTrail(), |
"GrMSAAPathRenderer::onStencilPath"); |
- SkASSERT(SkPath::kInverseEvenOdd_FillType != args.fPath->getFillType()); |
- SkASSERT(SkPath::kInverseWinding_FillType != args.fPath->getFillType()); |
+ SkASSERT(args.fShape->style().isSimpleFill()); |
+ SkASSERT(!args.fShape->mayBeInverseFilledAfterStyling()); |
GrPaint paint; |
paint.setXPFactory(GrDisableColorXPFactory::Make()); |
paint.setAntiAlias(args.fIsAA); |
- this->internalDrawPath(args.fDrawContext, |
- paint, |
- &GrUserStencilSettings::kUnused, |
- *args.fClip, |
- GrColor_WHITE, |
- *args.fViewMatrix, |
- *args.fPath, |
- true); |
+ this->internalDrawPath(args.fDrawContext, paint, &GrUserStencilSettings::kUnused, *args.fClip, |
+ GrColor_WHITE, *args.fViewMatrix, *args.fShape, true); |
} |
/////////////////////////////////////////////////////////////////////////////////////////////////// |