Changeset 215287 in webkit


Ignore:
Timestamp:
Apr 12, 2017 1:54:02 PM (7 years ago)
Author:
mmaxfield@apple.com
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.
Location:
trunk
Files:
2 added
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r215286 r215287  
     12017-04-12  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        Well-known variations should clamp to the values listed in the @font-face block
     4        https://bugs.webkit.org/show_bug.cgi?id=169260
     5
     6        Reviewed by Dean Jackson.
     7
     8        * fast/text/variations/font-face-clamp-expected.html: Added.
     9        * fast/text/variations/font-face-clamp.html: Added.
     10
    1112017-04-12  Jonathan Bedard  <jbedard@apple.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r215284 r215287  
     12017-04-12  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        Well-known variations should clamp to the values listed in the @font-face block
     4        https://bugs.webkit.org/show_bug.cgi?id=169260
     5
     6        Reviewed by Dean Jackson.
     7
     8        Most of this patch is plumbing the variation ranges from the CSSFontFace object
     9        to preparePlatformFont() where variation values get applied.
     10
     11        Beyond that, there is one other piece of this patch - a nonspecified value in an
     12        @font-face block shouldn't perform any clamping, but a specified value should be
     13        clamped. This means that we need to retain whether or not a value is specified.
     14        This patch does this by migrating CSSFontFace from using FontSelectionCapabilities
     15        to using FontSelectionSpecifiedCapabilities, which has its internals behind
     16        std::optionals which represent whether or not the value was specified. For the
     17        purposes of font selection, these unspecified values are replaced with default
     18        values.
     19
     20        Test: fast/text/variations/font-face-clamp.html
     21
     22        * css/CSSFontFace.cpp:
     23        (WebCore::CSSFontFace::font):
     24        * css/CSSFontFace.h:
     25        * css/CSSFontFaceSource.cpp:
     26        (WebCore::CSSFontFaceSource::font):
     27        * css/CSSFontFaceSource.h:
     28        * css/CSSFontSelector.cpp:
     29        (WebCore::CSSFontSelector::addFontFaceRule):
     30        * loader/cache/CachedFont.cpp:
     31        (WebCore::CachedFont::createFont):
     32        (WebCore::CachedFont::platformDataFromCustomData):
     33        * loader/cache/CachedFont.h:
     34        * loader/cache/CachedSVGFont.cpp:
     35        (WebCore::CachedSVGFont::createFont):
     36        (WebCore::CachedSVGFont::platformDataFromCustomData):
     37        * loader/cache/CachedSVGFont.h:
     38        * platform/graphics/FontCache.cpp:
     39        (WebCore::FontPlatformDataCacheKey::FontPlatformDataCacheKey):
     40        (WebCore::FontPlatformDataCacheKey::operator==):
     41        (WebCore::FontPlatformDataCacheKeyHash::hash):
     42        (WebCore::FontCache::getCachedFontPlatformData):
     43        (WebCore::FontCache::fontForFamily):
     44        * platform/graphics/FontCache.h:
     45        (WebCore::FontCache::fontForFamily):
     46        (WebCore::FontCache::getCachedFontPlatformData):
     47        (WebCore::FontCache::createFontPlatformDataForTesting):
     48        * platform/graphics/FontSelectionAlgorithm.h:
     49        (WebCore::FontSelectionRange::uniqueValue):
     50        (WebCore::FontSelectionCapabilities::operator==):
     51        (WebCore::FontSelectionCapabilities::operator!=):
     52        (WebCore::FontSelectionSpecifiedCapabilities::computeFontSelectionCapabilities):
     53        (WebCore::FontSelectionSpecifiedCapabilities::operator==):
     54        (WebCore::FontSelectionSpecifiedCapabilities::operator!=):
     55        (WebCore::FontSelectionSpecifiedCapabilities::operator=):
     56        (WebCore::FontSelectionSpecifiedCapabilities::computeWeight):
     57        (WebCore::FontSelectionSpecifiedCapabilities::computeWidth):
     58        (WebCore::FontSelectionSpecifiedCapabilities::computeSlope):
     59        * platform/graphics/cocoa/FontCacheCoreText.cpp:
     60        (WebCore::preparePlatformFont):
     61        (WebCore::fontWithFamily):
     62        (WebCore::FontCache::createFontPlatformData):
     63        (WebCore::FontCache::systemFallbackForCharacters):
     64        * platform/graphics/mac/FontCacheMac.mm:
     65        (WebCore::FontCache::lastResortFallbackFont):
     66        * platform/graphics/mac/FontCustomPlatformData.cpp:
     67        (WebCore::FontCustomPlatformData::fontPlatformData):
     68        * platform/graphics/mac/FontCustomPlatformData.h:
     69
    1702017-04-12  Beth Dakin  <bdakin@apple.com>
    271
  • trunk/Source/WebCore/css/CSSFontFace.cpp

    r215173 r215287  
    630630            return Font::create(FontCache::singleton().lastResortFallbackFontForEveryCharacter(fontDescription)->platformData(), true, true);
    631631        case CSSFontFaceSource::Status::Success:
    632             if (RefPtr<Font> result = source->font(fontDescription, syntheticBold, syntheticItalic, m_featureSettings, m_variantSettings))
     632            if (RefPtr<Font> result = source->font(fontDescription, syntheticBold, syntheticItalic, m_featureSettings, m_variantSettings, m_fontSelectionCapabilities))
    633633                return result;
    634634            break;
  • trunk/Source/WebCore/css/CSSFontFace.h

    r213464 r215287  
    8181    struct UnicodeRange;
    8282    const CSSValueList* families() const { return m_families.get(); }
    83     FontSelectionRange weight() const { return m_fontSelectionCapabilities.weight; }
    84     FontSelectionRange stretch() const { return m_fontSelectionCapabilities.width; }
    85     FontSelectionRange italic() const { return m_fontSelectionCapabilities.slope; }
    86     FontSelectionCapabilities fontSelectionCapabilities() const { return m_fontSelectionCapabilities; }
     83    FontSelectionRange weight() const { return m_fontSelectionCapabilities.computeWeight(); }
     84    FontSelectionRange stretch() const { return m_fontSelectionCapabilities.computeWidth(); }
     85    FontSelectionRange italic() const { return m_fontSelectionCapabilities.computeSlope(); }
     86    FontSelectionCapabilities fontSelectionCapabilities() const { return m_fontSelectionCapabilities.computeFontSelectionCapabilities(); }
    8787    const Vector<UnicodeRange>& ranges() const { return m_ranges; }
    8888    const FontFeatureSettings& featureSettings() const { return m_featureSettings; }
     
    178178    HashSet<Client*> m_clients;
    179179    WeakPtr<FontFace> m_wrapper;
    180     FontSelectionCapabilities m_fontSelectionCapabilities;
     180    FontSelectionSpecifiedCapabilities m_fontSelectionCapabilities;
    181181    Status m_status { Status::Pending };
    182182    bool m_isLocalFallback { false };
  • trunk/Source/WebCore/css/CSSFontFaceSource.cpp

    r215262 r215287  
    137137}
    138138
    139 RefPtr<Font> CSSFontFaceSource::font(const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
     139RefPtr<Font> CSSFontFaceSource::font(const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
    140140{
    141141    ASSERT(status() == Status::Success);
     
    155155            } if (!m_immediateFontCustomPlatformData)
    156156                return nullptr;
    157             return Font::create(CachedFont::platformDataFromCustomData(*m_immediateFontCustomPlatformData, fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings), true);
     157            return Font::create(CachedFont::platformDataFromCustomData(*m_immediateFontCustomPlatformData, fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities), true);
    158158        }
    159159
    160160        // We're local. Just return a Font from the normal cache.
    161161        // We don't want to check alternate font family names here, so pass true as the checkingAlternateName parameter.
    162         return FontCache::singleton().fontForFamily(fontDescription, m_familyNameOrURI, &fontFaceFeatures, &fontFaceVariantSettings, true);
     162        return FontCache::singleton().fontForFamily(fontDescription, m_familyNameOrURI, &fontFaceFeatures, &fontFaceVariantSettings, fontFaceCapabilities, true);
    163163    }
    164164
     
    167167            return nullptr;
    168168
    169         return m_font->createFont(fontDescription, m_familyNameOrURI, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings);
     169        return m_font->createFont(fontDescription, m_familyNameOrURI, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
    170170    }
    171171
     
    188188        return nullptr;
    189189#if PLATFORM(COCOA)
    190     return Font::create(m_inDocumentCustomPlatformData->fontPlatformData(fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings), true, false);
     190    return Font::create(m_inDocumentCustomPlatformData->fontPlatformData(fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities), true, false);
    191191#else
    192192    return Font::create(m_inDocumentCustomPlatformData->fontPlatformData(fontDescription, syntheticBold, syntheticItalic), true, false);
  • trunk/Source/WebCore/css/CSSFontFaceSource.h

    r208668 r215287  
    3838struct FontCustomPlatformData;
    3939class FontDescription;
     40struct FontSelectionSpecifiedCapabilities;
    4041struct FontVariantSettings;
    4142class SVGFontFaceElement;
     
    6768
    6869    void load(CSSFontSelector&);
    69     RefPtr<Font> font(const FontDescription&, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&, const FontVariantSettings&);
     70    RefPtr<Font> font(const FontDescription&, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities);
    7071
    7172#if ENABLE(SVG_FONTS)
  • trunk/Source/WebCore/css/CSSFontSelector.cpp

    r215160 r215287  
    165165        return;
    166166
    167     if (!fontStyle)
    168         fontStyle = CSSFontStyleRangeValue::create(CSSValuePool::singleton().createIdentifierValue(CSSValueNormal));
    169 
    170     if (!fontWeight)
    171         fontWeight = CSSValuePool::singleton().createIdentifierValue(CSSValueNormal);
    172 
    173     if (!fontStretch)
    174         fontStretch = CSSValuePool::singleton().createIdentifierValue(CSSValueNormal);
    175 
    176167    CSSValueList* rangeList = downcast<CSSValueList>(unicodeRange.get());
    177168
     
    185176    if (!fontFace->setFamilies(*fontFamily))
    186177        return;
    187     fontFace->setStyle(*fontStyle);
    188     fontFace->setWeight(*fontWeight);
    189     fontFace->setStretch(*fontStretch);
     178    if (fontStyle)
     179        fontFace->setStyle(*fontStyle);
     180    if (fontWeight)
     181        fontFace->setWeight(*fontWeight);
     182    if (fontStretch)
     183        fontFace->setStretch(*fontStretch);
    190184    if (rangeList && !fontFace->setUnicodeRange(*rangeList))
    191185        return;
  • trunk/Source/WebCore/loader/cache/CachedFont.cpp

    r215262 r215287  
    123123}
    124124
    125 RefPtr<Font> CachedFont::createFont(const FontDescription& fontDescription, const AtomicString&, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
     125RefPtr<Font> CachedFont::createFont(const FontDescription& fontDescription, const AtomicString&, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
    126126{
    127     return Font::create(platformDataFromCustomData(fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings), true);
     127    return Font::create(platformDataFromCustomData(fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities), true);
    128128}
    129129
    130 FontPlatformData CachedFont::platformDataFromCustomData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
     130FontPlatformData CachedFont::platformDataFromCustomData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
    131131{
    132132    ASSERT(m_fontCustomPlatformData);
    133     return platformDataFromCustomData(*m_fontCustomPlatformData, fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings);
     133    return platformDataFromCustomData(*m_fontCustomPlatformData, fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
    134134}
    135135
    136 FontPlatformData CachedFont::platformDataFromCustomData(FontCustomPlatformData& fontCustomPlatformData, const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
     136FontPlatformData CachedFont::platformDataFromCustomData(FontCustomPlatformData& fontCustomPlatformData, const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
    137137{
    138138#if PLATFORM(COCOA)
    139     return fontCustomPlatformData.fontPlatformData(fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings);
     139    return fontCustomPlatformData.fontPlatformData(fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
    140140#else
    141141    UNUSED_PARAM(fontFaceFeatures);
    142142    UNUSED_PARAM(fontFaceVariantSettings);
     143    UNUSED_PARAM(fontFaceCapabilities);
    143144    return fontCustomPlatformData.fontPlatformData(fontDescription, bold, italic);
    144145#endif
  • trunk/Source/WebCore/loader/cache/CachedFont.h

    r208646 r215287  
    3636class FontDescription;
    3737class FontPlatformData;
     38struct FontSelectionSpecifiedCapabilities;
    3839class SVGDocument;
    3940class SVGFontElement;
     
    5354    virtual bool ensureCustomFontData(const AtomicString& remoteURI);
    5455    static std::unique_ptr<FontCustomPlatformData> createCustomFontData(SharedBuffer&, bool& wrapping);
    55     static FontPlatformData platformDataFromCustomData(FontCustomPlatformData&, const FontDescription&, bool bold, bool italic, const FontFeatureSettings&, const FontVariantSettings&);
     56    static FontPlatformData platformDataFromCustomData(FontCustomPlatformData&, const FontDescription&, bool bold, bool italic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities);
    5657
    57     virtual RefPtr<Font> createFont(const FontDescription&, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&, const FontVariantSettings&);
     58    virtual RefPtr<Font> createFont(const FontDescription&, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities);
    5859
    5960protected:
    60     FontPlatformData platformDataFromCustomData(const FontDescription&, bool bold, bool italic, const FontFeatureSettings&, const FontVariantSettings&);
     61    FontPlatformData platformDataFromCustomData(const FontDescription&, bool bold, bool italic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities);
    6162
    6263    bool ensureCustomFontData(SharedBuffer* data);
  • trunk/Source/WebCore/loader/cache/CachedSVGFont.cpp

    r215262 r215287  
    5353}
    5454
    55 RefPtr<Font> CachedSVGFont::createFont(const FontDescription& fontDescription, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
     55RefPtr<Font> CachedSVGFont::createFont(const FontDescription& fontDescription, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
    5656{
    5757    if (firstFontFace(remoteURI))
    58         return CachedFont::createFont(fontDescription, remoteURI, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings);
     58        return CachedFont::createFont(fontDescription, remoteURI, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
    5959    return nullptr;
    6060}
    6161
    62 FontPlatformData CachedSVGFont::platformDataFromCustomData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
     62FontPlatformData CachedSVGFont::platformDataFromCustomData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
    6363{
    6464    if (m_externalSVGDocument)
    6565        return FontPlatformData(fontDescription.computedPixelSize(), bold, italic);
    66     return CachedFont::platformDataFromCustomData(fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings);
     66    return CachedFont::platformDataFromCustomData(fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
    6767}
    6868
  • trunk/Source/WebCore/loader/cache/CachedSVGFont.h

    r208646 r215287  
    4040    bool ensureCustomFontData(const AtomicString& remoteURI) override;
    4141
    42     RefPtr<Font> createFont(const FontDescription&, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&, const FontVariantSettings&) override;
     42    RefPtr<Font> createFont(const FontDescription&, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities) override;
    4343
    4444private:
    45     FontPlatformData platformDataFromCustomData(const FontDescription&, bool bold, bool italic, const FontFeatureSettings&, const FontVariantSettings&);
     45    FontPlatformData platformDataFromCustomData(const FontDescription&, bool bold, bool italic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities);
    4646
    4747    SVGFontElement* getSVGFontById(const String&) const;
  • trunk/Source/WebCore/platform/graphics/FontCache.cpp

    r215152 r215287  
    103103public:
    104104    FontPlatformDataCacheKey() { }
    105     FontPlatformDataCacheKey(const AtomicString& family, const FontDescription& description, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings)
     105    FontPlatformDataCacheKey(const AtomicString& family, const FontDescription& description, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
    106106        : m_fontDescriptionKey(description)
    107107        , m_family(family)
    108108        , m_fontFaceFeatures(fontFaceFeatures ? *fontFaceFeatures : FontFeatureSettings())
    109109        , m_fontFaceVariantSettings(fontFaceVariantSettings ? *fontFaceVariantSettings : FontVariantSettings())
     110        , m_fontFaceCapabilities(fontFaceCapabilities)
    110111    { }
    111112
     
    120121        if (m_fontDescriptionKey != other.m_fontDescriptionKey
    121122            || m_fontFaceFeatures != other.m_fontFaceFeatures
    122             || m_fontFaceVariantSettings != other.m_fontFaceVariantSettings)
     123            || m_fontFaceVariantSettings != other.m_fontFaceVariantSettings
     124            || m_fontFaceCapabilities != other.m_fontFaceCapabilities)
    123125            return false;
    124126        if (m_family.impl() == other.m_family.impl())
     
    133135    FontFeatureSettings m_fontFaceFeatures;
    134136    FontVariantSettings m_fontFaceVariantSettings;
     137    FontSelectionSpecifiedCapabilities m_fontFaceCapabilities;
    135138};
    136139
     
    143146        hasher.add(fontKey.m_fontFaceFeatures.hash());
    144147        hasher.add(fontKey.m_fontFaceVariantSettings.uniqueValue());
     148        if (auto weight = fontKey.m_fontFaceCapabilities.weight)
     149            hasher.add(weight->uniqueValue());
     150        else
     151            hasher.add(std::numeric_limits<unsigned>::max());
     152        if (auto width = fontKey.m_fontFaceCapabilities.weight)
     153            hasher.add(width->uniqueValue());
     154        else
     155            hasher.add(std::numeric_limits<unsigned>::max());
     156        if (auto slope = fontKey.m_fontFaceCapabilities.weight)
     157            hasher.add(slope->uniqueValue());
     158        else
     159            hasher.add(std::numeric_limits<unsigned>::max());
    145160        return hasher.hash();
    146161    }
     
    154169};
    155170
    156 typedef HashMap<FontPlatformDataCacheKey, std::unique_ptr<FontPlatformData>, FontPlatformDataCacheKeyHash, WTF::SimpleClassHashTraits<FontPlatformDataCacheKey>> FontPlatformDataCache;
     171struct FontPlatformDataCacheKeyHashTraits : public SimpleClassHashTraits<FontPlatformDataCacheKey> {
     172    static const bool emptyValueIsZero = false;
     173};
     174
     175typedef HashMap<FontPlatformDataCacheKey, std::unique_ptr<FontPlatformData>, FontPlatformDataCacheKeyHash, FontPlatformDataCacheKeyHashTraits> FontPlatformDataCache;
    157176
    158177static FontPlatformDataCache& fontPlatformDataCache()
     
    211230
    212231FontPlatformData* FontCache::getCachedFontPlatformData(const FontDescription& fontDescription, const AtomicString& passedFamilyName,
    213     const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, bool checkingAlternateName)
     232    const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities, bool checkingAlternateName)
    214233{
    215234#if PLATFORM(IOS)
     
    233252    }
    234253
    235     FontPlatformDataCacheKey key(familyName, fontDescription, fontFaceFeatures, fontFaceVariantSettings);
     254    FontPlatformDataCacheKey key(familyName, fontDescription, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
    236255
    237256    auto addResult = fontPlatformDataCache().add(key, nullptr);
    238257    FontPlatformDataCache::iterator it = addResult.iterator;
    239258    if (addResult.isNewEntry) {
    240         it->value = createFontPlatformData(fontDescription, familyName, fontFaceFeatures, fontFaceVariantSettings);
     259        it->value = createFontPlatformData(fontDescription, familyName, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities);
    241260
    242261        if (!it->value && !checkingAlternateName) {
     
    245264            const AtomicString& alternateName = alternateFamilyName(familyName);
    246265            if (!alternateName.isNull()) {
    247                 FontPlatformData* fontPlatformDataForAlternateName = getCachedFontPlatformData(fontDescription, alternateName, fontFaceFeatures, fontFaceVariantSettings, true);
     266                FontPlatformData* fontPlatformDataForAlternateName = getCachedFontPlatformData(fontDescription, alternateName, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, true);
    248267                // Lookup the key in the hash table again as the previous iterator may have
    249268                // been invalidated by the recursive call to getCachedFontPlatformData().
     
    327346const unsigned cTargetUnderMemoryPressureInactiveFontData = 30;
    328347
    329 RefPtr<Font> FontCache::fontForFamily(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, bool checkingAlternateName)
     348RefPtr<Font> FontCache::fontForFamily(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities, bool checkingAlternateName)
    330349{
    331350    if (!m_purgeTimer.isActive())
    332351        m_purgeTimer.startOneShot(0_s);
    333352
    334     FontPlatformData* platformData = getCachedFontPlatformData(fontDescription, family, fontFaceFeatures, fontFaceVariantSettings, checkingAlternateName);
     353    FontPlatformData* platformData = getCachedFontPlatformData(fontDescription, family, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, checkingAlternateName);
    335354    if (!platformData)
    336355        return nullptr;
  • trunk/Source/WebCore/platform/graphics/FontCache.h

    r214364 r215287  
    201201    Vector<FontSelectionCapabilities> getFontSelectionCapabilitiesInFamily(const AtomicString&);
    202202
    203     WEBCORE_EXPORT RefPtr<Font> fontForFamily(const FontDescription&, const AtomicString&, const FontFeatureSettings* fontFaceFeatures = nullptr, const FontVariantSettings* fontFaceVariantSettings = nullptr, bool checkingAlternateName = false);
     203    WEBCORE_EXPORT RefPtr<Font> fontForFamily(const FontDescription&, const AtomicString&, const FontFeatureSettings* fontFaceFeatures = nullptr, const FontVariantSettings* fontFaceVariantSettings = nullptr, FontSelectionSpecifiedCapabilities fontFaceCapabilities = { }, bool checkingAlternateName = false);
    204204    WEBCORE_EXPORT Ref<Font> lastResortFallbackFont(const FontDescription&);
    205205    Ref<Font> lastResortFallbackFontForEveryCharacter(const FontDescription&);
     
    235235
    236236    // FIXME: This method should eventually be removed.
    237     FontPlatformData* getCachedFontPlatformData(const FontDescription&, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures = nullptr, const FontVariantSettings* fontFaceVariantSettings = nullptr, bool checkingAlternateName = false);
     237    FontPlatformData* getCachedFontPlatformData(const FontDescription&, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures = nullptr, const FontVariantSettings* fontFaceVariantSettings = nullptr, FontSelectionSpecifiedCapabilities fontFaceCapabilities = { }, bool checkingAlternateName = false);
    238238
    239239    // These methods are implemented by each platform.
     
    241241    FontPlatformData* getCustomFallbackFont(const UInt32, const FontDescription&);
    242242#endif
    243     WEBCORE_EXPORT std::unique_ptr<FontPlatformData> createFontPlatformData(const FontDescription&, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings);
     243    WEBCORE_EXPORT std::unique_ptr<FontPlatformData> createFontPlatformData(const FontDescription&, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities);
    244244   
    245245    static const AtomicString& alternateFamilyName(const AtomicString&);
     
    256256inline std::unique_ptr<FontPlatformData> FontCache::createFontPlatformDataForTesting(const FontDescription& fontDescription, const AtomicString& family)
    257257{
    258     return createFontPlatformData(fontDescription, family, nullptr, nullptr);
     258    return createFontPlatformData(fontDescription, family, nullptr, nullptr, { });
    259259}
    260260
     
    277277};
    278278
    279 RetainPtr<CTFontRef> preparePlatformFont(CTFontRef, TextRenderingMode, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, const FontFeatureSettings& features, const FontVariantSettings&, FontSelectionRequest, const FontVariationSettings&, FontOpticalSizing, float size);
     279RetainPtr<CTFontRef> preparePlatformFont(CTFontRef, TextRenderingMode, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities, const FontFeatureSettings& features, const FontVariantSettings&, FontSelectionRequest, const FontVariationSettings&, FontOpticalSizing, float size);
    280280SynthesisPair computeNecessarySynthesis(CTFontRef, const FontDescription&, bool isPlatformFont = false);
    281281RetainPtr<CTFontRef> platformFontWithFamilySpecialCase(const AtomicString& family, FontSelectionRequest, float size);
  • trunk/Source/WebCore/platform/graphics/FontSelectionAlgorithm.h

    r213464 r215287  
    313313    }
    314314
     315    uint32_t uniqueValue() const
     316    {
     317        return minimum.rawValue() << 16 | maximum.rawValue();
     318    }
     319
    315320    FontSelectionValue minimum { FontSelectionValue(1) };
    316321    FontSelectionValue maximum { FontSelectionValue(0) };
     
    395400
    396401struct FontSelectionCapabilities {
     402    FontSelectionCapabilities()
     403    {
     404    }
     405
     406    FontSelectionCapabilities(FontSelectionRange weight, FontSelectionRange width, FontSelectionRange slope)
     407        : weight(weight)
     408        , width(width)
     409        , slope(slope)
     410    {
     411    }
     412
    397413    void expand(const FontSelectionCapabilities& capabilities)
    398414    {
     
    402418    }
    403419
     420    bool operator==(const FontSelectionCapabilities& other) const
     421    {
     422        return weight == other.weight
     423            && width == other.width
     424            && slope == other.slope;
     425    }
     426
     427    bool operator!=(const FontSelectionCapabilities& other) const
     428    {
     429        return !(*this == other);
     430    }
     431
    404432    FontSelectionRange weight { normalWeightValue(), normalWeightValue() };
    405433    FontSelectionRange width { normalStretchValue(), normalStretchValue() };
    406434    FontSelectionRange slope { normalItalicValue(), normalItalicValue() };
     435};
     436
     437struct FontSelectionSpecifiedCapabilities {
     438    FontSelectionCapabilities computeFontSelectionCapabilities() const
     439    {
     440        return FontSelectionCapabilities(computeWeight(), computeWidth(), computeSlope());
     441    }
     442
     443    bool operator==(const FontSelectionSpecifiedCapabilities& other) const
     444    {
     445        return weight == other.weight
     446            && width == other.width
     447            && slope == other.slope;
     448    }
     449
     450    bool operator!=(const FontSelectionSpecifiedCapabilities& other) const
     451    {
     452        return !(*this == other);
     453    }
     454
     455    FontSelectionSpecifiedCapabilities& operator=(const FontSelectionCapabilities& other)
     456    {
     457        weight = other.weight;
     458        width = other.width;
     459        slope = other.slope;
     460        return *this;
     461    }
     462
     463    FontSelectionRange computeWeight() const
     464    {
     465        return weight.value_or(FontSelectionRange({ normalWeightValue(), normalWeightValue() }));
     466    }
     467
     468    FontSelectionRange computeWidth() const
     469    {
     470        return width.value_or(FontSelectionRange({ normalStretchValue(), normalStretchValue() }));
     471    }
     472
     473    FontSelectionRange computeSlope() const
     474    {
     475        return slope.value_or(FontSelectionRange({ normalItalicValue(), normalItalicValue() }));
     476    }
     477
     478    std::optional<FontSelectionRange> weight;
     479    std::optional<FontSelectionRange> width;
     480    std::optional<FontSelectionRange> slope;
    407481};
    408482
  • trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp

    r215159 r215287  
    498498#endif
    499499
    500 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)
     500RetainPtr<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)
    501501{
    502502    bool alwaysAddVariations = false;
     
    509509    UNUSED_PARAM(fontSelectionRequest);
    510510    UNUSED_PARAM(fontOpticalSizing);
     511    UNUSED_PARAM(fontFaceCapabilities);
    511512    UNUSED_PARAM(size);
    512513#endif
     
    579580        float width = fontSelectionRequest.width;
    580581        float slope = fontSelectionRequest.slope;
     582        if (auto weightValue = fontFaceCapabilities.weight)
     583            weight = std::max(std::min(weight, static_cast<float>(weightValue->maximum)), static_cast<float>(weightValue->minimum));
     584        if (auto widthValue = fontFaceCapabilities.width)
     585            width = std::max(std::min(width, static_cast<float>(widthValue->maximum)), static_cast<float>(widthValue->minimum));
     586        if (auto slopeValue = fontFaceCapabilities.weight)
     587            slope = std::max(std::min(slope, static_cast<float>(slopeValue->maximum)), static_cast<float>(slopeValue->minimum));
    581588        if (needsConversion) {
    582589            weight = denormalizeWeight(weight);
     
    11561163}
    11571164
    1158 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)
     1165static 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)
    11591166{
    11601167    if (family.isEmpty())
     
    11641171    if (!foundFont)
    11651172        foundFont = platformFontLookupWithFamily(family, request, size);
    1166     return preparePlatformFont(foundFont.get(), textRenderingMode, fontFaceFeatures, fontFaceVariantSettings, featureSettings, variantSettings, fontSelectionRequest, variationSettings, fontOpticalSizing, size);
     1173    return preparePlatformFont(foundFont.get(), textRenderingMode, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, featureSettings, variantSettings, fontSelectionRequest, variationSettings, fontOpticalSizing, size);
    11671174}
    11681175
     
    11991206#endif
    12001207
    1201 std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings)
     1208std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
    12021209{
    12031210    float size = fontDescription.computedPixelSize();
    12041211
    1205     auto font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, fontDescription.textRenderingMode(), fontDescription.fontSelectionRequest(), fontDescription.opticalSizing(), size);
     1212    auto font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, fontDescription.textRenderingMode(), fontDescription.fontSelectionRequest(), fontDescription.opticalSizing(), size);
    12061213
    12071214#if PLATFORM(MAC)
     
    12141221        autoActivateFont(family.string(), size);
    12151222
    1216         font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, fontDescription.textRenderingMode(), fontDescription.fontSelectionRequest(), fontDescription.opticalSizing(), size);
     1223        font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, fontDescription.textRenderingMode(), fontDescription.fontSelectionRequest(), fontDescription.opticalSizing(), size);
    12171224    }
    12181225#endif
     
    13021309    const FontPlatformData& platformData = originalFontData->platformData();
    13031310    auto result = lookupFallbackFont(platformData.font(), description.weight(), description.locale(), characters, length);
    1304     result = preparePlatformFont(result.get(), description.textRenderingMode(), nullptr, nullptr, description.featureSettings(), description.variantSettings(), description.fontSelectionRequest(), description.variationSettings(), description.opticalSizing(), description.computedSize());
     1311    result = preparePlatformFont(result.get(), description.textRenderingMode(), nullptr, nullptr, { }, description.featureSettings(), description.variantSettings(), description.fontSelectionRequest(), description.variationSettings(), description.opticalSizing(), description.computedSize());
    13051312    if (!result)
    13061313        return lastResortFallbackFont(description);
  • trunk/Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp

    r214283 r215287  
    325325}
    326326
    327 std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings*, const FontVariantSettings*)
     327std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings*, const FontVariantSettings*, FontSelectionSpecifiedCapabilities)
    328328{
    329329    // The CSS font matching algorithm (http://www.w3.org/TR/css3-fonts/#font-matching-algorithm)
  • trunk/Source/WebCore/platform/graphics/mac/FontCacheMac.mm

    r213464 r215287  
    126126    // guaranteed to be there, according to Nathan Taylor. This is good enough
    127127    // to avoid a crash at least.
    128     return *fontForFamily(fontDescription, AtomicString("Lucida Grande", AtomicString::ConstructFromLiteral), nullptr, nullptr, false);
     128    return *fontForFamily(fontDescription, AtomicString("Lucida Grande", AtomicString::ConstructFromLiteral), nullptr, nullptr, { }, false);
    129129}
    130130
  • trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp

    r214415 r215287  
    3535}
    3636
    37 FontPlatformData FontCustomPlatformData::fontPlatformData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
     37FontPlatformData FontCustomPlatformData::fontPlatformData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
    3838{
    3939    int size = fontDescription.computedPixelSize();
     
    4141    FontWidthVariant widthVariant = fontDescription.widthVariant();
    4242    RetainPtr<CTFontRef> font = adoptCF(CTFontCreateWithFontDescriptor(m_fontDescriptor.get(), size, nullptr));
    43     font = preparePlatformFont(font.get(), fontDescription.textRenderingMode(), &fontFaceFeatures, &fontFaceVariantSettings, fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.fontSelectionRequest(), fontDescription.variationSettings(), fontDescription.opticalSizing(), fontDescription.computedSize());
     43    font = preparePlatformFont(font.get(), fontDescription.textRenderingMode(), &fontFaceFeatures, &fontFaceVariantSettings, fontFaceCapabilities, fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.fontSelectionRequest(), fontDescription.variationSettings(), fontDescription.opticalSizing(), fontDescription.computedSize());
    4444    ASSERT(font);
    4545    return FontPlatformData(font.get(), size, bold, italic, orientation, widthVariant, fontDescription.textRenderingMode());
  • trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.h

    r206664 r215287  
    3535class FontDescription;
    3636class FontPlatformData;
     37struct FontSelectionSpecifiedCapabilities;
    3738class SharedBuffer;
    3839
     
    5051    ~FontCustomPlatformData();
    5152
    52     FontPlatformData fontPlatformData(const FontDescription&, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings);
     53    FontPlatformData fontPlatformData(const FontDescription&, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities);
    5354
    5455    static bool supportsFormat(const String&);
  • trunk/Source/WebCore/platform/graphics/win/FontCacheWin.cpp

    r213464 r215287  
    612612}
    613613
    614 std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings*, const FontVariantSettings*)
     614std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings*, const FontVariantSettings*, FontSelectionSpecifiedCapabilities)
    615615{
    616616    bool isLucidaGrande = equalLettersIgnoringASCIICase(family, "lucida grande");
Note: See TracChangeset for help on using the changeset viewer.