Chromium Code Reviews| 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]; |
| } |