Title: [282922] trunk
Revision
282922
Author
mmaxfi...@apple.com
Date
2021-09-22 21:52:05 -0700 (Wed, 22 Sep 2021)

Log Message

[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:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (282921 => 282922)


--- 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)
@@ -1,3 +1,16 @@
+2021-09-22  Myles C. Maxfield  <mmaxfi...@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.
+
 2021-09-22  Joonghun Park  <jh718.p...@samsung.com>
 
         Fix the behavior that setting text field input's value content attribute to the same value moves caret to the end of the input.

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-expected.html (0 => 282922)


--- 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)
@@ -0,0 +1,31 @@
+<!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=""
+<link rel="match" href=""
+<link rel="help" href=""
+<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>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette.html (0 => 282922)


--- 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)
@@ -0,0 +1,49 @@
+<!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=""
+<link rel="match" href=""
+<link rel="help" href=""
+<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>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/resources/Ahem-COLOR-palettes.ttf (0 => 282922)


--- 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)
@@ -0,0 +1,43 @@
++\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?LYfs\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
+,Fr)\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
\ No newline at end of file

Modified: trunk/Source/WebCore/ChangeLog (282921 => 282922)


--- 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)
@@ -1,5 +1,42 @@
 2021-09-22  Myles C. Maxfield  <mmaxfi...@apple.com>
 
+        [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  <mmaxfi...@apple.com>
+
         Rename the Shaping log channel to TextShaping
         https://bugs.webkit.org/show_bug.cgi?id=230665
 

Modified: trunk/Source/WebCore/PAL/ChangeLog (282921 => 282922)


--- 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)
@@ -1,3 +1,12 @@
+2021-09-22  Myles C. Maxfield  <mmaxfi...@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:
+
 2021-09-21  Jean-Yves Avenard  <j...@apple.com>
 
         Use SharedMemory for transferring appended buffers from SourceBuffer to the GPU process

Modified: trunk/Source/WebCore/PAL/pal/spi/cf/CoreTextSPI.h (282921 => 282922)


--- 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)
@@ -87,6 +87,12 @@
     kCTFontTraitEmphasized = kCTFontTraitBold,
 };
 
+typedef CF_ENUM(CFIndex, CTFontPalette)
+{
+    kCTFontPaletteLight = -1,
+    kCTFontPaletteDark = -2
+};
+
 typedef const struct __OTSVGTable * OTSVGTableRef;
 
 #endif
@@ -150,6 +156,9 @@
 extern const CFStringRef kCTFontUIFontDesignMonospaced;
 extern const CFStringRef kCTFontUIFontDesignRounded;
 
+extern const CFStringRef kCTFontPaletteAttribute;
+extern const CFStringRef kCTFontPaletteColorsAttribute;
+
 extern const CFStringRef kCTFrameMaximumNumberOfLinesAttributeName;
 
 bool CTFontDescriptorIsSystemUIFont(CTFontDescriptorRef);

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (282921 => 282922)


--- 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)
@@ -650,7 +650,7 @@
 		1C26671B26FA932F00117073 /* FontCreationContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C26671926FA7F2E00117073 /* FontCreationContext.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		1C43DE6B22AB4B8A001527D9 /* LocalCurrentTraitCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C43DE6822AB4B8A001527D9 /* LocalCurrentTraitCollection.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		1C4D0DD324D9F10D003D7498 /* GlyphBufferMembers.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C4D0DD124D9F0DB003D7498 /* GlyphBufferMembers.h */; settings = {ATTRIBUTES = (Private, ); }; };
-		1C5E1DA826F94B9000E07AF1 /* FontPaletteValues.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C5E1DA626F949B900E07AF1 /* FontPaletteValues.h */; };
+		1C5E1DA826F94B9000E07AF1 /* FontPaletteValues.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C5E1DA626F949B900E07AF1 /* FontPaletteValues.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		1C6626111C6E7CA600AB527C /* FontFace.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C66260F1C6E7CA600AB527C /* FontFace.h */; };
 		1C73A7132185757E004CCEA5 /* TextUnderlineOffset.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CB6B4FB217B83940093B9CD /* TextUnderlineOffset.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		1C73A71521857587004CCEA5 /* TextDecorationThickness.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CB6B4F8217B83930093B9CD /* TextDecorationThickness.h */; settings = {ATTRIBUTES = (Private, ); }; };

Modified: trunk/Source/WebCore/css/CSSFontFace.cpp (282921 => 282922)


--- 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)
@@ -41,6 +41,7 @@
 #include "FontCache.h"
 #include "FontDescription.h"
 #include "FontFace.h"
+#include "FontPaletteValues.h"
 #include "Settings.h"
 #include "SharedBuffer.h"
 #include "StyleBuilderConverter.h"
@@ -651,7 +652,7 @@
     }
 }
 
-RefPtr<Font> CSSFontFace::font(const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic, ExternalResourceDownloadPolicy policy)
+RefPtr<Font> CSSFontFace::font(const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic, ExternalResourceDownloadPolicy policy, const FontPaletteValues& fontPaletteValues)
 {
     if (computeFailureState())
         return nullptr;
@@ -680,7 +681,7 @@
             return Font::create(fontCache.lastResortFallbackFont(fontDescription)->platformData(), Font::Origin::Local, &fontCache, Font::Interstitial::Yes, visibility);
         }
         case CSSFontFaceSource::Status::Success: {
-            FontCreationContext fontCreationContext { m_featureSettings, m_fontSelectionCapabilities };
+            FontCreationContext fontCreationContext { m_featureSettings, m_fontSelectionCapabilities, fontPaletteValues };
             if (auto result = source->font(fontDescription, syntheticBold, syntheticItalic, fontCreationContext))
                 return result;
             break;

Modified: trunk/Source/WebCore/css/CSSFontFace.h (282921 => 282922)


--- 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)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007, 2008, 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2007-2021 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -47,6 +47,7 @@
 class CSSValue;
 class CSSValueList;
 class FontCache;
+struct FontCreationContext;
 class FontDescription;
 class Font;
 class FontFace;
@@ -115,7 +116,7 @@
 
     void load();
 
-    RefPtr<Font> font(const FontDescription&, bool syntheticBold, bool syntheticItalic, ExternalResourceDownloadPolicy);
+    RefPtr<Font> font(const FontDescription&, bool syntheticBold, bool syntheticItalic, ExternalResourceDownloadPolicy, const FontPaletteValues&);
 
     static void appendSources(CSSFontFace&, CSSValueList&, ScriptExecutionContext*, bool isInitiatingElementInUserAgentShadowTree);
 

Modified: trunk/Source/WebCore/css/CSSFontSelector.cpp (282921 => 282922)


--- 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)
@@ -317,6 +317,20 @@
     return std::nullopt;
 }
 
+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;
+}
+
 FontRanges CSSFontSelector::fontRangesForFamily(const FontDescription& fontDescription, const AtomString& familyName)
 {
     // If this ASSERT() fires, it usually means you forgot a document.updateStyleIfNeeded() somewhere.
@@ -333,7 +347,7 @@
             familyForLookup = *genericFamilyOptional;
     };
 
-    // FIXME https://bugs.webkit.org/show_bug.cgi?id=230449: Query for font palette data and pass it into the font creation routines.
+    const auto& fontPaletteValues = lookupFontPaletteValues(familyName, fontDescription);
 
     if (resolveGenericFamilyFirst)
         resolveAndAssignGenericFamily();
@@ -342,12 +356,12 @@
     if (face) {
         if (document && RuntimeEnabledFeatures::sharedFeatures().webAPIStatisticsEnabled())
             ResourceLoadObserver::shared().logFontLoad(*document, familyForLookup.string(), true);
-        return face->fontRanges(*fontDescriptionForLookup);
+        return face->fontRanges(*fontDescriptionForLookup, fontPaletteValues);
     }
 
     if (!resolveGenericFamilyFirst)
         resolveAndAssignGenericFamily();
-    auto font = m_fontCache->fontForFamily(*fontDescriptionForLookup, familyForLookup, { });
+    auto font = m_fontCache->fontForFamily(*fontDescriptionForLookup, familyForLookup, { { }, { }, fontPaletteValues });
     if (document && RuntimeEnabledFeatures::sharedFeatures().webAPIStatisticsEnabled())
         ResourceLoadObserver::shared().logFontLoad(*document, familyForLookup.string(), !!font);
     return FontRanges { WTFMove(font) };

Modified: trunk/Source/WebCore/css/CSSFontSelector.h (282921 => 282922)


--- 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)
@@ -105,6 +105,8 @@
 
     std::optional<AtomString> resolveGenericFamily(const FontDescription&, const AtomString& family);
 
+    const FontPaletteValues& lookupFontPaletteValues(const AtomString& familyName, const FontDescription&);
+
     // CSSFontFace::Client
     void fontLoaded(CSSFontFace&) final;
     void updateStyleIfNeeded(CSSFontFace&) final;

Modified: trunk/Source/WebCore/css/CSSSegmentedFontFace.cpp (282921 => 282922)


--- 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)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2008-2021 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -29,7 +29,9 @@
 #include "CSSFontFace.h"
 #include "Font.h"
 #include "FontCache.h"
+#include "FontCreationContext.h"
 #include "FontDescription.h"
+#include "FontPaletteValues.h"
 #include "FontSelector.h"
 
 namespace WebCore {
@@ -58,9 +60,9 @@
 
 class CSSFontAccessor final : public FontAccessor {
 public:
-    static Ref<CSSFontAccessor> create(CSSFontFace& fontFace, const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic)
+    static Ref<CSSFontAccessor> create(CSSFontFace& fontFace, const FontDescription& fontDescription, const FontPaletteValues& fontPaletteValues, bool syntheticBold, bool syntheticItalic)
     {
-        return adoptRef(*new CSSFontAccessor(fontFace, fontDescription, syntheticBold, syntheticItalic));
+        return adoptRef(*new CSSFontAccessor(fontFace, fontDescription, fontPaletteValues, syntheticBold, syntheticItalic));
     }
 
     const Font* font(ExternalResourceDownloadPolicy policy) const final
@@ -67,7 +69,7 @@
     {
         if (!m_result || (policy == ExternalResourceDownloadPolicy::Allow
             && (m_fontFace->status() == CSSFontFace::Status::Pending || m_fontFace->status() == CSSFontFace::Status::Loading || m_fontFace->status() == CSSFontFace::Status::TimedOut))) {
-            const auto result = m_fontFace->font(m_fontDescription, m_syntheticBold, m_syntheticItalic, policy);
+            const auto result = m_fontFace->font(m_fontDescription, m_syntheticBold, m_syntheticItalic, policy, m_fontPaletteValues);
             if (!m_result)
                 m_result = result;
         }
@@ -75,9 +77,10 @@
     }
 
 private:
-    CSSFontAccessor(CSSFontFace& fontFace, const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic)
+    CSSFontAccessor(CSSFontFace& fontFace, const FontDescription& fontDescription, const FontPaletteValues& fontPaletteValues, bool syntheticBold, bool syntheticItalic)
         : m_fontFace(fontFace)
         , m_fontDescription(fontDescription)
+        , m_fontPaletteValues(fontPaletteValues)
         , m_syntheticBold(syntheticBold)
         , m_syntheticItalic(syntheticItalic)
     {
@@ -91,6 +94,7 @@
     mutable std::optional<RefPtr<Font>> m_result; // Caches nullptr too
     mutable Ref<CSSFontFace> m_fontFace;
     FontDescription m_fontDescription;
+    FontPaletteValues m_fontPaletteValues;
     bool m_syntheticBold;
     bool m_syntheticItalic;
 };
@@ -106,7 +110,7 @@
         ranges.appendRange({ range.from, range.to, fontAccessor.copyRef() });
 }
 
-FontRanges CSSSegmentedFontFace::fontRanges(const FontDescription& fontDescription)
+FontRanges CSSSegmentedFontFace::fontRanges(const FontDescription& fontDescription, const FontPaletteValues& fontPaletteValues)
 {
     auto addResult = m_cache.add(FontDescriptionKey(fontDescription), FontRanges());
     auto& ranges = addResult.iterator->value;
@@ -126,7 +130,7 @@
         bool syntheticItalic = (fontDescription.fontSynthesis() & FontSynthesisStyle) && !isItalic(selectionCapabilities.slope.maximum) && isItalic(desiredRequest.slope);
 
         // Metrics used for layout come from FontRanges::fontForFirstRange(), which assumes that the first font is non-null.
-        auto fontAccessor = CSSFontAccessor::create(face, fontDescription, syntheticBold, syntheticItalic);
+        auto fontAccessor = CSSFontAccessor::create(face, fontDescription, fontPaletteValues, syntheticBold, syntheticItalic);
         if (ranges.isNull() && !fontAccessor->font(ExternalResourceDownloadPolicy::Forbid))
             continue;
         

Modified: trunk/Source/WebCore/css/CSSSegmentedFontFace.h (282921 => 282922)


--- 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)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2008-2021 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -34,7 +34,9 @@
 namespace WebCore {
 
 class CSSFontSelector;
+struct FontCreationContext;
 class FontDescription;
+class FontPaletteValues;
 class FontRanges;
 
 class CSSSegmentedFontFace final : public RefCounted<CSSSegmentedFontFace>, public CSSFontFace::Client {
@@ -48,7 +50,7 @@
 
     void appendFontFace(Ref<CSSFontFace>&&);
 
-    FontRanges fontRanges(const FontDescription&);
+    FontRanges fontRanges(const FontDescription&, const FontPaletteValues&);
 
     Vector<Ref<CSSFontFace>, 1>& constituentFaces() { return m_fontFaces; }
 

Modified: trunk/Source/WebCore/platform/graphics/FontCreationContext.h (282921 => 282922)


--- 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)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "FontPaletteValues.h"
 #include "FontSelectionAlgorithm.h"
 #include "FontTaggedSettings.h"
 
@@ -34,7 +35,8 @@
     bool operator==(const FontCreationContext& other) const
     {
         return fontFaceFeatures == other.fontFaceFeatures
-            && fontFaceCapabilities == other.fontFaceCapabilities;
+            && fontFaceCapabilities == other.fontFaceCapabilities
+            && fontPaletteValues == other.fontPaletteValues;
     }
 
     bool operator!=(const FontCreationContext& other) const
@@ -44,7 +46,8 @@
 
     FontFeatureSettings fontFaceFeatures;
     FontSelectionSpecifiedCapabilities fontFaceCapabilities;
-    // FIXME: Add support for font-palette-values and font-feature-values.
+    FontPaletteValues fontPaletteValues;
+    // FIXME: Add support for font-feature-values.
 };
 
 inline void add(Hasher& hasher, const FontCreationContext& fontCreationContext)
@@ -51,6 +54,7 @@
 {
     add(hasher, fontCreationContext.fontFaceFeatures);
     add(hasher, fontCreationContext.fontFaceCapabilities.tied());
+    add(hasher, fontCreationContext.fontPaletteValues);
 }
 
 }

Modified: trunk/Source/WebCore/platform/graphics/FontPaletteValues.h (282921 => 282922)


--- 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)
@@ -26,6 +26,7 @@
 #pragma once
 
 #include "Color.h"
+#include "Gradient.h"
 #include <wtf/Variant.h>
 #include <wtf/Vector.h>
 #include <wtf/text/AtomString.h>
@@ -56,9 +57,25 @@
         return m_overrideColor;
     }
 
+    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);
+    }
+
 private:
     PaletteIndex m_basePalette;
     Vector<OverriddenColor> m_overrideColor;
 };
 
+inline void add(Hasher& hasher, const FontPaletteValues& fontPaletteValues)
+{
+    add(hasher, fontPaletteValues.basePalette());
+    add(hasher, fontPaletteValues.overrideColor());
 }
+
+}

Modified: trunk/Source/WebCore/platform/graphics/Gradient.cpp (282921 => 282922)


--- 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)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2020 Apple Inc. All rights reserved.
+ * Copyright (C) 2006-2021 Apple Inc. All rights reserved.
  * Copyright (C) 2007 Alp Toker <a...@atoker.com>
  *
  * Redistribution and use in source and binary forms, with or without
@@ -125,12 +125,6 @@
 
 // FIXME: Instead of these add(Hasher) functions, consider using encode functions to compute the hash.
 
-static void add(Hasher& hasher, const Color& color)
-{
-    // FIXME: We don't want to hash a hash; do better.
-    add(hasher, color.hash());
-}
-
 static void add(Hasher& hasher, const FloatPoint& point)
 {
     add(hasher, point.x(), point.y());

Modified: trunk/Source/WebCore/platform/graphics/Gradient.h (282921 => 282922)


--- 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)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2020 Apple Inc. All rights reserved.
+ * Copyright (C) 2006-2021 Apple Inc. All rights reserved.
  * Copyright (C) 2007 Alp Toker <a...@atoker.com>
  * Copyright (C) 2008 Torch Mobile, Inc.
  *
@@ -304,4 +304,10 @@
     return gradient;
 }
 
+inline void add(Hasher& hasher, const Color& color)
+{
+    // FIXME: We don't want to hash a hash; do better.
+    add(hasher, color.hash());
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp (282921 => 282922)


--- 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)
@@ -31,6 +31,7 @@
 #include "FontCascadeDescription.h"
 #include "FontCreationContext.h"
 #include "FontFamilySpecificationCoreText.h"
+#include "FontPaletteValues.h"
 #include "RenderThemeCocoa.h"
 #include "SystemFontDatabaseCoreText.h"
 #include "VersionChecks.h"
@@ -442,6 +443,53 @@
     bool aatShaping { false };
 };
 
+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());
+        }
+    }
+    }
+}
+
 RetainPtr<CTFontRef> preparePlatformFont(CTFontRef originalFont, const FontDescription& fontDescription, const FontCreationContext& fontCreationContext, bool applyWeightWidthSlopeVariations)
 {
     if (!originalFont)
@@ -464,6 +512,7 @@
     const auto& variantSettings = fontDescription.variantSettings();
     auto textRenderingMode = fontDescription.textRenderingMode();
     auto shouldDisableLigaturesForSpacing = fontDescription.shouldDisableLigaturesForSpacing();
+    bool dontNeedToApplyFontPalettes = fontDescription.fontPalette().type == FontPalette::Type::Normal;
 
     // 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.
     bool noFontFeatureSettings = features.isEmpty();
@@ -472,7 +521,7 @@
     bool variantSettingsIsNormal = variantSettings.isAllNormal();
     bool dontNeedToApplyOpticalSizing = fontOpticalSizing == FontOpticalSizing::Enabled && !forceOpticalSizingOn;
     bool fontFaceDoesntSpecifyFeatures = fontCreationContext.fontFaceFeatures.isEmpty();
-    if (noFontFeatureSettings && noFontVariationSettings && textRenderingModeIsAuto && variantSettingsIsNormal && dontNeedToApplyOpticalSizing && fontFaceDoesntSpecifyFeatures && !shouldDisableLigaturesForSpacing) {
+    if (noFontFeatureSettings && noFontVariationSettings && textRenderingModeIsAuto && variantSettingsIsNormal && dontNeedToApplyOpticalSizing && fontFaceDoesntSpecifyFeatures && !shouldDisableLigaturesForSpacing && dontNeedToApplyFontPalettes) {
 #if HAVE(CTFONTCREATEFORCHARACTERSWITHLANGUAGEANDOPTION)
         return originalFont;
 #else
@@ -622,6 +671,8 @@
 #endif
     }
 
+    addAttributesForFontPalettes(attributes.get(), fontDescription.fontPalette(), fontCreationContext.fontPaletteValues);
+
     addAttributesForInstalledFonts(attributes.get(), fontDescription.shouldAllowUserInstalledFonts());
 
     auto descriptor = adoptCF(CTFontDescriptorCreateWithAttributes(attributes.get()));
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to