<!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>[214594] trunk/Source/WebCore</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/214594">214594</a></dd>
<dt>Author</dt> <dd>mmaxfield@apple.com</dd>
<dt>Date</dt> <dd>2017-03-29 19:58:37 -0700 (Wed, 29 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Migrate to kCTFontCSSWidthAttribute
https://bugs.webkit.org/show_bug.cgi?id=170265

Reviewed by Darin Adler.

Previously, we were mapping from Core Text widths to CSS widths in WebKit.
However, on some OSes, Core Text can directly tell us what the CSS width
value is.

No new tests because there is no behavior change.

* platform/graphics/cocoa/FontCacheCoreText.cpp:
(WebCore::getCSSAttribute):
(WebCore::capabilitiesForFontDescriptor):
* platform/spi/cocoa/CoreTextSPI.h:</pre>

<h3>Modified Paths</h3>
<ul>
<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="#trunkSourceWebCoreplatformspicocoaCoreTextSPIh">trunk/Source/WebCore/platform/spi/cocoa/CoreTextSPI.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (214593 => 214594)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-03-30 02:58:15 UTC (rev 214593)
+++ trunk/Source/WebCore/ChangeLog        2017-03-30 02:58:37 UTC (rev 214594)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2017-03-29  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        Migrate to kCTFontCSSWidthAttribute
+        https://bugs.webkit.org/show_bug.cgi?id=170265
+
+        Reviewed by Darin Adler.
+
+        Previously, we were mapping from Core Text widths to CSS widths in WebKit.
+        However, on some OSes, Core Text can directly tell us what the CSS width
+        value is.
+
+        No new tests because there is no behavior change.
+
+        * platform/graphics/cocoa/FontCacheCoreText.cpp:
+        (WebCore::getCSSAttribute):
+        (WebCore::capabilitiesForFontDescriptor):
+        * platform/spi/cocoa/CoreTextSPI.h:
+
</ins><span class="cx"> 2017-03-28  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Make it possible to dump touch event regions for testing
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscocoaFontCacheCoreTextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp (214593 => 214594)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp        2017-03-30 02:58:15 UTC (rev 214593)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp        2017-03-30 02:58:37 UTC (rev 214594)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #define SHOULD_USE_CORE_TEXT_FONT_LOOKUP (PLATFORM(MAC) &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &lt; 101200)
</span><ins>+#define HAS_CORE_TEXT_WIDTH_ATTRIBUTE ((PLATFORM(MAC) &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101300) || (PLATFORM(IOS) &amp;&amp; __IPHONE_OS_VERSION_MIN_REQUIRED &gt;= 110000))
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -419,8 +420,7 @@
</span><span class="cx">     }
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><del>-#endif
-#if ENABLE(VARIATION_FONTS)
</del><ins>+
</ins><span class="cx"> static inline bool fontIsSystemFont(CTFontRef font)
</span><span class="cx"> {
</span><span class="cx">     if (CTFontDescriptorIsSystemUIFont(adoptCF(CTFontCopyFontDescriptor(font)).get()))
</span><span class="lines">@@ -477,6 +477,7 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if !HAS_CORE_TEXT_WIDTH_ATTRIBUTE || ENABLE(VARIATION_FONTS)
</ins><span class="cx"> static inline float normalizeWidth(float value)
</span><span class="cx"> {
</span><span class="cx">     if (value &lt; 0.5)
</span><span class="lines">@@ -483,6 +484,7 @@
</span><span class="cx">         return value * 50 + 100;
</span><span class="cx">     return value * 150 + 50;
</span><span class="cx"> }
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx"> RetainPtr&lt;CTFontRef&gt; preparePlatformFont(CTFontRef originalFont, TextRenderingMode textRenderingMode, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, const FontFeatureSettings&amp; features, const FontVariantSettings&amp; variantSettings, FontSelectionRequest fontSelectionRequest, const FontVariationSettings&amp; variations, FontOpticalSizing fontOpticalSizing, float size)
</span><span class="cx"> {
</span><span class="lines">@@ -664,6 +666,7 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if !HAS_CORE_TEXT_WIDTH_ATTRIBUTE
</ins><span class="cx"> static float stretchFromCoreTextTraits(CFDictionaryRef traits)
</span><span class="cx"> {
</span><span class="cx">     auto widthNumber = static_cast&lt;CFNumberRef&gt;(CFDictionaryGetValue(traits, kCTFontWidthTrait));
</span><span class="lines">@@ -675,6 +678,7 @@
</span><span class="cx">     ASSERT_UNUSED(success, success);
</span><span class="cx">     return normalizeWidth(ctWidth);
</span><span class="cx"> }
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx"> static void invalidateFontCache();
</span><span class="cx"> 
</span><span class="lines">@@ -971,6 +975,19 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if !SHOULD_USE_CORE_TEXT_FONT_LOOKUP || HAS_CORE_TEXT_WIDTH_ATTRIBUTE
+static float getCSSAttribute(CTFontDescriptorRef fontDescriptor, const CFStringRef attribute, float fallback)
+{
+    auto number = adoptCF(static_cast&lt;CFNumberRef&gt;(CTFontDescriptorCopyAttribute(fontDescriptor, attribute)));
+    if (!number)
+        return fallback;
+    float cssValue;
+    auto success = CFNumberGetValue(number.get(), kCFNumberFloatType, &amp;cssValue);
+    ASSERT_UNUSED(success, success);
+    return cssValue;
+}
+#endif
+
</ins><span class="cx"> FontSelectionCapabilities capabilitiesForFontDescriptor(CTFontDescriptorRef fontDescriptor)
</span><span class="cx"> {
</span><span class="cx">     if (!fontDescriptor)
</span><span class="lines">@@ -978,19 +995,21 @@
</span><span class="cx"> 
</span><span class="cx">     VariationCapabilities variationCapabilities = variationCapabilitiesForFontDescriptor(fontDescriptor);
</span><span class="cx"> 
</span><del>-#if SHOULD_USE_CORE_TEXT_FONT_LOOKUP
-    bool weightComesFromTraits = !variationCapabilities.weight;
</del><ins>+#if SHOULD_USE_CORE_TEXT_FONT_LOOKUP || !HAS_CORE_TEXT_WIDTH_ATTRIBUTE
+    bool weightOrWidthComeFromTraits = !variationCapabilities.weight || !variationCapabilities.width;
</ins><span class="cx"> #else
</span><del>-    bool weightComesFromTraits = false;
</del><ins>+    bool weightOrWidthComeFromTraits = false;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    if (!variationCapabilities.slope || !variationCapabilities.width || weightComesFromTraits) {
</del><ins>+    if (!variationCapabilities.slope || weightOrWidthComeFromTraits) {
</ins><span class="cx">         auto traits = adoptCF(static_cast&lt;CFDictionaryRef&gt;(CTFontDescriptorCopyAttribute(fontDescriptor, kCTFontTraitsAttribute)));
</span><span class="cx">         if (traits) {
</span><ins>+#if !HAS_CORE_TEXT_WIDTH_ATTRIBUTE
</ins><span class="cx">             if (!variationCapabilities.width) {
</span><span class="cx">                 auto widthValue = stretchFromCoreTextTraits(traits.get());
</span><span class="cx">                 variationCapabilities.width = {{ widthValue, widthValue }};
</span><span class="cx">             }
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">             if (!variationCapabilities.slope) {
</span><span class="cx">                 auto symbolicTraitsNumber = static_cast&lt;CFNumberRef&gt;(CFDictionaryGetValue(traits.get(), kCTFontSymbolicTrait));
</span><span class="lines">@@ -1022,17 +1041,18 @@
</span><span class="cx"> 
</span><span class="cx"> #if !SHOULD_USE_CORE_TEXT_FONT_LOOKUP
</span><span class="cx">     if (!variationCapabilities.weight) {
</span><del>-        auto weightNumber = adoptCF(static_cast&lt;CFNumberRef&gt;(CTFontDescriptorCopyAttribute(fontDescriptor, kCTFontCSSWeightAttribute)));
-        if (weightNumber) {
-            float cssWeight;
-            auto success = CFNumberGetValue(weightNumber.get(), kCFNumberFloatType, &amp;cssWeight);
-            ASSERT_UNUSED(success, success);
-            variationCapabilities.weight = {{ cssWeight, cssWeight }};
-        } else
-            variationCapabilities.weight = {{ static_cast&lt;float&gt;(normalWeightValue()), static_cast&lt;float&gt;(normalWeightValue()) }};
</del><ins>+        auto value = getCSSAttribute(fontDescriptor, kCTFontCSSWeightAttribute, static_cast&lt;float&gt;(normalWeightValue()));
+        variationCapabilities.weight = {{ value, value }};
</ins><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if HAS_CORE_TEXT_WIDTH_ATTRIBUTE
+    if (!variationCapabilities.width) {
+        auto value = getCSSAttribute(fontDescriptor, kCTFontCSSWidthAttribute, static_cast&lt;float&gt;(normalStretchValue()));
+        variationCapabilities.width = {{ value, value }};
+    }
+#endif
+
</ins><span class="cx">     return {{ FontSelectionValue(variationCapabilities.weight.value().minimum), FontSelectionValue(variationCapabilities.weight.value().maximum) },
</span><span class="cx">         { FontSelectionValue(variationCapabilities.width.value().minimum), FontSelectionValue(variationCapabilities.width.value().maximum) },
</span><span class="cx">         { FontSelectionValue(variationCapabilities.slope.value().minimum), FontSelectionValue(variationCapabilities.slope.value().maximum) }};
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformspicocoaCoreTextSPIh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/spi/cocoa/CoreTextSPI.h (214593 => 214594)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/spi/cocoa/CoreTextSPI.h        2017-03-30 02:58:15 UTC (rev 214593)
+++ trunk/Source/WebCore/platform/spi/cocoa/CoreTextSPI.h        2017-03-30 02:58:37 UTC (rev 214594)
</span><span class="lines">@@ -85,6 +85,7 @@
</span><span class="cx"> CTFontDescriptorRef CTFontDescriptorCreateWithAttributesAndOptions(CFDictionaryRef attributes, CTFontDescriptorOptions);
</span><span class="cx"> 
</span><span class="cx"> extern const CFStringRef kCTFontCSSWeightAttribute;
</span><ins>+extern const CFStringRef kCTFontCSSWidthAttribute;
</ins><span class="cx"> extern const CFStringRef kCTFontDescriptorTextStyleAttribute;
</span><span class="cx"> extern const CFStringRef kCTFontUIFontDesignTrait;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>