| Index: src/gpu/GrBlurUtils.cpp
|
| diff --git a/src/gpu/GrBlurUtils.cpp b/src/gpu/GrBlurUtils.cpp
|
| index c6cff60b342377b1bd7c82003ee7e048086ac823..8cd569b1b9c297c359eb433b4a4c72f46b6c3727 100644
|
| --- a/src/gpu/GrBlurUtils.cpp
|
| +++ b/src/gpu/GrBlurUtils.cpp
|
| @@ -46,15 +46,15 @@ static bool draw_mask(GrDrawContext* drawContext,
|
| return true;
|
| }
|
|
|
| -static bool draw_with_mask_filter(GrDrawContext* drawContext,
|
| - GrTextureProvider* textureProvider,
|
| - const GrClip& clipData,
|
| - const SkMatrix& viewMatrix,
|
| - const SkPath& devPath,
|
| - const SkMaskFilter* filter,
|
| - const SkIRect& clipBounds,
|
| - GrPaint* grp,
|
| - SkPaint::Style style) {
|
| +static bool sw_draw_with_mask_filter(GrDrawContext* drawContext,
|
| + GrTextureProvider* textureProvider,
|
| + const GrClip& clipData,
|
| + const SkMatrix& viewMatrix,
|
| + const SkPath& devPath,
|
| + const SkMaskFilter* filter,
|
| + const SkIRect& clipBounds,
|
| + GrPaint* grp,
|
| + SkPaint::Style style) {
|
| SkMask srcM, dstM;
|
|
|
| if (!SkDraw::DrawToMask(devPath, &clipBounds, filter, &viewMatrix, &srcM,
|
| @@ -166,12 +166,8 @@ static void draw_path_with_mask_filter(GrContext* context,
|
|
|
| static const SkRect* cullRect = nullptr; // TODO: what is our bounds?
|
|
|
| - if (!strokeInfo.isDashed() && pathEffect && pathEffect->filterPath(tmpPath.init(), *pathPtr,
|
| - &strokeInfo, cullRect)) {
|
| - pathPtr = tmpPath.get();
|
| - pathPtr->setIsVolatile(true);
|
| - pathIsMutable = true;
|
| - }
|
| + SkASSERT(strokeInfo.isDashed() || !pathEffect);
|
| +
|
| if (!strokeInfo.isHairlineStyle()) {
|
| SkPath* strokedPath = pathIsMutable ? pathPtr : tmpPath.init();
|
| if (strokeInfo.isDashed()) {
|
| @@ -183,6 +179,7 @@ static void draw_path_with_mask_filter(GrContext* context,
|
| strokeInfo.removeDash();
|
| }
|
| if (strokeInfo.applyToPath(strokedPath, *pathPtr)) {
|
| + // Apply the stroke to the path if there is one
|
| pathPtr = strokedPath;
|
| pathPtr->setIsVolatile(true);
|
| pathIsMutable = true;
|
| @@ -247,9 +244,9 @@ static void draw_path_with_mask_filter(GrContext* context,
|
| // GPU path fails
|
| SkPaint::Style style = strokeInfo.isHairlineStyle() ? SkPaint::kStroke_Style :
|
| SkPaint::kFill_Style;
|
| - draw_with_mask_filter(drawContext, context->textureProvider(),
|
| - clip, viewMatrix, *devPathPtr,
|
| - maskFilter, clipBounds, paint, style);
|
| + sw_draw_with_mask_filter(drawContext, context->textureProvider(),
|
| + clip, viewMatrix, *devPathPtr,
|
| + maskFilter, clipBounds, paint, style);
|
| }
|
|
|
| void GrBlurUtils::drawPathWithMaskFilter(GrContext* context,
|
| @@ -260,11 +257,24 @@ void GrBlurUtils::drawPathWithMaskFilter(GrContext* context,
|
| GrPaint* paint,
|
| const SkMatrix& viewMatrix,
|
| const SkMaskFilter* mf,
|
| - const SkPathEffect* pe,
|
| - const GrStrokeInfo& strokeInfo) {
|
| - SkPath* path = const_cast<SkPath*>(&origPath);
|
| - draw_path_with_mask_filter(context, drawContext, rt, clip, paint, viewMatrix, mf, pe,
|
| - strokeInfo, path, false);
|
| + const SkPathEffect* pathEffect,
|
| + const GrStrokeInfo& origStrokeInfo,
|
| + bool pathIsMutable) {
|
| + SkPath* pathPtr = const_cast<SkPath*>(&origPath);
|
| +
|
| + SkTLazy<SkPath> tmpPath;
|
| + GrStrokeInfo strokeInfo(origStrokeInfo);
|
| +
|
| + if (!strokeInfo.isDashed() && pathEffect && pathEffect->filterPath(tmpPath.init(), *pathPtr,
|
| + &strokeInfo, nullptr)) {
|
| + pathPtr = tmpPath.get();
|
| + pathPtr->setIsVolatile(true);
|
| + pathIsMutable = true;
|
| + pathEffect = nullptr;
|
| + }
|
| +
|
| + draw_path_with_mask_filter(context, drawContext, rt, clip, paint, viewMatrix, mf, pathEffect,
|
| + strokeInfo, pathPtr, pathIsMutable);
|
| }
|
|
|
| void GrBlurUtils::drawPathWithMaskFilter(GrContext* context,
|
| @@ -314,6 +324,16 @@ void GrBlurUtils::drawPathWithMaskFilter(GrContext* context,
|
| // at this point we're done with prePathMatrix
|
| SkDEBUGCODE(prePathMatrix = (const SkMatrix*)0x50FF8001;)
|
|
|
| + SkTLazy<SkPath> tmpPath2;
|
| +
|
| + if (!strokeInfo.isDashed() && pathEffect &&
|
| + pathEffect->filterPath(tmpPath2.init(), *pathPtr, &strokeInfo, nullptr)) {
|
| + pathPtr = tmpPath2.get();
|
| + pathPtr->setIsVolatile(true);
|
| + pathIsMutable = true;
|
| + pathEffect = nullptr;
|
| + }
|
| +
|
| GrPaint grPaint;
|
| if (!SkPaintToGrPaint(context, paint, viewMatrix, &grPaint)) {
|
| return;
|
| @@ -321,16 +341,9 @@ void GrBlurUtils::drawPathWithMaskFilter(GrContext* context,
|
|
|
| if (paint.getMaskFilter()) {
|
| draw_path_with_mask_filter(context, drawContext, renderTarget, clip, &grPaint, viewMatrix,
|
| - paint.getMaskFilter(), paint.getPathEffect(), strokeInfo,
|
| + paint.getMaskFilter(), pathEffect, strokeInfo,
|
| pathPtr, pathIsMutable);
|
| } else {
|
| - SkTLazy<SkPath> tmpPath2;
|
| - if (!strokeInfo.isDashed() && pathEffect &&
|
| - pathEffect->filterPath(tmpPath2.init(), *pathPtr, &strokeInfo, nullptr)) {
|
| - pathPtr = tmpPath2.get();
|
| - pathPtr->setIsVolatile(true);
|
| - pathIsMutable = true;
|
| - }
|
| drawContext->drawPath(clip, grPaint, viewMatrix, *pathPtr, strokeInfo);
|
| }
|
| }
|
|
|