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

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

Issue 1855303002: Replace filter outsets with bounds mapping in Blink. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: senorblanco review comments Created 4 years, 8 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
Index: third_party/WebKit/Source/platform/graphics/filters/FilterOperation.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/filters/FilterOperation.cpp b/third_party/WebKit/Source/platform/graphics/filters/FilterOperation.cpp
index 6bbb031a8a9252e5c0bf48bfb5ef44899596122d..46baef0e81fa79bd1fb24ffff396bed38134c842 100644
--- a/third_party/WebKit/Source/platform/graphics/filters/FilterOperation.cpp
+++ b/third_party/WebKit/Source/platform/graphics/filters/FilterOperation.cpp
@@ -25,10 +25,24 @@
#include "platform/graphics/filters/FilterOperation.h"
+#include "platform/LengthFunctions.h"
#include "platform/animation/AnimationUtilities.h"
+#include "platform/graphics/filters/FEGaussianBlur.h"
+#include "platform/graphics/filters/FilterEffect.h"
+#include "platform/graphics/filters/SkiaImageFilterBuilder.h"
namespace blink {
+static inline FloatSize outsetSizeForBlur(float stdDeviation)
+{
+ IntSize kernelSize = FEGaussianBlur::calculateUnscaledKernelSize(FloatPoint(stdDeviation, stdDeviation));
+ FloatSize outset;
+ // We take the half kernel size and multiply it with three, because we run box blur three times.
+ outset.setWidth(3 * kernelSize.width() * 0.5f);
+ outset.setHeight(3 * kernelSize.height() * 0.5f);
+ return outset;
+}
+
FilterOperation* FilterOperation::blend(const FilterOperation* from, const FilterOperation* to, double progress)
{
ASSERT(from || to);
@@ -43,6 +57,14 @@ DEFINE_TRACE(ReferenceFilterOperation)
FilterOperation::trace(visitor);
}
+FloatRect ReferenceFilterOperation::mapRect(const FloatRect& rect) const
+{
+ const auto* lastEffect = m_filter ? m_filter->lastEffect() : nullptr;
+ if (!lastEffect)
+ return rect;
+ return lastEffect->mapRectRecursive(rect);
+}
+
FilterOperation* BasicColorMatrixFilterOperation::blend(const FilterOperation* from, double progress) const
{
double fromAmount;
@@ -120,6 +142,17 @@ FilterOperation* BasicComponentTransferFilterOperation::blend(const FilterOperat
return BasicComponentTransferFilterOperation::create(result, m_type);
}
+FloatRect BlurFilterOperation::mapRect(const FloatRect& rect) const
+{
+ // Matches FEGaussianBlur::mapRect.
+ float stdDeviation = floatValueForLength(m_stdDeviation, 0);
+ FloatSize outsetSize = outsetSizeForBlur(stdDeviation);
+ FloatRect mappedRect = rect;
+ mappedRect.inflateX(outsetSize.width());
+ mappedRect.inflateY(outsetSize.height());
+ return mappedRect;
+}
+
FilterOperation* BlurFilterOperation::blend(const FilterOperation* from, double progress) const
{
LengthType lengthType = m_stdDeviation.type();
@@ -130,6 +163,17 @@ FilterOperation* BlurFilterOperation::blend(const FilterOperation* from, double
return BlurFilterOperation::create(m_stdDeviation.blend(fromOp->m_stdDeviation, progress, ValueRangeNonNegative));
}
+FloatRect DropShadowFilterOperation::mapRect(const FloatRect& rect) const
+{
+ FloatSize outsetSize = outsetSizeForBlur(m_stdDeviation);
+ FloatRect mappedRect = rect;
+ mappedRect.inflateX(outsetSize.width());
+ mappedRect.inflateY(outsetSize.height());
+ mappedRect.moveBy(m_location);
+ mappedRect.unite(rect);
+ return mappedRect;
+}
+
FilterOperation* DropShadowFilterOperation::blend(const FilterOperation* from, double progress) const
{
if (!from) {
@@ -146,6 +190,21 @@ FilterOperation* DropShadowFilterOperation::blend(const FilterOperation* from, d
blink::blend(fromOp->getColor(), m_color, progress));
}
+FloatRect BoxReflectFilterOperation::mapRect(const FloatRect& rect) const
+{
+ // Reflection about any line is self-inverse, so this matrix works for both
+ // forward and reverse mapping.
+ SkMatrix flipMatrix = SkiaImageFilterBuilder().matrixForBoxReflectFilter(
+ m_direction, m_offset);
+
+ SkRect reflection(rect);
+ flipMatrix.mapRect(&reflection);
+
+ FloatRect result = rect;
+ result.unite(reflection);
+ return result;
+}
+
FilterOperation* BoxReflectFilterOperation::blend(const FilterOperation* from, double progress) const
{
ASSERT_NOT_REACHED();

Powered by Google App Engine
This is Rietveld 408576698