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); |