Chromium Code Reviews| Index: Source/platform/graphics/filters/FEGaussianBlur.cpp |
| diff --git a/Source/platform/graphics/filters/FEGaussianBlur.cpp b/Source/platform/graphics/filters/FEGaussianBlur.cpp |
| index 631eac48165ff4e7b57d86d0067fbdda7db7d160..6b8e45f2e86e62ba0fb4fa12515e77a2c0858485 100644 |
| --- a/Source/platform/graphics/filters/FEGaussianBlur.cpp |
| +++ b/Source/platform/graphics/filters/FEGaussianBlur.cpp |
| @@ -44,7 +44,7 @@ static inline float gaussianKernelFactor() |
| return 3 / 4.f * sqrtf(twoPiFloat); |
| } |
| -static const unsigned gMaxKernelSize = 1000; |
| +static const int gMaxKernelSize = 1000; |
| namespace WebCore { |
| @@ -228,43 +228,41 @@ inline void FEGaussianBlur::platformApply(Uint8ClampedArray* srcPixelArray, Uint |
| platformApplyGeneric(srcPixelArray, tmpPixelArray, kernelSizeX, kernelSizeY, paintSize); |
| } |
| -void FEGaussianBlur::calculateUnscaledKernelSize(unsigned& kernelSizeX, unsigned& kernelSizeY, float stdX, float stdY) |
| +IntSize FEGaussianBlur::calculateUnscaledKernelSize(const FloatPoint& std) |
| { |
| - ASSERT(stdX >= 0 && stdY >= 0); |
| - |
| - kernelSizeX = 0; |
| - if (stdX) |
| - kernelSizeX = max<unsigned>(2, static_cast<unsigned>(floorf(stdX * gaussianKernelFactor() + 0.5f))); |
| - kernelSizeY = 0; |
| - if (stdY) |
| - kernelSizeY = max<unsigned>(2, static_cast<unsigned>(floorf(stdY * gaussianKernelFactor() + 0.5f))); |
| + ASSERT(std.x() >= 0 && std.y() >= 0); |
| + IntSize kernelSize; |
| // Limit the kernel size to 1000. A bigger radius won't make a big difference for the result image but |
| // inflates the absolute paint rect to much. This is compatible with Firefox' behavior. |
| - if (kernelSizeX > gMaxKernelSize) |
| - kernelSizeX = gMaxKernelSize; |
| - if (kernelSizeY > gMaxKernelSize) |
| - kernelSizeY = gMaxKernelSize; |
| + if (std.x()) { |
| + int size = max<unsigned>(2, static_cast<unsigned>(floorf(std.x() * gaussianKernelFactor() + 0.5f))); |
| + kernelSize.setWidth(min(size, gMaxKernelSize)); |
| + } |
| + |
| + if (std.y()) { |
| + int size = max<unsigned>(2, static_cast<unsigned>(floorf(std.y() * gaussianKernelFactor() + 0.5f))); |
| + kernelSize.setHeight(min(size, gMaxKernelSize)); |
| + } |
| + |
| + return kernelSize; |
| } |
| -void FEGaussianBlur::calculateKernelSize(Filter* filter, unsigned& kernelSizeX, unsigned& kernelSizeY, float stdX, float stdY) |
| +IntSize FEGaussianBlur::calculateKernelSize(Filter* filter, const FloatPoint& std) |
| { |
| - stdX = filter->applyHorizontalScale(stdX); |
| - stdY = filter->applyVerticalScale(stdY); |
| + FloatPoint stdError(filter->applyHorizontalScale(std.x()), filter->applyVerticalScale(std.y())); |
|
Stephen White
2014/03/27 04:11:53
I wonder if we should just have an applyScale() th
Savago
2014/03/27 04:51:19
I can look on that.
|
| - calculateUnscaledKernelSize(kernelSizeX, kernelSizeY, stdX, stdY); |
| + return calculateUnscaledKernelSize(stdError); |
| } |
| FloatRect FEGaussianBlur::mapRect(const FloatRect& rect, bool) |
| { |
| FloatRect result = rect; |
| - unsigned kernelSizeX = 0; |
| - unsigned kernelSizeY = 0; |
| - calculateKernelSize(filter(), kernelSizeX, kernelSizeY, m_stdX, m_stdY); |
| + IntSize kernelSize = calculateKernelSize(filter(), FloatPoint(m_stdX, m_stdY)); |
| // We take the half kernel size and multiply it with three, because we run box blur three times. |
| - result.inflateX(3 * kernelSizeX * 0.5f); |
| - result.inflateY(3 * kernelSizeY * 0.5f); |
| + result.inflateX(3 * kernelSize.width() * 0.5f); |
| + result.inflateY(3 * kernelSize.height() * 0.5f); |
| return result; |
| } |
| @@ -304,15 +302,13 @@ void FEGaussianBlur::applySoftware() |
| if (!m_stdX && !m_stdY) |
| return; |
| - unsigned kernelSizeX = 0; |
| - unsigned kernelSizeY = 0; |
| - calculateKernelSize(filter(), kernelSizeX, kernelSizeY, m_stdX, m_stdY); |
| + IntSize kernelSize = calculateKernelSize(filter(), FloatPoint(m_stdX, m_stdY)); |
| IntSize paintSize = absolutePaintRect().size(); |
| RefPtr<Uint8ClampedArray> tmpImageData = Uint8ClampedArray::createUninitialized(paintSize.width() * paintSize.height() * 4); |
| Uint8ClampedArray* tmpPixelArray = tmpImageData.get(); |
| - platformApply(srcPixelArray, tmpPixelArray, kernelSizeX, kernelSizeY, paintSize); |
| + platformApply(srcPixelArray, tmpPixelArray, kernelSize.width(), kernelSize.height(), paintSize); |
| } |
| bool FEGaussianBlur::applySkia() |