Title: [215287] trunk
Revision
215287
Author
mmaxfi...@apple.com
Date
2017-04-12 13:54:02 -0700 (Wed, 12 Apr 2017)

Log Message

Well-known variations should clamp to the values listed in the @font-face block
https://bugs.webkit.org/show_bug.cgi?id=169260

Reviewed by Dean Jackson.

Source/WebCore:

Most of this patch is plumbing the variation ranges from the CSSFontFace object
to preparePlatformFont() where variation values get applied.

Beyond that, there is one other piece of this patch - a nonspecified value in an
@font-face block shouldn't perform any clamping, but a specified value should be
clamped. This means that we need to retain whether or not a value is specified.
This patch does this by migrating CSSFontFace from using FontSelectionCapabilities
to using FontSelectionSpecifiedCapabilities, which has its internals behind
std::optionals which represent whether or not the value was specified. For the
purposes of font selection, these unspecified values are replaced with default
values.

Test: fast/text/variations/font-face-clamp.html

* css/CSSFontFace.cpp:
(WebCore::CSSFontFace::font):
* css/CSSFontFace.h:
* css/CSSFontFaceSource.cpp:
(WebCore::CSSFontFaceSource::font):
* css/CSSFontFaceSource.h:
* css/CSSFontSelector.cpp:
(WebCore::CSSFontSelector::addFontFaceRule):
* loader/cache/CachedFont.cpp:
(WebCore::CachedFont::createFont):
(WebCore::CachedFont::platformDataFromCustomData):
* loader/cache/CachedFont.h:
* loader/cache/CachedSVGFont.cpp:
(WebCore::CachedSVGFont::createFont):
(WebCore::CachedSVGFont::platformDataFromCustomData):
* loader/cache/CachedSVGFont.h:
* platform/graphics/FontCache.cpp:
(WebCore::FontPlatformDataCacheKey::FontPlatformDataCacheKey):
(WebCore::FontPlatformDataCacheKey::operator==):
(WebCore::FontPlatformDataCacheKeyHash::hash):
(WebCore::FontCache::getCachedFontPlatformData):
(WebCore::FontCache::fontForFamily):
* platform/graphics/FontCache.h:
(WebCore::FontCache::fontForFamily):
(WebCore::FontCache::getCachedFontPlatformData):
(WebCore::FontCache::createFontPlatformDataForTesting):
* platform/graphics/FontSelectionAlgorithm.h:
(WebCore::FontSelectionRange::uniqueValue):
(WebCore::FontSelectionCapabilities::operator==):
(WebCore::FontSelectionCapabilities::operator!=):
(WebCore::FontSelectionSpecifiedCapabilities::computeFontSelectionCapabilities):
(WebCore::FontSelectionSpecifiedCapabilities::operator==):
(WebCore::FontSelectionSpecifiedCapabilities::operator!=):
(WebCore::FontSelectionSpecifiedCapabilities::operator=):
(WebCore::FontSelectionSpecifiedCapabilities::computeWeight):
(WebCore::FontSelectionSpecifiedCapabilities::computeWidth):
(WebCore::FontSelectionSpecifiedCapabilities::computeSlope):
* platform/graphics/cocoa/FontCacheCoreText.cpp:
(WebCore::preparePlatformFont):
(WebCore::fontWithFamily):
(WebCore::FontCache::createFontPlatformData):
(WebCore::FontCache::systemFallbackForCharacters):
* platform/graphics/mac/FontCacheMac.mm:
(WebCore::FontCache::lastResortFallbackFont):
* platform/graphics/mac/FontCustomPlatformData.cpp:
(WebCore::FontCustomPlatformData::fontPlatformData):
* platform/graphics/mac/FontCustomPlatformData.h:

LayoutTests:

* fast/text/variations/font-face-clamp-expected.html: Added.
* fast/text/variations/font-face-clamp.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (215286 => 215287)


--- trunk/LayoutTests/ChangeLog	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/LayoutTests/ChangeLog	2017-04-12 20:54:02 UTC (rev 215287)
@@ -1,3 +1,13 @@
+2017-04-12  Myles C. Maxfield  <mmaxfi...@apple.com>
+
+        Well-known variations should clamp to the values listed in the @font-face block
+        https://bugs.webkit.org/show_bug.cgi?id=169260
+
+        Reviewed by Dean Jackson.
+
+        * fast/text/variations/font-face-clamp-expected.html: Added.
+        * fast/text/variations/font-face-clamp.html: Added.
+
 2017-04-12  Jonathan Bedard  <jbed...@apple.com>
 
         Remove two passing canvas tests from ios expectations

Added: trunk/LayoutTests/fast/text/variations/font-face-clamp-expected.html (0 => 215287)


--- trunk/LayoutTests/fast/text/variations/font-face-clamp-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/text/variations/font-face-clamp-expected.html	2017-04-12 20:54:02 UTC (rev 215287)
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+@font-face {
+	font-family: "Boxis";
+	src: url("resources/Boxis-VF.ttf");
+	font-stretch: 998% 999%;
+}
+</style>
+</head>
+<body>
+This test makes sure that the font selection properties are clamped by their values in the @font-face block.
+<div style="font-family: Boxis; font-variation-settings: 'wdth' 3.495; transform: scale(100, 1); transform-origin: left top;">Hello</div>
+</body>
+</html>

Added: trunk/LayoutTests/fast/text/variations/font-face-clamp.html (0 => 215287)


--- trunk/LayoutTests/fast/text/variations/font-face-clamp.html	                        (rev 0)
+++ trunk/LayoutTests/fast/text/variations/font-face-clamp.html	2017-04-12 20:54:02 UTC (rev 215287)
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+@font-face {
+	font-family: "Boxis";
+	src: url("resources/Boxis-VF.ttf");
+	font-stretch: 998% 999%;
+}
+</style>
+</head>
+<body>
+This test makes sure that the font selection properties are clamped by their values in the @font-face block.
+<div style="font-family: Boxis; font-stretch: 100%; transform: scale(100, 1); transform-origin: left top;">Hello</div>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (215286 => 215287)


--- trunk/Source/WebCore/ChangeLog	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/ChangeLog	2017-04-12 20:54:02 UTC (rev 215287)
@@ -1,3 +1,72 @@
+2017-04-12  Myles C. Maxfield  <mmaxfi...@apple.com>
+
+        Well-known variations should clamp to the values listed in the @font-face block
+        https://bugs.webkit.org/show_bug.cgi?id=169260
+
+        Reviewed by Dean Jackson.
+
+        Most of this patch is plumbing the variation ranges from the CSSFontFace object
+        to preparePlatformFont() where variation values get applied.
+
+        Beyond that, there is one other piece of this patch - a nonspecified value in an
+        @font-face block shouldn't perform any clamping, but a specified value should be
+        clamped. This means that we need to retain whether or not a value is specified.
+        This patch does this by migrating CSSFontFace from using FontSelectionCapabilities
+        to using FontSelectionSpecifiedCapabilities, which has its internals behind
+        std::optionals which represent whether or not the value was specified. For the
+        purposes of font selection, these unspecified values are replaced with default
+        values.
+
+        Test: fast/text/variations/font-face-clamp.html
+
+        * css/CSSFontFace.cpp:
+        (WebCore::CSSFontFace::font):
+        * css/CSSFontFace.h:
+        * css/CSSFontFaceSource.cpp:
+        (WebCore::CSSFontFaceSource::font):
+        * css/CSSFontFaceSource.h:
+        * css/CSSFontSelector.cpp:
+        (WebCore::CSSFontSelector::addFontFaceRule):
+        * loader/cache/CachedFont.cpp:
+        (WebCore::CachedFont::createFont):
+        (WebCore::CachedFont::platformDataFromCustomData):
+        * loader/cache/CachedFont.h:
+        * loader/cache/CachedSVGFont.cpp:
+        (WebCore::CachedSVGFont::createFont):
+        (WebCore::CachedSVGFont::platformDataFromCustomData):
+        * loader/cache/CachedSVGFont.h:
+        * platform/graphics/FontCache.cpp:
+        (WebCore::FontPlatformDataCacheKey::FontPlatformDataCacheKey):
+        (WebCore::FontPlatformDataCacheKey::operator==):
+        (WebCore::FontPlatformDataCacheKeyHash::hash):
+        (WebCore::FontCache::getCachedFontPlatformData):
+        (WebCore::FontCache::fontForFamily):
+        * platform/graphics/FontCache.h:
+        (WebCore::FontCache::fontForFamily):
+        (WebCore::FontCache::getCachedFontPlatformData):
+        (WebCore::FontCache::createFontPlatformDataForTesting):
+        * platform/graphics/FontSelectionAlgorithm.h:
+        (WebCore::FontSelectionRange::uniqueValue):
+        (WebCore::FontSelectionCapabilities::operator==):
+        (WebCore::FontSelectionCapabilities::operator!=):
+        (WebCore::FontSelectionSpecifiedCapabilities::computeFontSelectionCapabilities):
+        (WebCore::FontSelectionSpecifiedCapabilities::operator==):
+        (WebCore::FontSelectionSpecifiedCapabilities::operator!=):
+        (WebCore::FontSelectionSpecifiedCapabilities::operator=):
+        (WebCore::FontSelectionSpecifiedCapabilities::computeWeight):
+        (WebCore::FontSelectionSpecifiedCapabilities::computeWidth):
+        (WebCore::FontSelectionSpecifiedCapabilities::computeSlope):
+        * platform/graphics/cocoa/FontCacheCoreText.cpp:
+        (WebCore::preparePlatformFont):
+        (WebCore::fontWithFamily):
+        (WebCore::FontCache::createFontPlatformData):
+        (WebCore::FontCache::systemFallbackForCharacters):
+        * platform/graphics/mac/FontCacheMac.mm:
+        (WebCore::FontCache::lastResortFallbackFont):
+        * platform/graphics/mac/FontCustomPlatformData.cpp:
+        (WebCore::FontCustomPlatformData::fontPlatformData):
+        * platform/graphics/mac/FontCustomPlatformData.h:
+
 2017-04-12  Beth Dakin  <bda...@apple.com>
 
         Speculative open source build fix.

Modified: trunk/Source/WebCore/css/CSSFontFace.cpp (215286 => 215287)


--- trunk/Source/WebCore/css/CSSFontFace.cpp	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/css/CSSFontFace.cpp	2017-04-12 20:54:02 UTC (rev 215287)
@@ -629,7 +629,7 @@
                 continue;
             return Font::create(FontCache::singleton().lastResortFallbackFontForEveryCharacter(fontDescription)->platformData(), true, true);
         case CSSFontFaceSource::Status::Success:
-            if (RefPtr<Font> result = source->font(fontDescription, syntheticBold, syntheticItalic, m_featureSettings, m_variantSettings))
+            if (RefPtr<Font> result = source->font(fontDescription, syntheticBold, syntheticItalic, m_featureSettings, m_variantSettings, m_fontSelectionCapabilities))
                 return result;
             break;
         case CSSFontFaceSource::Status::Failure:

Modified: trunk/Source/WebCore/css/CSSFontFace.h (215286 => 215287)


--- trunk/Source/WebCore/css/CSSFontFace.h	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/css/CSSFontFace.h	2017-04-12 20:54:02 UTC (rev 215287)
@@ -80,10 +80,10 @@
     enum class Status;
     struct UnicodeRange;
     const CSSValueList* families() const { return m_families.get(); }
-    FontSelectionRange weight() const { return m_fontSelectionCapabilities.weight; }
-    FontSelectionRange stretch() const { return m_fontSelectionCapabilities.width; }
-    FontSelectionRange italic() const { return m_fontSelectionCapabilities.slope; }
-    FontSelectionCapabilities fontSelectionCapabilities() const { return m_fontSelectionCapabilities; }
+    FontSelectionRange weight() const { return m_fontSelectionCapabilities.computeWeight(); }
+    FontSelectionRange stretch() const { return m_fontSelectionCapabilities.computeWidth(); }
+    FontSelectionRange italic() const { return m_fontSelectionCapabilities.computeSlope(); }
+    FontSelectionCapabilities fontSelectionCapabilities() const { return m_fontSelectionCapabilities.computeFontSelectionCapabilities(); }
     const Vector<UnicodeRange>& ranges() const { return m_ranges; }
     const FontFeatureSettings& featureSettings() const { return m_featureSettings; }
     const FontVariantSettings& variantSettings() const { return m_variantSettings; }
@@ -177,7 +177,7 @@
     RefPtr<StyleRuleFontFace> m_cssConnection;
     HashSet<Client*> m_clients;
     WeakPtr<FontFace> m_wrapper;
-    FontSelectionCapabilities m_fontSelectionCapabilities;
+    FontSelectionSpecifiedCapabilities m_fontSelectionCapabilities;
     Status m_status { Status::Pending };
     bool m_isLocalFallback { false };
     bool m_sourcesPopulated { false };

Modified: trunk/Source/WebCore/css/CSSFontFaceSource.cpp (215286 => 215287)


--- trunk/Source/WebCore/css/CSSFontFaceSource.cpp	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/css/CSSFontFaceSource.cpp	2017-04-12 20:54:02 UTC (rev 215287)
@@ -136,7 +136,7 @@
     fontSelector.beginLoadingFontSoon(*m_font);
 }
 
-RefPtr<Font> CSSFontFaceSource::font(const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
+RefPtr<Font> CSSFontFaceSource::font(const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
 {
     ASSERT(status() == Status::Success);
 
@@ -154,12 +154,12 @@
                 m_immediateFontCustomPlatformData = CachedFont::createCustomFontData(*buffer, wrapping);
             } if (!m_immediateFontCustomPlatformData)
                 return nullptr;
-            return Font::create(CachedFont::platformDataFromCustomData(*m_immediateFontCustomPlatformData, fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings), true);
+            return Font::create(CachedFont::platformDataFromCustomData(*m_immediateFontCustomPlatformData, fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities), true);
         }
 
         // We're local. Just return a Font from the normal cache.
         // We don't want to check alternate font family names here, so pass true as the checkingAlternateName parameter.
-        return FontCache::singleton().fontForFamily(fontDescription, m_familyNameOrURI, &fontFaceFeatures, &fontFaceVariantSettings, true);
+        return FontCache::singleton().fontForFamily(fontDescription, m_familyNameOrURI, &fontFaceFeatures, &fontFaceVariantSettings, fontFaceCapabilities, true);
     }
 
     if (m_font) {
@@ -166,7 +166,7 @@
         if (!m_font->ensureCustomFontData(m_familyNameOrURI))
             return nullptr;
 
-        return m_font->createFont(fontDescription, m_familyNameOrURI, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings);
+        return m_font->createFont(fontDescription, m_familyNameOrURI, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
     }
 
     // In-Document SVG Fonts
@@ -187,7 +187,7 @@
     if (!m_inDocumentCustomPlatformData)
         return nullptr;
 #if PLATFORM(COCOA)
-    return Font::create(m_inDocumentCustomPlatformData->fontPlatformData(fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings), true, false);
+    return Font::create(m_inDocumentCustomPlatformData->fontPlatformData(fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities), true, false);
 #else
     return Font::create(m_inDocumentCustomPlatformData->fontPlatformData(fontDescription, syntheticBold, syntheticItalic), true, false);
 #endif

Modified: trunk/Source/WebCore/css/CSSFontFaceSource.h (215286 => 215287)


--- trunk/Source/WebCore/css/CSSFontFaceSource.h	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/css/CSSFontFaceSource.h	2017-04-12 20:54:02 UTC (rev 215287)
@@ -37,6 +37,7 @@
 class Font;
 struct FontCustomPlatformData;
 class FontDescription;
+struct FontSelectionSpecifiedCapabilities;
 struct FontVariantSettings;
 class SVGFontFaceElement;
 class SharedBuffer;
@@ -66,7 +67,7 @@
     const AtomicString& familyNameOrURI() const { return m_familyNameOrURI; }
 
     void load(CSSFontSelector&);
-    RefPtr<Font> font(const FontDescription&, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&, const FontVariantSettings&);
+    RefPtr<Font> font(const FontDescription&, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities);
 
 #if ENABLE(SVG_FONTS)
     bool isSVGFontFaceSource() const;

Modified: trunk/Source/WebCore/css/CSSFontSelector.cpp (215286 => 215287)


--- trunk/Source/WebCore/css/CSSFontSelector.cpp	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/css/CSSFontSelector.cpp	2017-04-12 20:54:02 UTC (rev 215287)
@@ -164,15 +164,6 @@
     if (!familyList.length())
         return;
 
-    if (!fontStyle)
-        fontStyle = CSSFontStyleRangeValue::create(CSSValuePool::singleton().createIdentifierValue(CSSValueNormal));
-
-    if (!fontWeight)
-        fontWeight = CSSValuePool::singleton().createIdentifierValue(CSSValueNormal);
-
-    if (!fontStretch)
-        fontStretch = CSSValuePool::singleton().createIdentifierValue(CSSValueNormal);
-
     CSSValueList* rangeList = downcast<CSSValueList>(unicodeRange.get());
 
     CSSValueList& srcList = downcast<CSSValueList>(*src);
@@ -184,9 +175,12 @@
 
     if (!fontFace->setFamilies(*fontFamily))
         return;
-    fontFace->setStyle(*fontStyle);
-    fontFace->setWeight(*fontWeight);
-    fontFace->setStretch(*fontStretch);
+    if (fontStyle)
+        fontFace->setStyle(*fontStyle);
+    if (fontWeight)
+        fontFace->setWeight(*fontWeight);
+    if (fontStretch)
+        fontFace->setStretch(*fontStretch);
     if (rangeList && !fontFace->setUnicodeRange(*rangeList))
         return;
     if (variantLigatures && !fontFace->setVariantLigatures(*variantLigatures))

Modified: trunk/Source/WebCore/loader/cache/CachedFont.cpp (215286 => 215287)


--- trunk/Source/WebCore/loader/cache/CachedFont.cpp	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/loader/cache/CachedFont.cpp	2017-04-12 20:54:02 UTC (rev 215287)
@@ -122,24 +122,25 @@
     return createFontCustomPlatformData(bytes);
 }
 
-RefPtr<Font> CachedFont::createFont(const FontDescription& fontDescription, const AtomicString&, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
+RefPtr<Font> CachedFont::createFont(const FontDescription& fontDescription, const AtomicString&, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
 {
-    return Font::create(platformDataFromCustomData(fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings), true);
+    return Font::create(platformDataFromCustomData(fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities), true);
 }
 
-FontPlatformData CachedFont::platformDataFromCustomData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
+FontPlatformData CachedFont::platformDataFromCustomData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
 {
     ASSERT(m_fontCustomPlatformData);
-    return platformDataFromCustomData(*m_fontCustomPlatformData, fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings);
+    return platformDataFromCustomData(*m_fontCustomPlatformData, fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
 }
 
-FontPlatformData CachedFont::platformDataFromCustomData(FontCustomPlatformData& fontCustomPlatformData, const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
+FontPlatformData CachedFont::platformDataFromCustomData(FontCustomPlatformData& fontCustomPlatformData, const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
 {
 #if PLATFORM(COCOA)
-    return fontCustomPlatformData.fontPlatformData(fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings);
+    return fontCustomPlatformData.fontPlatformData(fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
 #else
     UNUSED_PARAM(fontFaceFeatures);
     UNUSED_PARAM(fontFaceVariantSettings);
+    UNUSED_PARAM(fontFaceCapabilities);
     return fontCustomPlatformData.fontPlatformData(fontDescription, bold, italic);
 #endif
 }

Modified: trunk/Source/WebCore/loader/cache/CachedFont.h (215286 => 215287)


--- trunk/Source/WebCore/loader/cache/CachedFont.h	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/loader/cache/CachedFont.h	2017-04-12 20:54:02 UTC (rev 215287)
@@ -35,6 +35,7 @@
 class CachedResourceLoader;
 class FontDescription;
 class FontPlatformData;
+struct FontSelectionSpecifiedCapabilities;
 class SVGDocument;
 class SVGFontElement;
 struct FontCustomPlatformData;
@@ -52,12 +53,12 @@
 
     virtual bool ensureCustomFontData(const AtomicString& remoteURI);
     static std::unique_ptr<FontCustomPlatformData> createCustomFontData(SharedBuffer&, bool& wrapping);
-    static FontPlatformData platformDataFromCustomData(FontCustomPlatformData&, const FontDescription&, bool bold, bool italic, const FontFeatureSettings&, const FontVariantSettings&);
+    static FontPlatformData platformDataFromCustomData(FontCustomPlatformData&, const FontDescription&, bool bold, bool italic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities);
 
-    virtual RefPtr<Font> createFont(const FontDescription&, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&, const FontVariantSettings&);
+    virtual RefPtr<Font> createFont(const FontDescription&, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities);
 
 protected:
-    FontPlatformData platformDataFromCustomData(const FontDescription&, bool bold, bool italic, const FontFeatureSettings&, const FontVariantSettings&);
+    FontPlatformData platformDataFromCustomData(const FontDescription&, bool bold, bool italic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities);
 
     bool ensureCustomFontData(SharedBuffer* data);
 

Modified: trunk/Source/WebCore/loader/cache/CachedSVGFont.cpp (215286 => 215287)


--- trunk/Source/WebCore/loader/cache/CachedSVGFont.cpp	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/loader/cache/CachedSVGFont.cpp	2017-04-12 20:54:02 UTC (rev 215287)
@@ -52,18 +52,18 @@
 {
 }
 
-RefPtr<Font> CachedSVGFont::createFont(const FontDescription& fontDescription, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
+RefPtr<Font> CachedSVGFont::createFont(const FontDescription& fontDescription, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
 {
     if (firstFontFace(remoteURI))
-        return CachedFont::createFont(fontDescription, remoteURI, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings);
+        return CachedFont::createFont(fontDescription, remoteURI, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
     return nullptr;
 }
 
-FontPlatformData CachedSVGFont::platformDataFromCustomData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
+FontPlatformData CachedSVGFont::platformDataFromCustomData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
 {
     if (m_externalSVGDocument)
         return FontPlatformData(fontDescription.computedPixelSize(), bold, italic);
-    return CachedFont::platformDataFromCustomData(fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings);
+    return CachedFont::platformDataFromCustomData(fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
 }
 
 bool CachedSVGFont::ensureCustomFontData(const AtomicString& remoteURI)

Modified: trunk/Source/WebCore/loader/cache/CachedSVGFont.h (215286 => 215287)


--- trunk/Source/WebCore/loader/cache/CachedSVGFont.h	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/loader/cache/CachedSVGFont.h	2017-04-12 20:54:02 UTC (rev 215287)
@@ -39,10 +39,10 @@
 
     bool ensureCustomFontData(const AtomicString& remoteURI) override;
 
-    RefPtr<Font> createFont(const FontDescription&, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&, const FontVariantSettings&) override;
+    RefPtr<Font> createFont(const FontDescription&, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities) override;
 
 private:
-    FontPlatformData platformDataFromCustomData(const FontDescription&, bool bold, bool italic, const FontFeatureSettings&, const FontVariantSettings&);
+    FontPlatformData platformDataFromCustomData(const FontDescription&, bool bold, bool italic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities);
 
     SVGFontElement* getSVGFontById(const String&) const;
 

Modified: trunk/Source/WebCore/platform/graphics/FontCache.cpp (215286 => 215287)


--- trunk/Source/WebCore/platform/graphics/FontCache.cpp	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/platform/graphics/FontCache.cpp	2017-04-12 20:54:02 UTC (rev 215287)
@@ -102,11 +102,12 @@
     WTF_MAKE_FAST_ALLOCATED;
 public:
     FontPlatformDataCacheKey() { }
-    FontPlatformDataCacheKey(const AtomicString& family, const FontDescription& description, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings)
+    FontPlatformDataCacheKey(const AtomicString& family, const FontDescription& description, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
         : m_fontDescriptionKey(description)
         , m_family(family)
         , m_fontFaceFeatures(fontFaceFeatures ? *fontFaceFeatures : FontFeatureSettings())
         , m_fontFaceVariantSettings(fontFaceVariantSettings ? *fontFaceVariantSettings : FontVariantSettings())
+        , m_fontFaceCapabilities(fontFaceCapabilities)
     { }
 
     explicit FontPlatformDataCacheKey(HashTableDeletedValueType t)
@@ -119,7 +120,8 @@
     {
         if (m_fontDescriptionKey != other.m_fontDescriptionKey
             || m_fontFaceFeatures != other.m_fontFaceFeatures
-            || m_fontFaceVariantSettings != other.m_fontFaceVariantSettings)
+            || m_fontFaceVariantSettings != other.m_fontFaceVariantSettings
+            || m_fontFaceCapabilities != other.m_fontFaceCapabilities)
             return false;
         if (m_family.impl() == other.m_family.impl())
             return true;
@@ -132,6 +134,7 @@
     AtomicString m_family;
     FontFeatureSettings m_fontFaceFeatures;
     FontVariantSettings m_fontFaceVariantSettings;
+    FontSelectionSpecifiedCapabilities m_fontFaceCapabilities;
 };
 
 struct FontPlatformDataCacheKeyHash {
@@ -142,6 +145,18 @@
         hasher.add(fontKey.m_fontDescriptionKey.computeHash());
         hasher.add(fontKey.m_fontFaceFeatures.hash());
         hasher.add(fontKey.m_fontFaceVariantSettings.uniqueValue());
+        if (auto weight = fontKey.m_fontFaceCapabilities.weight)
+            hasher.add(weight->uniqueValue());
+        else
+            hasher.add(std::numeric_limits<unsigned>::max());
+        if (auto width = fontKey.m_fontFaceCapabilities.weight)
+            hasher.add(width->uniqueValue());
+        else
+            hasher.add(std::numeric_limits<unsigned>::max());
+        if (auto slope = fontKey.m_fontFaceCapabilities.weight)
+            hasher.add(slope->uniqueValue());
+        else
+            hasher.add(std::numeric_limits<unsigned>::max());
         return hasher.hash();
     }
          
@@ -153,8 +168,12 @@
     static const bool safeToCompareToEmptyOrDeleted = true;
 };
 
-typedef HashMap<FontPlatformDataCacheKey, std::unique_ptr<FontPlatformData>, FontPlatformDataCacheKeyHash, WTF::SimpleClassHashTraits<FontPlatformDataCacheKey>> FontPlatformDataCache;
+struct FontPlatformDataCacheKeyHashTraits : public SimpleClassHashTraits<FontPlatformDataCacheKey> {
+    static const bool emptyValueIsZero = false;
+};
 
+typedef HashMap<FontPlatformDataCacheKey, std::unique_ptr<FontPlatformData>, FontPlatformDataCacheKeyHash, FontPlatformDataCacheKeyHashTraits> FontPlatformDataCache;
+
 static FontPlatformDataCache& fontPlatformDataCache()
 {
     static NeverDestroyed<FontPlatformDataCache> cache;
@@ -210,7 +229,7 @@
 }
 
 FontPlatformData* FontCache::getCachedFontPlatformData(const FontDescription& fontDescription, const AtomicString& passedFamilyName,
-    const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, bool checkingAlternateName)
+    const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities, bool checkingAlternateName)
 {
 #if PLATFORM(IOS)
     FontLocker fontLocker;
@@ -232,12 +251,12 @@
         initialized = true;
     }
 
-    FontPlatformDataCacheKey key(familyName, fontDescription, fontFaceFeatures, fontFaceVariantSettings);
+    FontPlatformDataCacheKey key(familyName, fontDescription, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
 
     auto addResult = fontPlatformDataCache().add(key, nullptr);
     FontPlatformDataCache::iterator it = addResult.iterator;
     if (addResult.isNewEntry) {
-        it->value = createFontPlatformData(fontDescription, familyName, fontFaceFeatures, fontFaceVariantSettings);
+        it->value = createFontPlatformData(fontDescription, familyName, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
 
         if (!it->value && !checkingAlternateName) {
             // We were unable to find a font.  We have a small set of fonts that we alias to other names,
@@ -244,7 +263,7 @@
             // e.g., Arial/Helvetica, Courier/Courier New, etc.  Try looking up the font under the aliased name.
             const AtomicString& alternateName = alternateFamilyName(familyName);
             if (!alternateName.isNull()) {
-                FontPlatformData* fontPlatformDataForAlternateName = getCachedFontPlatformData(fontDescription, alternateName, fontFaceFeatures, fontFaceVariantSettings, true);
+                FontPlatformData* fontPlatformDataForAlternateName = getCachedFontPlatformData(fontDescription, alternateName, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, true);
                 // Lookup the key in the hash table again as the previous iterator may have
                 // been invalidated by the recursive call to getCachedFontPlatformData().
                 it = fontPlatformDataCache().find(key);
@@ -326,12 +345,12 @@
 const unsigned cMaxUnderMemoryPressureInactiveFontData = 50;
 const unsigned cTargetUnderMemoryPressureInactiveFontData = 30;
 
-RefPtr<Font> FontCache::fontForFamily(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, bool checkingAlternateName)
+RefPtr<Font> FontCache::fontForFamily(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities, bool checkingAlternateName)
 {
     if (!m_purgeTimer.isActive())
         m_purgeTimer.startOneShot(0_s);
 
-    FontPlatformData* platformData = getCachedFontPlatformData(fontDescription, family, fontFaceFeatures, fontFaceVariantSettings, checkingAlternateName);
+    FontPlatformData* platformData = getCachedFontPlatformData(fontDescription, family, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, checkingAlternateName);
     if (!platformData)
         return nullptr;
 

Modified: trunk/Source/WebCore/platform/graphics/FontCache.h (215286 => 215287)


--- trunk/Source/WebCore/platform/graphics/FontCache.h	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/platform/graphics/FontCache.h	2017-04-12 20:54:02 UTC (rev 215287)
@@ -200,7 +200,7 @@
     // It comes into play when you create an @font-face which shares a family name as a preinstalled font.
     Vector<FontSelectionCapabilities> getFontSelectionCapabilitiesInFamily(const AtomicString&);
 
-    WEBCORE_EXPORT RefPtr<Font> fontForFamily(const FontDescription&, const AtomicString&, const FontFeatureSettings* fontFaceFeatures = nullptr, const FontVariantSettings* fontFaceVariantSettings = nullptr, bool checkingAlternateName = false);
+    WEBCORE_EXPORT RefPtr<Font> fontForFamily(const FontDescription&, const AtomicString&, const FontFeatureSettings* fontFaceFeatures = nullptr, const FontVariantSettings* fontFaceVariantSettings = nullptr, FontSelectionSpecifiedCapabilities fontFaceCapabilities = { }, bool checkingAlternateName = false);
     WEBCORE_EXPORT Ref<Font> lastResortFallbackFont(const FontDescription&);
     Ref<Font> lastResortFallbackFontForEveryCharacter(const FontDescription&);
     WEBCORE_EXPORT Ref<Font> fontForPlatformData(const FontPlatformData&);
@@ -234,13 +234,13 @@
     WEBCORE_EXPORT void purgeInactiveFontDataIfNeeded();
 
     // FIXME: This method should eventually be removed.
-    FontPlatformData* getCachedFontPlatformData(const FontDescription&, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures = nullptr, const FontVariantSettings* fontFaceVariantSettings = nullptr, bool checkingAlternateName = false);
+    FontPlatformData* getCachedFontPlatformData(const FontDescription&, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures = nullptr, const FontVariantSettings* fontFaceVariantSettings = nullptr, FontSelectionSpecifiedCapabilities fontFaceCapabilities = { }, bool checkingAlternateName = false);
 
     // These methods are implemented by each platform.
 #if PLATFORM(COCOA)
     FontPlatformData* getCustomFallbackFont(const UInt32, const FontDescription&);
 #endif
-    WEBCORE_EXPORT std::unique_ptr<FontPlatformData> createFontPlatformData(const FontDescription&, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings);
+    WEBCORE_EXPORT std::unique_ptr<FontPlatformData> createFontPlatformData(const FontDescription&, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities);
     
     static const AtomicString& alternateFamilyName(const AtomicString&);
     static const AtomicString& platformAlternateFamilyName(const AtomicString&);
@@ -255,7 +255,7 @@
 
 inline std::unique_ptr<FontPlatformData> FontCache::createFontPlatformDataForTesting(const FontDescription& fontDescription, const AtomicString& family)
 {
-    return createFontPlatformData(fontDescription, family, nullptr, nullptr);
+    return createFontPlatformData(fontDescription, family, nullptr, nullptr, { });
 }
 
 #if PLATFORM(COCOA)
@@ -276,7 +276,7 @@
     bool needsSyntheticOblique;
 };
 
-RetainPtr<CTFontRef> preparePlatformFont(CTFontRef, TextRenderingMode, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, const FontFeatureSettings& features, const FontVariantSettings&, FontSelectionRequest, const FontVariationSettings&, FontOpticalSizing, float size);
+RetainPtr<CTFontRef> preparePlatformFont(CTFontRef, TextRenderingMode, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities, const FontFeatureSettings& features, const FontVariantSettings&, FontSelectionRequest, const FontVariationSettings&, FontOpticalSizing, float size);
 SynthesisPair computeNecessarySynthesis(CTFontRef, const FontDescription&, bool isPlatformFont = false);
 RetainPtr<CTFontRef> platformFontWithFamilySpecialCase(const AtomicString& family, FontSelectionRequest, float size);
 RetainPtr<CTFontRef> platformFontWithFamily(const AtomicString& family, FontSelectionRequest, TextRenderingMode, float size);

Modified: trunk/Source/WebCore/platform/graphics/FontSelectionAlgorithm.h (215286 => 215287)


--- trunk/Source/WebCore/platform/graphics/FontSelectionAlgorithm.h	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/platform/graphics/FontSelectionAlgorithm.h	2017-04-12 20:54:02 UTC (rev 215287)
@@ -312,6 +312,11 @@
         return target >= minimum && target <= maximum;
     }
 
+    uint32_t uniqueValue() const
+    {
+        return minimum.rawValue() << 16 | maximum.rawValue();
+    }
+
     FontSelectionValue minimum { FontSelectionValue(1) };
     FontSelectionValue maximum { FontSelectionValue(0) };
 };
@@ -394,6 +399,17 @@
 };
 
 struct FontSelectionCapabilities {
+    FontSelectionCapabilities()
+    {
+    }
+
+    FontSelectionCapabilities(FontSelectionRange weight, FontSelectionRange width, FontSelectionRange slope)
+        : weight(weight)
+        , width(width)
+        , slope(slope)
+    {
+    }
+
     void expand(const FontSelectionCapabilities& capabilities)
     {
         weight.expand(capabilities.weight);
@@ -401,11 +417,69 @@
         slope.expand(capabilities.slope);
     }
 
+    bool operator==(const FontSelectionCapabilities& other) const
+    {
+        return weight == other.weight
+            && width == other.width
+            && slope == other.slope;
+    }
+
+    bool operator!=(const FontSelectionCapabilities& other) const
+    {
+        return !(*this == other);
+    }
+
     FontSelectionRange weight { normalWeightValue(), normalWeightValue() };
     FontSelectionRange width { normalStretchValue(), normalStretchValue() };
     FontSelectionRange slope { normalItalicValue(), normalItalicValue() };
 };
 
+struct FontSelectionSpecifiedCapabilities {
+    FontSelectionCapabilities computeFontSelectionCapabilities() const
+    {
+        return FontSelectionCapabilities(computeWeight(), computeWidth(), computeSlope());
+    }
+
+    bool operator==(const FontSelectionSpecifiedCapabilities& other) const
+    {
+        return weight == other.weight
+            && width == other.width
+            && slope == other.slope;
+    }
+
+    bool operator!=(const FontSelectionSpecifiedCapabilities& other) const
+    {
+        return !(*this == other);
+    }
+
+    FontSelectionSpecifiedCapabilities& operator=(const FontSelectionCapabilities& other)
+    {
+        weight = other.weight;
+        width = other.width;
+        slope = other.slope;
+        return *this;
+    }
+
+    FontSelectionRange computeWeight() const
+    {
+        return weight.value_or(FontSelectionRange({ normalWeightValue(), normalWeightValue() }));
+    }
+
+    FontSelectionRange computeWidth() const
+    {
+        return width.value_or(FontSelectionRange({ normalStretchValue(), normalStretchValue() }));
+    }
+
+    FontSelectionRange computeSlope() const
+    {
+        return slope.value_or(FontSelectionRange({ normalItalicValue(), normalItalicValue() }));
+    }
+
+    std::optional<FontSelectionRange> weight;
+    std::optional<FontSelectionRange> width;
+    std::optional<FontSelectionRange> slope;
+};
+
 class FontSelectionAlgorithm {
 public:
     FontSelectionAlgorithm() = delete;

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


--- trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp	2017-04-12 20:54:02 UTC (rev 215287)
@@ -497,7 +497,7 @@
 }
 #endif
 
-RetainPtr<CTFontRef> preparePlatformFont(CTFontRef originalFont, TextRenderingMode textRenderingMode, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, const FontFeatureSettings& features, const FontVariantSettings& variantSettings, FontSelectionRequest fontSelectionRequest, const FontVariationSettings& variations, FontOpticalSizing fontOpticalSizing, float size)
+RetainPtr<CTFontRef> preparePlatformFont(CTFontRef originalFont, TextRenderingMode textRenderingMode, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities, const FontFeatureSettings& features, const FontVariantSettings& variantSettings, FontSelectionRequest fontSelectionRequest, const FontVariationSettings& variations, FontOpticalSizing fontOpticalSizing, float size)
 {
     bool alwaysAddVariations = false;
 
@@ -508,6 +508,7 @@
 #else
     UNUSED_PARAM(fontSelectionRequest);
     UNUSED_PARAM(fontOpticalSizing);
+    UNUSED_PARAM(fontFaceCapabilities);
     UNUSED_PARAM(size);
 #endif
 
@@ -578,6 +579,12 @@
         float weight = fontSelectionRequest.weight;
         float width = fontSelectionRequest.width;
         float slope = fontSelectionRequest.slope;
+        if (auto weightValue = fontFaceCapabilities.weight)
+            weight = std::max(std::min(weight, static_cast<float>(weightValue->maximum)), static_cast<float>(weightValue->minimum));
+        if (auto widthValue = fontFaceCapabilities.width)
+            width = std::max(std::min(width, static_cast<float>(widthValue->maximum)), static_cast<float>(widthValue->minimum));
+        if (auto slopeValue = fontFaceCapabilities.weight)
+            slope = std::max(std::min(slope, static_cast<float>(slopeValue->maximum)), static_cast<float>(slopeValue->minimum));
         if (needsConversion) {
             weight = denormalizeWeight(weight);
             width = denormalizeVariationWidth(width);
@@ -1155,7 +1162,7 @@
     FontCache::singleton().invalidate();
 }
 
-static RetainPtr<CTFontRef> fontWithFamily(const AtomicString& family, FontSelectionRequest request, const FontFeatureSettings& featureSettings, const FontVariantSettings& variantSettings, const FontVariationSettings& variationSettings, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, const TextRenderingMode& textRenderingMode, FontSelectionRequest fontSelectionRequest, FontOpticalSizing fontOpticalSizing, float size)
+static RetainPtr<CTFontRef> fontWithFamily(const AtomicString& family, FontSelectionRequest request, const FontFeatureSettings& featureSettings, const FontVariantSettings& variantSettings, const FontVariationSettings& variationSettings, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities, const TextRenderingMode& textRenderingMode, FontSelectionRequest fontSelectionRequest, FontOpticalSizing fontOpticalSizing, float size)
 {
     if (family.isEmpty())
         return nullptr;
@@ -1163,7 +1170,7 @@
     auto foundFont = platformFontWithFamilySpecialCase(family, request, size);
     if (!foundFont)
         foundFont = platformFontLookupWithFamily(family, request, size);
-    return preparePlatformFont(foundFont.get(), textRenderingMode, fontFaceFeatures, fontFaceVariantSettings, featureSettings, variantSettings, fontSelectionRequest, variationSettings, fontOpticalSizing, size);
+    return preparePlatformFont(foundFont.get(), textRenderingMode, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, featureSettings, variantSettings, fontSelectionRequest, variationSettings, fontOpticalSizing, size);
 }
 
 #if PLATFORM(MAC)
@@ -1198,11 +1205,11 @@
 }
 #endif
 
-std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings)
+std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
 {
     float size = fontDescription.computedPixelSize();
 
-    auto font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, fontDescription.textRenderingMode(), fontDescription.fontSelectionRequest(), fontDescription.opticalSizing(), size);
+    auto font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, fontDescription.textRenderingMode(), fontDescription.fontSelectionRequest(), fontDescription.opticalSizing(), size);
 
 #if PLATFORM(MAC)
     if (!font) {
@@ -1213,7 +1220,7 @@
         // Ignore the result because we want to use our own algorithm to actually find the font.
         autoActivateFont(family.string(), size);
 
-        font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, fontDescription.textRenderingMode(), fontDescription.fontSelectionRequest(), fontDescription.opticalSizing(), size);
+        font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, fontDescription.textRenderingMode(), fontDescription.fontSelectionRequest(), fontDescription.opticalSizing(), size);
     }
 #endif
 
@@ -1301,7 +1308,7 @@
 
     const FontPlatformData& platformData = originalFontData->platformData();
     auto result = lookupFallbackFont(platformData.font(), description.weight(), description.locale(), characters, length);
-    result = preparePlatformFont(result.get(), description.textRenderingMode(), nullptr, nullptr, description.featureSettings(), description.variantSettings(), description.fontSelectionRequest(), description.variationSettings(), description.opticalSizing(), description.computedSize());
+    result = preparePlatformFont(result.get(), description.textRenderingMode(), nullptr, nullptr, { }, description.featureSettings(), description.variantSettings(), description.fontSelectionRequest(), description.variationSettings(), description.opticalSizing(), description.computedSize());
     if (!result)
         return lastResortFallbackFont(description);
 

Modified: trunk/Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp (215286 => 215287)


--- trunk/Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp	2017-04-12 20:54:02 UTC (rev 215287)
@@ -324,7 +324,7 @@
         || equalLettersIgnoringASCIICase(familyNameString, "cursive");
 }
 
-std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings*, const FontVariantSettings*)
+std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings*, const FontVariantSettings*, FontSelectionSpecifiedCapabilities)
 {
     // The CSS font matching algorithm (http://www.w3.org/TR/css3-fonts/#font-matching-algorithm)
     // says that we must find an exact match for font family, slant (italic or oblique can be used)

Modified: trunk/Source/WebCore/platform/graphics/mac/FontCacheMac.mm (215286 => 215287)


--- trunk/Source/WebCore/platform/graphics/mac/FontCacheMac.mm	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/platform/graphics/mac/FontCacheMac.mm	2017-04-12 20:54:02 UTC (rev 215287)
@@ -125,7 +125,7 @@
     // the user doesn't have it, we fall back on Lucida Grande because that's
     // guaranteed to be there, according to Nathan Taylor. This is good enough
     // to avoid a crash at least.
-    return *fontForFamily(fontDescription, AtomicString("Lucida Grande", AtomicString::ConstructFromLiteral), nullptr, nullptr, false);
+    return *fontForFamily(fontDescription, AtomicString("Lucida Grande", AtomicString::ConstructFromLiteral), nullptr, nullptr, { }, false);
 }
 
 #endif // PLATFORM(MAC)

Modified: trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp (215286 => 215287)


--- trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp	2017-04-12 20:54:02 UTC (rev 215287)
@@ -34,13 +34,13 @@
 {
 }
 
-FontPlatformData FontCustomPlatformData::fontPlatformData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
+FontPlatformData FontCustomPlatformData::fontPlatformData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
 {
     int size = fontDescription.computedPixelSize();
     FontOrientation orientation = fontDescription.orientation();
     FontWidthVariant widthVariant = fontDescription.widthVariant();
     RetainPtr<CTFontRef> font = adoptCF(CTFontCreateWithFontDescriptor(m_fontDescriptor.get(), size, nullptr));
-    font = preparePlatformFont(font.get(), fontDescription.textRenderingMode(), &fontFaceFeatures, &fontFaceVariantSettings, fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.fontSelectionRequest(), fontDescription.variationSettings(), fontDescription.opticalSizing(), fontDescription.computedSize());
+    font = preparePlatformFont(font.get(), fontDescription.textRenderingMode(), &fontFaceFeatures, &fontFaceVariantSettings, fontFaceCapabilities, fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.fontSelectionRequest(), fontDescription.variationSettings(), fontDescription.opticalSizing(), fontDescription.computedSize());
     ASSERT(font);
     return FontPlatformData(font.get(), size, bold, italic, orientation, widthVariant, fontDescription.textRenderingMode());
 }

Modified: trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.h (215286 => 215287)


--- trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.h	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.h	2017-04-12 20:54:02 UTC (rev 215287)
@@ -34,6 +34,7 @@
 
 class FontDescription;
 class FontPlatformData;
+struct FontSelectionSpecifiedCapabilities;
 class SharedBuffer;
 
 template <typename T> class FontTaggedSettings;
@@ -49,7 +50,7 @@
 
     ~FontCustomPlatformData();
 
-    FontPlatformData fontPlatformData(const FontDescription&, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings);
+    FontPlatformData fontPlatformData(const FontDescription&, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities);
 
     static bool supportsFormat(const String&);
 

Modified: trunk/Source/WebCore/platform/graphics/win/FontCacheWin.cpp (215286 => 215287)


--- trunk/Source/WebCore/platform/graphics/win/FontCacheWin.cpp	2017-04-12 20:47:31 UTC (rev 215286)
+++ trunk/Source/WebCore/platform/graphics/win/FontCacheWin.cpp	2017-04-12 20:54:02 UTC (rev 215287)
@@ -611,7 +611,7 @@
     return result;
 }
 
-std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings*, const FontVariantSettings*)
+std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings*, const FontVariantSettings*, FontSelectionSpecifiedCapabilities)
 {
     bool isLucidaGrande = equalLettersIgnoringASCIICase(family, "lucida grande");
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to