Index: src/effects/SkBlurMaskFilter.cpp |
=================================================================== |
--- src/effects/SkBlurMaskFilter.cpp (revision 9604) |
+++ src/effects/SkBlurMaskFilter.cpp (working copy) |
@@ -97,11 +97,7 @@ |
radius = matrix.mapRadius(fRadius); |
} |
- // To avoid unseemly allocation requests (esp. for finite platforms like |
- // handset) we limit the radius so something manageable. (as opposed to |
- // a request like 10,000) |
- static const SkScalar MAX_RADIUS = SkIntToScalar(128); |
- radius = SkMinScalar(radius, MAX_RADIUS); |
+ radius = SkMinScalar(radius, SkBlurMask::kMAX_BLUR_RADIUS); |
SkBlurMask::Quality blurQuality = |
(fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? |
SkBlurMask::kHigh_Quality : SkBlurMask::kLow_Quality; |
@@ -120,11 +116,7 @@ |
radius = matrix.mapRadius(fRadius); |
} |
- // To avoid unseemly allocation requests (esp. for finite platforms like |
- // handset) we limit the radius so something manageable. (as opposed to |
- // a request like 10,000) |
- static const SkScalar MAX_RADIUS = SkIntToScalar(128); |
- radius = SkMinScalar(radius, MAX_RADIUS); |
+ radius = SkMinScalar(radius, SkBlurMask::kMAX_BLUR_RADIUS); |
return SkBlurMask::BlurRect(dst, r, radius, (SkBlurMask::Style)fBlurStyle, |
margin, createMode); |
@@ -300,8 +292,27 @@ |
void SkBlurMaskFilterImpl::computeFastBounds(const SkRect& src, |
SkRect* dst) const { |
- dst->set(src.fLeft - fRadius, src.fTop - fRadius, |
- src.fRight + fRadius, src.fBottom + fRadius); |
+ SkScalar gpuPad, rasterPad; |
+ |
+ { |
+ // GPU path |
Stephen White
2013/06/14 19:37:38
I guess there's no way to pass the device down her
|
+ SkScalar sigma = SkScalarMul(fRadius, SkBlurMask::kBLUR_SIGMA_SCALE); |
+ gpuPad = sigma * 3.0f; |
+ } |
+ |
+ { |
+ // raster path |
+ SkScalar radius = SkScalarMul(fRadius, SkBlurMask::kBlurRadiusFudgeFactor); |
+ |
+ radius = (radius + .5f) * 2.f; |
+ |
+ rasterPad = SkIntToScalar(SkScalarRoundToInt(radius * 3)/2); |
+ } |
+ |
+ SkScalar pad = SkMaxScalar(gpuPad, rasterPad); |
+ |
+ dst->set(src.fLeft - pad, src.fTop - pad, |
+ src.fRight + pad, src.fBottom + pad); |
} |
SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkFlattenableReadBuffer& buffer) |
@@ -332,6 +343,9 @@ |
info->fRadius = fRadius; |
info->fIgnoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag); |
info->fHighQuality = SkToBool(fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag); |
+ |
+ info->fSigmaFraction = SkBlurMask::kBLUR_SIGMA_SCALE; |
+ info->fMaxRadius = SkBlurMask::kMAX_BLUR_RADIUS; |
} |
return gBlurStyle2BlurType[fBlurStyle]; |
} |