From 733832e0e0ed2fcec462ec4152da2c5ac4fcc0c6 Mon Sep 17 00:00:00 2001 From: "timothy_horton@apple.com" Date: Tue, 27 Sep 2011 20:54:16 +0000 Subject: [PATCH] Rapidly refreshing a feMorphology[erode] with r=0 can sometimes cause display corruption https://bugs.webkit.org/show_bug.cgi?id=68816 Reviewed by Simon Fraser. If a filter returns without writing into its result buffer, make sure to return an cleared buffer. Test: svg/filters/feMorphology-zero-radius.svg git-svn-id: http://svn.webkit.org/repository/webkit/trunk@96151 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- LayoutTests/ChangeLog | 14 ++++++++++ .../filters/feMorphology-zero-radius-expected.png | Bin 0 -> 10564 bytes .../filters/feMorphology-zero-radius-expected.txt | 1 + .../svg/filters/feMorphology-zero-radius.svg | 30 +++++++++++++++++++++ Source/JavaScriptCore/ChangeLog | 13 +++++++++ Source/JavaScriptCore/wtf/ByteArray.h | 2 ++ Source/WebCore/ChangeLog | 17 ++++++++++++ .../platform/graphics/filters/FEMorphology.cpp | 4 ++- .../platform/graphics/filters/FETurbulence.cpp | 4 ++- 9 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 LayoutTests/svg/filters/feMorphology-zero-radius-expected.png create mode 100644 LayoutTests/svg/filters/feMorphology-zero-radius-expected.txt create mode 100644 LayoutTests/svg/filters/feMorphology-zero-radius.svg diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog index fb0d566..1950efe 100644 --- a/LayoutTests/ChangeLog +++ b/LayoutTests/ChangeLog @@ -1,3 +1,17 @@ +2011-09-27 Tim Horton + + Rapidly refreshing a feMorphology[erode] with r=0 can sometimes cause display corruption + https://bugs.webkit.org/show_bug.cgi?id=68816 + + + Reviewed by Simon Fraser. + + Add a test which ensures that a zero-radius feMorphology filter returns cleared memory. + + * svg/filters/feMorphology-zero-radius-expected.png: Added. + * svg/filters/feMorphology-zero-radius-expected.txt: Added. + * svg/filters/feMorphology-zero-radius.svg: Added. + 2011-09-27 David Hyatt https://bugs.webkit.org/show_bug.cgi?id=68922 diff --git a/LayoutTests/svg/filters/feMorphology-zero-radius-expected.png b/LayoutTests/svg/filters/feMorphology-zero-radius-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..172a430d804e8308e1bd9999139e737016d2ef30 GIT binary patch literal 10564 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV2a>i1B%QlYbpRznkB9gCCM47$=SuFxeOMj z#wn==2Bv1_DTYRdNvVkjN#;qZ$*E>$iKZ!LhRF%$|9=Bbk;`;;4)An#RtPA{Ps_|n zWnidaYz?`eeK|nn->uZS8y&$LET`mM z{{7YelCRF1$|LweMq%F+(<4d`BNt@GTqzNLaIN$GTtm}CXMKtzma}lmr(5JFH$Lp? zRi2h+V(Ku9^AP({CoAtA4i+;qAAIJ$ajsG1iMra#NqXHjt6hWipQgBO;`#PLzPR~Q z{Du`%Ud~?oT%b31mZaasny!2DmbC>v&ls*Aw2znA>$qcXL4?`k#in&mXI0h-s_lLL zt|W8D+tgXpBQ=FoWmNVgg{(8q$$ZAm+&Syn<+on~CT*B+vfsow^7G@j0aICC8y@}o z&D-tEuD#c9Pn^vD*wk*h=Cyi63cG##$=PMfhmVv8 z+B17NHTB7)Xgrwc#FIEH`N*mtK4OweUP~@zmV{JpvbbigF?rfs8TX2l@q9bt#J)yv z+VSnd?|FAsulMZ{Z9Teu@r}T@TN_{Q+9W(ny1q1V>EgVH<~yIxmd;(x%@O#o>*+?1 zxYSerO@Y@-&7MsNp8ltl`@GSVcdBJV5j?xre2Dv@mBZ!VDt>7C{wpWW-CHYox}i|V zZuPw2v&Y`3Uh=v0I%UWHuCGqVBz{gXbdH+4PsMjmm*uBh0o>|rvU4M)AWw<9&AV+w(gTm*3uZIpy_Y!>HH0FHhXHXk*os{@d!` zZ2MLTOK#e@Z)05;hxV35$yr{TOZ*v_RdfBOe`cNhUa*C`remFMXaDM?@Cp9fT=_G3 z;->R>uJ^d9x52vqE%UbEYq8HVs zv@qU?fkA=6)5S5Qg7NM3jl2vBJS>I@|K~C%b*!Gl8n@}voq6S_1r;0`7#NvYI0O_N z6a*{|wsAt(5WyNo#z%r6DX5wgEG!;wxg9VKKvBj=?4$Cd;WL^(zy+CCm_AA<+nM*9b&{e#i| z!D#UrvXCfpr0BEx>47W3;U?+SV9t jYmBxv23uRBk^5yh$C~sr6C{AkA{jhg{an^LB{Ts5-&g%s literal 0 HcmV?d00001 diff --git a/LayoutTests/svg/filters/feMorphology-zero-radius-expected.txt b/LayoutTests/svg/filters/feMorphology-zero-radius-expected.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/LayoutTests/svg/filters/feMorphology-zero-radius-expected.txt @@ -0,0 +1 @@ + diff --git a/LayoutTests/svg/filters/feMorphology-zero-radius.svg b/LayoutTests/svg/filters/feMorphology-zero-radius.svg new file mode 100644 index 0000000..1120575 --- /dev/null +++ b/LayoutTests/svg/filters/feMorphology-zero-radius.svg @@ -0,0 +1,30 @@ + +The entire image should be white. + + + + + + + + diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog index 4a7ba48..699ad8b 100644 --- a/Source/JavaScriptCore/ChangeLog +++ b/Source/JavaScriptCore/ChangeLog @@ -1,3 +1,16 @@ +2011-09-27 Tim Horton + + Rapidly refreshing a feMorphology[erode] with r=0 can sometimes cause display corruption + https://bugs.webkit.org/show_bug.cgi?id=68816 + + + Reviewed by Simon Fraser. + + Add ByteArray::clear, which zeros the memory in the ByteArray. + + * wtf/ByteArray.h: + (WTF::ByteArray::clear): Added. + 2011-09-27 Sheriff Bot Unreviewed, rolling out r96131. diff --git a/Source/JavaScriptCore/wtf/ByteArray.h b/Source/JavaScriptCore/wtf/ByteArray.h index 47b1cff..7002096 100644 --- a/Source/JavaScriptCore/wtf/ByteArray.h +++ b/Source/JavaScriptCore/wtf/ByteArray.h @@ -70,6 +70,8 @@ namespace WTF { unsigned char* data() { return m_data; } + void clear() { memset(m_data, 0, m_size); } + void deref() { if (derefBase()) { diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 57c2e77..0ef0bd7 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,20 @@ +2011-09-27 Tim Horton + + Rapidly refreshing a feMorphology[erode] with r=0 can sometimes cause display corruption + https://bugs.webkit.org/show_bug.cgi?id=68816 + + + Reviewed by Simon Fraser. + + If a filter returns without writing into its result buffer, make sure to return an cleared buffer. + + Test: svg/filters/feMorphology-zero-radius.svg + + * platform/graphics/filters/FEMorphology.cpp: + (WebCore::FEMorphology::apply): + * platform/graphics/filters/FETurbulence.cpp: + (WebCore::FETurbulence::apply): + 2011-09-27 Ryosuke Niwa CompositeEditCommand::prune should remove subtree at once diff --git a/Source/WebCore/platform/graphics/filters/FEMorphology.cpp b/Source/WebCore/platform/graphics/filters/FEMorphology.cpp index 611af77..90ce38b 100644 --- a/Source/WebCore/platform/graphics/filters/FEMorphology.cpp +++ b/Source/WebCore/platform/graphics/filters/FEMorphology.cpp @@ -207,8 +207,10 @@ void FEMorphology::apply() return; setIsAlphaImage(in->isAlphaImage()); - if (m_radiusX <= 0 || m_radiusY <= 0) + if (m_radiusX <= 0 || m_radiusY <= 0) { + dstPixelArray->clear(); return; + } Filter* filter = this->filter(); int radiusX = static_cast(floorf(filter->applyHorizontalScale(m_radiusX))); diff --git a/Source/WebCore/platform/graphics/filters/FETurbulence.cpp b/Source/WebCore/platform/graphics/filters/FETurbulence.cpp index 0935dd1..230747d 100644 --- a/Source/WebCore/platform/graphics/filters/FETurbulence.cpp +++ b/Source/WebCore/platform/graphics/filters/FETurbulence.cpp @@ -372,8 +372,10 @@ void FETurbulence::apply() if (!pixelArray) return; - if (absolutePaintRect().isEmpty()) + if (absolutePaintRect().isEmpty()) { + pixelArray->clear(); return; + } PaintingData paintingData(m_seed, roundedIntSize(filterPrimitiveSubregion().size())); initPaint(paintingData); -- 2.7.4