<!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>[213143] releases/WebKitGTK/webkit-2.16</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/213143">213143</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2017-02-28 01:48:50 -0800 (Tue, 28 Feb 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/213008">r213008</a> - Text might wrap when its preferred logical width is used for sizing the containing block.
https://bugs.webkit.org/show_bug.cgi?id=168864
&lt;rdar://problem/30690734&gt;

Reviewed by Antti Koivisto.

Source/WebCore:

In certain cases we end up measuring a text run in 2 different ways.
1. preferred width computation -&gt; slow path FontCascade::width()
2. line breaking logic -&gt; fast path FontCascade::widthForSimpleText()

FontCascade::width() and ::widthForSimpleText() might return different results for the same run even when
the individual glyph widths are measured to be the same. It's because they run diffrent set of
arithmetics on the float values and for certain values these arithmetics produce different results due to the floating point
precision.
Since RenderText::computePreferredLogicalWidths() currently forces us to use the slow path
(to retrieve fontfallback and glyph overflow information) the only alternative solution is to turn off the fast path
for all runs that have been already measured using the slow path (which would be just wasteful).

Test: fast/text/fast-run-width-vs-slow-run-width.html

* platform/graphics/FontCascade.cpp:
(WebCore::FontCascade::widthForSimpleText): Mimics WidthIterator::applyFontTransforms. Use the same set of arithmetics here.

LayoutTests:

* fast/text/fast-run-width-vs-slow-run-width-expected.html: Added.
* fast/text/fast-run-width-vs-slow-run-width.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit216LayoutTestsChangeLog">releases/WebKitGTK/webkit-2.16/LayoutTests/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit216SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.16/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit216SourceWebCoreplatformgraphicsFontCascadecpp">releases/WebKitGTK/webkit-2.16/Source/WebCore/platform/graphics/FontCascade.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit216LayoutTestsfasttextfastrunwidthvsslowrunwidthexpectedhtml">releases/WebKitGTK/webkit-2.16/LayoutTests/fast/text/fast-run-width-vs-slow-run-width-expected.html</a></li>
<li><a href="#releasesWebKitGTKwebkit216LayoutTestsfasttextfastrunwidthvsslowrunwidthhtml">releases/WebKitGTK/webkit-2.16/LayoutTests/fast/text/fast-run-width-vs-slow-run-width.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit216LayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.16/LayoutTests/ChangeLog (213142 => 213143)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.16/LayoutTests/ChangeLog        2017-02-28 09:47:45 UTC (rev 213142)
+++ releases/WebKitGTK/webkit-2.16/LayoutTests/ChangeLog        2017-02-28 09:48:50 UTC (rev 213143)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2017-02-25  Zalan Bujtas &lt;zalan@apple.com&gt;
+
+        Text might wrap when its preferred logical width is used for sizing the containing block.
+        https://bugs.webkit.org/show_bug.cgi?id=168864
+        &lt;rdar://problem/30690734&gt;
+
+        Reviewed by Antti Koivisto.
+
+        * fast/text/fast-run-width-vs-slow-run-width-expected.html: Added.
+        * fast/text/fast-run-width-vs-slow-run-width.html: Added.
+
</ins><span class="cx"> 2017-02-24  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         .. should not remove windows drive letters in paths of file URLs
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit216LayoutTestsfasttextfastrunwidthvsslowrunwidthexpectedhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.16/LayoutTests/fast/text/fast-run-width-vs-slow-run-width-expected.html (0 => 213143)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.16/LayoutTests/fast/text/fast-run-width-vs-slow-run-width-expected.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.16/LayoutTests/fast/text/fast-run-width-vs-slow-run-width-expected.html        2017-02-28 09:48:50 UTC (rev 213143)
</span><span class="lines">@@ -0,0 +1,20 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;head&gt;
+&lt;title&gt;This tests that fast and slow run width functions produce the same results.&lt;/title&gt;
+&lt;style&gt;
+html {
+    font-family: &quot;Helvetica Neue&quot;;
+    font-size: 62%;
+}
+
+div {
+    font-weight: 400;
+    font-size: 2.5rem;
+}
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+The text below should not wrap.&lt;br&gt;
+&lt;div&gt;alignment-baseline&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit216LayoutTestsfasttextfastrunwidthvsslowrunwidthhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.16/LayoutTests/fast/text/fast-run-width-vs-slow-run-width.html (0 => 213143)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.16/LayoutTests/fast/text/fast-run-width-vs-slow-run-width.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.16/LayoutTests/fast/text/fast-run-width-vs-slow-run-width.html        2017-02-28 09:48:50 UTC (rev 213143)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;head&gt;
+&lt;title&gt;This tests that fast and slow run width functions produce the same results.&lt;/title&gt;
+&lt;style&gt;
+html {
+    font-family: &quot;Helvetica Neue&quot;;
+    font-size: 62%;
+}
+
+div {
+    font-weight: 400;
+    font-size: 2.5rem;
+    display: inline-block;
+}
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+The text below should not wrap.&lt;br&gt;
+&lt;div&gt;alignment-baseline&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit216SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/ChangeLog (213142 => 213143)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.16/Source/WebCore/ChangeLog        2017-02-28 09:47:45 UTC (rev 213142)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/ChangeLog        2017-02-28 09:48:50 UTC (rev 213143)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2017-02-25  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Text might wrap when its preferred logical width is used for sizing the containing block.
+        https://bugs.webkit.org/show_bug.cgi?id=168864
+        &lt;rdar://problem/30690734&gt;
+
+        Reviewed by Antti Koivisto.
+
+        In certain cases we end up measuring a text run in 2 different ways.
+        1. preferred width computation -&gt; slow path FontCascade::width() 
+        2. line breaking logic -&gt; fast path FontCascade::widthForSimpleText()

+        FontCascade::width() and ::widthForSimpleText() might return different results for the same run even when
+        the individual glyph widths are measured to be the same. It's because they run diffrent set of
+        arithmetics on the float values and for certain values these arithmetics produce different results due to the floating point
+        precision.
+        Since RenderText::computePreferredLogicalWidths() currently forces us to use the slow path
+        (to retrieve fontfallback and glyph overflow information) the only alternative solution is to turn off the fast path
+        for all runs that have been already measured using the slow path (which would be just wasteful).
+
+        Test: fast/text/fast-run-width-vs-slow-run-width.html
+
+        * platform/graphics/FontCascade.cpp:
+        (WebCore::FontCascade::widthForSimpleText): Mimics WidthIterator::applyFontTransforms. Use the same set of arithmetics here.  
+
</ins><span class="cx"> 2017-02-24  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Simple line layout: Re-adjust paginated lines when block height changes.
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit216SourceWebCoreplatformgraphicsFontCascadecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/platform/graphics/FontCascade.cpp (213142 => 213143)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.16/Source/WebCore/platform/graphics/FontCascade.cpp        2017-02-28 09:47:45 UTC (rev 213142)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/platform/graphics/FontCascade.cpp        2017-02-28 09:48:50 UTC (rev 213143)
</span><span class="lines">@@ -382,6 +382,8 @@
</span><span class="cx"> 
</span><span class="cx"> float FontCascade::widthForSimpleText(StringView text) const
</span><span class="cx"> {
</span><ins>+    if (text.isNull() || text.isEmpty())
+        return 0;
</ins><span class="cx">     ASSERT(codePath(TextRun(text)) != FontCascade::Complex);
</span><span class="cx">     float* cacheEntry = m_fonts-&gt;widthCache().add(text, std::numeric_limits&lt;float&gt;::quiet_NaN());
</span><span class="cx">     if (cacheEntry &amp;&amp; !std::isnan(*cacheEntry))
</span><span class="lines">@@ -409,9 +411,12 @@
</span><span class="cx">     }
</span><span class="cx">     if (hasKerningOrLigatures) {
</span><span class="cx">         font.applyTransforms(&amp;glyphs[0], &amp;advances[0], glyphs.size(), enableKerning(), requiresShaping());
</span><del>-        runWidth = 0;
</del><ins>+        // This is needed only to match the result of the slow path. Same glyph widths but different floating point arithmentics can
+        // produce different run width.
+        float runWidthDifferenceWithTransformApplied = -runWidth;
</ins><span class="cx">         for (auto&amp; advance : advances)
</span><del>-            runWidth += advance.width();
</del><ins>+            runWidthDifferenceWithTransformApplied += advance.width();
+        runWidth += runWidthDifferenceWithTransformApplied;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (cacheEntry)
</span></span></pre>
</div>
</div>

</body>
</html>