Index: src/effects/SkBlurMaskFilter.cpp |
diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp |
index 65ed7c543a7ea525dc7175abd4f36649ba824905..ac21300fe9d4bf9c2e30fb949286ca2c9107fcbb 100644 |
--- a/src/effects/SkBlurMaskFilter.cpp |
+++ b/src/effects/SkBlurMaskFilter.cpp |
@@ -1053,15 +1053,13 @@ static sk_sp<GrTexture> make_rrect_blur_mask(GrContext* context, |
return dc2->asTexture(); |
} |
-sk_sp<GrFragmentProcessor> GrRRectBlurEffect::Make(GrContext* context, float sigma, |
- const SkRRect& rrect) { |
- if (rrect.isCircle()) { |
- return GrCircleBlurFragmentProcessor::Make(context->textureProvider(), |
- rrect.rect(), sigma); |
- } |
+sk_sp<GrFragmentProcessor> GrRRectBlurEffect::Make(GrContext* context, |
+ float xformedSigma, |
+ const SkRRect& devRRect) { |
+ SkASSERT(!devRRect.isCircle()); // Should've been caught up-stream |
// TODO: loosen this up |
- if (!rrect.isSimpleCircular()) { |
+ if (!devRRect.isSimpleCircular()) { |
return nullptr; |
} |
@@ -1069,10 +1067,10 @@ sk_sp<GrFragmentProcessor> GrRRectBlurEffect::Make(GrContext* context, float sig |
// sufficiently small relative to both the size of the corner radius and the |
// width (and height) of the rrect. |
- unsigned int blurRadius = 3*SkScalarCeilToInt(sigma-1/6.0f); |
- unsigned int cornerRadius = SkScalarCeilToInt(rrect.getSimpleRadii().x()); |
- if (cornerRadius + blurRadius > rrect.width()/2 || |
- cornerRadius + blurRadius > rrect.height()/2) { |
+ unsigned int blurRadius = 3*SkScalarCeilToInt(xformedSigma-1/6.0f); |
+ unsigned int cornerRadius = SkScalarCeilToInt(devRRect.getSimpleRadii().x()); |
+ if (cornerRadius + blurRadius > devRRect.width()/2 || |
+ cornerRadius + blurRadius > devRRect.height()/2) { |
return nullptr; |
} |
@@ -1087,13 +1085,14 @@ sk_sp<GrFragmentProcessor> GrRRectBlurEffect::Make(GrContext* context, float sig |
context->textureProvider()->findAndRefTextureByUniqueKey(key)); |
if (!blurNinePatchTexture) { |
- blurNinePatchTexture = make_rrect_blur_mask(context, rrect, sigma, true); |
+ blurNinePatchTexture = make_rrect_blur_mask(context, devRRect, xformedSigma, true); |
if (!blurNinePatchTexture) { |
return nullptr; |
} |
context->textureProvider()->assignUniqueKeyToTexture(key, blurNinePatchTexture.get()); |
} |
- return sk_sp<GrFragmentProcessor>(new GrRRectBlurEffect(sigma, rrect, blurNinePatchTexture.get())); |
+ return sk_sp<GrFragmentProcessor>(new GrRRectBlurEffect(xformedSigma, devRRect, |
+ blurNinePatchTexture.get())); |
} |
void GrRRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const { |
@@ -1250,6 +1249,26 @@ bool SkBlurMaskFilterImpl::directFilterRRectMaskGPU(GrContext* context, |
SkScalar xformedSigma = this->computeXformedSigma(viewMatrix); |
+ if (devRRect.isCircle()) { |
+ sk_sp<GrFragmentProcessor> fp(GrCircleBlurFragmentProcessor::Make( |
+ context->textureProvider(), |
+ devRRect.rect(), |
+ xformedSigma)); |
+ if (!fp) { |
+ return false; |
+ } |
+ |
+ GrPaint newPaint(*grp); |
+ newPaint.addCoverageFragmentProcessor(std::move(fp)); |
+ newPaint.setAntiAlias(false); |
+ |
+ SkRect srcProxyRect = srcRRect.rect(); |
+ srcProxyRect.outset(3.0f*fSigma, 3.0f*fSigma); |
+ |
+ drawContext->drawRect(clip, newPaint, viewMatrix, srcProxyRect); |
+ return true; |
+ } |
+ |
sk_sp<GrFragmentProcessor> fp(GrRRectBlurEffect::Make(context, xformedSigma, devRRect)); |
if (!fp) { |
return false; |