<!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>[218616] 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/218616">218616</a></dd>
<dt>Author</dt> <dd>mmaxfield@apple.com</dd>
<dt>Date</dt> <dd>2017-06-20 16:52:22 -0700 (Tue, 20 Jun 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Cocoa] The system Japanese font cannot be italicized
https://bugs.webkit.org/show_bug.cgi?id=173300
<rdar://problem/31805407>

Reviewed by Ryosuke Niwa.

Source/WebCore:

Items in the system font cascade list may lie about whether or not they support italics.
In order to get the truth, we need to use the physical font underlying the font in question,
because this one won't lie. Then, we can interrogate this physical font about its traits
in order to synthesize italics correctly.

Test: fast/text/system-font-japanese-synthetic-italic.html

* platform/graphics/cocoa/FontCacheCoreText.cpp:
(WebCore::lookupFallbackFont):
* platform/graphics/cocoa/FontFamilySpecificationCoreText.cpp:
(WebCore::FontFamilySpecificationCoreText::fontRanges):

LayoutTests:

* fast/text/system-font-japanese-synthetic-italic-expected-mismatch.html: Added.
* fast/text/system-font-japanese-synthetic-italic.html: Added.
* platform/mac/TestExpectations: This codepath doesn't work in El Capitan.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformmacTestExpectations">trunk/LayoutTests/platform/mac/TestExpectations</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscocoaFontCacheCoreTextcpp">trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscocoaFontFamilySpecificationCoreTextcpp">trunk/Source/WebCore/platform/graphics/cocoa/FontFamilySpecificationCoreText.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfasttextsystemfontjapanesesyntheticitalicexpectedmismatchhtml">trunk/LayoutTests/fast/text/system-font-japanese-synthetic-italic-expected-mismatch.html</a></li>
<li><a href="#trunkLayoutTestsfasttextsystemfontjapanesesyntheticitalichtml">trunk/LayoutTests/fast/text/system-font-japanese-synthetic-italic.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (218615 => 218616)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2017-06-20 23:42:18 UTC (rev 218615)
+++ trunk/LayoutTests/ChangeLog 2017-06-20 23:52:22 UTC (rev 218616)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2017-06-20  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        [Cocoa] The system Japanese font cannot be italicized
+        https://bugs.webkit.org/show_bug.cgi?id=173300
+        <rdar://problem/31805407>
+
+        Reviewed by Ryosuke Niwa.
+
+        * fast/text/system-font-japanese-synthetic-italic-expected-mismatch.html: Added.
+        * fast/text/system-font-japanese-synthetic-italic.html: Added.
+        * platform/mac/TestExpectations: This codepath doesn't work in El Capitan.
+
</ins><span class="cx"> 2017-06-20  Ryan Haddad  <ryanhaddad@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r218524.
</span></span></pre></div>
<a id="trunkLayoutTestsfasttextsystemfontjapanesesyntheticitalicexpectedmismatchhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/text/system-font-japanese-synthetic-italic-expected-mismatch.html (0 => 218616)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/system-font-japanese-synthetic-italic-expected-mismatch.html                         (rev 0)
+++ trunk/LayoutTests/fast/text/system-font-japanese-synthetic-italic-expected-mismatch.html    2017-06-20 23:52:22 UTC (rev 218616)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+</head>
+<body>
+This test makes sure that the Japanese system font can be italicized. The test passes if the character below is oblique (either because the font supports it or because WebKit synthesizes the oblique).
+<div style="font: 100px 'system-ui';">の</div>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkLayoutTestsfasttextsystemfontjapanesesyntheticitalichtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/text/system-font-japanese-synthetic-italic.html (0 => 218616)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/system-font-japanese-synthetic-italic.html                           (rev 0)
+++ trunk/LayoutTests/fast/text/system-font-japanese-synthetic-italic.html      2017-06-20 23:52:22 UTC (rev 218616)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+</head>
+<body>
+This test makes sure that the Japanese system font can be italicized. The test passes if the character below is oblique (either because the font supports it or because WebKit synthesizes the oblique).
+<div style="font: 100px 'system-ui'; font-style: italic;">の</div>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkLayoutTestsplatformmacTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac/TestExpectations (218615 => 218616)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/TestExpectations  2017-06-20 23:42:18 UTC (rev 218615)
+++ trunk/LayoutTests/platform/mac/TestExpectations     2017-06-20 23:52:22 UTC (rev 218616)
</span><span class="lines">@@ -1605,3 +1605,4 @@
</span><span class="cx"> 
</span><span class="cx"> webkit.org/b/173487 imported/w3c/web-platform-tests/IndexedDB/large-nested-cloning.html [ Pass Failure ]
</span><span class="cx"> 
</span><ins>+webkit.org/b/313156 [ ElCapitan ] fast/text/system-font-japanese-synthetic-italic.html [ ImageOnlyFailure ]
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (218615 => 218616)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2017-06-20 23:42:18 UTC (rev 218615)
+++ trunk/Source/WebCore/ChangeLog      2017-06-20 23:52:22 UTC (rev 218616)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2017-06-20  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        [Cocoa] The system Japanese font cannot be italicized
+        https://bugs.webkit.org/show_bug.cgi?id=173300
+        <rdar://problem/31805407>
+
+        Reviewed by Ryosuke Niwa.
+
+        Items in the system font cascade list may lie about whether or not they support italics.
+        In order to get the truth, we need to use the physical font underlying the font in question,
+        because this one won't lie. Then, we can interrogate this physical font about its traits
+        in order to synthesize italics correctly.
+
+        Test: fast/text/system-font-japanese-synthetic-italic.html
+
+        * platform/graphics/cocoa/FontCacheCoreText.cpp:
+        (WebCore::lookupFallbackFont):
+        * platform/graphics/cocoa/FontFamilySpecificationCoreText.cpp:
+        (WebCore::FontFamilySpecificationCoreText::fontRanges):
+
</ins><span class="cx"> 2017-06-20  Chris Dumez  <cdumez@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Use WTF::Function instead of std::function in more places in WebCore/
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscocoaFontCacheCoreTextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp (218615 => 218616)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp       2017-06-20 23:42:18 UTC (rev 218615)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp  2017-06-20 23:52:22 UTC (rev 218616)
</span><span class="lines">@@ -1292,7 +1292,12 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     CFIndex coveredLength = 0;
</span><del>-    auto result = adoptCF(CTFontCreateForCharactersWithLanguage(font, characters, length, localeString.get(), &coveredLength));
</del><ins>+    RetainPtr<CTFontRef> result;
+#if !USE_PLATFORM_SYSTEM_FALLBACK_LIST && ((PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200) || (PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 100000))
+    result = adoptCF(CTFontCreatePhysicalFontForCharactersWithLanguage(font, characters, length, localeString.get(), &coveredLength));
+#else
+    result = adoptCF(CTFontCreateForCharactersWithLanguage(font, characters, length, localeString.get(), &coveredLength));
+#endif
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     // Callers of this function won't include multiple code points. "Length" is to know how many code units
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscocoaFontFamilySpecificationCoreTextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontFamilySpecificationCoreText.cpp (218615 => 218616)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cocoa/FontFamilySpecificationCoreText.cpp 2017-06-20 23:42:18 UTC (rev 218615)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontFamilySpecificationCoreText.cpp    2017-06-20 23:52:22 UTC (rev 218616)
</span><span class="lines">@@ -28,8 +28,14 @@
</span><span class="cx"> 
</span><span class="cx"> #include "FontCache.h"
</span><span class="cx"> #include "FontSelector.h"
</span><ins>+#include "SoftLinking.h"
</ins><span class="cx"> #include <CoreText/CoreText.h>
</span><span class="cx"> 
</span><ins>+#if USE_PLATFORM_SYSTEM_FALLBACK_LIST
+SOFT_LINK_FRAMEWORK(CoreText);
+SOFT_LINK_MAY_FAIL(CoreText, CTFontCopyPhysicalFont, CTFontRef, (CTFontRef font), (font));
+#endif
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> FontFamilySpecificationCoreText::FontFamilySpecificationCoreText(CTFontDescriptorRef fontDescriptor)
</span><span class="lines">@@ -47,10 +53,18 @@
</span><span class="cx"> 
</span><span class="cx">     auto font = adoptCF(CTFontCreateWithFontDescriptor(m_fontDescriptor.get(), size, nullptr));
</span><span class="cx"> 
</span><ins>+    auto fontForSynthesisComputation = font;
+#if USE_PLATFORM_SYSTEM_FALLBACK_LIST
+    if (canLoadCTFontCopyPhysicalFont()) {
+        if (auto physicalFont = adoptCF(CTFontCopyPhysicalFont(font.get())))
+            fontForSynthesisComputation = physicalFont;
+    }
+#endif
+
</ins><span class="cx">     font = preparePlatformFont(font.get(), fontDescription, nullptr, nullptr, { }, fontDescription.computedSize());
</span><span class="cx"> 
</span><span class="cx">     bool syntheticBold, syntheticOblique;
</span><del>-    std::tie(syntheticBold, syntheticOblique) = computeNecessarySynthesis(font.get(), fontDescription).boldObliquePair();
</del><ins>+    std::tie(syntheticBold, syntheticOblique) = computeNecessarySynthesis(fontForSynthesisComputation.get(), fontDescription).boldObliquePair();
</ins><span class="cx"> 
</span><span class="cx">     FontPlatformData fontPlatformData(font.get(), size, syntheticBold, syntheticOblique, fontDescription.orientation(), fontDescription.widthVariant(), fontDescription.textRenderingMode());
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>