Chromium Code Reviews| Index: src/effects/SkBlurImageFilter.cpp |
| diff --git a/src/effects/SkBlurImageFilter.cpp b/src/effects/SkBlurImageFilter.cpp |
| index 8590400003eba2ffb8aae2eb255abcc00e207f0a..febc062a431c32203ea0f656cb45d7004c4efe78 100644 |
| --- a/src/effects/SkBlurImageFilter.cpp |
| +++ b/src/effects/SkBlurImageFilter.cpp |
| @@ -23,15 +23,28 @@ |
| // raster paths. |
| #define MAX_SIGMA SkIntToScalar(532) |
| +static SkVector mapSigma(const SkSize& localSigma, const SkMatrix& ctm) { |
| + SkVector sigma = SkVector::Make(localSigma.width(), localSigma.height()); |
| + ctm.mapVectors(&sigma, 1); |
| + sigma.fX = SkMinScalar(sigma.fX, MAX_SIGMA); |
| + sigma.fY = SkMinScalar(sigma.fY, MAX_SIGMA); |
|
sugoi1
2014/09/09 15:42:39
Shouldn't this happen after line 37? What if sigma
Stephen White
2014/09/09 16:03:59
Good catch. Fixed.
|
| + if (sigma.fX < 0) { |
|
reed1
2014/09/09 15:37:38
SkScalarAbs()
Stephen White
2014/09/09 15:48:15
Done.
|
| + sigma.fX = -sigma.fX; |
| + } |
| + |
| + if (sigma.fY < 0) { |
| + sigma.fY = -sigma.fY; |
| + } |
| + return sigma; |
| +} |
| + |
| #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING |
| SkBlurImageFilter::SkBlurImageFilter(SkReadBuffer& buffer) |
| : INHERITED(1, buffer) { |
| fSigma.fWidth = buffer.readScalar(); |
| fSigma.fHeight = buffer.readScalar(); |
| buffer.validate(SkScalarIsFinite(fSigma.fWidth) && |
| - SkScalarIsFinite(fSigma.fHeight) && |
| - (fSigma.fWidth >= 0) && |
| - (fSigma.fHeight >= 0)); |
| + SkScalarIsFinite(fSigma.fHeight)); |
| } |
| #endif |
| @@ -177,10 +190,7 @@ bool SkBlurImageFilter::onFilterImage(Proxy* proxy, |
| } |
| dst->getBounds(&dstBounds); |
| - SkVector sigma = SkVector::Make(fSigma.width(), fSigma.height()); |
| - ctx.ctm().mapVectors(&sigma, 1); |
| - sigma.fX = SkMinScalar(sigma.fX, MAX_SIGMA); |
| - sigma.fY = SkMinScalar(sigma.fY, MAX_SIGMA); |
| + SkVector sigma = mapSigma(fSigma, ctx.ctm()); |
| int kernelSizeX, kernelSizeX3, lowOffsetX, highOffsetX; |
| int kernelSizeY, kernelSizeY3, lowOffsetY, highOffsetY; |
| @@ -253,8 +263,7 @@ void SkBlurImageFilter::computeFastBounds(const SkRect& src, SkRect* dst) const |
| bool SkBlurImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm, |
| SkIRect* dst) const { |
| SkIRect bounds = src; |
| - SkVector sigma = SkVector::Make(fSigma.width(), fSigma.height()); |
| - ctm.mapVectors(&sigma, 1); |
| + SkVector sigma = mapSigma(fSigma, ctm); |
| bounds.outset(SkScalarCeilToInt(SkScalarMul(sigma.x(), SkIntToScalar(3))), |
| SkScalarCeilToInt(SkScalarMul(sigma.y(), SkIntToScalar(3)))); |
| if (getInput(0) && !getInput(0)->filterBounds(bounds, ctm, &bounds)) { |
| @@ -277,10 +286,7 @@ bool SkBlurImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const |
| return false; |
| } |
| GrTexture* source = input.getTexture(); |
| - SkVector sigma = SkVector::Make(fSigma.width(), fSigma.height()); |
| - ctx.ctm().mapVectors(&sigma, 1); |
| - sigma.fX = SkMinScalar(sigma.fX, MAX_SIGMA); |
| - sigma.fY = SkMinScalar(sigma.fY, MAX_SIGMA); |
| + SkVector sigma = mapSigma(fSigma, ctx.ctm()); |
| offset->fX = rect.fLeft; |
| offset->fY = rect.fTop; |
| rect.offset(-srcOffset); |