<!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>[211029] 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/211029">211029</a></dd>
<dt>Author</dt> <dd>mmaxfield@apple.com</dd>
<dt>Date</dt> <dd>2017-01-22 19:52:39 -0800 (Sun, 22 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Cocoa] Unify FontPlatformData's hashing and equality operators
https://bugs.webkit.org/show_bug.cgi?id=167061

Reviewed by Darin Adler.

On iOS, we were using CFEqual() and CFHash(), while on macOS
we were using pointer hashing and pointer equality. Instead,
we should be consistent about these operators.

Right now, FontPlatformData holds two internal CTFontRefs, and
switching to these higher-level CFEqual() and CFHash()
functions is required for eliminating one of these two
internal font objects.

No new tests because there is no behavior change.

* platform/graphics/FontPlatformData.h:
(WebCore::FontPlatformData::hash): Deleted.
* platform/graphics/cocoa/FontPlatformDataCocoa.mm:
(WebCore::FontPlatformData::hash):
(WebCore::FontPlatformData::platformIsEqual):
(WebCore::cascadeToLastResortAttributesDictionary):
* platform/graphics/freetype/FontPlatformDataFreeType.cpp:
(WebCore::FontPlatformData::hash):
* platform/graphics/win/FontPlatformDataCGWin.cpp:
(WebCore::FontPlatformData::hash):
* platform/graphics/win/FontPlatformDataCairoWin.cpp:
(WebCore::FontPlatformData::hash):
* platform/graphics/win/FontPlatformDataDirect2D.cpp:
(WebCore::FontPlatformData::hash):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsFontPlatformDatah">trunk/Source/WebCore/platform/graphics/FontPlatformData.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscocoaFontPlatformDataCocoamm">trunk/Source/WebCore/platform/graphics/cocoa/FontPlatformDataCocoa.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsfreetypeFontPlatformDataFreeTypecpp">trunk/Source/WebCore/platform/graphics/freetype/FontPlatformDataFreeType.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicswinFontPlatformDataCGWincpp">trunk/Source/WebCore/platform/graphics/win/FontPlatformDataCGWin.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicswinFontPlatformDataCairoWincpp">trunk/Source/WebCore/platform/graphics/win/FontPlatformDataCairoWin.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicswinFontPlatformDataDirect2Dcpp">trunk/Source/WebCore/platform/graphics/win/FontPlatformDataDirect2D.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (211028 => 211029)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-01-22 18:51:09 UTC (rev 211028)
+++ trunk/Source/WebCore/ChangeLog        2017-01-23 03:52:39 UTC (rev 211029)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2017-01-22  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        [Cocoa] Unify FontPlatformData's hashing and equality operators
+        https://bugs.webkit.org/show_bug.cgi?id=167061
+
+        Reviewed by Darin Adler.
+
+        On iOS, we were using CFEqual() and CFHash(), while on macOS
+        we were using pointer hashing and pointer equality. Instead,
+        we should be consistent about these operators.
+
+        Right now, FontPlatformData holds two internal CTFontRefs, and
+        switching to these higher-level CFEqual() and CFHash()
+        functions is required for eliminating one of these two
+        internal font objects.
+
+        No new tests because there is no behavior change.
+
+        * platform/graphics/FontPlatformData.h:
+        (WebCore::FontPlatformData::hash): Deleted.
+        * platform/graphics/cocoa/FontPlatformDataCocoa.mm:
+        (WebCore::FontPlatformData::hash):
+        (WebCore::FontPlatformData::platformIsEqual):
+        (WebCore::cascadeToLastResortAttributesDictionary):
+        * platform/graphics/freetype/FontPlatformDataFreeType.cpp:
+        (WebCore::FontPlatformData::hash):
+        * platform/graphics/win/FontPlatformDataCGWin.cpp:
+        (WebCore::FontPlatformData::hash):
+        * platform/graphics/win/FontPlatformDataCairoWin.cpp:
+        (WebCore::FontPlatformData::hash):
+        * platform/graphics/win/FontPlatformDataDirect2D.cpp:
+        (WebCore::FontPlatformData::hash):
+
</ins><span class="cx"> 2017-01-20  Dean Jackson  &lt;dino@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WebGL] Do not allow GPU muxing on some old Mac hardware
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsFontPlatformDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/FontPlatformData.h (211028 => 211029)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/FontPlatformData.h        2017-01-22 18:51:09 UTC (rev 211028)
+++ trunk/Source/WebCore/platform/graphics/FontPlatformData.h        2017-01-23 03:52:39 UTC (rev 211029)
</span><span class="lines">@@ -172,25 +172,7 @@
</span><span class="cx">     FcFontSet* fallbacks() const;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    unsigned hash() const
-    {
-#if USE(CAIRO)
-        return PtrHash&lt;cairo_scaled_font_t*&gt;::hash(m_scaledFont.get());
-#elif PLATFORM(WIN)
-        return m_font ? m_font-&gt;hash() : 0;
-#elif PLATFORM(COCOA)
-        uintptr_t flags = static_cast&lt;uintptr_t&gt;(m_isHashTableDeletedValue &lt;&lt; 5 | m_textRenderingMode &lt;&lt; 3 | m_orientation &lt;&lt; 2 | m_syntheticBold &lt;&lt; 1 | m_syntheticOblique);
-#if USE(APPKIT)
-        uintptr_t fontHash = (uintptr_t)m_font.get();
-#else
-        uintptr_t fontHash = reinterpret_cast&lt;uintptr_t&gt;(CFHash(m_font.get()));
-#endif
-        uintptr_t hashCodes[3] = { fontHash, m_widthVariant, flags };
-        return StringHasher::hashMemory&lt;sizeof(hashCodes)&gt;(hashCodes);
-#else
-#error &quot;Unsupported configuration&quot;
-#endif
-    }
</del><ins>+    unsigned hash() const;
</ins><span class="cx"> 
</span><span class="cx">     bool operator==(const FontPlatformData&amp; other) const
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscocoaFontPlatformDataCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontPlatformDataCocoa.mm (211028 => 211029)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cocoa/FontPlatformDataCocoa.mm        2017-01-22 18:51:09 UTC (rev 211028)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontPlatformDataCocoa.mm        2017-01-23 03:52:39 UTC (rev 211029)
</span><span class="lines">@@ -58,18 +58,27 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+unsigned FontPlatformData::hash() const
+{
+    uintptr_t flags = static_cast&lt;uintptr_t&gt;(m_widthVariant &lt;&lt; 6 | m_isHashTableDeletedValue &lt;&lt; 5 | m_textRenderingMode &lt;&lt; 3 | m_orientation &lt;&lt; 2 | m_syntheticBold &lt;&lt; 1 | m_syntheticOblique);
+#if PLATFORM(MAC) &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &lt; 101200
+    uintptr_t fontHash = reinterpret_cast&lt;uintptr_t&gt;(m_font.get());
+#else
+    uintptr_t fontHash = reinterpret_cast&lt;uintptr_t&gt;(CFHash(m_font.get()));
+#endif
+    uintptr_t hashCodes[] = { fontHash, flags };
+    return StringHasher::hashMemory&lt;sizeof(hashCodes)&gt;(hashCodes);
+}
+
</ins><span class="cx"> bool FontPlatformData::platformIsEqual(const FontPlatformData&amp; other) const
</span><span class="cx"> {
</span><del>-    bool result = false;
-    if (m_font || other.m_font) {
-#if PLATFORM(IOS)
-        result = m_font &amp;&amp; other.m_font &amp;&amp; CFEqual(m_font.get(), other.m_font.get());
</del><ins>+    if (!m_font || !other.m_font)
+        return m_font == other.m_font;
+#if PLATFORM(MAC) &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &lt; 101200
+    return m_font == other.m_font;
</ins><span class="cx"> #else
</span><del>-        result = m_font == other.m_font;
</del><ins>+    return CFEqual(m_font.get(), other.m_font.get());
</ins><span class="cx"> #endif
</span><del>-        return result;
-    }
-    return true;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> CTFontRef FontPlatformData::registeredFont() const
</span><span class="lines">@@ -109,11 +118,11 @@
</span><span class="cx"> 
</span><span class="cx">     RetainPtr&lt;CTFontDescriptorRef&gt; lastResort = adoptCF(CTFontDescriptorCreateWithNameAndSize(CFSTR(&quot;LastResort&quot;), 0));
</span><span class="cx"> 
</span><del>-    const void* descriptors[] = { lastResort.get() };
</del><ins>+    CFTypeRef descriptors[] = { lastResort.get() };
</ins><span class="cx">     RetainPtr&lt;CFArrayRef&gt; array = adoptCF(CFArrayCreate(kCFAllocatorDefault, descriptors, WTF_ARRAY_LENGTH(descriptors), &amp;kCFTypeArrayCallBacks));
</span><span class="cx"> 
</span><del>-    const void* keys[] = { kCTFontCascadeListAttribute };
-    const void* values[] = { array.get() };
</del><ins>+    CFTypeRef keys[] = { kCTFontCascadeListAttribute };
+    CFTypeRef values[] = { array.get() };
</ins><span class="cx">     attributes = CFDictionaryCreate(kCFAllocatorDefault, keys, values, WTF_ARRAY_LENGTH(keys), &amp;kCFTypeDictionaryKeyCallBacks, &amp;kCFTypeDictionaryValueCallBacks);
</span><span class="cx"> 
</span><span class="cx">     return attributes;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsfreetypeFontPlatformDataFreeTypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/freetype/FontPlatformDataFreeType.cpp (211028 => 211029)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/freetype/FontPlatformDataFreeType.cpp        2017-01-22 18:51:09 UTC (rev 211028)
+++ trunk/Source/WebCore/platform/graphics/freetype/FontPlatformDataFreeType.cpp        2017-01-23 03:52:39 UTC (rev 211029)
</span><span class="lines">@@ -280,6 +280,11 @@
</span><span class="cx">     return m_fixedWidth;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+unsigned FontPlatformData::hash() const
+{
+    return PtrHash&lt;cairo_scaled_font_t*&gt;::hash(m_scaledFont.get());
+}
+
</ins><span class="cx"> bool FontPlatformData::platformIsEqual(const FontPlatformData&amp; other) const
</span><span class="cx"> {
</span><span class="cx">     // FcPatternEqual does not support null pointers as arguments.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicswinFontPlatformDataCGWincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/win/FontPlatformDataCGWin.cpp (211028 => 211029)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/win/FontPlatformDataCGWin.cpp        2017-01-22 18:51:09 UTC (rev 211028)
+++ trunk/Source/WebCore/platform/graphics/win/FontPlatformDataCGWin.cpp        2017-01-23 03:52:39 UTC (rev 211029)
</span><span class="lines">@@ -129,6 +129,11 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+unsigned FontPlatformData::hash() const
+{
+    return m_font ? m_font-&gt;hash() : 0;
+}
+
</ins><span class="cx"> bool FontPlatformData::platformIsEqual(const FontPlatformData&amp; other) const
</span><span class="cx"> {
</span><span class="cx">     return m_font == other.m_font
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicswinFontPlatformDataCairoWincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/win/FontPlatformDataCairoWin.cpp (211028 => 211029)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/win/FontPlatformDataCairoWin.cpp        2017-01-22 18:51:09 UTC (rev 211028)
+++ trunk/Source/WebCore/platform/graphics/win/FontPlatformDataCairoWin.cpp        2017-01-23 03:52:39 UTC (rev 211029)
</span><span class="lines">@@ -85,6 +85,11 @@
</span><span class="cx">     cairo_font_options_destroy(options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+unsigned FontPlatformData::hash() const
+{
+    return PtrHash&lt;cairo_scaled_font_t*&gt;::hash(m_scaledFont.get());
+}
+
</ins><span class="cx"> bool FontPlatformData::platformIsEqual(const FontPlatformData&amp; other) const
</span><span class="cx"> {
</span><span class="cx">     return m_font == other.m_font
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicswinFontPlatformDataDirect2Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/win/FontPlatformDataDirect2D.cpp (211028 => 211029)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/win/FontPlatformDataDirect2D.cpp        2017-01-22 18:51:09 UTC (rev 211028)
+++ trunk/Source/WebCore/platform/graphics/win/FontPlatformDataDirect2D.cpp        2017-01-23 03:52:39 UTC (rev 211029)
</span><span class="lines">@@ -104,6 +104,11 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+unsigned FontPlatformData::hash() const
+{
+    return m_font ? m_font-&gt;hash() : 0;
+}
+
</ins><span class="cx"> bool FontPlatformData::platformIsEqual(const FontPlatformData&amp; other) const
</span><span class="cx"> {
</span><span class="cx">     return m_font == other.m_font
</span></span></pre>
</div>
</div>

</body>
</html>