<!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>[282922] 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/282922">282922</a></dd>
<dt>Author</dt> <dd>mmaxfield@apple.com</dd>
<dt>Date</dt> <dd>2021-09-22 21:52:05 -0700 (Wed, 22 Sep 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Cocoa] Hook up palettes to CoreText
https://bugs.webkit.org/show_bug.cgi?id=230449

Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

This is being upstreamed at https://github.com/web-platform-tests/wpt/pull/30910.

* web-platform-tests/css/css-fonts/font-palette-expected.html: Added.
* web-platform-tests/css/css-fonts/font-palette.html: Added.
* web-platform-tests/css/css-fonts/resources/Ahem-COLOR-palettes.ttf: Added.

Source/WebCore:

Now that we have FontCreationContext, we can just add FontPaletteValues to it, and turn
that into Core Text attributes in preparePlatformFont().

Test: imported/w3c/web-platform-tests/css/css-fonts/font-palette.html

* WebCore.xcodeproj/project.pbxproj:
* css/CSSFontFace.cpp:
(WebCore::CSSFontFace::font):
* css/CSSFontFace.h:
* css/CSSFontSelector.cpp:
(WebCore::CSSFontSelector::lookupFontPaletteValues):
(WebCore::CSSFontSelector::fontRangesForFamily):
* css/CSSFontSelector.h:
* css/CSSSegmentedFontFace.cpp:
(WebCore::CSSSegmentedFontFace::fontRanges):
* css/CSSSegmentedFontFace.h:
* platform/graphics/FontCreationContext.h:
(WebCore::FontCreationContext::operator== const):
(WebCore::add):
* platform/graphics/FontPaletteValues.h:
(WebCore::FontPaletteValues::operator== const):
(WebCore::FontPaletteValues::operator!= const):
(WebCore::add):
* platform/graphics/Gradient.cpp:
* platform/graphics/Gradient.h:
(WebCore::add):
* platform/graphics/cocoa/FontCacheCoreText.cpp:
(WebCore::addAttributesForFontPalettes):
(WebCore::preparePlatformFont):

Source/WebCore/PAL:

* pal/spi/cf/CoreTextSPI.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsimportedw3cChangeLog">trunk/LayoutTests/imported/w3c/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorePALChangeLog">trunk/Source/WebCore/PAL/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorePALpalspicfCoreTextSPIh">trunk/Source/WebCore/PAL/pal/spi/cf/CoreTextSPI.h</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorecssCSSFontFacecpp">trunk/Source/WebCore/css/CSSFontFace.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSFontFaceh">trunk/Source/WebCore/css/CSSFontFace.h</a></li>
<li><a href="#trunkSourceWebCorecssCSSFontSelectorcpp">trunk/Source/WebCore/css/CSSFontSelector.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSFontSelectorh">trunk/Source/WebCore/css/CSSFontSelector.h</a></li>
<li><a href="#trunkSourceWebCorecssCSSSegmentedFontFacecpp">trunk/Source/WebCore/css/CSSSegmentedFontFace.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSSegmentedFontFaceh">trunk/Source/WebCore/css/CSSSegmentedFontFace.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsFontCreationContexth">trunk/Source/WebCore/platform/graphics/FontCreationContext.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsFontPaletteValuesh">trunk/Source/WebCore/platform/graphics/FontPaletteValues.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGradientcpp">trunk/Source/WebCore/platform/graphics/Gradient.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGradienth">trunk/Source/WebCore/platform/graphics/Gradient.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscocoaFontCacheCoreTextcpp">trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestscsscssfontsfontpaletteexpectedhtml">trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-expected.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestscsscssfontsfontpalettehtml">trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestscsscssfontsresourcesAhemCOLORpalettesttf">trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/Ahem-COLOR-palettes.ttf</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsimportedw3cChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/ChangeLog (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/ChangeLog 2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/LayoutTests/imported/w3c/ChangeLog    2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2021-09-22  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        [Cocoa] Hook up palettes to CoreText
+        https://bugs.webkit.org/show_bug.cgi?id=230449
+
+        Reviewed by Simon Fraser.
+
+        This is being upstreamed at https://github.com/web-platform-tests/wpt/pull/30910.
+
+        * web-platform-tests/css/css-fonts/font-palette-expected.html: Added.
+        * web-platform-tests/css/css-fonts/font-palette.html: Added.
+        * web-platform-tests/css/css-fonts/resources/Ahem-COLOR-palettes.ttf: Added.
+
</ins><span class="cx"> 2021-09-22  Joonghun Park  <jh718.park@samsung.com>
</span><span class="cx"> 
</span><span class="cx">         Fix the behavior that setting text field input's value content attribute to the same value moves caret to the end of the input.
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestscsscssfontsfontpaletteexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-expected.html (0 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-expected.html                               (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-expected.html  2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<title>CSS Test: font-palette drawing</title>
+<link rel="author" title="Myles C. Maxfield" href="mmaxfield@apple.com">
+<link rel="match" href="font-palette-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#font-palette-prop">
+<meta name="assert" content="Font palettes are applied as necessary">
+</head>
+<body>
+<p>Test passes if you see particular rectangles of particular colors.</p>
+<div style="position: relative;">
+<div style="position: absolute; left: 0px; top: 0px; width: 100px; height: 100px; background: #FF00FF;">
+    <div style="position: absolute; left: 20px; top: 0px; width: 20px; height: 100px; background: #00FFFF;"></div>
+</div>
+<div style="position: absolute; left: 100px; top: 0px; width: 100px; height: 100px; background: #0000FF;">
+    <div style="position: absolute; left: 20px; top: 0px; width: 20px; height: 100px; background: #00FF00;"></div>
+</div>
+<div style="position: absolute; left: 200px; top: 0px; width: 100px; height: 100px; background: #0000FF;">
+    <div style="position: absolute; left: 20px; top: 0px; width: 20px; height: 100px; background: #FFFF00;"></div>
+</div>
+<div style="position: absolute; left: 300px; top: 0px; width: 100px; height: 100px; background: #00FF00;">
+    <div style="position: absolute; left: 20px; top: 0px; width: 20px; height: 100px; background: #000000;"></div>
+</div>
+<div style="position: absolute; left: 400px; top: 0px; width: 100px; height: 100px; background: #00FF00;">
+    <div style="position: absolute; left: 20px; top: 0px; width: 20px; height: 100px; background: #000000;"></div>
+</div>
+</div>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestscsscssfontsfontpalettehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette.html (0 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette.html                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette.html   2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<title>CSS Test: font-palette drawing</title>
+<link rel="author" title="Myles C. Maxfield" href="mmaxfield@apple.com">
+<link rel="match" href="font-palette-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#font-palette-prop">
+<meta name="assert" content="Font palettes are applied as necessary">
+<style>
+@font-face {
+    font-family: "WebFont";
+    src: url("resources/Ahem-COLOR-palettes.ttf") format("truetype");
+}
+
+@font-palette-values Palette1 {
+    font-family: "WebFont";
+    base-palette: 0;
+}
+
+@font-palette-values Palette2 {
+    font-family: "WebFont";
+    base-palette: 1;
+}
+
+@font-palette-values Palette3 {
+    font-family: "WebFont";
+    base-palette: 1;
+    override-color: 1 #FFFF00;
+}
+
+@font-palette-values Palette4 {
+    font-family: "WebFont";
+    base-palette: 1;
+    override-color: 0 #00FF00, 1 #000000;
+}
+
+@font-palette-values Palette5 {
+    font-family: "WebFont";
+    base-palette: 1;
+    override-color: 1 #000000, 0 #00FF00;
+}
+</style>
+</head>
+<body>
+<p>Test passes if you see particular rectangles of particular colors.</p>
+<div style="display: inline-block; font: 100px 'WebFont'; font-palette: Palette1;">A</div><div style="display: inline-block; font: 100px 'WebFont'; font-palette: Palette2;">A</div><div style="display: inline-block; font: 100px 'WebFont'; font-palette: Palette3;">A</div><div style="display: inline-block; font: 100px 'WebFont'; font-palette: Palette4;">A</div><div style="display: inline-block; font: 100px 'WebFont'; font-palette: Palette5;">A</div>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestscsscssfontsresourcesAhemCOLORpalettesttf"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/Ahem-COLOR-palettes.ttf (0 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/Ahem-COLOR-palettes.ttf                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/Ahem-COLOR-palettes.ttf   2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>++\x80PCOLR;I\xDCCPAL\xFF\xF8 OS/2sf\xF8`cmap9\x96U\xEEx gasp        \x84glyf' A\x94\x8Ehead\xDBP͵!$6hhea
+7!\$hmtx+!\x80Xloca\xB8\xA2\xB2%\xD8.maxp ( nameM\xDAc((1\xAEpostc\xA1[#Y\xD8#$\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xD6\x90\xBC\x8A\x8F\xBC\x8A\xC52\x80\xAF HW3C @ \xFE\xFF \xFF8 \xC8\xFF\xFC\xFF\xFF   \xF8::&~\xA0\xA1\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCF\xD0\xD1\xD2\xD4\xD5\xD6\xD7\xD8\xD9\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEB\xEC\xED\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6
 \xF7\xF8\xF9\xFA\xFC\xFD\xFE\xFF1Sx\x92\xC6\xC7\xC9\xDA\xDB\xDC\xDD\x94\xA5\xA7\xA9\xBC\xC0    +      " & 0 : D!"!&"""""&quo
 t;"""+"H"`"e"\xF2%\xCA00NNN        N]N\x8CN\x94QkQmSAV\xD7V\xDBWg(j*l4pk~\xB5\x91\xD1\xF0\xFE\xFF\xFF\xFF (\xA0\xA1\xA2\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xD0\xD1\xD2\xD3\xD5\xD6\xD7\xD8\xD9\xDA\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEC\xED\xEE\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFD\xFE\xFF1Rx\x92\xC6\xC7\xC9\xD8\xDB\xDC\xDD\x94\xA5\xA7\xA9\xBC\xC0               & 0 9 D!"!&"""""""""+"H"`"d"\xF2%\xCA00NNN   N]N\x8CN\x94QkQmSAV\xD7V\xDBWg(j*l4pk~\xB5\x91\xD1\xF0\xFE\xFF\xFF\xFF\xFF\xE3\xFF\xE2\xFF\xF9
 \xFF\xF4\xFF\xE0\xFF\xFD\xFF\xE9\xFF\xDD\xFF\xE2\xFF\xDF\xFF\xE6\xFF\xEC\xFF\xEA\xFF\xD9\
 xFF\xD1\xFF\xDC\xFF\xD5\xFF\xDA\xFF\xCF\xFF\xEB+\xFF\xD7\xFF\xDD +\xFF\xD5\xFF\xDA\xFF\xE4\xFF\xE1\xFF\xD8\xFF\x9D\xFF\xC5\xFF\x9C\xFF\xDF\xFF\x9B\xFF\xDA\xFF\xDB\xFF\xDF\xFF\xDB\xFF\xEE\xFF\x94\xFF\xDC\xFF\xD9\xFF\xC7\xFF\x90\xFF\xEE\xFF\xB4\xFF\xD8\xFF\xD5\xFF\x8B\xFF\xE3\xFF\xE4\xFF\xA7\xFF\x89\xFF\x87\xFF\x88\xFF\x89\xFF\x87\xFF\x88\xFF\xAC\xFF\x87\xFF\x88\xFF\x86\xFF\x87\xFF\x88\xFF\x86\xFF\x87\xFF\xCF\xFF\x86\xFF\x87\xFF\x85\xFF\x86\xFF\x87\xFF\x85\xFF\xA8\xFF\x9B\xFF\x85\xFF\x83\xFF\x84\xFF\xC4\xFF\xC5\xFF\xA1\xFF\x81\xFF|\xFFX\xFF?\xFD\xED\xFD\xF5\xFD\xEC\xFD\xDE\xFD\xE0\xFD\xD8\xFD\xDD\xFD>\xFDo\xFDk\xFD*\xFC\xD3\xFD\xE0\xF4\xE0\xF2\xE0\xF3\xDF\xFF\xE0\xC2\xE0\x85\xE0\xBD\xE0\xBC\xE0\xBB\xE0\xB8\xE0\xAF\xE0\xA7\xE0\x9E\xDF\xC1߭\xDE\xE2\xDE\xCC\xDE\xD6\xDE\xD5޲މ\xDE\xCD\xDE\xCA޾ޥފއ\xDD\xFB\xDB$\xD0\xFE\xD1\xB3\xB3\xB2\xFA\xB2\xAC\xB2v\xB2q\xAF\x9D\xAF\x99\xADɪ5\xAA)\xA9\xF2\x99\xE7\x96\xE9\x94ڐ\xA2\x82`o?\xEF\xF6
 
 \xFF\xFF}k 3!%!!}\xEE\xFD\x8F\xF4\xFE  \xFC\xE0}&\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC
 \xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE
 8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 
 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\
 xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC 
 \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xF
 C\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE81!!\xE8\xFC\xC8\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC
 \xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE
 8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xE8 !!\xE8\xFC \xFC\xE0\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 
 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\
 xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC 
 \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xF
 C\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\
 xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\
 xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 
 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!
 \xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC
  \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \
 xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC
 \xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8
 \xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 !!\xE8\xFC \xFC\xFF8\xE8 
 !!\xE8\xFC \xFC\x90\xE8X!!\xE8\xFCX\xC8\x90\xE8X!!\xE8\xFCX\xC8\xC8\xFF8\x90 
 3#\xC8\xC8\xC8 \xFC\xC8\xFF8\x90 3#\xC8\xC8\xC8 \xFC\x80\x83s\xC5P_<\xF5     \xE8\xB3o_Y\xC4ݫ$\xFF8\xE8  \xFF8\xE8\xE8\xE8}\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE
 8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE
 8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\
 xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xF4\xE8M\xFA\xA7\xC8d\xE8\xE8\xE
 8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xE8\xC8\xE8\xC8!.;HUbo|\x89\x96\xA3\xB0\xBD\xCA\xD7\xE4\xF1\xFE %2?LYfs\x80\x8D\x9A\xA7\xA7\xB4\xC1\xCE\xDB\xE8\xF5)6CP]jw\x84\x91\x9E\xAB\xB8\xC5\xD2\xDF\xEC\xF9 -:GTan{\x88\x95\xA2\xAF\xBC\xC9\xD6\xE3\xF0\xFD #0=JWdq~\x8B\x98\xA5\xB2\xBF\xCC\xD9\xE6\xF3+'4AN[hu\x82\x8F\x9C\xA9\xB6\xC3\xD0\xDD\xEA\xF7+8ER_ly\x86\x93\xA0\xAD\xBA\xC7\xD4\xE1\xEE\xFB"/<IVcp}\x8A\x97\x97\xA4\xB1\xBE\xCB\xD8\xE5\xF2\xFF &3@MZgt\x81\x8E\x9B\xA8\xB5\xC2\xCF\xDC\xE9\xF6                      *       7       D       Q       ^       k       x       \x85    \x92    \x9F    \xAC    \xB9    \xC6    \xD3    \xE0    \xED    \xFA
+
+
+!
+.
+;
+H
+U
+b
+o
+|
+\x89
+\x96
+\xA3
+\xB0
+\xBD
+\xCA
+\xD7
+\xE4
+\xF1
+\xFE  % 2 ? L Y f s \x80 \x8D \x9A \xA7 \xB4 \xC1 \xCE \xDB \xE8 \xF5    ) 6 6 6 6 6 6 6 6 6 6 6 6 6 C P ] j w \x84 \x91 \x9E \xAB \xB8 \xC5 \xD2 \xDF \xEC \xF9+++ +-+:+G$\xB6\xF0\xF0\xF8"(0H
+XP $\xA8R\xCC\xF8!2 6B
+,F r)\x84\xAD\xB1\xB8 \xF0\xBC   \xAC      \xB4      "\xC2 \xE4      \xEC       
+X      $/d R/\x88      /\xDA      /\xE2      /\xF0The Ahem font belongs to the public domain. In jurisdictions that do not recognize public domain ownership of these files, the following Creative Commons Zero declaration applies: http://labs.creativecommons.org/licenses/zero-waive/1.0/us/legalcodeAhemRegularVersion 1.50 AhemAhemVersion 1.50AhemThe 
 Ahem font was developed by Todd Fahrner and Myles C. Maxfield to help test writers develop predictable tests. The units per em is 1000, the advance is 800, and 
 the descent is 200, thereby making the em square exactly square. The glyphs for most characters is simply a box which fills this square. The codepoints mapped to this full square with a full advance are the following ranges: U+20-U+26, U+28-U+6F, U+71-U+7E, U+A0-U+C8, U+CA-U+FF, U+131, U+152-U+153, U+178, U+192, U+2C6-U+2C7, U+2C9,
  U+2D8-U+2DD, U+394, U+3A5, U+3A7, U+3A9, U+3BC, U+3C0, U+2013-U+2014, U+2018-U+201A, U+201C-U+201E, U+2020-U+2022, U+2026, U+2030, U+2039-U+203A, U+2044, U+2122, U+2
 126, U+2202, U+2206, U+220F, U+2211-U+2212, U+2219-U+221A, U+221E, U+222B, U+2248, U+2260, U+2264-U+2265, U+22F2, U+25CA, U+3007, U+4E00, U+4E03, U+4E09, U+4E5D, U+4E8C, U+4E94, U+516B, U+516D, U+5341, U+56D7, U+56DB, U+571F, U+6728, U+6C34, U+706B, U+91D1, U+F000-U+F002. The codepoints which are mapped to something else are the f
 ollowing: " " (U+20): No path but full advance; "p" (U+70): Path has 0 ascent but full descent; "\xC9" (U+C9): Path has 0 descent but full ascent; Non-br
 eaking space (U+A0): No path but full advance; Zero-width non-breaking space (U+FEFF): No path and 0 advance; En space (U+2002): No path and half advance; Em space (U+2003): No path but full advance; Three-per-em space (U+2004): No path and one third advance; Four-per-em space (U+2005): No path and one quarter advance; Six-per-em 
 space (U+2006): No path and one sixth advance; Thin space (U+2009): No path and one fifth advance; Hair space (U+200A): No path and one tenth advance; Zero width spac
 e (U+200B): No path and no advance; Ideographic space (U+3000): No path but full advance; Zero width non-joiner (U+200C): No path and no advance; Zero width joiner (U+200D): No path and no advance; Greek capital letter Chi (U+3A7): Thin horizontal stripe and full advance; (U+6A2A): Thin horizontal stripe and full advance; Greek cap
 ital letter Upsilon (U+3A5): Thin vertical stripe and full advance; (U+7EB5): Thin vertical stripe and full advance.http://www.w3c.orghttp://dev.w3.org/CSS/fonts/ahem
 /COPYING
+The Ahem font belongs to the public domain. In jurisdictions that do not recognize public domain ownership of these files, the following Creative Commons Zero declaration applies: http://labs.creativecommons.org/licenses/zero-waive/1.0/us/legalcodeAhemRegularVersion 1.50 AhemAhemVersion 1.50AhemThe Ahem font was developed by Todd Fahrner and Myles C. Maxfield to help test writers develop predictable tests. The units per em is 1000, the advance is 800, and the descent is 200, thereby making the em square exactly square. The glyphs for most characters is simply a box which fills this square. The codepoints mapped to this full square with a full advance are the following ranges: U+20-U+26, U+28-U+6F, U+71-U+7E, U+A0-U+C8, U+CA-U+FF, U+131, U+152-U+153, U+178, U+192, U+2C6-U+2C7, U+2C9, U+2D8-U+2DD, U+394, U+3A5, U+3A7, U+3A9, U+3BC, U+3C0, U+2013-U+2014, U+2018-U+201A, U+201C-U+201E, U+2020-U+2022, U+2026, U+2030, U+2039-U+203A, U+2044, U+2122, U+2126, U+2202, U+2206, U+220F, U+2211-U+
 2212, U+2219-U+221A, U+221E, U+222B, U+2248, U+2260, U+2264-U+2265, U+22F2, U+25CA, U+3007, U+4E00, U+4E03, U+4E09, U+4E5D, U+4E8C, U+4E94, U+516B, U+516D, U+5341, U+56D7, U+56DB, U+571F, U+6728, U+6C34, U+706B, U+91D1, U+F000-U+F002. The codepoints which are mapped to something else are the following: " " (U+20): No path but full advance; "p" (U+70): Path has 0 ascent but full descent; "\x83" (U+C9): Path has 0 descent but full ascent; Non-breaking space (U+A0): No path but full advance; Zero-width non-breaking space (U+FEFF): No path and 0 advance; En space (U+2002): No path and half advance; Em space (U+2003): No path but full advance; Three-per-em space (U+2004): No path and one third advance; Four-per-em space (U+2005): No path and one quarter advance; Six-per-em space (U+2006): No path and one sixth advance; Thin space (U+2009): No path and one fifth advance; Hair space (U+200A): No path and one tenth advance; Zero width space (U+200B): No path an
 d no advance; Ideographic space (U+3000): No path but full advance; Zero width non-joiner (U+200C): No path and no advance; Zero width joiner (U+200D): No path and no advance; Greek capital letter Chi (U+3A7): Thin horizontal stripe and full advance; (U+6A2A): Thin horizontal stripe and full advance; Greek capital letter Upsilon (U+3A5): Thin vertical stripe and full advance; (U+7EB5): Thin vertical stripe and full advance.http://www.w3c.orghttp://dev.w3.org/CSS/fonts/ahem/COPYING
+AhemRegularAhemThe Ahem font belongs to the public domain. In jurisdictions that do not recognize public domain ownership of these files, the following Creative Commons Zero declaration applies: http://labs.creativecommons.org/licenses/zero-waive/1.0/us/legalcodeAhemRegularVersion 1.50 AhemAhemVersion 1.50AhemThe Ahem font was developed by 
 Todd Fahrner and Myles C. Maxfield to help test writers develop predictable tests. The units per em is 1000, the advance is 800, and the descent is 200, thereby mak
 ing the em square exactly square. The glyphs for most characters is simply a box which fills this square. The codepoints mapped to this full square with a full advance are the following ranges: U+20-U+26, U+28-U+6F, U+71-U+7E, U+A0-U+C8, U+CA-U+FF, U+131, U+152-U+153, U+178, U+192, U+2C6-U+2C7, U+2C9, U+2D8-U+2DD, U+394, U+3A5, U+
 3A7, U+3A9, U+3BC, U+3C0, U+2013-U+2014, U+2018-U+201A, U+201C-U+201E, U+2020-U+2022, U+2026, U+2030, U+2039-U+203A, U+2044, U+2122, U+2126, U+2202, U+2206, U+220F, U
 +2211-U+2212, U+2219-U+221A, U+221E, U+222B, U+2248, U+2260, U+2264-U+2265, U+22F2, U+25CA, U+3007, U+4E00, U+4E03, U+4E09, U+4E5D, U+4E8C, U+4E94, U+516B, U+516D, U+5341, U+56D7, U+56DB, U+571F, U+6728, U+6C34, U+706B, U+91D1, U+F000-U+F002. The codepoints which are mapped to something else are the following: " " (U+20): No pa
 th but full advance; "p" (U+70): Path has 0 ascent but full descent; "\xC9" (U+C9): Path has 0 descent but full ascent; Non-breaking space (U+A0): No path b
 ut full advance; Zero-width non-breaking space (U+FEFF): No path and 0 advance; En space (U+2002): No path and half advance; Em space (U+2003): No path but full advance; Three-per-em space (U+2004): No path and one third advance; Four-per-em space (U+2005): No path and one quarter advance; Six-per-em space (U+2006): No path and one
  sixth advance; Thin space (U+2009): No path and one fifth advance; Hair space (U+200A): No path and one tenth advance; Zero width space (U+200B): No path and no adva
 nce; Ideographic space (U+3000): No path but full advance; Zero width non-joiner (U+200C): No path and no advance; Zero width joiner (U+200D): No path and no advance; Greek capital letter Chi (U+3A7): Thin horizontal stripe and full advance; (U+6A2A): Thin horizontal stripe and full advance; Greek capital letter Upsilon (U+3A5): T
 hin vertical stripe and full advance; (U+7EB5): Thin vertical stripe and full advance.http://www.w3c.orghttp://dev.w3.org/CSS/fonts/ahem/COPYING
+AhemRegularAhem\xFF{  + !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x80\x81\x83\x84\x85\x86\x88\x89\x8A\x8B\x8D\x8E\x90\x91\x93\x96\x97\x9D\x9E\xA0\xA1\xA2\xA3\xA4\xA9\xAA\xAC\xAD\xAE\xAF\xB6\xB7\xB8\xBA\xBD\xC3\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xB0\xB1\xBB\x
 A6\xA8\x9F\x9B\xB2\xB3\xC4\xB4\xB5\xC5\x82\xC2\x87\xAB\xC6\xBE\xBF\xBC\x8C\x98\x9A\x99\xA5\x92\x9C\x8F\x94\x95\xA7\xB9\xD2\xC0\xC1   
+  + !"#$%&'(NULLglyph243glyph204glyph205HTDELuniFEFFuni2002uni2003uni2004uni2005uni2006uni2009uni200Auni200Buni3000   afii61664afii301uni4E00uni4E8Cuni4E09uni56DBuni4E94uni516Duni4E03uni516Buni4E5Duni5341uni3007uni56D7uni706Buni6C34uni6728uni91D1uni571Funi03A7uni6A2Auni03A5uni7EB5
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/ChangeLog      2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -1,5 +1,42 @@
</span><span class="cx"> 2021-09-22  Myles C. Maxfield  <mmaxfield@apple.com>
</span><span class="cx"> 
</span><ins>+        [Cocoa] Hook up palettes to CoreText
+        https://bugs.webkit.org/show_bug.cgi?id=230449
+
+        Reviewed by Simon Fraser.
+
+        Now that we have FontCreationContext, we can just add FontPaletteValues to it, and turn
+        that into Core Text attributes in preparePlatformFont().
+
+        Test: imported/w3c/web-platform-tests/css/css-fonts/font-palette.html
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * css/CSSFontFace.cpp:
+        (WebCore::CSSFontFace::font):
+        * css/CSSFontFace.h:
+        * css/CSSFontSelector.cpp:
+        (WebCore::CSSFontSelector::lookupFontPaletteValues):
+        (WebCore::CSSFontSelector::fontRangesForFamily):
+        * css/CSSFontSelector.h:
+        * css/CSSSegmentedFontFace.cpp:
+        (WebCore::CSSSegmentedFontFace::fontRanges):
+        * css/CSSSegmentedFontFace.h:
+        * platform/graphics/FontCreationContext.h:
+        (WebCore::FontCreationContext::operator== const):
+        (WebCore::add):
+        * platform/graphics/FontPaletteValues.h:
+        (WebCore::FontPaletteValues::operator== const):
+        (WebCore::FontPaletteValues::operator!= const):
+        (WebCore::add):
+        * platform/graphics/Gradient.cpp:
+        * platform/graphics/Gradient.h:
+        (WebCore::add):
+        * platform/graphics/cocoa/FontCacheCoreText.cpp:
+        (WebCore::addAttributesForFontPalettes):
+        (WebCore::preparePlatformFont):
+
+2021-09-22  Myles C. Maxfield  <mmaxfield@apple.com>
+
</ins><span class="cx">         Rename the Shaping log channel to TextShaping
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=230665
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorePALChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/PAL/ChangeLog (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/PAL/ChangeLog       2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/PAL/ChangeLog  2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2021-09-22  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        [Cocoa] Hook up palettes to CoreText
+        https://bugs.webkit.org/show_bug.cgi?id=230449
+
+        Reviewed by Simon Fraser.
+
+        * pal/spi/cf/CoreTextSPI.h:
+
</ins><span class="cx"> 2021-09-21  Jean-Yves Avenard  <jya@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Use SharedMemory for transferring appended buffers from SourceBuffer to the GPU process
</span></span></pre></div>
<a id="trunkSourceWebCorePALpalspicfCoreTextSPIh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/PAL/pal/spi/cf/CoreTextSPI.h (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/PAL/pal/spi/cf/CoreTextSPI.h        2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/PAL/pal/spi/cf/CoreTextSPI.h   2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -87,6 +87,12 @@
</span><span class="cx">     kCTFontTraitEmphasized = kCTFontTraitBold,
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+typedef CF_ENUM(CFIndex, CTFontPalette)
+{
+    kCTFontPaletteLight = -1,
+    kCTFontPaletteDark = -2
+};
+
</ins><span class="cx"> typedef const struct __OTSVGTable * OTSVGTableRef;
</span><span class="cx"> 
</span><span class="cx"> #endif
</span><span class="lines">@@ -150,6 +156,9 @@
</span><span class="cx"> extern const CFStringRef kCTFontUIFontDesignMonospaced;
</span><span class="cx"> extern const CFStringRef kCTFontUIFontDesignRounded;
</span><span class="cx"> 
</span><ins>+extern const CFStringRef kCTFontPaletteAttribute;
+extern const CFStringRef kCTFontPaletteColorsAttribute;
+
</ins><span class="cx"> extern const CFStringRef kCTFrameMaximumNumberOfLinesAttributeName;
</span><span class="cx"> 
</span><span class="cx"> bool CTFontDescriptorIsSystemUIFont(CTFontDescriptorRef);
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj   2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj      2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -650,7 +650,7 @@
</span><span class="cx">          1C26671B26FA932F00117073 /* FontCreationContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C26671926FA7F2E00117073 /* FontCreationContext.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          1C43DE6B22AB4B8A001527D9 /* LocalCurrentTraitCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C43DE6822AB4B8A001527D9 /* LocalCurrentTraitCollection.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          1C4D0DD324D9F10D003D7498 /* GlyphBufferMembers.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C4D0DD124D9F0DB003D7498 /* GlyphBufferMembers.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-               1C5E1DA826F94B9000E07AF1 /* FontPaletteValues.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C5E1DA626F949B900E07AF1 /* FontPaletteValues.h */; };
</del><ins>+                1C5E1DA826F94B9000E07AF1 /* FontPaletteValues.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C5E1DA626F949B900E07AF1 /* FontPaletteValues.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">           1C6626111C6E7CA600AB527C /* FontFace.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C66260F1C6E7CA600AB527C /* FontFace.h */; };
</span><span class="cx">          1C73A7132185757E004CCEA5 /* TextUnderlineOffset.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CB6B4FB217B83940093B9CD /* TextUnderlineOffset.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          1C73A71521857587004CCEA5 /* TextDecorationThickness.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CB6B4F8217B83930093B9CD /* TextDecorationThickness.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSFontFacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSFontFace.cpp (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSFontFace.cpp 2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/css/CSSFontFace.cpp    2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> #include "FontCache.h"
</span><span class="cx"> #include "FontDescription.h"
</span><span class="cx"> #include "FontFace.h"
</span><ins>+#include "FontPaletteValues.h"
</ins><span class="cx"> #include "Settings.h"
</span><span class="cx"> #include "SharedBuffer.h"
</span><span class="cx"> #include "StyleBuilderConverter.h"
</span><span class="lines">@@ -651,7 +652,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr<Font> CSSFontFace::font(const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic, ExternalResourceDownloadPolicy policy)
</del><ins>+RefPtr<Font> CSSFontFace::font(const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic, ExternalResourceDownloadPolicy policy, const FontPaletteValues& fontPaletteValues)
</ins><span class="cx"> {
</span><span class="cx">     if (computeFailureState())
</span><span class="cx">         return nullptr;
</span><span class="lines">@@ -680,7 +681,7 @@
</span><span class="cx">             return Font::create(fontCache.lastResortFallbackFont(fontDescription)->platformData(), Font::Origin::Local, &fontCache, Font::Interstitial::Yes, visibility);
</span><span class="cx">         }
</span><span class="cx">         case CSSFontFaceSource::Status::Success: {
</span><del>-            FontCreationContext fontCreationContext { m_featureSettings, m_fontSelectionCapabilities };
</del><ins>+            FontCreationContext fontCreationContext { m_featureSettings, m_fontSelectionCapabilities, fontPaletteValues };
</ins><span class="cx">             if (auto result = source->font(fontDescription, syntheticBold, syntheticItalic, fontCreationContext))
</span><span class="cx">                 return result;
</span><span class="cx">             break;
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSFontFaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSFontFace.h (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSFontFace.h   2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/css/CSSFontFace.h      2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2007, 2008, 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2007-2021 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -47,6 +47,7 @@
</span><span class="cx"> class CSSValue;
</span><span class="cx"> class CSSValueList;
</span><span class="cx"> class FontCache;
</span><ins>+struct FontCreationContext;
</ins><span class="cx"> class FontDescription;
</span><span class="cx"> class Font;
</span><span class="cx"> class FontFace;
</span><span class="lines">@@ -115,7 +116,7 @@
</span><span class="cx"> 
</span><span class="cx">     void load();
</span><span class="cx"> 
</span><del>-    RefPtr<Font> font(const FontDescription&, bool syntheticBold, bool syntheticItalic, ExternalResourceDownloadPolicy);
</del><ins>+    RefPtr<Font> font(const FontDescription&, bool syntheticBold, bool syntheticItalic, ExternalResourceDownloadPolicy, const FontPaletteValues&);
</ins><span class="cx"> 
</span><span class="cx">     static void appendSources(CSSFontFace&, CSSValueList&, ScriptExecutionContext*, bool isInitiatingElementInUserAgentShadowTree);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSFontSelectorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSFontSelector.cpp (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSFontSelector.cpp     2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/css/CSSFontSelector.cpp        2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -317,6 +317,20 @@
</span><span class="cx">     return std::nullopt;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+const FontPaletteValues& CSSFontSelector::lookupFontPaletteValues(const AtomString& familyName, const FontDescription& fontDescription)
+{
+    static NeverDestroyed<FontPaletteValues> emptyFontPaletteValues;
+    if (fontDescription.fontPalette().type != FontPalette::Type::Custom)
+        return emptyFontPaletteValues.get();
+
+    const AtomString paletteName = fontDescription.fontPalette().identifier;
+
+    auto iterator = m_paletteFamilyMap.find(std::make_pair(familyName, paletteName));
+    if (iterator == m_paletteFamilyMap.end())
+        return emptyFontPaletteValues.get();
+    return iterator->value;
+}
+
</ins><span class="cx"> FontRanges CSSFontSelector::fontRangesForFamily(const FontDescription& fontDescription, const AtomString& familyName)
</span><span class="cx"> {
</span><span class="cx">     // If this ASSERT() fires, it usually means you forgot a document.updateStyleIfNeeded() somewhere.
</span><span class="lines">@@ -333,7 +347,7 @@
</span><span class="cx">             familyForLookup = *genericFamilyOptional;
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    // FIXME https://bugs.webkit.org/show_bug.cgi?id=230449: Query for font palette data and pass it into the font creation routines.
</del><ins>+    const auto& fontPaletteValues = lookupFontPaletteValues(familyName, fontDescription);
</ins><span class="cx"> 
</span><span class="cx">     if (resolveGenericFamilyFirst)
</span><span class="cx">         resolveAndAssignGenericFamily();
</span><span class="lines">@@ -342,12 +356,12 @@
</span><span class="cx">     if (face) {
</span><span class="cx">         if (document && RuntimeEnabledFeatures::sharedFeatures().webAPIStatisticsEnabled())
</span><span class="cx">             ResourceLoadObserver::shared().logFontLoad(*document, familyForLookup.string(), true);
</span><del>-        return face->fontRanges(*fontDescriptionForLookup);
</del><ins>+        return face->fontRanges(*fontDescriptionForLookup, fontPaletteValues);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (!resolveGenericFamilyFirst)
</span><span class="cx">         resolveAndAssignGenericFamily();
</span><del>-    auto font = m_fontCache->fontForFamily(*fontDescriptionForLookup, familyForLookup, { });
</del><ins>+    auto font = m_fontCache->fontForFamily(*fontDescriptionForLookup, familyForLookup, { { }, { }, fontPaletteValues });
</ins><span class="cx">     if (document && RuntimeEnabledFeatures::sharedFeatures().webAPIStatisticsEnabled())
</span><span class="cx">         ResourceLoadObserver::shared().logFontLoad(*document, familyForLookup.string(), !!font);
</span><span class="cx">     return FontRanges { WTFMove(font) };
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSFontSelectorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSFontSelector.h (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSFontSelector.h       2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/css/CSSFontSelector.h  2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -105,6 +105,8 @@
</span><span class="cx"> 
</span><span class="cx">     std::optional<AtomString> resolveGenericFamily(const FontDescription&, const AtomString& family);
</span><span class="cx"> 
</span><ins>+    const FontPaletteValues& lookupFontPaletteValues(const AtomString& familyName, const FontDescription&);
+
</ins><span class="cx">     // CSSFontFace::Client
</span><span class="cx">     void fontLoaded(CSSFontFace&) final;
</span><span class="cx">     void updateStyleIfNeeded(CSSFontFace&) final;
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSSegmentedFontFacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSSegmentedFontFace.cpp (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSSegmentedFontFace.cpp        2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/css/CSSSegmentedFontFace.cpp   2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2008, 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2008-2021 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -29,7 +29,9 @@
</span><span class="cx"> #include "CSSFontFace.h"
</span><span class="cx"> #include "Font.h"
</span><span class="cx"> #include "FontCache.h"
</span><ins>+#include "FontCreationContext.h"
</ins><span class="cx"> #include "FontDescription.h"
</span><ins>+#include "FontPaletteValues.h"
</ins><span class="cx"> #include "FontSelector.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -58,9 +60,9 @@
</span><span class="cx"> 
</span><span class="cx"> class CSSFontAccessor final : public FontAccessor {
</span><span class="cx"> public:
</span><del>-    static Ref<CSSFontAccessor> create(CSSFontFace& fontFace, const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic)
</del><ins>+    static Ref<CSSFontAccessor> create(CSSFontFace& fontFace, const FontDescription& fontDescription, const FontPaletteValues& fontPaletteValues, bool syntheticBold, bool syntheticItalic)
</ins><span class="cx">     {
</span><del>-        return adoptRef(*new CSSFontAccessor(fontFace, fontDescription, syntheticBold, syntheticItalic));
</del><ins>+        return adoptRef(*new CSSFontAccessor(fontFace, fontDescription, fontPaletteValues, syntheticBold, syntheticItalic));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     const Font* font(ExternalResourceDownloadPolicy policy) const final
</span><span class="lines">@@ -67,7 +69,7 @@
</span><span class="cx">     {
</span><span class="cx">         if (!m_result || (policy == ExternalResourceDownloadPolicy::Allow
</span><span class="cx">             && (m_fontFace->status() == CSSFontFace::Status::Pending || m_fontFace->status() == CSSFontFace::Status::Loading || m_fontFace->status() == CSSFontFace::Status::TimedOut))) {
</span><del>-            const auto result = m_fontFace->font(m_fontDescription, m_syntheticBold, m_syntheticItalic, policy);
</del><ins>+            const auto result = m_fontFace->font(m_fontDescription, m_syntheticBold, m_syntheticItalic, policy, m_fontPaletteValues);
</ins><span class="cx">             if (!m_result)
</span><span class="cx">                 m_result = result;
</span><span class="cx">         }
</span><span class="lines">@@ -75,9 +77,10 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    CSSFontAccessor(CSSFontFace& fontFace, const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic)
</del><ins>+    CSSFontAccessor(CSSFontFace& fontFace, const FontDescription& fontDescription, const FontPaletteValues& fontPaletteValues, bool syntheticBold, bool syntheticItalic)
</ins><span class="cx">         : m_fontFace(fontFace)
</span><span class="cx">         , m_fontDescription(fontDescription)
</span><ins>+        , m_fontPaletteValues(fontPaletteValues)
</ins><span class="cx">         , m_syntheticBold(syntheticBold)
</span><span class="cx">         , m_syntheticItalic(syntheticItalic)
</span><span class="cx">     {
</span><span class="lines">@@ -91,6 +94,7 @@
</span><span class="cx">     mutable std::optional<RefPtr<Font>> m_result; // Caches nullptr too
</span><span class="cx">     mutable Ref<CSSFontFace> m_fontFace;
</span><span class="cx">     FontDescription m_fontDescription;
</span><ins>+    FontPaletteValues m_fontPaletteValues;
</ins><span class="cx">     bool m_syntheticBold;
</span><span class="cx">     bool m_syntheticItalic;
</span><span class="cx"> };
</span><span class="lines">@@ -106,7 +110,7 @@
</span><span class="cx">         ranges.appendRange({ range.from, range.to, fontAccessor.copyRef() });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-FontRanges CSSSegmentedFontFace::fontRanges(const FontDescription& fontDescription)
</del><ins>+FontRanges CSSSegmentedFontFace::fontRanges(const FontDescription& fontDescription, const FontPaletteValues& fontPaletteValues)
</ins><span class="cx"> {
</span><span class="cx">     auto addResult = m_cache.add(FontDescriptionKey(fontDescription), FontRanges());
</span><span class="cx">     auto& ranges = addResult.iterator->value;
</span><span class="lines">@@ -126,7 +130,7 @@
</span><span class="cx">         bool syntheticItalic = (fontDescription.fontSynthesis() & FontSynthesisStyle) && !isItalic(selectionCapabilities.slope.maximum) && isItalic(desiredRequest.slope);
</span><span class="cx"> 
</span><span class="cx">         // Metrics used for layout come from FontRanges::fontForFirstRange(), which assumes that the first font is non-null.
</span><del>-        auto fontAccessor = CSSFontAccessor::create(face, fontDescription, syntheticBold, syntheticItalic);
</del><ins>+        auto fontAccessor = CSSFontAccessor::create(face, fontDescription, fontPaletteValues, syntheticBold, syntheticItalic);
</ins><span class="cx">         if (ranges.isNull() && !fontAccessor->font(ExternalResourceDownloadPolicy::Forbid))
</span><span class="cx">             continue;
</span><span class="cx">         
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSSegmentedFontFaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSSegmentedFontFace.h (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSSegmentedFontFace.h  2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/css/CSSSegmentedFontFace.h     2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2008 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2008-2021 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -34,7 +34,9 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class CSSFontSelector;
</span><ins>+struct FontCreationContext;
</ins><span class="cx"> class FontDescription;
</span><ins>+class FontPaletteValues;
</ins><span class="cx"> class FontRanges;
</span><span class="cx"> 
</span><span class="cx"> class CSSSegmentedFontFace final : public RefCounted<CSSSegmentedFontFace>, public CSSFontFace::Client {
</span><span class="lines">@@ -48,7 +50,7 @@
</span><span class="cx"> 
</span><span class="cx">     void appendFontFace(Ref<CSSFontFace>&&);
</span><span class="cx"> 
</span><del>-    FontRanges fontRanges(const FontDescription&);
</del><ins>+    FontRanges fontRanges(const FontDescription&, const FontPaletteValues&);
</ins><span class="cx"> 
</span><span class="cx">     Vector<Ref<CSSFontFace>, 1>& constituentFaces() { return m_fontFaces; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsFontCreationContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/FontCreationContext.h (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/FontCreationContext.h     2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/platform/graphics/FontCreationContext.h        2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><ins>+#include "FontPaletteValues.h"
</ins><span class="cx"> #include "FontSelectionAlgorithm.h"
</span><span class="cx"> #include "FontTaggedSettings.h"
</span><span class="cx"> 
</span><span class="lines">@@ -34,7 +35,8 @@
</span><span class="cx">     bool operator==(const FontCreationContext& other) const
</span><span class="cx">     {
</span><span class="cx">         return fontFaceFeatures == other.fontFaceFeatures
</span><del>-            && fontFaceCapabilities == other.fontFaceCapabilities;
</del><ins>+            && fontFaceCapabilities == other.fontFaceCapabilities
+            && fontPaletteValues == other.fontPaletteValues;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool operator!=(const FontCreationContext& other) const
</span><span class="lines">@@ -44,7 +46,8 @@
</span><span class="cx"> 
</span><span class="cx">     FontFeatureSettings fontFaceFeatures;
</span><span class="cx">     FontSelectionSpecifiedCapabilities fontFaceCapabilities;
</span><del>-    // FIXME: Add support for font-palette-values and font-feature-values.
</del><ins>+    FontPaletteValues fontPaletteValues;
+    // FIXME: Add support for font-feature-values.
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> inline void add(Hasher& hasher, const FontCreationContext& fontCreationContext)
</span><span class="lines">@@ -51,6 +54,7 @@
</span><span class="cx"> {
</span><span class="cx">     add(hasher, fontCreationContext.fontFaceFeatures);
</span><span class="cx">     add(hasher, fontCreationContext.fontFaceCapabilities.tied());
</span><ins>+    add(hasher, fontCreationContext.fontPaletteValues);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsFontPaletteValuesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/FontPaletteValues.h (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/FontPaletteValues.h       2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/platform/graphics/FontPaletteValues.h  2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include "Color.h"
</span><ins>+#include "Gradient.h"
</ins><span class="cx"> #include <wtf/Variant.h>
</span><span class="cx"> #include <wtf/Vector.h>
</span><span class="cx"> #include <wtf/text/AtomString.h>
</span><span class="lines">@@ -56,9 +57,25 @@
</span><span class="cx">         return m_overrideColor;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool operator==(const FontPaletteValues& other) const
+    {
+        return m_basePalette == other.m_basePalette && m_overrideColor == other.m_overrideColor;
+    }
+
+    bool operator!=(const FontPaletteValues& other) const
+    {
+        return !(*this == other);
+    }
+
</ins><span class="cx"> private:
</span><span class="cx">     PaletteIndex m_basePalette;
</span><span class="cx">     Vector<OverriddenColor> m_overrideColor;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+inline void add(Hasher& hasher, const FontPaletteValues& fontPaletteValues)
+{
+    add(hasher, fontPaletteValues.basePalette());
+    add(hasher, fontPaletteValues.overrideColor());
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGradientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/Gradient.cpp (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/Gradient.cpp      2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/platform/graphics/Gradient.cpp 2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2006-2020 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2006-2021 Apple Inc. All rights reserved.
</ins><span class="cx">  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
</span><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="lines">@@ -125,12 +125,6 @@
</span><span class="cx"> 
</span><span class="cx"> // FIXME: Instead of these add(Hasher) functions, consider using encode functions to compute the hash.
</span><span class="cx"> 
</span><del>-static void add(Hasher& hasher, const Color& color)
-{
-    // FIXME: We don't want to hash a hash; do better.
-    add(hasher, color.hash());
-}
-
</del><span class="cx"> static void add(Hasher& hasher, const FloatPoint& point)
</span><span class="cx"> {
</span><span class="cx">     add(hasher, point.x(), point.y());
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGradienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/Gradient.h (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/Gradient.h        2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/platform/graphics/Gradient.h   2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2006-2020 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2006-2021 Apple Inc. All rights reserved.
</ins><span class="cx">  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
</span><span class="cx">  * Copyright (C) 2008 Torch Mobile, Inc.
</span><span class="cx">  *
</span><span class="lines">@@ -304,4 +304,10 @@
</span><span class="cx">     return gradient;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline void add(Hasher& hasher, const Color& color)
+{
+    // FIXME: We don't want to hash a hash; do better.
+    add(hasher, color.hash());
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscocoaFontCacheCoreTextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp (282921 => 282922)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp       2021-09-23 04:48:59 UTC (rev 282921)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp  2021-09-23 04:52:05 UTC (rev 282922)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include "FontCascadeDescription.h"
</span><span class="cx"> #include "FontCreationContext.h"
</span><span class="cx"> #include "FontFamilySpecificationCoreText.h"
</span><ins>+#include "FontPaletteValues.h"
</ins><span class="cx"> #include "RenderThemeCocoa.h"
</span><span class="cx"> #include "SystemFontDatabaseCoreText.h"
</span><span class="cx"> #include "VersionChecks.h"
</span><span class="lines">@@ -442,6 +443,53 @@
</span><span class="cx">     bool aatShaping { false };
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+static void addAttributesForFontPalettes(CFMutableDictionaryRef attributes, const FontPalette& fontPalette, const FontPaletteValues& fontPaletteValues)
+{
+    switch (fontPalette.type) {
+    case FontPalette::Type::None:
+        // This is unimplementable in Core Text.
+        break;
+    case FontPalette::Type::Normal:
+        break;
+    case FontPalette::Type::Light: {
+        auto light = kCTFontPaletteLight;
+        auto number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &light));
+        CFDictionaryAddValue(attributes, kCTFontPaletteAttribute, number.get());
+        break;
+    }
+    case FontPalette::Type::Dark: {
+        auto dark = kCTFontPaletteDark;
+        auto number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberCFIndexType, &dark));
+        CFDictionaryAddValue(attributes, kCTFontPaletteAttribute, number.get());
+        break;
+    }
+    case FontPalette::Type::Custom: {
+        WTF::switchOn(fontPaletteValues.basePalette(), [&](int64_t index) {
+            auto number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberCFIndexType, &index));
+            CFDictionaryAddValue(attributes, kCTFontPaletteAttribute, number.get());
+        }, [](const AtomString&) {
+            // This is unimplementable in Core Text.
+        });
+        if (!fontPaletteValues.overrideColor().isEmpty()) {
+            auto overrideDictionary = adoptCF(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
+            for (const auto& pair : fontPaletteValues.overrideColor()) {
+                const auto& paletteColorIndex = pair.first;
+                const auto& color = pair.second;
+                WTF::switchOn(paletteColorIndex, [](const AtomString&) {
+                    // This is unimplementable in Core Text.
+                }, [&](int64_t index) {
+                    auto number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &index));
+                    auto colorObject = cachedCGColor(color);
+                    CFDictionaryAddValue(overrideDictionary.get(), number.get(), colorObject);
+                });
+            }
+            if (CFDictionaryGetCount(overrideDictionary.get()))
+                CFDictionaryAddValue(attributes, kCTFontPaletteColorsAttribute, overrideDictionary.get());
+        }
+    }
+    }
+}
+
</ins><span class="cx"> RetainPtr<CTFontRef> preparePlatformFont(CTFontRef originalFont, const FontDescription& fontDescription, const FontCreationContext& fontCreationContext, bool applyWeightWidthSlopeVariations)
</span><span class="cx"> {
</span><span class="cx">     if (!originalFont)
</span><span class="lines">@@ -464,6 +512,7 @@
</span><span class="cx">     const auto& variantSettings = fontDescription.variantSettings();
</span><span class="cx">     auto textRenderingMode = fontDescription.textRenderingMode();
</span><span class="cx">     auto shouldDisableLigaturesForSpacing = fontDescription.shouldDisableLigaturesForSpacing();
</span><ins>+    bool dontNeedToApplyFontPalettes = fontDescription.fontPalette().type == FontPalette::Type::Normal;
</ins><span class="cx"> 
</span><span class="cx">     // We might want to check fontType.trackingType == FontType::TrackingType::Manual here, but in order to maintain compatibility with the rest of the system, we don't.
</span><span class="cx">     bool noFontFeatureSettings = features.isEmpty();
</span><span class="lines">@@ -472,7 +521,7 @@
</span><span class="cx">     bool variantSettingsIsNormal = variantSettings.isAllNormal();
</span><span class="cx">     bool dontNeedToApplyOpticalSizing = fontOpticalSizing == FontOpticalSizing::Enabled && !forceOpticalSizingOn;
</span><span class="cx">     bool fontFaceDoesntSpecifyFeatures = fontCreationContext.fontFaceFeatures.isEmpty();
</span><del>-    if (noFontFeatureSettings && noFontVariationSettings && textRenderingModeIsAuto && variantSettingsIsNormal && dontNeedToApplyOpticalSizing && fontFaceDoesntSpecifyFeatures && !shouldDisableLigaturesForSpacing) {
</del><ins>+    if (noFontFeatureSettings && noFontVariationSettings && textRenderingModeIsAuto && variantSettingsIsNormal && dontNeedToApplyOpticalSizing && fontFaceDoesntSpecifyFeatures && !shouldDisableLigaturesForSpacing && dontNeedToApplyFontPalettes) {
</ins><span class="cx"> #if HAVE(CTFONTCREATEFORCHARACTERSWITHLANGUAGEANDOPTION)
</span><span class="cx">         return originalFont;
</span><span class="cx"> #else
</span><span class="lines">@@ -622,6 +671,8 @@
</span><span class="cx"> #endif
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    addAttributesForFontPalettes(attributes.get(), fontDescription.fontPalette(), fontCreationContext.fontPaletteValues);
+
</ins><span class="cx">     addAttributesForInstalledFonts(attributes.get(), fontDescription.shouldAllowUserInstalledFonts());
</span><span class="cx"> 
</span><span class="cx">     auto descriptor = adoptCF(CTFontDescriptorCreateWithAttributes(attributes.get()));
</span></span></pre>
</div>
</div>

</body>
</html>