Index: src/gpu/GrDrawContext.cpp |
diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp |
index b5489f1123bd6ca427434ddec98f8a222a680cca..7ee4e620e58ce040d9cddd1b1f7d51a0cf779a06 100644 |
--- a/src/gpu/GrDrawContext.cpp |
+++ b/src/gpu/GrDrawContext.cpp |
@@ -925,11 +925,11 @@ bool GrDrawContextPriv::drawAndStencilPath(const GrFixedClip& clip, |
useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType |
: GrPathRendererChain::kColor_DrawType; |
+ GrShape shape(path, GrStyle::SimpleFill()); |
GrPathRenderer::CanDrawPathArgs canDrawArgs; |
canDrawArgs.fShaderCaps = fDrawContext->fDrawingManager->getContext()->caps()->shaderCaps(); |
canDrawArgs.fViewMatrix = &viewMatrix; |
- canDrawArgs.fPath = &path; |
- canDrawArgs.fStyle = &GrStyle::SimpleFill(); |
+ canDrawArgs.fShape = &shape; |
canDrawArgs.fAntiAlias = useCoverageAA; |
canDrawArgs.fHasUserStencilSettings = hasUserStencilSettings; |
canDrawArgs.fIsStencilBufferMSAA = isStencilBufferMSAA; |
@@ -951,8 +951,7 @@ bool GrDrawContextPriv::drawAndStencilPath(const GrFixedClip& clip, |
args.fClip = &clip; |
args.fColor = GrColor_WHITE; |
args.fViewMatrix = &viewMatrix; |
- args.fPath = &path; |
- args.fStyle = &GrStyle::SimpleFill(); |
+ args.fShape = &shape; |
args.fAntiAlias = useCoverageAA; |
args.fGammaCorrect = fDrawContext->isGammaCorrect(); |
pr->drawPath(args); |
@@ -962,11 +961,11 @@ bool GrDrawContextPriv::drawAndStencilPath(const GrFixedClip& clip, |
void GrDrawContext::internalDrawPath(const GrClip& clip, |
const GrPaint& paint, |
const SkMatrix& viewMatrix, |
- const SkPath& origPath, |
- const GrStyle& origStyle) { |
+ const SkPath& path, |
+ const GrStyle& style) { |
ASSERT_SINGLE_OWNER |
RETURN_IF_ABANDONED |
- SkASSERT(!origPath.isEmpty()); |
+ SkASSERT(!path.isEmpty()); |
bool useCoverageAA = should_apply_coverage_aa(paint, fRenderTarget.get()); |
constexpr bool kHasUserStencilSettings = false; |
@@ -976,14 +975,11 @@ void GrDrawContext::internalDrawPath(const GrClip& clip, |
useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType |
: GrPathRendererChain::kColor_DrawType; |
- SkTLazy<SkPath> tmpPath; |
- SkTLazy<GrStyle> tmpStyle; |
- |
+ GrShape shape(path, style); |
GrPathRenderer::CanDrawPathArgs canDrawArgs; |
canDrawArgs.fShaderCaps = fDrawingManager->getContext()->caps()->shaderCaps(); |
canDrawArgs.fViewMatrix = &viewMatrix; |
- canDrawArgs.fPath = &origPath; |
- canDrawArgs.fStyle = &origStyle; |
+ canDrawArgs.fShape = &shape; |
canDrawArgs.fAntiAlias = useCoverageAA; |
canDrawArgs.fHasUserStencilSettings = kHasUserStencilSettings; |
canDrawArgs.fIsStencilBufferMSAA = isStencilBufferMSAA; |
@@ -992,55 +988,26 @@ void GrDrawContext::internalDrawPath(const GrClip& clip, |
GrPathRenderer* pr = fDrawingManager->getPathRenderer(canDrawArgs, false, type); |
SkScalar styleScale = GrStyle::MatrixToScaleFactor(viewMatrix); |
- if (!pr && canDrawArgs.fStyle->pathEffect()) { |
+ if (!pr && shape.style().pathEffect()) { |
// It didn't work above, so try again with the path effect applied. |
- SkStrokeRec rec(SkStrokeRec::kFill_InitStyle); |
- if (!canDrawArgs.fStyle->applyPathEffectToPath(tmpPath.init(), &rec, *canDrawArgs.fPath, |
- styleScale)) { |
- GrStyle noPathEffect(canDrawArgs.fStyle->strokeRec(), nullptr); |
- this->internalDrawPath(clip, paint, viewMatrix, *canDrawArgs.fPath, noPathEffect); |
- return; |
- } |
- tmpStyle.init(rec, nullptr); |
- canDrawArgs.fPath = tmpPath.get(); |
- canDrawArgs.fStyle = tmpStyle.get(); |
- if (canDrawArgs.fPath->isEmpty()) { |
+ shape = shape.applyStyle(GrStyle::Apply::kPathEffectOnly, styleScale); |
+ if (shape.isEmpty()) { |
return; |
} |
- |
pr = fDrawingManager->getPathRenderer(canDrawArgs, false, type); |
} |
if (!pr) { |
- SkASSERT(!canDrawArgs.fStyle->pathEffect()); |
- if (canDrawArgs.fStyle->strokeRec().needToApply()) { |
- if (!tmpPath.isValid()) { |
- tmpPath.init(); |
- } |
- // It didn't work above, so try again by applying the stroke to the geometry. |
- SkStrokeRec::InitStyle fillOrHairline; |
- if (!canDrawArgs.fStyle->applyToPath(tmpPath.get(), &fillOrHairline, |
- *canDrawArgs.fPath, styleScale)) { |
+ if (shape.style().applies()) { |
+ shape = shape.applyStyle(GrStyle::Apply::kPathEffectAndStrokeRec, styleScale); |
+ if (shape.isEmpty()) { |
return; |
} |
- if (!tmpStyle.isValid()) { |
- tmpStyle.init(fillOrHairline); |
- } else { |
- tmpStyle.get()->resetToInitStyle(fillOrHairline); |
- } |
- canDrawArgs.fPath = tmpPath.get(); |
- canDrawArgs.fStyle = tmpStyle.get(); |
- if (canDrawArgs.fPath->isEmpty()) { |
- return; |
- } |
- |
- pr = fDrawingManager->getPathRenderer(canDrawArgs, false, type); |
} |
- |
// This time, allow SW renderer |
pr = fDrawingManager->getPathRenderer(canDrawArgs, true, type); |
} |
- if (nullptr == pr) { |
+ if (!pr) { |
#ifdef SK_DEBUG |
SkDebugf("Unable to find path renderer compatible with path.\n"); |
#endif |
@@ -1055,8 +1022,7 @@ void GrDrawContext::internalDrawPath(const GrClip& clip, |
args.fClip = &clip; |
args.fColor = paint.getColor(); |
args.fViewMatrix = &viewMatrix; |
- args.fPath = canDrawArgs.fPath; |
- args.fStyle = canDrawArgs.fStyle; |
+ args.fShape = canDrawArgs.fShape; |
args.fAntiAlias = useCoverageAA; |
args.fGammaCorrect = this->isGammaCorrect(); |
pr->drawPath(args); |