Chromium Code Reviews| Index: src/effects/SkBlurImageFilter.cpp |
| diff --git a/src/effects/SkBlurImageFilter.cpp b/src/effects/SkBlurImageFilter.cpp |
| index 5d58369bc765cd561f6836a702145c7b4af0b6f1..631cd35f8c05276afcc35da1d3162cc0e25c997b 100644 |
| --- a/src/effects/SkBlurImageFilter.cpp |
| +++ b/src/effects/SkBlurImageFilter.cpp |
| @@ -90,18 +90,6 @@ bool SkBlurImageFilter::onFilterImage(Proxy* proxy, |
| return false; |
| } |
| - SkAutoLockPixels alp(src); |
| - if (!src.getPixels()) { |
| - return false; |
| - } |
| - |
| - SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(dstBounds.width(), dstBounds.height())); |
| - if (!device) { |
| - return false; |
| - } |
| - *dst = device->accessBitmap(false); |
| - SkAutoLockPixels alp_dst(*dst); |
| - |
| SkVector sigma = mapSigma(fSigma, ctx.ctm()); |
| int kernelSizeX, kernelSizeX3, lowOffsetX, highOffsetX; |
| @@ -114,12 +102,24 @@ bool SkBlurImageFilter::onFilterImage(Proxy* proxy, |
| } |
| if (kernelSizeX == 0 && kernelSizeY == 0) { |
| - src.copyTo(dst, dst->colorType()); |
| - offset->fX = dstBounds.x() + srcOffset.x(); |
| - offset->fY = dstBounds.y() + srcOffset.y(); |
| + src.extractSubset(dst, srcBounds); |
| + offset->fX = srcBounds.x(); |
| + offset->fY = srcBounds.y(); |
| return true; |
| } |
| + SkAutoLockPixels alp(src); |
| + if (!src.getPixels()) { |
| + return false; |
| + } |
| + |
| + SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(dstBounds.width(), dstBounds.height())); |
| + if (!device) { |
| + return false; |
| + } |
| + *dst = device->accessBitmap(false); |
| + SkAutoLockPixels alp_dst(*dst); |
| + |
| SkAutoTUnref<SkBaseDevice> tempDevice(proxy->createDevice(dst->width(), dst->height())); |
| if (!tempDevice) { |
| return false; |
| @@ -211,15 +211,21 @@ bool SkBlurImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const |
| if (!srcBounds.intersect(dstBounds)) { |
| return false; |
| } |
| - GrTexture* source = input.getTexture(); |
| SkVector sigma = mapSigma(fSigma, ctx.ctm()); |
|
robertphillips
2016/02/01 17:41:35
Do we need/want an epsilon-based comparison here ?
Stephen White
2016/02/01 18:20:03
Since GaussianBlur() does exact comparisons as wel
|
| + if (sigma.x() == 0 && sigma.y() == 0) { |
| + input.extractSubset(result, srcBounds); |
| + offset->fX = srcBounds.x(); |
| + offset->fY = srcBounds.y(); |
| + return true; |
| + } |
| offset->fX = dstBounds.fLeft; |
| offset->fY = dstBounds.fTop; |
| srcBounds.offset(-srcOffset); |
| dstBounds.offset(-srcOffset); |
| SkRect srcBoundsF(SkRect::Make(srcBounds)); |
| - SkAutoTUnref<GrTexture> tex(SkGpuBlurUtils::GaussianBlur(source->getContext(), |
| - source, |
| + GrTexture* inputTexture = input.getTexture(); |
| + SkAutoTUnref<GrTexture> tex(SkGpuBlurUtils::GaussianBlur(inputTexture->getContext(), |
| + inputTexture, |
| false, |
| SkRect::Make(dstBounds), |
| &srcBoundsF, |