<!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>[171100] 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/171100">171100</a></dd>
<dt>Author</dt> <dd>zalan@apple.com</dd>
<dt>Date</dt> <dd>2014-07-14 19:55:26 -0700 (Mon, 14 Jul 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Subpixel rendering: Zero sized compositing container's content positioned off by one device pixel.
https://bugs.webkit.org/show_bug.cgi?id=134903

Reviewed by Simon Fraser.

The compositing layer boundaries are calculated using its renderer()'s and the renderer()'s
descendants' bounds. However when the renderer() is zero sized, its bounds are omitted.
In such cases, when the child content has offset from the renderer(), the subpixel adjustment
of the compositing layer becomes negative (-meaning that the compositing layer is to the right/bottom
direction from its renderer()). Remove fabs() to be able to express such direction.

Source/WebCore:
Test: compositing/hidpi-compositing-layer-with-zero-sized-container.html

* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::updateGeometry):

LayoutTests:
* compositing/hidpi-compositing-layer-with-zero-sized-container-expected.html: Added.
* compositing/hidpi-compositing-layer-with-zero-sized-container.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="#trunkSourceWebCorerenderingRenderLayerBackingcpp">trunk/Source/WebCore/rendering/RenderLayerBacking.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestscompositinghidpicompositinglayerwithzerosizedcontainerexpectedhtml">trunk/LayoutTests/compositing/hidpi-compositing-layer-with-zero-sized-container-expected.html</a></li>
<li><a href="#trunkLayoutTestscompositinghidpicompositinglayerwithzerosizedcontainerhtml">trunk/LayoutTests/compositing/hidpi-compositing-layer-with-zero-sized-container.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (171099 => 171100)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-07-15 02:15:23 UTC (rev 171099)
+++ trunk/LayoutTests/ChangeLog        2014-07-15 02:55:26 UTC (rev 171100)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2014-07-14  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Subpixel rendering: Zero sized compositing container's content positioned off by one device pixel.
+        https://bugs.webkit.org/show_bug.cgi?id=134903
+
+        Reviewed by Simon Fraser.
+
+        The compositing layer boundaries are calculated using its renderer()'s and the renderer()'s
+        descendants' bounds. However when the renderer() is zero sized, its bounds are omitted.
+        In such cases, when the child content has offset from the renderer(), the subpixel adjustment
+        of the compositing layer becomes negative (-meaning that the compositing layer is to the right/bottom
+        direction from its renderer()). Remove fabs() to be able to express such direction.
+
+        * compositing/hidpi-compositing-layer-with-zero-sized-container-expected.html: Added.
+        * compositing/hidpi-compositing-layer-with-zero-sized-container.html: Added.
+
</ins><span class="cx"> 2014-07-14  Dean Jackson  &lt;dino@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Provide some large JPEG images with EXIF orientation for subsampling tests
</span></span></pre></div>
<a id="trunkLayoutTestscompositinghidpicompositinglayerwithzerosizedcontainerexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/compositing/hidpi-compositing-layer-with-zero-sized-container-expected.html (0 => 171100)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/compositing/hidpi-compositing-layer-with-zero-sized-container-expected.html                                (rev 0)
+++ trunk/LayoutTests/compositing/hidpi-compositing-layer-with-zero-sized-container-expected.html        2014-07-15 02:55:26 UTC (rev 171100)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;title&gt;This tests that child content is positioned properly when the parent compositing layer has zero width/height.&lt;/title&gt;
+&lt;style&gt;
+  .container {
+    position: absolute;
+  }
+
+  .child {
+    position: absolute;
+    width: 5px;
+    height: 5px;
+    border: 0.5px solid red;
+}
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;p id=&quot;container&quot;&gt;&lt;/p&gt;
+&lt;script&gt;
+  var container = document.getElementById(&quot;container&quot;);
+  containerAdjustment = 0;
+  for (i = 0; i &lt; 40; ++i) {
+    var childAdjustment = 0;
+    for (j = 0; j &lt; 40; ++j) {
+      var c = document.createElement(&quot;div&quot;);
+      c.className = &quot;container&quot;;
+      c.style.top = (6 * i + j * containerAdjustment) + &quot;px&quot;;
+      c.style.left = (6 * j + i * containerAdjustment) + &quot;px&quot;;
+
+      var child = document.createElement(&quot;div&quot;);
+      child.className = &quot;child&quot;;
+      child.style.top = (6 * i + j * childAdjustment) + &quot;px&quot;;
+      child.style.left = (6 * j + i * childAdjustment) + &quot;px&quot;;
+      c.appendChild(child);
+
+      container.appendChild(c);
+      childAdjustment += 0.05;
+    }
+    containerAdjustment += 0.05;
+  }
+&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestscompositinghidpicompositinglayerwithzerosizedcontainerhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/compositing/hidpi-compositing-layer-with-zero-sized-container.html (0 => 171100)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/compositing/hidpi-compositing-layer-with-zero-sized-container.html                                (rev 0)
+++ trunk/LayoutTests/compositing/hidpi-compositing-layer-with-zero-sized-container.html        2014-07-15 02:55:26 UTC (rev 171100)
</span><span class="lines">@@ -0,0 +1,45 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;title&gt;This tests that child content is positioned properly when the parent compositing layer has zero width/height.&lt;/title&gt;
+&lt;style&gt;
+  .container {
+    position: absolute;
+    -webkit-transform: translateZ(0); 
+  }
+
+  .child {
+    position: absolute;
+    width: 5px;
+    height: 5px;
+    border: 0.5px solid red;
+}
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;p id=&quot;container&quot;&gt;&lt;/p&gt;
+&lt;script&gt;
+  var container = document.getElementById(&quot;container&quot;);
+  containerAdjustment = 0;
+  for (i = 0; i &lt; 40; ++i) {
+    var childAdjustment = 0;
+    for (j = 0; j &lt; 40; ++j) {
+      var c = document.createElement(&quot;div&quot;);
+      c.className = &quot;container&quot;;
+      c.style.top = (6 * i + j * containerAdjustment) + &quot;px&quot;;
+      c.style.left = (6 * j + i * containerAdjustment) + &quot;px&quot;;
+
+      var child = document.createElement(&quot;div&quot;);
+      child.className = &quot;child&quot;;
+      child.style.top = (6 * i + j * childAdjustment) + &quot;px&quot;;
+      child.style.left = (6 * j + i * childAdjustment) + &quot;px&quot;;
+      c.appendChild(child);
+
+      container.appendChild(c);
+      childAdjustment += 0.05;
+    }
+    containerAdjustment += 0.05;
+  }
+&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (171099 => 171100)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-07-15 02:15:23 UTC (rev 171099)
+++ trunk/Source/WebCore/ChangeLog        2014-07-15 02:55:26 UTC (rev 171100)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2014-07-14  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Subpixel rendering: Zero sized compositing container's content positioned off by one device pixel.
+        https://bugs.webkit.org/show_bug.cgi?id=134903
+
+        Reviewed by Simon Fraser.
+
+        The compositing layer boundaries are calculated using its renderer()'s and the renderer()'s
+        descendants' bounds. However when the renderer() is zero sized, its bounds are omitted.
+        In such cases, when the child content has offset from the renderer(), the subpixel adjustment
+        of the compositing layer becomes negative (-meaning that the compositing layer is to the right/bottom
+        direction from its renderer()). Remove fabs() to be able to express such direction.
+
+        Test: compositing/hidpi-compositing-layer-with-zero-sized-container.html
+
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::RenderLayerBacking::updateGeometry):
+
</ins><span class="cx"> 2014-07-14  Jeremy Jones  &lt;jeremyj@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix crash on WebVideoFullscreenManagerProxy construction.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerBackingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (171099 => 171100)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp        2014-07-15 02:15:23 UTC (rev 171099)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp        2014-07-15 02:55:26 UTC (rev 171100)
</span><span class="lines">@@ -721,7 +721,7 @@
</span><span class="cx">     FloatSize devicePixelOffsetFromRenderer;
</span><span class="cx">     LayoutSize devicePixelFractionFromRenderer;
</span><span class="cx">     calculateDevicePixelOffsetFromRenderer(rendererOffsetFromGraphicsLayer, devicePixelOffsetFromRenderer, devicePixelFractionFromRenderer, deviceScaleFactor);
</span><del>-    m_devicePixelFractionFromRenderer = LayoutSize(fabs(devicePixelFractionFromRenderer.width().toFloat()), fabs(devicePixelFractionFromRenderer.height().toFloat()));
</del><ins>+    m_devicePixelFractionFromRenderer = LayoutSize(-devicePixelFractionFromRenderer.width(), -devicePixelFractionFromRenderer.height());
</ins><span class="cx"> 
</span><span class="cx">     adjustAncestorCompositingBoundsForFlowThread(ancestorCompositingBounds, compAncestor);
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>