<!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>[150047] trunk/Source/WebCore</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/150047">150047</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2013-05-13 19:11:16 -0700 (Mon, 13 May 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Mac] Use pageScaleFactor * deviceScaleFactor in requiresTiledLayer() and computePixelAlignment() of GraphicsLayerCA.
https://bugs.webkit.org/show_bug.cgi?id=107359

Patch by Huang Dongsung &lt;luxtella@company100.net&gt; on 2013-05-13
Reviewed by Darin Adler.

Currently GraphicsLayerCA uses pageScaleFactor in requiresTiledLayer() and
computePixelAlignment(), but we must use pageScaleFactor * deviceScaleFactor in
them.
It is because:
1. requiresTiledLayer() uses the scale to compute an actual layer size in the device
pixel unit.
2. computePixelAlignment() uses the scale to compute an aligned layer position
in the device pixel unit.

No new tests. We can not test about requiresTiledLayer() because it depends on
gpu. computePixelAlignment() is correct now because fortunately Mac uses
only 2 (for retina display) as a deviceScaleFactor.

* platform/graphics/ca/GraphicsLayerCA.cpp:
(WebCore::GraphicsLayerCA::requiresTiledLayer):
(WebCore::GraphicsLayerCA::computePixelAlignment):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAcpp">trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (150046 => 150047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2013-05-14 02:00:00 UTC (rev 150046)
+++ trunk/Source/WebCore/ChangeLog        2013-05-14 02:11:16 UTC (rev 150047)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2013-05-13  Huang Dongsung  &lt;luxtella@company100.net&gt;
+
+        [Mac] Use pageScaleFactor * deviceScaleFactor in requiresTiledLayer() and computePixelAlignment() of GraphicsLayerCA.
+        https://bugs.webkit.org/show_bug.cgi?id=107359
+
+        Reviewed by Darin Adler.
+
+        Currently GraphicsLayerCA uses pageScaleFactor in requiresTiledLayer() and
+        computePixelAlignment(), but we must use pageScaleFactor * deviceScaleFactor in
+        them.
+        It is because:
+        1. requiresTiledLayer() uses the scale to compute an actual layer size in the device
+        pixel unit.
+        2. computePixelAlignment() uses the scale to compute an aligned layer position
+        in the device pixel unit.
+
+        No new tests. We can not test about requiresTiledLayer() because it depends on
+        gpu. computePixelAlignment() is correct now because fortunately Mac uses
+        only 2 (for retina display) as a deviceScaleFactor.
+
+        * platform/graphics/ca/GraphicsLayerCA.cpp:
+        (WebCore::GraphicsLayerCA::requiresTiledLayer):
+        (WebCore::GraphicsLayerCA::computePixelAlignment):
+
</ins><span class="cx"> 2013-05-13  Christophe Dumez  &lt;ch.dumez@sisa.samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Rename BarInfo to BarProp and remove [NoInterfaceObject]
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp (150046 => 150047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp        2013-05-14 02:00:00 UTC (rev 150046)
+++ trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp        2013-05-14 02:11:16 UTC (rev 150047)
</span><span class="lines">@@ -2676,8 +2676,10 @@
</span><span class="cx">     if (!m_drawsContent || !m_allowTiledLayer || m_isPageTiledBackingLayer)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><ins>+    float effectiveScale = pageScaleFactor * deviceScaleFactor();
+
</ins><span class="cx">     // FIXME: catch zero-size height or width here (or earlier)?
</span><del>-    return m_size.width() * pageScaleFactor &gt; cMaxPixelDimension || m_size.height() * pageScaleFactor &gt; cMaxPixelDimension;
</del><ins>+    return m_size.width() * effectiveScale &gt; cMaxPixelDimension || m_size.height() * effectiveScale &gt; cMaxPixelDimension;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void GraphicsLayerCA::swapFromOrToTiledLayer(bool useTiledLayer)
</span><span class="lines">@@ -3008,7 +3010,8 @@
</span><span class="cx"> void GraphicsLayerCA::computePixelAlignment(float pageScaleFactor, const FloatPoint&amp; positionRelativeToBase,
</span><span class="cx">     FloatPoint&amp; position, FloatSize&amp; size, FloatPoint3D&amp; anchorPoint, FloatSize&amp; alignmentOffset) const
</span><span class="cx"> {
</span><del>-    if (!m_maintainsPixelAlignment || isIntegral(pageScaleFactor) || !m_drawsContent || m_masksToBounds) {
</del><ins>+    float effectiveScale = pageScaleFactor * deviceScaleFactor();
+    if (!m_maintainsPixelAlignment || isIntegral(effectiveScale) || !m_drawsContent || m_masksToBounds) {
</ins><span class="cx">         position = m_position;
</span><span class="cx">         size = m_size;
</span><span class="cx">         anchorPoint = m_anchorPoint;
</span><span class="lines">@@ -3019,12 +3022,12 @@
</span><span class="cx">     FloatRect baseRelativeBounds(positionRelativeToBase, m_size);
</span><span class="cx">     FloatRect scaledBounds = baseRelativeBounds;
</span><span class="cx">     // Scale by the page scale factor to compute the screen-relative bounds.
</span><del>-    scaledBounds.scale(pageScaleFactor);
</del><ins>+    scaledBounds.scale(effectiveScale);
</ins><span class="cx">     // Round to integer boundaries.
</span><span class="cx">     FloatRect alignedBounds = enclosingIntRect(scaledBounds);
</span><span class="cx">     
</span><span class="cx">     // Convert back to layer coordinates.
</span><del>-    alignedBounds.scale(1 / pageScaleFactor);
</del><ins>+    alignedBounds.scale(1 / effectiveScale);
</ins><span class="cx">     
</span><span class="cx">     // Epsilon is necessary to ensure that backing store size computation in CA, which involves integer truncation,
</span><span class="cx">     // will match our aligned bounds.
</span></span></pre>
</div>
</div>

</body>
</html>