<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[179171] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/179171">179171</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2015-01-26 22:32:03 -0800 (Mon, 26 Jan 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Apply feTurbulence spec change to fix zero length vector generation
https://bugs.webkit.org/show_bug.cgi?id=140812
.:

Patch by Nikos Andronikos &lt;nikos.andronikos-webkit@cisra.canon.com.au&gt; on 2015-01-26
Reviewed by Darin Adler.

Recently a bug with the turbulence algorithm was corrected in the
Filter Effects specification.
For some seed values this bug allowed zero length vectors to be generated.
This resulted in large solid color squares being present in the generated image.
The feTurbulence algorithm was updated to reject zero length vectors. This patch
applies that change in WebCore.

Test: svg/filters/feTurbulence_bad_seeds.html

* platform/graphics/filters/FETurbulence.cpp:
(WebCore::FETurbulence::initPaint):
Added rejection sampling during vector generation to avoid zero length vectors.

LayoutTests:

Patch by Nikos Andronikos &lt;nikos.andronikos-webkit@cisra.canon.com.au&gt; on 2015-01-26
Reviewed by Darin Adler.

Ref test that generates a turbulence image which is then coloured black
and alpha min/maxxed (&gt;0 becomes 1, 0 stays zero). This allows holes
caused by zero length vectors to be easily identified.

* svg/filters/feTurbulence_bad_seeds-expected.html: Added.
* svg/filters/feTurbulence_bad_seeds.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkChangeLog">trunk/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsfiltersFETurbulencecpp">trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestssvgfiltersfeTurbulence_bad_seedsexpectedhtml">trunk/LayoutTests/svg/filters/feTurbulence_bad_seeds-expected.html</a></li>
<li><a href="#trunkLayoutTestssvgfiltersfeTurbulence_bad_seedshtml">trunk/LayoutTests/svg/filters/feTurbulence_bad_seeds.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/ChangeLog (179170 => 179171)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/ChangeLog        2015-01-27 06:24:09 UTC (rev 179170)
+++ trunk/ChangeLog        2015-01-27 06:32:03 UTC (rev 179171)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2015-01-26  Nikos Andronikos  &lt;nikos.andronikos-webkit@cisra.canon.com.au&gt;
+
+        Apply feTurbulence spec change to fix zero length vector generation
+        https://bugs.webkit.org/show_bug.cgi?id=140812
+        
+        Reviewed by Darin Adler.
+
+        Recently a bug with the turbulence algorithm was corrected in the
+        Filter Effects specification.
+        For some seed values this bug allowed zero length vectors to be generated.
+        This resulted in large solid color squares being present in the generated image.
+        The feTurbulence algorithm was updated to reject zero length vectors. This patch
+        applies that change in WebCore.
+
+        Test: svg/filters/feTurbulence_bad_seeds.html
+
+        * platform/graphics/filters/FETurbulence.cpp:
+        (WebCore::FETurbulence::initPaint):
+        Added rejection sampling during vector generation to avoid zero length vectors. 
+
</ins><span class="cx"> 2015-01-26  Csaba Osztrogonác  &lt;ossy@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         [cmake] Remove compiler version calculate cruft
</span></span></pre></div>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (179170 => 179171)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-01-27 06:24:09 UTC (rev 179170)
+++ trunk/LayoutTests/ChangeLog        2015-01-27 06:32:03 UTC (rev 179171)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2015-01-26  Nikos Andronikos  &lt;nikos.andronikos-webkit@cisra.canon.com.au&gt;
+
+        Apply feTurbulence spec change to fix zero length vector generation
+        https://bugs.webkit.org/show_bug.cgi?id=140812
+
+        Reviewed by Darin Adler.
+
+        Ref test that generates a turbulence image which is then coloured black
+        and alpha min/maxxed (&gt;0 becomes 1, 0 stays zero). This allows holes
+        caused by zero length vectors to be easily identified.
+
+        * svg/filters/feTurbulence_bad_seeds-expected.html: Added.
+        * svg/filters/feTurbulence_bad_seeds.html: Added.
+
</ins><span class="cx"> 2015-01-26  Sylvain Galineau  &lt;galineau@adobe.com&gt;
</span><span class="cx"> 
</span><span class="cx">         The computed value of line-height:normal is incorrect
</span></span></pre></div>
<a id="trunkLayoutTestssvgfiltersfeTurbulence_bad_seedsexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/svg/filters/feTurbulence_bad_seeds-expected.html (0 => 179171)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/filters/feTurbulence_bad_seeds-expected.html                                (rev 0)
+++ trunk/LayoutTests/svg/filters/feTurbulence_bad_seeds-expected.html        2015-01-27 06:32:03 UTC (rev 179171)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+&lt;!doctype html&gt;
+&lt;html&gt;
+&lt;body&gt;
+&lt;svg viewbox=&quot;0 0 512 256&quot;&gt;
+    &lt;rect x=&quot;0&quot; y=&quot;0&quot; width=&quot;256&quot; height=&quot;128&quot; fill=&quot;black&quot; /&gt;
+&lt;/svg&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestssvgfiltersfeTurbulence_bad_seedshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/svg/filters/feTurbulence_bad_seeds.html (0 => 179171)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/filters/feTurbulence_bad_seeds.html                                (rev 0)
+++ trunk/LayoutTests/svg/filters/feTurbulence_bad_seeds.html        2015-01-27 06:32:03 UTC (rev 179171)
</span><span class="lines">@@ -0,0 +1,52 @@
</span><ins>+&lt;!doctype html&gt;
+&lt;!--
+This test determines whether the feTurbulence algorithm allows zero length vectors on some particular seeds. These zero length
+vectors result in large rectangular holes in the generated image.
+Seed 514 is the first seed value that demonstrates the error.
+Others are: 1977,2337,4777,8032,9615,14783,14862,14921,18607,19537,19852,19955,22456,23056,26678,27351,29383,29560,29929, ...
+The feTurbulence algorithm in the specification uses rejection sampling to avoid generating zero length vectors and so in a
+correct implementation we should not see any large holes in the image.
+--&gt;
+&lt;html&gt;
+&lt;body&gt;
+&lt;svg viewbox=&quot;0 0 512 256&quot;&gt;
+    &lt;desc&gt;Test passes if there are no red squares.&lt;/desc&gt;
+    &lt;defs&gt;
+        &lt;filter id=&quot;turb1&quot; filterUnits=&quot;objectBoundingBox&quot; x=&quot;0&quot; y=&quot;0&quot; width=&quot;100%&quot; height=&quot;100%&quot;&gt;
+            &lt;feTurbulence x=&quot;0&quot; y=&quot;0&quot; width=&quot;100%&quot; height=&quot;100%&quot; baseFrequency=&quot;0.02 0.1&quot; numOctaves=&quot;5&quot; seed=&quot;514&quot; result=&quot;a&quot; /&gt;
+            &lt;feComponentTransfer in=&quot;a&quot;&gt;
+                &lt;!-- set colour to black everywhere and set opacity to full if alpha &gt; 0 --&gt;
+                &lt;feFuncR type=&quot;linear&quot; slope=&quot;-10000&quot; intercept=&quot;0&quot;/&gt;&lt;feFuncG type=&quot;linear&quot; slope=&quot;-10000&quot; intercept=&quot;0&quot;/&gt;&lt;feFuncB type=&quot;linear&quot; slope=&quot;-10000&quot; intercept=&quot;0&quot;/&gt;
+                &lt;feFuncA type=&quot;linear&quot; slope=&quot;10000&quot; intercept=&quot;0&quot;/&gt;
+            &lt;/feComponentTransfer&gt;
+        &lt;/filter&gt;
+        &lt;filter id=&quot;turb2&quot; filterUnits=&quot;objectBoundingBox&quot; x=&quot;0&quot; y=&quot;0&quot; width=&quot;100%&quot; height=&quot;100%&quot;&gt;
+            &lt;feTurbulence x=&quot;0&quot; y=&quot;0&quot; width=&quot;100%&quot; height=&quot;100%&quot; baseFrequency=&quot;0.02 0.1&quot; numOctaves=&quot;5&quot; seed=&quot;14783&quot; result=&quot;a&quot; /&gt;
+            &lt;feComponentTransfer in=&quot;a&quot;&gt;
+                &lt;feFuncR type=&quot;linear&quot; slope=&quot;-10000&quot; intercept=&quot;0&quot;/&gt;&lt;feFuncG type=&quot;linear&quot; slope=&quot;-10000&quot; intercept=&quot;0&quot;/&gt;&lt;feFuncB type=&quot;linear&quot; slope=&quot;-10000&quot; intercept=&quot;0&quot;/&gt;
+                &lt;feFuncA type=&quot;linear&quot; slope=&quot;10000&quot; intercept=&quot;0&quot;/&gt;
+            &lt;/feComponentTransfer&gt;
+        &lt;/filter&gt;
+        &lt;filter id=&quot;turb3&quot; filterUnits=&quot;objectBoundingBox&quot; x=&quot;0&quot; y=&quot;0&quot; width=&quot;100%&quot; height=&quot;100%&quot;&gt;
+            &lt;feTurbulence x=&quot;0&quot; y=&quot;0&quot; width=&quot;100%&quot; height=&quot;100%&quot; baseFrequency=&quot;0.02 0.1&quot; numOctaves=&quot;5&quot; seed=&quot;23056&quot; result=&quot;a&quot; /&gt;
+            &lt;feComponentTransfer in=&quot;a&quot;&gt;
+                &lt;feFuncR type=&quot;linear&quot; slope=&quot;-10000&quot; intercept=&quot;0&quot;/&gt;&lt;feFuncG type=&quot;linear&quot; slope=&quot;-10000&quot; intercept=&quot;0&quot;/&gt;&lt;feFuncB type=&quot;linear&quot; slope=&quot;-10000&quot; intercept=&quot;0&quot;/&gt;
+                &lt;feFuncA type=&quot;linear&quot; slope=&quot;10000&quot; intercept=&quot;0&quot;/&gt;
+            &lt;/feComponentTransfer&gt;
+        &lt;/filter&gt;
+        &lt;filter id=&quot;turb4&quot; filterUnits=&quot;objectBoundingBox&quot; x=&quot;0&quot; y=&quot;0&quot; width=&quot;100%&quot; height=&quot;100%&quot;&gt;
+            &lt;feTurbulence x=&quot;0&quot; y=&quot;0&quot; width=&quot;100%&quot; height=&quot;100%&quot; baseFrequency=&quot;0.02 0.1&quot; numOctaves=&quot;5&quot; seed=&quot;9615&quot; result=&quot;a&quot; /&gt;
+            &lt;feComponentTransfer in=&quot;a&quot;&gt;
+                &lt;feFuncR type=&quot;linear&quot; slope=&quot;-10000&quot; intercept=&quot;0&quot;/&gt;&lt;feFuncG type=&quot;linear&quot; slope=&quot;-10000&quot; intercept=&quot;0&quot;/&gt;&lt;feFuncB type=&quot;linear&quot; slope=&quot;-10000&quot; intercept=&quot;0&quot;/&gt;
+                &lt;feFuncA type=&quot;linear&quot; slope=&quot;10000&quot; intercept=&quot;0&quot;/&gt;
+            &lt;/feComponentTransfer&gt;
+        &lt;/filter&gt;
+    &lt;/defs&gt;
+    &lt;rect x=&quot;0&quot; y=&quot;0&quot; width=&quot;256&quot; height=&quot;128&quot; fill=&quot;red&quot; /&gt;
+    &lt;rect x=&quot;0&quot; y=&quot;0&quot; width=&quot;64&quot; height=&quot;128&quot; fill=&quot;black&quot; filter=&quot;url(#turb1)&quot;/&gt;
+    &lt;rect x=&quot;64&quot; y=&quot;0&quot; width=&quot;64&quot; height=&quot;128&quot; fill=&quot;blue&quot; filter=&quot;url(#turb2)&quot;/&gt;
+    &lt;rect x=&quot;128&quot; y=&quot;0&quot; width=&quot;64&quot; height=&quot;128&quot; fill=&quot;black&quot; filter=&quot;url(#turb3)&quot;/&gt;
+    &lt;rect x=&quot;192&quot; y=&quot;0&quot; width=&quot;64&quot; height=&quot;128&quot; fill=&quot;blue&quot; filter=&quot;url(#turb4)&quot;/&gt;
+&lt;/svg&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsfiltersFETurbulencecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp (179170 => 179171)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp        2015-01-27 06:24:09 UTC (rev 179170)
+++ trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp        2015-01-27 06:32:03 UTC (rev 179171)
</span><span class="lines">@@ -180,8 +180,10 @@
</span><span class="cx">         for (int i = 0; i &lt; s_blockSize; ++i) {
</span><span class="cx">             paintingData.latticeSelector[i] = i;
</span><span class="cx">             gradient = paintingData.gradient[channel][i];
</span><del>-            gradient[0] = static_cast&lt;float&gt;((paintingData.random() % (2 * s_blockSize)) - s_blockSize) / s_blockSize;
-            gradient[1] = static_cast&lt;float&gt;((paintingData.random() % (2 * s_blockSize)) - s_blockSize) / s_blockSize;
</del><ins>+            do {
+                gradient[0] = static_cast&lt;float&gt;((paintingData.random() % (2 * s_blockSize)) - s_blockSize) / s_blockSize;
+                gradient[1] = static_cast&lt;float&gt;((paintingData.random() % (2 * s_blockSize)) - s_blockSize) / s_blockSize;
+            } while (!gradient[0] &amp;&amp; !gradient[1]);
</ins><span class="cx">             normalizationFactor = sqrtf(gradient[0] * gradient[0] + gradient[1] * gradient[1]);
</span><span class="cx">             gradient[0] /= normalizationFactor;
</span><span class="cx">             gradient[1] /= normalizationFactor;
</span></span></pre>
</div>
</div>

</body>
</html>