<!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>[215081] 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/215081">215081</a></dd>
<dt>Author</dt> <dd>mmaxfield@apple.com</dd>
<dt>Date</dt> <dd>2017-04-06 17:59:57 -0700 (Thu, 06 Apr 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Make FontWithFeatures test font pass OTS
https://bugs.webkit.org/show_bug.cgi?id=169788

Reviewed by Tim Horton.

Tools:

OTS, or the OpenType Sanitizer, is a check which tells if fonts are properly formed.
Previously, our FontWithFeatures test font did not pass this check. This patch updates
the font to pass the checks. Now, we can use this font on other platforms, and
contribute the font to the W3C for testing the CSS Fonts level 3 spec.

* FontWithFeatures/FontWithFeatures/FontCreator.cpp:
(Generator::appendCFFTable):
(Generator::Feature::operator&lt;):
(Generator::appendGSUBTable):
(Generator::appendOS2Table):
(Generator::appendFormat4CMAPTable):
(Generator::appendHEADTable):
(Generator::appendHHEATable):
(Generator::NameRecord::operator&lt;):
(Generator::appendNameSubtable):
(Generator::appendNAMETable):

LayoutTests:

Updated font to the one which passes the tests.

* css3/resources/FontWithFeatures.otf:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestscss3resourcesFontWithFeaturesotf">trunk/LayoutTests/css3/resources/FontWithFeatures.otf</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsFontWithFeaturesFontWithFeaturesFontCreatorcpp">trunk/Tools/FontWithFeatures/FontWithFeatures/FontCreator.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (215080 => 215081)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-04-07 00:53:31 UTC (rev 215080)
+++ trunk/LayoutTests/ChangeLog        2017-04-07 00:59:57 UTC (rev 215081)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2017-04-06  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        Make FontWithFeatures test font pass OTS
+        https://bugs.webkit.org/show_bug.cgi?id=169788
+
+        Reviewed by Tim Horton.
+
+        Updated font to the one which passes the tests.
+
+        * css3/resources/FontWithFeatures.otf:
+
</ins><span class="cx"> 2017-04-06  Jiewen Tan  &lt;jiewen_tan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         LayoutTest crypto/subtle/aes-ctr-encrypt-malformed-parameters.html is a flaky failure
</span></span></pre></div>
<a id="trunkLayoutTestscss3resourcesFontWithFeaturesotf"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/css3/resources/FontWithFeatures.otf (215080 => 215081)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/css3/resources/FontWithFeatures.otf        2017-04-07 00:53:31 UTC (rev 215080)
+++ trunk/LayoutTests/css3/resources/FontWithFeatures.otf        2017-04-07 00:59:57 UTC (rev 215081)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> OTTO
</span><del>-\x80 CFF Vy\xD6\xEB\xAC&quot;OGSUBä»….&quot;\xFC\xBAOS/2H\xE0Yb'\xB8dcmap\xD5\xAF(jheadeD\xF9(\x886hheag7(\xC0$hmtx\xD4 \x86(\xE4\xD4maxpk)\xB8 name\xD9u/\xEA)\xD8|post8T FontWithFeaturesOTF9\x87\x87\x85\xEEFontWithFeaturesOTF        
</del><ins>+\x80 CFF Vy\xD6\xEA\xAC&quot;OGSUB45\xE9&quot;\xFC\xBAOS/2H\xE0Y`'\xB8dcmap\xD5\xB1(lheadeD\xF8(\x886hheah5(\xC0$hmtx\xD4 \x86(\xE4\xD4maxpk)\xB8 name\xD7\xF0/w)\xD8|post8T FontWithFeaturesOTF9\x87\x87\xFF\xFF\xFF\xFF\x85\xEEFontWithFeaturesOTF        
</ins><span class="cx">    !&quot;#$%&amp;'()*+,-./012345I\xA7G\xE7\x87'\xC7g\xA7G\xE7\x87'\xC7        g
</span><span class="cx"> 
</span><span class="lines">@@ -8,18 +8,18 @@
</span><span class="cx"> \xC7g\xA7G\xE7\x87'\xC7g\xA7G\xE7\x87'\xC7g\xA7G\xE7\x87'\xC7g\xA7G\xE7 \x87\xFF\xFF\xFF\xFF\xC8\xFF\xC8\xFF\xFFX\xFFX\xFF\xFF\xFF\xFD\xA8\xFF\xFD\xA8\xFF\xFF\xFF\xFF\xFF\xC8\xFF\xF4\xFF2\xFF2\xFF\xFA\xFF\xFF\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFE&gt;\xFF\xFE&gt;\xFF\xFE\xD4\xFF,\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xF
 F\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp
 \xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xF
 Ep\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xF
 F\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2
 \xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x
 90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xF
 F\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\x
 FF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\
 xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF
 \xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\
 xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp
 ;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF
 \x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xF
 F\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xF
 Ep\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xF
 F\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp\xFF\xFF\xFF\xFF\xF4\xFF&amp;\xFF\x90\xFF\x90\xFF2\xFF\xFF\xCE\xFF\xFEp\xFF\xFEp\xFF\x90\xFF\xFEp
 \xFF\xFF\xCE\xFF\xFF\xCE\xFF\xFEp\xFF\x90\xFF\xFEp\xFF\xFEp\xFF\xFF\xCE\xFF2\xFF\x90\xFF\x90\xFF\xFEp\xFF\x90\xFF2\xFF2\xFF\x90\xFF\xFEp
</span><span class="cx"> Z\xD0DFLT\xFF\xFF        
</span><span class="cx">  -liga\xBCclig\xC2dlig\xC8hlig\xCEcalt\xD4subs\xDAsups\xE0smcp\xE6c2sc\xECpcap\xF2c2pc\xF8unic\xFEtitllnum
</span><del>-onumpnumtnumfrac&quot;afrc(ordn.zero4hist:jp78@jp83Fjp90Ljp04RsmplXtrad^fwiddpwidjrubyp        
</del><ins>+afrc\xBCc2pc\xC2c2sc\xC8calt\xCEclig\xD4dlig\xDAfrac\xE0fwid\xE6hist\xEChlig\xF2jp04\xF8jp78\xFEjp83jp90
+ligalnumonumordn&quot;pcap(pnum.pwid4ruby:smcp@smplFsubsLsupsRtitlXtnum^traddunicjzerop        
</ins><span class="cx">     @HPX`hpx\x80\x88\x90\x98\xA0\xA8\xB0\xB8\xC0\xC8\xD0\xD8\xE0\xE8\xF0\xF8 (0\xF8\xFE
</span><del>-&quot;(.4:@FLRX^djpv|\x82\x88\x8E\x94\x9A\xA0\xA6\xAC        
-   - !\xF4TKBW\xFF\xFFf\xFF\xFC\xFF\xFF \xFF\xFFD
- (AZaz&amp;Zz\xFF\xFFAa\xFF\xFF\xFF\xDA\xFF\xA0^\xF7w`_&lt;\xF5f5\xC8\xC82222222222222222222222222222222222222222222222222225\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF5B&amp;&amp;&amp;&amp;L&amp;r\x98&amp;\x9E\xC44\xE0&lt;6P&gt;\x860\xC42\xF4&lt;&amp;        &gt;b.&lt;\xA0
-2\xDC &gt; @L -*\x8C*\xB6$\xE0$+&quot;(J*f6\x908\xC6\xFE*6D8z\xB2*\xD0\xFA&quot;\xFE* (Jr *\x90!2\xBA&quot;2\xEC#$$*B%8l&amp;4\xA4'\xD8(*\xF4)4*4R,,\x86-,\xB2/&amp;\xDE0*        14        .24        b34        \x9644        \xCA5:        \xFE6&lt;
</del><ins>+&quot;(.4:@FLRX^djpv|\x82\x88\x8E\x94\x9A\xA0\xA6\xAC +   !
+        \xF4TKBW\xFF\xFF\xFF\xFFf\xFF\xFC\xFF\xFF \xFF\xFFD
+ (AZaz(Zz\xFF\xFFAa\xFF\xFF\xFF\xDA\xFF\xA0\xC3t\xD6_&lt;\xF5\xFF\xFF\xFF\xFFf5\xC8\xC82222222222222222222222222222222222222222222222222225\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF5B&amp;&amp;&amp;&amp;L&amp;r\x98&amp;\x9E\xC44\xE0&lt;6P&gt;\x860\xC42\xF4&lt;&amp;        &gt;b
+2\xA0 &gt;\xD2 @ +*P*z$\xA4$\xC8\xEC*2*N6x6\xAE8\xE48T*r\x9C&quot;\xA0*\xC2(\xEC *2!2\&quot;2\x8E#$\xC0$*\xE4%8&amp;4F'z(*\x96)4\xC0*4\xF4+&quot;(,,J-,v.&lt;\xA2/&amp;\xDE0*        14        .24        b34        \x9644        \xCA5:        \xFE6&lt;
</ins><span class="cx"> 87 
</span><span class="cx"> t8*
</span><span class="cx"> \x949.
</span><span class="cx"> \xBE:2
</span><del>-\xEC; &lt;&amp; 8FontWithFeaturesOTFFontWithFeaturesOTFFontWithFeaturesOTFFontWithFeaturesOTF1.0FontWithFeaturesOTFkLigaturesTypekCommonLigaturesOnSelectorkContextualLigaturesOnSelectorkCommonLigaturesOffSelectorkContextualLigaturesOffSelectorkRareLigaturesOnSelectorkRareLigaturesOffSelectorkHistoricalLigaturesOnSelectorkHistoricalLigaturesOffSelectorkHistoricalLigaturesOnSelectorkContextualAlternatesTypekContextualAlternatesOnSelectorkContextualAlternatesOffSelectorkVerticalPositionType
 defaultUnusedSelectorkInferiorsSelectorkSuperiorsSelectorkOrdinalsSelectorkLowerCaseTypedefaultUnusedSelectorkLowerCaseSmallCapsSelectorkLowerCasePetiteCapsSelectorkUpperCaseTypedefaultUnusedSelectorkUpperCaseSmallCapsSelectorkUpperCasePetiteCapsSelectorkLetterCaseTypedefaultUnusedSelector14kStyleOptionsTypedefaultUnusedSelectorkTitlingCapsSelectorkNumberCaseTypedefaultUnusedSelectorkUpperCaseNumbersSelectorkLowerCaseNumbersSelectorkNumberSpacingTypedefaultUnusedSelectorkProportionalNumbersSel
 ectorkMonospacedNumbersSelectorkFractionsTypedefaultUnusedSelectorkDiagonalFractionsSelectorkVerticalFractionsSelectorkTypographicExtrasTypekSlashedZeroOnSelectorkCharacterShapeTypedefaultUnusedSelectorkJIS1978CharactersSelectorkJIS1983CharactersSelectorkJIS1990CharactersSelectorkJIS2004CharactersSelectorkSimplifiedCharactersSelectorkTraditionalCharactersSelectorkTextSpacingTypedefaultUnusedSelectorkMonospacedTextSelectorkProportionalTextSelectorkRubyKanaTypekRubyKanaOnSelector
</del><span class="cx">\ No newline at end of file
</span><ins>+\xEC; &lt;&amp; 8FontWithFeaturesOTFFontWithFeaturesOTFFontWithFeaturesOTFFontWithFeaturesOTF1.0FontWithFeaturesOTFkLigaturesTypekCommonLigaturesOnSelectorkContextualLigaturesOnSelectorkCommonLigaturesOffSelectorkContextualLigaturesOffSelectorkRareLigaturesOnSelectorkRareLigaturesOffSelectorkHistoricalLigaturesOnSelectorkHistoricalLigaturesOffSelectorkContextualAlternatesTypekContextualAlternatesOnSelectorkContextualAlternatesOffSelectorkVerticalPositionTypedefaultUnusedSelectorkInferior
 sSelectorkSuperiorsSelectorkLowerCaseTypedefaultUnusedSelectorkUpperCaseTypedefaultUnusedSelectorkLowerCaseSmallCapsSelectorkUpperCaseSmallCapsSelectorkLowerCasePetiteCapsSelectorkUpperCasePetiteCapsSelectorkLetterCaseTypedefaultUnusedSelector14kStyleOptionsTypedefaultUnusedSelectorkTitlingCapsSelectorkNumberCaseTypedefaultUnusedSelectorkUpperCaseNumbersSelectorkLowerCaseNumbersSelectorkNumberSpacingTypedefaultUnusedSelectorkProportionalNumbersSelectorkMonospacedNumbersSelectorkFractionsTypede
 faultUnusedSelectorkDiagonalFractionsSelectorkVerticalFractionsSelectorkOrdinalsSelectorkTypographicExtrasTypekSlashedZeroOnSelectorkHistoricalLigaturesOnSelectorkCharacterShapeTypedefaultUnusedSelectorkJIS1978CharactersSelectorkJIS1983CharactersSelectorkJIS1990CharactersSelectorkJIS2004CharactersSelectorkSimplifiedCharactersSelectorkTraditionalCharactersSelectorkTextSpacingTypedefaultUnusedSelectorkMonospacedTextSelectorkProportionalTextSelectorkRubyKanaTypekRubyKanaOnSelector
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (215080 => 215081)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-04-07 00:53:31 UTC (rev 215080)
+++ trunk/Tools/ChangeLog        2017-04-07 00:59:57 UTC (rev 215081)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2017-04-06  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        Make FontWithFeatures test font pass OTS
+        https://bugs.webkit.org/show_bug.cgi?id=169788
+
+        Reviewed by Tim Horton.
+
+        OTS, or the OpenType Sanitizer, is a check which tells if fonts are properly formed.
+        Previously, our FontWithFeatures test font did not pass this check. This patch updates
+        the font to pass the checks. Now, we can use this font on other platforms, and
+        contribute the font to the W3C for testing the CSS Fonts level 3 spec.
+
+        * FontWithFeatures/FontWithFeatures/FontCreator.cpp:
+        (Generator::appendCFFTable):
+        (Generator::Feature::operator&lt;):
+        (Generator::appendGSUBTable):
+        (Generator::appendOS2Table):
+        (Generator::appendFormat4CMAPTable):
+        (Generator::appendHEADTable):
+        (Generator::appendHHEATable):
+        (Generator::NameRecord::operator&lt;):
+        (Generator::appendNameSubtable):
+        (Generator::appendNAMETable):
+
</ins><span class="cx"> 2017-04-06  Alexey Proskuryakov  &lt;ap@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Disable flaky WebKit2.ResizeWithHiddenContentDoesNotHang
</span></span></pre></div>
<a id="trunkToolsFontWithFeaturesFontWithFeaturesFontCreatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/FontWithFeatures/FontWithFeatures/FontCreator.cpp (215080 => 215081)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/FontWithFeatures/FontWithFeatures/FontCreator.cpp        2017-04-07 00:53:31 UTC (rev 215080)
+++ trunk/Tools/FontWithFeatures/FontWithFeatures/FontCreator.cpp        2017-04-07 00:59:57 UTC (rev 215081)
</span><span class="lines">@@ -612,7 +612,7 @@
</span><span class="cx">         result.push_back(operand32Bit);
</span><span class="cx">         append32(clampTo&lt;int32_t&gt;(0)); // Bounding box x
</span><span class="cx">         result.push_back(operand32Bit);
</span><del>-        append32(clampTo&lt;int32_t&gt;(0)); // Bounding box y
</del><ins>+        append32(clampTo&lt;int32_t&gt;(-1)); // Bounding box y
</ins><span class="cx">         result.push_back(operand32Bit);
</span><span class="cx">         append32(clampTo&lt;int32_t&gt;(unitsPerEm)); // Bounding box max x
</span><span class="cx">         result.push_back(operand32Bit);
</span><span class="lines">@@ -821,9 +821,20 @@
</span><span class="cx">             append16(i); // Features indices
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    struct Feature {
+        bool operator&lt;(const Feature&amp; o) const
+        {
+            return tag &lt; o.tag;
+        }
+
+        std::array&lt;char, 5&gt; tag;
+        uint16_t glyphToReplace;
+    };
+
</ins><span class="cx">     void appendGSUBTable()
</span><span class="cx">     {
</span><del>-        std::vector&lt;std::array&lt;char, 5&gt;&gt; features {{&quot;liga&quot;}, {&quot;clig&quot;}, {&quot;dlig&quot;}, {&quot;hlig&quot;}, {&quot;calt&quot;}, {&quot;subs&quot;}, {&quot;sups&quot;}, {&quot;smcp&quot;}, {&quot;c2sc&quot;}, {&quot;pcap&quot;}, {&quot;c2pc&quot;}, {&quot;unic&quot;}, {&quot;titl&quot;}, {&quot;lnum&quot;}, {&quot;onum&quot;}, {&quot;pnum&quot;}, {&quot;tnum&quot;}, {&quot;frac&quot;}, {&quot;afrc&quot;}, {&quot;ordn&quot;}, {&quot;zero&quot;}, {&quot;hist&quot;}, {&quot;jp78&quot;}, {&quot;jp83&quot;}, {&quot;jp90&quot;}, {&quot;jp04&quot;}, {&quot;smpl&quot;}, {&quot;trad&quot;}, {&quot;fwid&quot;}, {&quot;pwid&quot;}, {&quot;ruby&quot;}};
</del><ins>+        std::vector&lt;Feature&gt; features {{{&quot;liga&quot;}, 3}, {{&quot;clig&quot;}, 4}, {{&quot;dlig&quot;}, 5}, {{&quot;hlig&quot;}, 6}, {{&quot;calt&quot;}, 7}, {{&quot;subs&quot;}, 8}, {{&quot;sups&quot;}, 9}, {{&quot;smcp&quot;}, 10}, {{&quot;c2sc&quot;}, 11}, {{&quot;pcap&quot;}, 12}, {{&quot;c2pc&quot;}, 13}, {{&quot;unic&quot;}, 14}, {{&quot;titl&quot;}, 15}, {{&quot;lnum&quot;}, 16}, {{&quot;onum&quot;}, 17}, {{&quot;pnum&quot;}, 18}, {{&quot;tnum&quot;}, 19}, {{&quot;frac&quot;}, 20}, {{&quot;afrc&quot;}, 21}, {{&quot;ordn&quot;}, 22}, {{&quot;zero&quot;}, 23}, {{&quot;hist&quot;}, 24}, {{&quot;jp78&quot;}, 25}, {{&quot;jp83&quot;}, 26}, {{&quot;jp90&quot;}, 27}, {{&quot;jp04&quot;}, 28}, {{&quot;smpl&quot;}, 29}, {{&quot;trad&quot;}, 30}, {{&quot;fwid&quot;}, 31}, {{&quot;pwid&quot;}, 32}, {{&quot;ruby&quot;}, 33}};
+        std::sort(features.begin(), features.end());
</ins><span class="cx">         auto tableLocation = result.size();
</span><span class="cx">         auto headerSize = 10;
</span><span class="cx"> 
</span><span class="lines">@@ -850,7 +861,7 @@
</span><span class="cx">         append16(features.size()); // FeatureCount
</span><span class="cx">         for (unsigned i = 0; i &lt; features.size(); ++i) {
</span><span class="cx">             auto&amp; code = features[i];
</span><del>-            append32BitCode(code.data()); // Feature name
</del><ins>+            append32BitCode(code.tag.data()); // Feature name
</ins><span class="cx">             append16(featureListSize + featureTableSize * i); // Offset of feature table, relative to beginning of FeatureList table
</span><span class="cx">         }
</span><span class="cx">         assert(featureListLocation + featureListSize == result.size());
</span><span class="lines">@@ -880,7 +891,7 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         for (unsigned i = 0; i &lt; features.size(); ++i)
</span><del>-            appendSubstitutionSubtable(subtableRecordLocations[i], 3 + i, 1);
</del><ins>+            appendSubstitutionSubtable(subtableRecordLocations[i], features[i].glyphToReplace, 1);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void appendOS2Table()
</span><span class="lines">@@ -913,10 +924,10 @@
</span><span class="cx">         append16(0); // First unicode index
</span><span class="cx">         append16(0xFFFF); // Last unicode index
</span><span class="cx">         append16(clampTo&lt;int16_t&gt;(unitsPerEm)); // Typographical ascender
</span><del>-        append16(clampTo&lt;int16_t&gt;(1)); // Typographical descender
</del><ins>+        append16(clampTo&lt;int16_t&gt;(-1)); // Typographical descender
</ins><span class="cx">         append16(clampTo&lt;int16_t&gt;(unitsPerEm / 10)); // Typographical line gap
</span><span class="cx">         append16(clampTo&lt;uint16_t&gt;(unitsPerEm)); // Windows-specific ascent
</span><del>-        append16(clampTo&lt;uint16_t&gt;(1)); // Windows-specific descent
</del><ins>+        append16(clampTo&lt;uint16_t&gt;(0)); // Windows-specific descent
</ins><span class="cx">         append32(0xFF10FC07); // Bitmask for supported codepages (Part 1). Report all pages as supported.
</span><span class="cx">         append32(0x0000FFFF); // Bitmask for supported codepages (Part 2). Report all pages as supported.
</span><span class="cx">         append16(clampTo&lt;int16_t&gt;(unitsPerEm / 2)); // x-height
</span><span class="lines">@@ -979,6 +990,7 @@
</span><span class="cx">         // idRangeOffset
</span><span class="cx">         append16(0); // idRangeOffset
</span><span class="cx">         append16(0);
</span><ins>+        append16(0);
</ins><span class="cx"> 
</span><span class="cx">         // Fonts strive to hold 2^16 glyphs, but with the current encoding scheme, we write 8 bytes per codepoint into this subtable.
</span><span class="cx">         // Because the size of this subtable must be represented as a 16-bit number, we are limiting the number of glyphs we support to 2^13.
</span><span class="lines">@@ -1024,7 +1036,7 @@
</span><span class="cx">         append32(0); // First half of modification date
</span><span class="cx">         append32(0); // Last half of modification date
</span><span class="cx">         append16(clampTo&lt;int16_t&gt;(0)); // bounding box x
</span><del>-        append16(clampTo&lt;int16_t&gt;(0)); // bounding box y
</del><ins>+        append16(clampTo&lt;int16_t&gt;(-1)); // bounding box y
</ins><span class="cx">         append16(clampTo&lt;int16_t&gt;(unitsPerEm)); // bounding box max x
</span><span class="cx">         append16(clampTo&lt;int16_t&gt;(unitsPerEm)); // bounding box max y
</span><span class="cx">         append16(0); // Traits
</span><span class="lines">@@ -1038,7 +1050,7 @@
</span><span class="cx">     {
</span><span class="cx">         append32(0x00010000); // Version
</span><span class="cx">         append16(clampTo&lt;int16_t&gt;(unitsPerEm)); // ascent
</span><del>-        append16(clampTo&lt;int16_t&gt;(1)); // descent
</del><ins>+        append16(clampTo&lt;int16_t&gt;(-1)); // descent
</ins><span class="cx">         // WebKit SVG font rendering has hard coded the line gap to be 1/10th of the font size since 2008 (see r29719).
</span><span class="cx">         append16(clampTo&lt;int16_t&gt;(unitsPerEm / 10)); // line gap
</span><span class="cx">         append16(clampTo&lt;uint16_t&gt;(unitsPerEm)); // advance width max
</span><span class="lines">@@ -1082,15 +1094,25 @@
</span><span class="cx">         append16(0); // No compound glyphs
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void appendNameSubtable(const std::string&amp; s, uint16_t nameIdentifier)
</del><ins>+    struct NameRecord {
+        bool operator&lt;(const NameRecord&amp; o) const
+        {
+            return nameIdentifier &lt; o.nameIdentifier;
+        }
+
+        uint16_t nameIdentifier;
+        std::string value;
+    };
+
+    void appendNameSubtable(const NameRecord&amp; nameRecord)
</ins><span class="cx">     {
</span><span class="cx">         append16(0); // Unicode
</span><span class="cx">         append16(3); // Unicode version 2.0 or later
</span><span class="cx">         append16(0); // Language
</span><del>-        append16(nameIdentifier); // Name identifier
-        append16(s.length() * 2); // Code units get 2 bytes each
</del><ins>+        append16(nameRecord.nameIdentifier); // Name identifier
+        append16(nameRecord.value.length() * 2); // Code units get 2 bytes each
</ins><span class="cx">         append16(m_nameOffset); // Offset into name data
</span><del>-        m_nameOffset += s.size() * 2; // Code units get 2 bytes each
</del><ins>+        m_nameOffset += nameRecord.value.size() * 2; // Code units get 2 bytes each
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void append2ByteASCIIString(std::string&amp; s)
</span><span class="lines">@@ -1109,29 +1131,19 @@
</span><span class="cx">         append16(numberOfRecords); // Number of name records in table
</span><span class="cx">         append16(6 + 12 * numberOfRecords); // Offset in bytes to the beginning of name character strings
</span><span class="cx"> 
</span><del>-        appendNameSubtable(familyName, 1); // 1: Font Family.
-        appendNameSubtable(familyName, 2); // 2: Font Subfamily.
-        appendNameSubtable(familyName, 3); // 3: Unique subfamily identification.
-        appendNameSubtable(familyName, 4); // 4: Full name of the font.
-        appendNameSubtable(version, 5); // 5: Version of the name table.
-        appendNameSubtable(familyName, 6); // 6: PostScript name of the font.
</del><ins>+        std::vector&lt;NameRecord&gt; nameRecords = { { 1, familyName }, { 2, familyName }, { 3, familyName }, { 4, familyName }, { 5, version }, { 6, familyName } };
</ins><span class="cx">         for (FeatureType&amp; type : featureDescription) {
</span><del>-            appendNameSubtable(type.name, m_baseStringIndex + type.stringIndex);
</del><ins>+            nameRecords.push_back({ static_cast&lt;uint16_t&gt;(m_baseStringIndex + type.stringIndex), type.name });
</ins><span class="cx">             for (FeatureSelector&amp; selector : type.selectors)
</span><del>-                appendNameSubtable(selector.name, m_baseStringIndex + selector.stringIndex);
</del><ins>+                nameRecords.push_back({ static_cast&lt;uint16_t&gt;(m_baseStringIndex + selector.stringIndex), selector.name });
</ins><span class="cx">         }
</span><ins>+        std::sort(nameRecords.begin(), nameRecords.end());
</ins><span class="cx"> 
</span><del>-        append2ByteASCIIString(familyName);
-        append2ByteASCIIString(familyName);
-        append2ByteASCIIString(familyName);
-        append2ByteASCIIString(familyName);
-        append2ByteASCIIString(version);
-        append2ByteASCIIString(familyName);
-        for (FeatureType&amp; type : featureDescription) {
-            append2ByteASCIIString(type.name);
-            for (FeatureSelector&amp; selector : type.selectors)
-                append2ByteASCIIString(selector.name);
-        }
</del><ins>+        for (auto&amp; nameRecord : nameRecords)
+            appendNameSubtable(nameRecord);
+
+        for (auto&amp; nameRecord : nameRecords)
+            append2ByteASCIIString(nameRecord.value);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     void appendPOSTTable()
</span></span></pre>
</div>
</div>

</body>
</html>