Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(166)

Unified Diff: third_party/WebKit/Source/platform/graphics/filters/FEGaussianBlur.cpp

Issue 2393993004: Consolidate FilterOperation and FilterEffect mapRect implementations (Closed)
Patch Set: Rebase; Drop stale comment. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/filters/FEGaussianBlur.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/platform/graphics/filters/FEGaussianBlur.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/filters/FEGaussianBlur.cpp b/third_party/WebKit/Source/platform/graphics/filters/FEGaussianBlur.cpp
index 1527161d5a95be30a359dca05bd8921534a50ecf..590d839d709eb24459b7d3f2b6e6ea8f7438a474 100644
--- a/third_party/WebKit/Source/platform/graphics/filters/FEGaussianBlur.cpp
+++ b/third_party/WebKit/Source/platform/graphics/filters/FEGaussianBlur.cpp
@@ -31,54 +31,41 @@
#include "SkBlurImageFilter.h"
-static inline float gaussianKernelFactor() {
- return 3 / 4.f * sqrtf(twoPiFloat);
-}
-
namespace blink {
-FEGaussianBlur::FEGaussianBlur(Filter* filter, float x, float y)
- : FilterEffect(filter), m_stdX(x), m_stdY(y) {}
+namespace {
-FEGaussianBlur* FEGaussianBlur::create(Filter* filter, float x, float y) {
- return new FEGaussianBlur(filter, x, y);
+inline unsigned approximateBoxWidth(float s) {
+ return static_cast<unsigned>(
+ floorf(s * (3 / 4.f * sqrtf(twoPiFloat)) + 0.5f));
}
-IntSize FEGaussianBlur::calculateUnscaledKernelSize(const FloatPoint& std) {
- ASSERT(std.x() >= 0 && std.y() >= 0);
-
+IntSize calculateKernelSize(const FloatSize& std) {
+ DCHECK(std.width() >= 0 && std.height() >= 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 too much. This is
- // compatible with Firefox' behavior.
- if (std.x()) {
- int size = std::max<unsigned>(
- 2,
- static_cast<unsigned>(floorf(std.x() * gaussianKernelFactor() + 0.5f)));
+ if (std.width()) {
+ int size = std::max<unsigned>(2, approximateBoxWidth(std.width()));
kernelSize.setWidth(size);
}
-
- if (std.y()) {
- int size = std::max<unsigned>(
- 2,
- static_cast<unsigned>(floorf(std.y() * gaussianKernelFactor() + 0.5f)));
+ if (std.height()) {
+ int size = std::max<unsigned>(2, approximateBoxWidth(std.height()));
kernelSize.setHeight(size);
}
-
return kernelSize;
}
-IntSize FEGaussianBlur::calculateKernelSize(const Filter* filter,
- const FloatPoint& std) {
- FloatPoint stdError(filter->applyHorizontalScale(std.x()),
- filter->applyVerticalScale(std.y()));
- return calculateUnscaledKernelSize(stdError);
}
-FloatRect FEGaussianBlur::mapEffect(const FloatRect& rect) const {
- IntSize kernelSize =
- calculateKernelSize(getFilter(), FloatPoint(m_stdX, m_stdY));
+FEGaussianBlur::FEGaussianBlur(Filter* filter, float x, float y)
+ : FilterEffect(filter), m_stdX(x), m_stdY(y) {}
+FEGaussianBlur* FEGaussianBlur::create(Filter* filter, float x, float y) {
+ return new FEGaussianBlur(filter, x, y);
+}
+
+FloatRect FEGaussianBlur::mapEffect(const FloatSize& stdDeviation,
+ const FloatRect& rect) {
+ IntSize kernelSize = calculateKernelSize(stdDeviation);
// We take the half kernel size and multiply it by three, because we run box
// blur three times.
FloatRect result = rect;
@@ -87,6 +74,12 @@ FloatRect FEGaussianBlur::mapEffect(const FloatRect& rect) const {
return result;
}
+FloatRect FEGaussianBlur::mapEffect(const FloatRect& rect) const {
+ FloatSize stdError(getFilter()->applyHorizontalScale(m_stdX),
+ getFilter()->applyVerticalScale(m_stdY));
+ return mapEffect(stdError, rect);
+}
+
sk_sp<SkImageFilter> FEGaussianBlur::createImageFilter() {
sk_sp<SkImageFilter> input(
SkiaImageFilterBuilder::build(inputEffect(0), operatingColorSpace()));
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/filters/FEGaussianBlur.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698