<!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>[166322] 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/166322">166322</a></dd>
<dt>Author</dt> <dd>mmaxfield@apple.com</dd>
<dt>Date</dt> <dd>2014-03-26 15:05:24 -0700 (Wed, 26 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Skipping underlines disregard points completely inside the underline rect
https://bugs.webkit.org/show_bug.cgi?id=130800

Patch by Myles C. Maxfield &lt;mmaxfield@apple.com&gt; on 2014-03-26
Reviewed by Dean Jackson.

Source/WebCore:

When determining bounds for underline skipping, endpoints of glyph contours
that lie entirely within the rect of the underline are ignored. This patch
makes these points affect the skipping regions the same way that intersections
do.

Test: fast/css3-text/css3-text-decoration/text-decoration-skip/glyph-inside-underline.html

* platform/graphics/mac/FontMac.mm:
(WebCore::updateX): Refactored common code into a function
(WebCore::findPathIntersections): Test for endpoints which lie entirely within
the underline bounds

LayoutTests:

This test draws a glyph entire inside the underline. It should render the same
as it would without any underline at all.

* fast/css3-text/css3-text-decoration/text-decoration-skip/resources/Litherum.svg: Added
an underscore glyph that would lie entirely within an underline
* fast/css3-text/css3-text-decoration/text-decoration-skip/glyph-inside-underline.html:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastcss3textcss3textdecorationtextdecorationskipresourcesLitherumsvg">trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-skip/resources/Litherum.svg</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsmacFontMacmm">trunk/Source/WebCore/platform/graphics/mac/FontMac.mm</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastcss3textcss3textdecorationtextdecorationskipglyphinsideunderlineexpectedhtml">trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-skip/glyph-inside-underline-expected.html</a></li>
<li><a href="#trunkLayoutTestsfastcss3textcss3textdecorationtextdecorationskipglyphinsideunderlinehtml">trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-skip/glyph-inside-underline.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (166321 => 166322)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-03-26 22:02:26 UTC (rev 166321)
+++ trunk/LayoutTests/ChangeLog        2014-03-26 22:05:24 UTC (rev 166322)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2014-03-26  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        Skipping underlines disregard points completely inside the underline rect
+        https://bugs.webkit.org/show_bug.cgi?id=130800
+
+        Reviewed by Dean Jackson.
+
+        This test draws a glyph entire inside the underline. It should render the same
+        as it would without any underline at all.
+
+        * fast/css3-text/css3-text-decoration/text-decoration-skip/resources/Litherum.svg: Added
+        an underscore glyph that would lie entirely within an underline
+        * fast/css3-text/css3-text-decoration/text-decoration-skip/glyph-inside-underline.html:
+
</ins><span class="cx"> 2014-03-26  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r155977): matrix animations no longer animate
</span></span></pre></div>
<a id="trunkLayoutTestsfastcss3textcss3textdecorationtextdecorationskipglyphinsideunderlineexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-skip/glyph-inside-underline-expected.html (0 => 166322)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-skip/glyph-inside-underline-expected.html                                (rev 0)
+++ trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-skip/glyph-inside-underline-expected.html        2014-03-26 22:05:24 UTC (rev 166322)
</span><span class="lines">@@ -0,0 +1,19 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;style&gt;
+@font-face {
+    font-family: 'Litherum';
+    src: url(&quot;./resources/Litherum.svg&quot;) format(svg)
+}
+#p {
+    font: 100px 'Litherum';
+}
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+This test draws an underscore that should entirely fit within an underline.
+The underline should skip over the entire glyph.
+&lt;div id=&quot;p&quot;&gt;_&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastcss3textcss3textdecorationtextdecorationskipglyphinsideunderlinehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-skip/glyph-inside-underline.html (0 => 166322)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-skip/glyph-inside-underline.html                                (rev 0)
+++ trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-skip/glyph-inside-underline.html        2014-03-26 22:05:24 UTC (rev 166322)
</span><span class="lines">@@ -0,0 +1,20 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;style&gt;
+@font-face {
+    font-family: 'Litherum';
+    src: url(&quot;./resources/Litherum.svg&quot;) format(svg)
+}
+#p {
+    font: 100px 'Litherum';
+    text-decoration: underline;
+}
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+This test draws an underscore that should entirely fit within an underline.
+The underline should skip over the entire glyph.
+&lt;div id=&quot;p&quot;&gt;_&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastcss3textcss3textdecorationtextdecorationskipresourcesLitherumsvg"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-skip/resources/Litherum.svg (166321 => 166322)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-skip/resources/Litherum.svg        2014-03-26 22:02:26 UTC (rev 166321)
+++ trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-skip/resources/Litherum.svg        2014-03-26 22:05:24 UTC (rev 166322)
</span><span class="lines">@@ -4,8 +4,9 @@
</span><span class="cx"> &lt;metadata&gt;&lt;/metadata&gt;
</span><span class="cx"> &lt;defs&gt;
</span><span class="cx"> &lt;font id=&quot;Litherum&quot; horiz-adv-x=&quot;1024&quot;&gt;
</span><del>-&lt;font-face units-per-em=&quot;14&quot; ascent=&quot;14&quot; descent=&quot;-7&quot;/&gt;
-&lt;glyph unicode=&quot;|&quot; horiz-adv-x=&quot;14&quot; d=&quot;M5 -7v21h4v-21z&quot;/&gt;
</del><ins>+&lt;font-face units-per-em=&quot;56&quot; ascent=&quot;56&quot; descent=&quot;-28&quot;/&gt;
+&lt;glyph unicode=&quot;|&quot; horiz-adv-x=&quot;56&quot; d=&quot;M20 -28v84h16v-84z&quot;/&gt;
+&lt;glyph unicode=&quot;_&quot; horiz-adv-x=&quot;56&quot; d=&quot;M1 -5v1h54v-1z&quot;/&gt;
</ins><span class="cx"> &lt;/font&gt;
</span><span class="cx"> &lt;/defs&gt;
</span><span class="cx"> &lt;/svg&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (166321 => 166322)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-03-26 22:02:26 UTC (rev 166321)
+++ trunk/Source/WebCore/ChangeLog        2014-03-26 22:05:24 UTC (rev 166322)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2014-03-26  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        Skipping underlines disregard points completely inside the underline rect
+        https://bugs.webkit.org/show_bug.cgi?id=130800
+
+        Reviewed by Dean Jackson.
+
+        When determining bounds for underline skipping, endpoints of glyph contours
+        that lie entirely within the rect of the underline are ignored. This patch
+        makes these points affect the skipping regions the same way that intersections
+        do.
+
+        Test: fast/css3-text/css3-text-decoration/text-decoration-skip/glyph-inside-underline.html
+
+        * platform/graphics/mac/FontMac.mm:
+        (WebCore::updateX): Refactored common code into a function
+        (WebCore::findPathIntersections): Test for endpoints which lie entirely within
+        the underline bounds
+
</ins><span class="cx"> 2014-03-26  Pratik Solanki  &lt;psolanki@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed. iOS build fix after r166312. Soft link CMTimeRangeGetEnd.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsmacFontMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/mac/FontMac.mm (166321 => 166322)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/mac/FontMac.mm        2014-03-26 22:02:26 UTC (rev 166321)
+++ trunk/Source/WebCore/platform/graphics/mac/FontMac.mm        2014-03-26 22:05:24 UTC (rev 166322)
</span><span class="lines">@@ -388,6 +388,12 @@
</span><span class="cx">     return (p1.y &lt; y &amp;&amp; p2.y &gt; y) || (p1.y &gt; y &amp;&amp; p2.y &lt; y);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static void updateX(GlyphIterationState&amp; state, CGFloat x)
+{
+    state.minX = std::min(state.minX, x);
+    state.maxX = std::max(state.maxX, x);
+}
+
</ins><span class="cx"> // This function is called by CGPathApply and is therefore invoked for each
</span><span class="cx"> // contour in a glyph. This function models each contours as a straight line
</span><span class="cx"> // and calculates the intersections between each pseudo-contour and
</span><span class="lines">@@ -425,14 +431,13 @@
</span><span class="cx">     if (!doIntersection)
</span><span class="cx">         return;
</span><span class="cx">     CGFloat x;
</span><del>-    if (findIntersectionPoint(state.y1, state.currentPoint, point, x)) {
-        state.minX = std::min(state.minX, x);
-        state.maxX = std::max(state.maxX, x);
-    }
-    if (findIntersectionPoint(state.y2, state.currentPoint, point, x)) {
-        state.minX = std::min(state.minX, x);
-        state.maxX = std::max(state.maxX, x);
-    }
</del><ins>+    if (findIntersectionPoint(state.y1, state.currentPoint, point, x))
+        updateX(state, x);
+    if (findIntersectionPoint(state.y2, state.currentPoint, point, x))
+        updateX(state, x);
+    if ((state.currentPoint.y &gt;= state.y1 &amp;&amp; state.currentPoint.y &lt;= state.y2)
+        || (state.currentPoint.y &lt;= state.y1 &amp;&amp; state.currentPoint.y &gt;= state.y2))
+        updateX(state, state.currentPoint.x);
</ins><span class="cx">     state.currentPoint = point;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>