@@ -713,21 +713,33 @@ bool SkBlurMaskFilterImpl::directFilterMaskGPU(GrRecordingContext* context,
713713
714714 std::unique_ptr<GrFragmentProcessor> fp;
715715
716+ SkRRect devRRect;
717+ bool devRRectIsValid = srcRRect.transform (viewMatrix, &devRRect);
718+
719+ bool devRRectIsCircle = devRRectIsValid && SkRRectPriv::IsCircle (devRRect);
720+
716721 bool canBeRect = srcRRect.isRect () && viewMatrix.preservesRightAngles ();
717- bool canBeCircle = SkRRectPriv::IsCircle (srcRRect) && viewMatrix.isSimilarity ();
722+ bool canBeCircle = (SkRRectPriv::IsCircle (srcRRect) && viewMatrix.isSimilarity ()) ||
723+ devRRectIsCircle;
724+
718725 if (canBeRect || canBeCircle) {
719726 if (canBeRect) {
720727 fp = GrRectBlurEffect::Make (
721728 /* inputFP=*/ nullptr , context, *context->priv ().caps ()->shaderCaps (),
722729 srcRRect.rect (), viewMatrix, xformedSigma);
723730 } else {
724- SkPoint center = {srcRRect.getBounds ().centerX (), srcRRect.getBounds ().centerY ()};
725- viewMatrix.mapPoints (¢er, 1 );
726- SkScalar radius = viewMatrix.mapVector (0 , srcRRect.width ()/2 .f ).length ();
727- SkRect devBounds = {center.x () - radius,
728- center.y () - radius,
729- center.x () + radius,
730- center.y () + radius};
731+ SkRect devBounds;
732+ if (devRRectIsCircle) {
733+ devBounds = devRRect.getBounds ();
734+ } else {
735+ SkPoint center = {srcRRect.getBounds ().centerX (), srcRRect.getBounds ().centerY ()};
736+ viewMatrix.mapPoints (¢er, 1 );
737+ SkScalar radius = viewMatrix.mapVector (0 , srcRRect.width ()/2 .f ).length ();
738+ devBounds = {center.x () - radius,
739+ center.y () - radius,
740+ center.x () + radius,
741+ center.y () + radius};
742+ }
731743 fp = GrCircleBlurFragmentProcessor::Make (/* inputFP=*/ nullptr , context, devBounds,
732744 xformedSigma);
733745 }
@@ -760,8 +772,7 @@ bool SkBlurMaskFilterImpl::directFilterMaskGPU(GrRecordingContext* context,
760772 if (!viewMatrix.isScaleTranslate ()) {
761773 return false ;
762774 }
763- SkRRect devRRect;
764- if (!srcRRect.transform (viewMatrix, &devRRect) || !SkRRectPriv::AllCornersCircular (devRRect)) {
775+ if (!devRRectIsValid || !SkRRectPriv::AllCornersCircular (devRRect)) {
765776 return false ;
766777 }
767778
0 commit comments