From eb928ea49a1c8a72ba3e01f64452b20713232059 Mon Sep 17 00:00:00 2001 From: "robertphillips@google.com" Date: Tue, 8 Jan 2013 13:45:09 +0000 Subject: [PATCH] Proposed fix to new stroking/path render selection system https://codereview.appspot.com/7075043/ git-svn-id: http://skia.googlecode.com/svn/trunk@7076 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/gpu/GrContext.cpp | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index 30b75ad377..9d80ebc548 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -1063,24 +1063,15 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const SkStrok return; } - const SkPath* pathPtr = &path; - SkPath tmpPath; - SkStrokeRec strokeRec(stroke); - if (!strokeRec.isHairlineStyle()) { - if (strokeRec.applyToPath(&tmpPath, *pathPtr)) { - pathPtr = &tmpPath; - strokeRec.setFillStyle(); - } - } - SkRect ovalRect; - if (!pathPtr->isInverseFillType() && pathPtr->isOval(&ovalRect)) { - SkScalar width = strokeRec.isHairlineStyle() ? 0 : -SK_Scalar1; + if ((stroke.isHairlineStyle() || stroke.isFillStyle()) && !path.isInverseFillType() && + path.isOval(&ovalRect)) { + SkScalar width = stroke.isHairlineStyle() ? 0 : -SK_Scalar1; this->drawOval(paint, ovalRect, width); return; } - this->internalDrawPath(paint, *pathPtr, strokeRec); + this->internalDrawPath(paint, path, stroke); } void GrContext::internalDrawPath(const GrPaint& paint, const SkPath& path, const SkStrokeRec& stroke) { @@ -1109,7 +1100,25 @@ void GrContext::internalDrawPath(const GrPaint& paint, const SkPath& path, const GrPathRendererChain::DrawType type = prAA ? GrPathRendererChain::kColorAntiAlias_DrawType : GrPathRendererChain::kColor_DrawType; - GrPathRenderer* pr = this->getPathRenderer(path, stroke, target, true, type); + const SkPath* pathPtr = &path; + SkPath tmpPath; + SkStrokeRec strokeRec(stroke); + + // Try a 1st time without stroking the path and without allowing the SW renderer + GrPathRenderer* pr = this->getPathRenderer(*pathPtr, strokeRec, target, false, type); + + if (NULL == pr) { + if (!strokeRec.isHairlineStyle()) { + // It didn't work the 1st time, so try again with the stroked path + if (strokeRec.applyToPath(&tmpPath, *pathPtr)) { + pathPtr = &tmpPath; + strokeRec.setFillStyle(); + } + } + // This time, allow SW renderer + pr = this->getPathRenderer(*pathPtr, strokeRec, target, true, type); + } + if (NULL == pr) { #if GR_DEBUG GrPrintf("Unable to find path renderer compatible with path.\n"); @@ -1117,7 +1126,7 @@ void GrContext::internalDrawPath(const GrPaint& paint, const SkPath& path, const return; } - pr->drawPath(path, stroke, target, prAA); + pr->drawPath(*pathPtr, strokeRec, target, prAA); } ////////////////////////////////////////////////////////////////////////////////