<!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>[171640] 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/171640">171640</a></dd>
<dt>Author</dt> <dd>zalan@apple.com</dd>
<dt>Date</dt> <dd>2014-07-25 21:37:31 -0700 (Fri, 25 Jul 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Subpixel rendering: Rounded rect gets non-renderable at certain subpixel size.
https://bugs.webkit.org/show_bug.cgi?id=135314
&lt;rdar://problem/17812921&gt;

Reviewed by Tim Horton.

While calculating the rounded rect for painting, the radius is adjusted to compensate
for the pixel snapped size. However while scaling the radius, certain values overflow
(float) mantissa and it produces a non-renderable rounded rect where the radius becomes bigger
than the rectangle dimensions. In such cases, we need to shrink the radius to make it
renderable again.

Source/WebCore:
Test: transitions/rounded-rect-becomes-non-renderable-while-transitioning.html

* platform/graphics/RoundedRect.cpp:
(WebCore::RoundedRect::pixelSnappedRoundedRectForPainting): shrink the radius by
one device pixel. It is as good as any other small value.

LayoutTests:
* transitions/rounded-rect-becomes-non-renderable-while-transitioning-expected.txt: Added.
* transitions/rounded-rect-becomes-non-renderable-while-transitioning.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsRoundedRectcpp">trunk/Source/WebCore/platform/graphics/RoundedRect.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTeststransitionsroundedrectbecomesnonrenderablewhiletransitioningexpectedtxt">trunk/LayoutTests/transitions/rounded-rect-becomes-non-renderable-while-transitioning-expected.txt</a></li>
<li><a href="#trunkLayoutTeststransitionsroundedrectbecomesnonrenderablewhiletransitioninghtml">trunk/LayoutTests/transitions/rounded-rect-becomes-non-renderable-while-transitioning.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (171639 => 171640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-07-26 01:31:25 UTC (rev 171639)
+++ trunk/LayoutTests/ChangeLog        2014-07-26 04:37:31 UTC (rev 171640)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2014-07-25  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Subpixel rendering: Rounded rect gets non-renderable at certain subpixel size.
+        https://bugs.webkit.org/show_bug.cgi?id=135314
+        &lt;rdar://problem/17812921&gt;
+
+        Reviewed by Tim Horton.
+
+        While calculating the rounded rect for painting, the radius is adjusted to compensate
+        for the pixel snapped size. However while scaling the radius, certain values overflow
+        (float) mantissa and it produces a non-renderable rounded rect where the radius becomes bigger
+        than the rectangle dimensions. In such cases, we need to shrink the radius to make it
+        renderable again.
+
+        * transitions/rounded-rect-becomes-non-renderable-while-transitioning-expected.txt: Added.
+        * transitions/rounded-rect-becomes-non-renderable-while-transitioning.html: Added.
+
</ins><span class="cx"> 2014-07-25  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [MSE] Playback stalls &amp; readyState drops to HAVE_CURRENT_DATA at end of stream with unbalanced buffered SourceBuffers
</span></span></pre></div>
<a id="trunkLayoutTeststransitionsroundedrectbecomesnonrenderablewhiletransitioningexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/transitions/rounded-rect-becomes-non-renderable-while-transitioning-expected.txt (0 => 171640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transitions/rounded-rect-becomes-non-renderable-while-transitioning-expected.txt                                (rev 0)
+++ trunk/LayoutTests/transitions/rounded-rect-becomes-non-renderable-while-transitioning-expected.txt        2014-07-26 04:37:31 UTC (rev 171640)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+Test passes if it does not assert in debug builds.
+
+
</ins></span></pre></div>
<a id="trunkLayoutTeststransitionsroundedrectbecomesnonrenderablewhiletransitioninghtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/transitions/rounded-rect-becomes-non-renderable-while-transitioning.html (0 => 171640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transitions/rounded-rect-becomes-non-renderable-while-transitioning.html                                (rev 0)
+++ trunk/LayoutTests/transitions/rounded-rect-becomes-non-renderable-while-transitioning.html        2014-07-26 04:37:31 UTC (rev 171640)
</span><span class="lines">@@ -0,0 +1,37 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;head&gt;
+&lt;title&gt;This tests that rounded rect stays renderable during while animating size.&lt;/title&gt;
+&lt;style&gt;
+  #thumb {
+    background-color: red;
+    border: solid 1px transparent;
+    border-radius: 50%;
+    width: 100px;
+    height: 100px;
+    -webkit-transition: width 500ms, height 500ms;
+}
+&lt;/style&gt;
+&lt;script&gt;
+    if (window.testRunner) {
+        window.testRunner.waitUntilDone();
+        window.testRunner.dumpAsText();
+      }
+
+    function transitionFinished() {
+        if (window.testRunner)
+            window.testRunner.notifyDone();
+    }
+
+    function start() {
+      var thumb = document.getElementById(&quot;thumb&quot;);
+      thumb.addEventListener(&quot;webkitTransitionEnd&quot;, transitionFinished, true);
+      thumb.style.width = &quot;10px&quot;;
+      thumb.style.height = &quot;10px&quot;;
+    }
+    
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body onload=start()&gt;
+  &lt;p&gt;Test passes if it does not assert in debug builds.&lt;/p&gt;
+  &lt;div id=thumb&gt;&lt;/div&gt;
+&lt;/body&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (171639 => 171640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-07-26 01:31:25 UTC (rev 171639)
+++ trunk/Source/WebCore/ChangeLog        2014-07-26 04:37:31 UTC (rev 171640)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2014-07-25  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Subpixel rendering: Rounded rect gets non-renderable at certain subpixel size.
+        https://bugs.webkit.org/show_bug.cgi?id=135314
+        &lt;rdar://problem/17812921&gt;
+
+        Reviewed by Tim Horton.
+
+        While calculating the rounded rect for painting, the radius is adjusted to compensate
+        for the pixel snapped size. However while scaling the radius, certain values overflow
+        (float) mantissa and it produces a non-renderable rounded rect where the radius becomes bigger
+        than the rectangle dimensions. In such cases, we need to shrink the radius to make it
+        renderable again.
+
+        Test: transitions/rounded-rect-becomes-non-renderable-while-transitioning.html
+
+        * platform/graphics/RoundedRect.cpp:
+        (WebCore::RoundedRect::pixelSnappedRoundedRectForPainting): shrink the radius by
+        one device pixel. It is as good as any other small value.
+
</ins><span class="cx"> 2014-07-25  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [EME][Mac] CDM error messages not piped through to MediaKeySession correctly; clients don't receive error events
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsRoundedRectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/RoundedRect.cpp (171639 => 171640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/RoundedRect.cpp        2014-07-26 01:31:25 UTC (rev 171639)
+++ trunk/Source/WebCore/platform/graphics/RoundedRect.cpp        2014-07-26 04:37:31 UTC (rev 171640)
</span><span class="lines">@@ -249,8 +249,13 @@
</span><span class="cx"> 
</span><span class="cx">     // Snapping usually does not alter size, but when it does, we need to make sure that the final rect is still renderable by distributing the size delta proportionally.
</span><span class="cx">     FloatRoundedRect::Radii adjustedRadii = radii();
</span><del>-    adjustedRadii.scale(pixelSnappedRect.width() / originalRect.width(), pixelSnappedRect.height() / originalRect.height());
</del><ins>+    adjustedRadii.scale(pixelSnappedRect.width() / originalRect.width().toFloat(), pixelSnappedRect.height() / originalRect.height().toFloat());
</ins><span class="cx">     FloatRoundedRect snappedRoundedRect = FloatRoundedRect(pixelSnappedRect, adjustedRadii);
</span><ins>+    if (!snappedRoundedRect.isRenderable()) {
+        // Floating point mantissa overflow can produce a non-renderable rounded rect.
+        adjustedRadii.shrink(1 / deviceScaleFactor);
+        snappedRoundedRect.setRadii(adjustedRadii);
+    }
</ins><span class="cx">     ASSERT(snappedRoundedRect.isRenderable());
</span><span class="cx">     return snappedRoundedRect;
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>