Update handling of negative radius for feMorphology
Spec[1] states:
"A negative or zero value disables the effect of the given filter
primitive (i.e., the result is the filter input image)."
So change FEMorphology to clamp radii to non-negative and stop treating
as an error in SVGFEMorphologyElement::build.
[1] https://drafts.fxtf.org/filters/#element-attrdef-femorphology-radius
BUG=533457
Review URL: https://codereview.chromium.org/1344283004
git-svn-id: svn://svn.chromium.org/blink/trunk@202644 bbb929c8-8fbe-4397-9dbb-9b2b20218538
diff --git a/third_party/WebKit/LayoutTests/svg/filters/feMorphology-negative-radius-expected.html b/third_party/WebKit/LayoutTests/svg/filters/feMorphology-negative-radius-expected.html
new file mode 100644
index 0000000..6122c34
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/svg/filters/feMorphology-negative-radius-expected.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<svg>
+ <filter id="dilate">
+ <feMorphology operator="dilate" radius="0"/>
+ </filter>
+ <rect width="100" height="100" fill="green" filter="url(#dilate)"/>
+
+ <filter id="erode">
+ <feMorphology operator="erode" radius="0"/>
+ </filter>
+ <rect width="100" height="100" fill="green" filter="url(#erode)" x="100"/>
+</svg>
diff --git a/third_party/WebKit/LayoutTests/svg/filters/feMorphology-negative-radius.html b/third_party/WebKit/LayoutTests/svg/filters/feMorphology-negative-radius.html
new file mode 100644
index 0000000..299342c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/svg/filters/feMorphology-negative-radius.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<svg>
+ <filter id="dilate">
+ <feMorphology operator="dilate" radius="-1"/>
+ </filter>
+ <rect width="100" height="100" fill="green" filter="url(#dilate)"/>
+
+ <filter id="erode">
+ <feMorphology operator="erode" radius="-1"/>
+ </filter>
+ <rect width="100" height="100" fill="green" filter="url(#erode)" x="100"/>
+</svg>
diff --git a/third_party/WebKit/Source/core/svg/SVGFEMorphologyElement.cpp b/third_party/WebKit/Source/core/svg/SVGFEMorphologyElement.cpp
index b39fcee..9c36d646 100644
--- a/third_party/WebKit/Source/core/svg/SVGFEMorphologyElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGFEMorphologyElement.cpp
@@ -95,15 +95,17 @@
PassRefPtrWillBeRawPtr<FilterEffect> SVGFEMorphologyElement::build(SVGFilterBuilder* filterBuilder, Filter* filter)
{
FilterEffect* input1 = filterBuilder->getEffectById(AtomicString(m_in1->currentValue()->value()));
- float xRadius = radiusX()->currentValue()->value();
- float yRadius = radiusY()->currentValue()->value();
if (!input1)
return nullptr;
- if (xRadius < 0 || yRadius < 0)
- return nullptr;
-
+ // "A negative or zero value disables the effect of the given filter
+ // primitive (i.e., the result is the filter input image)."
+ // https://drafts.fxtf.org/filters/#element-attrdef-femorphology-radius
+ //
+ // (This is handled by FEMorphology)
+ float xRadius = radiusX()->currentValue()->value();
+ float yRadius = radiusY()->currentValue()->value();
RefPtrWillBeRawPtr<FilterEffect> effect = FEMorphology::create(filter, m_svgOperator->currentValue()->enumValue(), xRadius, yRadius);
effect->inputEffects().append(input1);
return effect.release();
diff --git a/third_party/WebKit/Source/platform/graphics/filters/FEMorphology.cpp b/third_party/WebKit/Source/platform/graphics/filters/FEMorphology.cpp
index f5d7796..bfd2ebcb 100644
--- a/third_party/WebKit/Source/platform/graphics/filters/FEMorphology.cpp
+++ b/third_party/WebKit/Source/platform/graphics/filters/FEMorphology.cpp
@@ -35,8 +35,8 @@
FEMorphology::FEMorphology(Filter* filter, MorphologyOperatorType type, float radiusX, float radiusY)
: FilterEffect(filter)
, m_type(type)
- , m_radiusX(radiusX)
- , m_radiusY(radiusY)
+ , m_radiusX(std::max(0.0f, radiusX))
+ , m_radiusY(std::max(0.0f, radiusY))
{
}
@@ -65,6 +65,7 @@
bool FEMorphology::setRadiusX(float radiusX)
{
+ radiusX = std::max(0.0f, radiusX);
if (m_radiusX == radiusX)
return false;
m_radiusX = radiusX;
@@ -76,6 +77,15 @@
return m_radiusY;
}
+bool FEMorphology::setRadiusY(float radiusY)
+{
+ radiusY = std::max(0.0f, radiusY);
+ if (m_radiusY == radiusY)
+ return false;
+ m_radiusY = radiusY;
+ return true;
+}
+
FloatRect FEMorphology::mapRect(const FloatRect& rect, bool)
{
FloatRect result = rect;
@@ -84,14 +94,6 @@
return result;
}
-bool FEMorphology::setRadiusY(float radiusY)
-{
- if (m_radiusY == radiusY)
- return false;
- m_radiusY = radiusY;
- return true;
-}
-
PassRefPtr<SkImageFilter> FEMorphology::createImageFilter(SkiaImageFilterBuilder* builder)
{
RefPtr<SkImageFilter> input(builder->build(inputEffect(0), operatingColorSpace()));