Chromium Code Reviews| Index: src/effects/SkBlurImageFilter.cpp |
| diff --git a/src/effects/SkBlurImageFilter.cpp b/src/effects/SkBlurImageFilter.cpp |
| index c04c258829ed846faeb7c1a89508e6e13fde902d..3be76e83dda47294b968e59bee5987192de0556e 100644 |
| --- a/src/effects/SkBlurImageFilter.cpp |
| +++ b/src/effects/SkBlurImageFilter.cpp |
| @@ -10,6 +10,7 @@ |
| #include "SkColorPriv.h" |
| #include "SkFlattenableBuffers.h" |
| #include "SkGpuBlurUtils.h" |
| +#include "SkBlurImage_opts.h" |
| #if SK_SUPPORT_GPU |
| #include "GrContext.h" |
| #include "SkImageFilterUtils.h" |
| @@ -39,10 +40,6 @@ void SkBlurImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { |
| buffer.writeScalar(fSigma.fHeight); |
| } |
| -enum BlurDirection { |
| - kX, kY |
| -}; |
| - |
| /** |
| * |
| * In order to make memory accesses cache-friendly, we reorder the passes to |
| @@ -62,15 +59,15 @@ enum BlurDirection { |
| * images, and all memory reads are contiguous. |
| */ |
| -template<BlurDirection srcDirection, BlurDirection dstDirection> |
| +template<SkBlurDirection srcDirection, SkBlurDirection dstDirection> |
| static void boxBlur(const SkPMColor* src, int srcStride, SkPMColor* dst, int kernelSize, |
| int leftOffset, int rightOffset, int width, int height) |
| { |
| int rightBorder = SkMin32(rightOffset + 1, width); |
| - int srcStrideX = srcDirection == kX ? 1 : srcStride; |
| - int dstStrideX = dstDirection == kX ? 1 : height; |
| - int srcStrideY = srcDirection == kX ? srcStride : 1; |
| - int dstStrideY = dstDirection == kX ? width : 1; |
| + int srcStrideX = srcDirection == kX_BlurDirection ? 1 : srcStride; |
| + int dstStrideX = dstDirection == kX_BlurDirection ? 1 : height; |
| + int srcStrideY = srcDirection == kX_BlurDirection ? srcStride : 1; |
| + int dstStrideY = dstDirection == kX_BlurDirection ? width : 1; |
| #ifndef SK_DISABLE_BLUR_DIVISION_OPTIMIZATION |
| uint32_t scale = (1 << 24) / kernelSize; |
| uint32_t half = 1 << 23; |
| @@ -115,7 +112,7 @@ static void boxBlur(const SkPMColor* src, int srcStride, SkPMColor* dst, int ker |
| sumB += SkGetPackedB32(r); |
| } |
| sptr += srcStrideX; |
| - if (srcDirection == kY) { |
| + if (srcDirection == kY_BlurDirection) { |
| SK_PREFETCH(sptr + (rightOffset + 1) * srcStrideX); |
| } |
| dptr += dstStrideX; |
| @@ -125,26 +122,6 @@ static void boxBlur(const SkPMColor* src, int srcStride, SkPMColor* dst, int ker |
| } |
| } |
| -static void boxBlurX(const SkPMColor* src, int srcStride, SkPMColor* dst, int kernelSize, |
| - int leftOffset, int rightOffset, int width, int height) |
| -{ |
| - boxBlur<kX, kX>(src, srcStride, dst, kernelSize, leftOffset, rightOffset, width, height); |
| -} |
| - |
| -#ifndef SK_DISABLE_BLUR_DIVISION_OPTIMIZATION |
| -static void boxBlurXY(const SkPMColor* src, int srcStride, SkPMColor* dst, int kernelSize, |
| - int leftOffset, int rightOffset, int width, int height) |
| -{ |
| - boxBlur<kX, kY>(src, srcStride, dst, kernelSize, leftOffset, rightOffset, width, height); |
| -} |
| -#endif |
| - |
| -static void boxBlurY(const SkPMColor* src, int srcStride, SkPMColor* dst, int kernelSize, |
| - int topOffset, int bottomOffset, int width, int height) |
| -{ |
| - boxBlur<kY, kY>(src, srcStride, dst, kernelSize, topOffset, bottomOffset, width, height); |
| -} |
| - |
| static void getBox3Params(SkScalar s, int *kernelSize, int* kernelSize3, int *lowOffset, |
| int *highOffset) |
| { |
| @@ -212,6 +189,19 @@ bool SkBlurImageFilter::onFilterImage(Proxy* proxy, |
| SkPMColor* d = dst->getAddr32(0, 0); |
| int w = dstBounds.width(), h = dstBounds.height(); |
| int sw = src.rowBytesAsPixels(); |
| + SkBoxBlurProc boxBlurX = SkBoxBlurGetPlatformProc(kX_BlurDirection, kX_BlurDirection); |
|
mtklein
2013/11/08 02:11:03
This feels weird, like unnecessary degrees of free
Stephen White
2013/11/08 15:47:47
Done.
|
| + if (!boxBlurX) { |
| + boxBlurX = boxBlur<kX_BlurDirection, kX_BlurDirection>; |
| + } |
| + SkBoxBlurProc boxBlurY = SkBoxBlurGetPlatformProc(kY_BlurDirection, kY_BlurDirection); |
| + if (!boxBlurY) { |
| + boxBlurY = boxBlur<kY_BlurDirection, kY_BlurDirection>; |
| + } |
| + SkBoxBlurProc boxBlurXY = SkBoxBlurGetPlatformProc(kX_BlurDirection, kY_BlurDirection); |
| + if (!boxBlurY) { |
|
mtklein
2013/11/08 02:11:03
oh dear.
-> boxBlurXY?
Stephen White
2013/11/08 15:47:47
Thanks! Good catch. Should be obsoleted by new cod
|
| + boxBlurXY = boxBlur<kX_BlurDirection, kY_BlurDirection>; |
| + } |
| + |
| if (kernelSizeX > 0 && kernelSizeY > 0) { |
| #ifndef SK_DISABLE_BLUR_DIVISION_OPTIMIZATION |
| boxBlurX(s, sw, t, kernelSizeX, lowOffsetX, highOffsetX, w, h); |