Changeset 215287 in webkit
- Timestamp:
- Apr 12, 2017 1:54:02 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r215286 r215287 1 2017-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 1 11 2017-04-12 Jonathan Bedard <jbedard@apple.com> 2 12 -
trunk/Source/WebCore/ChangeLog
r215284 r215287 1 2017-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 1 70 2017-04-12 Beth Dakin <bdakin@apple.com> 2 71 -
trunk/Source/WebCore/css/CSSFontFace.cpp
r215173 r215287 630 630 return Font::create(FontCache::singleton().lastResortFallbackFontForEveryCharacter(fontDescription)->platformData(), true, true); 631 631 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)) 633 633 return result; 634 634 break; -
trunk/Source/WebCore/css/CSSFontFace.h
r213464 r215287 81 81 struct UnicodeRange; 82 82 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(); } 87 87 const Vector<UnicodeRange>& ranges() const { return m_ranges; } 88 88 const FontFeatureSettings& featureSettings() const { return m_featureSettings; } … … 178 178 HashSet<Client*> m_clients; 179 179 WeakPtr<FontFace> m_wrapper; 180 FontSelection Capabilities m_fontSelectionCapabilities;180 FontSelectionSpecifiedCapabilities m_fontSelectionCapabilities; 181 181 Status m_status { Status::Pending }; 182 182 bool m_isLocalFallback { false }; -
trunk/Source/WebCore/css/CSSFontFaceSource.cpp
r215262 r215287 137 137 } 138 138 139 RefPtr<Font> CSSFontFaceSource::font(const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings )139 RefPtr<Font> CSSFontFaceSource::font(const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities) 140 140 { 141 141 ASSERT(status() == Status::Success); … … 155 155 } if (!m_immediateFontCustomPlatformData) 156 156 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); 158 158 } 159 159 160 160 // We're local. Just return a Font from the normal cache. 161 161 // 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); 163 163 } 164 164 … … 167 167 return nullptr; 168 168 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); 170 170 } 171 171 … … 188 188 return nullptr; 189 189 #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); 191 191 #else 192 192 return Font::create(m_inDocumentCustomPlatformData->fontPlatformData(fontDescription, syntheticBold, syntheticItalic), true, false); -
trunk/Source/WebCore/css/CSSFontFaceSource.h
r208668 r215287 38 38 struct FontCustomPlatformData; 39 39 class FontDescription; 40 struct FontSelectionSpecifiedCapabilities; 40 41 struct FontVariantSettings; 41 42 class SVGFontFaceElement; … … 67 68 68 69 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); 70 71 71 72 #if ENABLE(SVG_FONTS) -
trunk/Source/WebCore/css/CSSFontSelector.cpp
r215160 r215287 165 165 return; 166 166 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 176 167 CSSValueList* rangeList = downcast<CSSValueList>(unicodeRange.get()); 177 168 … … 185 176 if (!fontFace->setFamilies(*fontFamily)) 186 177 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); 190 184 if (rangeList && !fontFace->setUnicodeRange(*rangeList)) 191 185 return; -
trunk/Source/WebCore/loader/cache/CachedFont.cpp
r215262 r215287 123 123 } 124 124 125 RefPtr<Font> CachedFont::createFont(const FontDescription& fontDescription, const AtomicString&, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings )125 RefPtr<Font> CachedFont::createFont(const FontDescription& fontDescription, const AtomicString&, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities) 126 126 { 127 return Font::create(platformDataFromCustomData(fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings ), true);127 return Font::create(platformDataFromCustomData(fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities), true); 128 128 } 129 129 130 FontPlatformData CachedFont::platformDataFromCustomData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings )130 FontPlatformData CachedFont::platformDataFromCustomData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities) 131 131 { 132 132 ASSERT(m_fontCustomPlatformData); 133 return platformDataFromCustomData(*m_fontCustomPlatformData, fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings );133 return platformDataFromCustomData(*m_fontCustomPlatformData, fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities); 134 134 } 135 135 136 FontPlatformData CachedFont::platformDataFromCustomData(FontCustomPlatformData& fontCustomPlatformData, const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings )136 FontPlatformData CachedFont::platformDataFromCustomData(FontCustomPlatformData& fontCustomPlatformData, const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities) 137 137 { 138 138 #if PLATFORM(COCOA) 139 return fontCustomPlatformData.fontPlatformData(fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings );139 return fontCustomPlatformData.fontPlatformData(fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities); 140 140 #else 141 141 UNUSED_PARAM(fontFaceFeatures); 142 142 UNUSED_PARAM(fontFaceVariantSettings); 143 UNUSED_PARAM(fontFaceCapabilities); 143 144 return fontCustomPlatformData.fontPlatformData(fontDescription, bold, italic); 144 145 #endif -
trunk/Source/WebCore/loader/cache/CachedFont.h
r208646 r215287 36 36 class FontDescription; 37 37 class FontPlatformData; 38 struct FontSelectionSpecifiedCapabilities; 38 39 class SVGDocument; 39 40 class SVGFontElement; … … 53 54 virtual bool ensureCustomFontData(const AtomicString& remoteURI); 54 55 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); 56 57 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); 58 59 59 60 protected: 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); 61 62 62 63 bool ensureCustomFontData(SharedBuffer* data); -
trunk/Source/WebCore/loader/cache/CachedSVGFont.cpp
r215262 r215287 53 53 } 54 54 55 RefPtr<Font> CachedSVGFont::createFont(const FontDescription& fontDescription, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings )55 RefPtr<Font> CachedSVGFont::createFont(const FontDescription& fontDescription, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities) 56 56 { 57 57 if (firstFontFace(remoteURI)) 58 return CachedFont::createFont(fontDescription, remoteURI, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings );58 return CachedFont::createFont(fontDescription, remoteURI, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities); 59 59 return nullptr; 60 60 } 61 61 62 FontPlatformData CachedSVGFont::platformDataFromCustomData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings )62 FontPlatformData CachedSVGFont::platformDataFromCustomData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities) 63 63 { 64 64 if (m_externalSVGDocument) 65 65 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); 67 67 } 68 68 -
trunk/Source/WebCore/loader/cache/CachedSVGFont.h
r208646 r215287 40 40 bool ensureCustomFontData(const AtomicString& remoteURI) override; 41 41 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; 43 43 44 44 private: 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); 46 46 47 47 SVGFontElement* getSVGFontById(const String&) const; -
trunk/Source/WebCore/platform/graphics/FontCache.cpp
r215152 r215287 103 103 public: 104 104 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) 106 106 : m_fontDescriptionKey(description) 107 107 , m_family(family) 108 108 , m_fontFaceFeatures(fontFaceFeatures ? *fontFaceFeatures : FontFeatureSettings()) 109 109 , m_fontFaceVariantSettings(fontFaceVariantSettings ? *fontFaceVariantSettings : FontVariantSettings()) 110 , m_fontFaceCapabilities(fontFaceCapabilities) 110 111 { } 111 112 … … 120 121 if (m_fontDescriptionKey != other.m_fontDescriptionKey 121 122 || m_fontFaceFeatures != other.m_fontFaceFeatures 122 || m_fontFaceVariantSettings != other.m_fontFaceVariantSettings) 123 || m_fontFaceVariantSettings != other.m_fontFaceVariantSettings 124 || m_fontFaceCapabilities != other.m_fontFaceCapabilities) 123 125 return false; 124 126 if (m_family.impl() == other.m_family.impl()) … … 133 135 FontFeatureSettings m_fontFaceFeatures; 134 136 FontVariantSettings m_fontFaceVariantSettings; 137 FontSelectionSpecifiedCapabilities m_fontFaceCapabilities; 135 138 }; 136 139 … … 143 146 hasher.add(fontKey.m_fontFaceFeatures.hash()); 144 147 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()); 145 160 return hasher.hash(); 146 161 } … … 154 169 }; 155 170 156 typedef HashMap<FontPlatformDataCacheKey, std::unique_ptr<FontPlatformData>, FontPlatformDataCacheKeyHash, WTF::SimpleClassHashTraits<FontPlatformDataCacheKey>> FontPlatformDataCache; 171 struct FontPlatformDataCacheKeyHashTraits : public SimpleClassHashTraits<FontPlatformDataCacheKey> { 172 static const bool emptyValueIsZero = false; 173 }; 174 175 typedef HashMap<FontPlatformDataCacheKey, std::unique_ptr<FontPlatformData>, FontPlatformDataCacheKeyHash, FontPlatformDataCacheKeyHashTraits> FontPlatformDataCache; 157 176 158 177 static FontPlatformDataCache& fontPlatformDataCache() … … 211 230 212 231 FontPlatformData* 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) 214 233 { 215 234 #if PLATFORM(IOS) … … 233 252 } 234 253 235 FontPlatformDataCacheKey key(familyName, fontDescription, fontFaceFeatures, fontFaceVariantSettings );254 FontPlatformDataCacheKey key(familyName, fontDescription, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities); 236 255 237 256 auto addResult = fontPlatformDataCache().add(key, nullptr); 238 257 FontPlatformDataCache::iterator it = addResult.iterator; 239 258 if (addResult.isNewEntry) { 240 it->value = createFontPlatformData(fontDescription, familyName, fontFaceFeatures, fontFaceVariantSettings );259 it->value = createFontPlatformData(fontDescription, familyName, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities); 241 260 242 261 if (!it->value && !checkingAlternateName) { … … 245 264 const AtomicString& alternateName = alternateFamilyName(familyName); 246 265 if (!alternateName.isNull()) { 247 FontPlatformData* fontPlatformDataForAlternateName = getCachedFontPlatformData(fontDescription, alternateName, fontFaceFeatures, fontFaceVariantSettings, true);266 FontPlatformData* fontPlatformDataForAlternateName = getCachedFontPlatformData(fontDescription, alternateName, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, true); 248 267 // Lookup the key in the hash table again as the previous iterator may have 249 268 // been invalidated by the recursive call to getCachedFontPlatformData(). … … 327 346 const unsigned cTargetUnderMemoryPressureInactiveFontData = 30; 328 347 329 RefPtr<Font> FontCache::fontForFamily(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, bool checkingAlternateName)348 RefPtr<Font> FontCache::fontForFamily(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities, bool checkingAlternateName) 330 349 { 331 350 if (!m_purgeTimer.isActive()) 332 351 m_purgeTimer.startOneShot(0_s); 333 352 334 FontPlatformData* platformData = getCachedFontPlatformData(fontDescription, family, fontFaceFeatures, fontFaceVariantSettings, checkingAlternateName);353 FontPlatformData* platformData = getCachedFontPlatformData(fontDescription, family, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, checkingAlternateName); 335 354 if (!platformData) 336 355 return nullptr; -
trunk/Source/WebCore/platform/graphics/FontCache.h
r214364 r215287 201 201 Vector<FontSelectionCapabilities> getFontSelectionCapabilitiesInFamily(const AtomicString&); 202 202 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); 204 204 WEBCORE_EXPORT Ref<Font> lastResortFallbackFont(const FontDescription&); 205 205 Ref<Font> lastResortFallbackFontForEveryCharacter(const FontDescription&); … … 235 235 236 236 // 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); 238 238 239 239 // These methods are implemented by each platform. … … 241 241 FontPlatformData* getCustomFallbackFont(const UInt32, const FontDescription&); 242 242 #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); 244 244 245 245 static const AtomicString& alternateFamilyName(const AtomicString&); … … 256 256 inline std::unique_ptr<FontPlatformData> FontCache::createFontPlatformDataForTesting(const FontDescription& fontDescription, const AtomicString& family) 257 257 { 258 return createFontPlatformData(fontDescription, family, nullptr, nullptr );258 return createFontPlatformData(fontDescription, family, nullptr, nullptr, { }); 259 259 } 260 260 … … 277 277 }; 278 278 279 RetainPtr<CTFontRef> preparePlatformFont(CTFontRef, TextRenderingMode, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, const FontFeatureSettings& features, const FontVariantSettings&, FontSelectionRequest, const FontVariationSettings&, FontOpticalSizing, float size);279 RetainPtr<CTFontRef> preparePlatformFont(CTFontRef, TextRenderingMode, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities, const FontFeatureSettings& features, const FontVariantSettings&, FontSelectionRequest, const FontVariationSettings&, FontOpticalSizing, float size); 280 280 SynthesisPair computeNecessarySynthesis(CTFontRef, const FontDescription&, bool isPlatformFont = false); 281 281 RetainPtr<CTFontRef> platformFontWithFamilySpecialCase(const AtomicString& family, FontSelectionRequest, float size); -
trunk/Source/WebCore/platform/graphics/FontSelectionAlgorithm.h
r213464 r215287 313 313 } 314 314 315 uint32_t uniqueValue() const 316 { 317 return minimum.rawValue() << 16 | maximum.rawValue(); 318 } 319 315 320 FontSelectionValue minimum { FontSelectionValue(1) }; 316 321 FontSelectionValue maximum { FontSelectionValue(0) }; … … 395 400 396 401 struct 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 397 413 void expand(const FontSelectionCapabilities& capabilities) 398 414 { … … 402 418 } 403 419 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 404 432 FontSelectionRange weight { normalWeightValue(), normalWeightValue() }; 405 433 FontSelectionRange width { normalStretchValue(), normalStretchValue() }; 406 434 FontSelectionRange slope { normalItalicValue(), normalItalicValue() }; 435 }; 436 437 struct 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; 407 481 }; 408 482 -
trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp
r215159 r215287 498 498 #endif 499 499 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)500 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) 501 501 { 502 502 bool alwaysAddVariations = false; … … 509 509 UNUSED_PARAM(fontSelectionRequest); 510 510 UNUSED_PARAM(fontOpticalSizing); 511 UNUSED_PARAM(fontFaceCapabilities); 511 512 UNUSED_PARAM(size); 512 513 #endif … … 579 580 float width = fontSelectionRequest.width; 580 581 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)); 581 588 if (needsConversion) { 582 589 weight = denormalizeWeight(weight); … … 1156 1163 } 1157 1164 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)1165 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) 1159 1166 { 1160 1167 if (family.isEmpty()) … … 1164 1171 if (!foundFont) 1165 1172 foundFont = platformFontLookupWithFamily(family, request, size); 1166 return preparePlatformFont(foundFont.get(), textRenderingMode, fontFaceFeatures, fontFaceVariantSettings, f eatureSettings, variantSettings, fontSelectionRequest, variationSettings, fontOpticalSizing, size);1173 return preparePlatformFont(foundFont.get(), textRenderingMode, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, featureSettings, variantSettings, fontSelectionRequest, variationSettings, fontOpticalSizing, size); 1167 1174 } 1168 1175 … … 1199 1206 #endif 1200 1207 1201 std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings )1208 std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities) 1202 1209 { 1203 1210 float size = fontDescription.computedPixelSize(); 1204 1211 1205 auto font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, font Description.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); 1206 1213 1207 1214 #if PLATFORM(MAC) … … 1214 1221 autoActivateFont(family.string(), size); 1215 1222 1216 font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, font Description.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); 1217 1224 } 1218 1225 #endif … … 1302 1309 const FontPlatformData& platformData = originalFontData->platformData(); 1303 1310 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()); 1305 1312 if (!result) 1306 1313 return lastResortFallbackFont(description); -
trunk/Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp
r214283 r215287 325 325 } 326 326 327 std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings*, const FontVariantSettings* )327 std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings*, const FontVariantSettings*, FontSelectionSpecifiedCapabilities) 328 328 { 329 329 // 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 126 126 // guaranteed to be there, according to Nathan Taylor. This is good enough 127 127 // 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); 129 129 } 130 130 -
trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp
r214415 r215287 35 35 } 36 36 37 FontPlatformData FontCustomPlatformData::fontPlatformData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings )37 FontPlatformData FontCustomPlatformData::fontPlatformData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities) 38 38 { 39 39 int size = fontDescription.computedPixelSize(); … … 41 41 FontWidthVariant widthVariant = fontDescription.widthVariant(); 42 42 RetainPtr<CTFontRef> font = adoptCF(CTFontCreateWithFontDescriptor(m_fontDescriptor.get(), size, nullptr)); 43 font = preparePlatformFont(font.get(), fontDescription.textRenderingMode(), &fontFaceFeatures, &fontFaceVariantSettings, font Description.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()); 44 44 ASSERT(font); 45 45 return FontPlatformData(font.get(), size, bold, italic, orientation, widthVariant, fontDescription.textRenderingMode()); -
trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.h
r206664 r215287 35 35 class FontDescription; 36 36 class FontPlatformData; 37 struct FontSelectionSpecifiedCapabilities; 37 38 class SharedBuffer; 38 39 … … 50 51 ~FontCustomPlatformData(); 51 52 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); 53 54 54 55 static bool supportsFormat(const String&); -
trunk/Source/WebCore/platform/graphics/win/FontCacheWin.cpp
r213464 r215287 612 612 } 613 613 614 std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings*, const FontVariantSettings* )614 std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings*, const FontVariantSettings*, FontSelectionSpecifiedCapabilities) 615 615 { 616 616 bool isLucidaGrande = equalLettersIgnoringASCIICase(family, "lucida grande");
Note: See TracChangeset
for help on using the changeset viewer.