Diff
Modified: trunk/Source/WebCore/ChangeLog (283209 => 283210)
--- trunk/Source/WebCore/ChangeLog 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/ChangeLog 2021-09-29 04:52:27 UTC (rev 283210)
@@ -1,3 +1,50 @@
+2021-09-28 Myles C. Maxfield <[email protected]>
+
+ Factor out rare members of FontCreationContext into FontCreationContextRareData
+ https://bugs.webkit.org/show_bug.cgi?id=230800
+ <rdar://problem/83538227>
+
+ Reviewed by Alan Bujtas.
+
+ FontCreationContext is used inside HashMap keys in font caches, so we want the type to be
+ small. Palettes and font features are rare, so we can move those into a heap-allocated
+ rare data object, thereby decreasing the size of FontCreationContext for most fonts.
+ Importantly, if palettes and font features aren't used, the RefPtr will just be null, and
+ no allocation is performed.
+
+ No new tests because there is no behavior change.
+
+ * css/CSSFontFace.h:
+ * css/CSSFontFaceSource.h:
+ * css/CSSSegmentedFontFace.h:
+ * loader/FontLoadRequest.h:
+ * loader/cache/CachedFont.h:
+ * loader/cache/CachedFontLoadRequest.h:
+ * loader/cache/CachedSVGFont.h:
+ * platform/graphics/FontCreationContext.h:
+ (WebCore::FontCreationContextRareData::create):
+ (WebCore::FontCreationContextRareData::fontFaceFeatures const):
+ (WebCore::FontCreationContextRareData::fontPaletteValues const):
+ (WebCore::FontCreationContextRareData::operator== const):
+ (WebCore::FontCreationContextRareData::operator!= const):
+ (WebCore::FontCreationContextRareData::FontCreationContextRareData):
+ (WebCore::FontCreationContext::FontCreationContext):
+ (WebCore::FontCreationContext::fontFaceFeatures const):
+ (WebCore::FontCreationContext::fontFaceCapabilities const):
+ (WebCore::FontCreationContext::fontPaletteValues const):
+ (WebCore::FontCreationContext::operator== const):
+ (WebCore::add):
+ * platform/graphics/FontPaletteValues.h:
+ (WebCore::FontPaletteValues::operator bool const):
+ * platform/graphics/cocoa/FontCacheCoreText.cpp:
+ (WebCore::addAttributesForFontPalettes):
+ (WebCore::preparePlatformFont):
+ * platform/graphics/cocoa/FontCacheCoreText.h:
+ * platform/graphics/freetype/FontCacheFreeType.cpp:
+ * platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp:
+ * platform/graphics/mac/FontCustomPlatformData.h:
+ * workers/WorkerFontLoadRequest.h:
+
2021-09-28 Takashi Komori <[email protected]>
[Curl] Set CURL_LOCK_DATA_SSL_SESSION option to reduce SSL/TLS handshake time
Modified: trunk/Source/WebCore/css/CSSFontFace.h (283209 => 283210)
--- trunk/Source/WebCore/css/CSSFontFace.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/css/CSSFontFace.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -47,7 +47,7 @@
class CSSValue;
class CSSValueList;
class FontCache;
-struct FontCreationContext;
+class FontCreationContext;
class FontDescription;
class Font;
class FontFace;
Modified: trunk/Source/WebCore/css/CSSFontFaceSource.h (283209 => 283210)
--- trunk/Source/WebCore/css/CSSFontFaceSource.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/css/CSSFontFaceSource.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -36,7 +36,7 @@
class CSSFontSelector;
class Document;
class Font;
-struct FontCreationContext;
+class FontCreationContext;
struct FontCustomPlatformData;
class FontDescription;
struct FontSelectionSpecifiedCapabilities;
Modified: trunk/Source/WebCore/css/CSSSegmentedFontFace.h (283209 => 283210)
--- trunk/Source/WebCore/css/CSSSegmentedFontFace.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/css/CSSSegmentedFontFace.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -34,7 +34,7 @@
namespace WebCore {
class CSSFontSelector;
-struct FontCreationContext;
+class FontCreationContext;
class FontDescription;
class FontPaletteValues;
class FontRanges;
Modified: trunk/Source/WebCore/loader/FontLoadRequest.h (283209 => 283210)
--- trunk/Source/WebCore/loader/FontLoadRequest.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/loader/FontLoadRequest.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -32,7 +32,7 @@
namespace WebCore {
class Font;
-struct FontCreationContext;
+class FontCreationContext;
class FontDescription;
class FontLoadRequest;
struct FontSelectionSpecifiedCapabilities;
Modified: trunk/Source/WebCore/loader/cache/CachedFont.h (283209 => 283210)
--- trunk/Source/WebCore/loader/cache/CachedFont.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/loader/cache/CachedFont.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -34,7 +34,7 @@
namespace WebCore {
class CachedResourceLoader;
-struct FontCreationContext;
+class FontCreationContext;
class FontDescription;
class FontPlatformData;
struct FontSelectionSpecifiedCapabilities;
Modified: trunk/Source/WebCore/loader/cache/CachedFontLoadRequest.h (283209 => 283210)
--- trunk/Source/WebCore/loader/cache/CachedFontLoadRequest.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/loader/cache/CachedFontLoadRequest.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -34,7 +34,7 @@
namespace WebCore {
-struct FontCreationContext;
+class FontCreationContext;
class CachedFontLoadRequest final : public FontLoadRequest, public CachedFontClient {
WTF_MAKE_FAST_ALLOCATED;
Modified: trunk/Source/WebCore/loader/cache/CachedSVGFont.h (283209 => 283210)
--- trunk/Source/WebCore/loader/cache/CachedSVGFont.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/loader/cache/CachedSVGFont.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -29,7 +29,7 @@
namespace WebCore {
-struct FontCreationContext;
+class FontCreationContext;
class SVGFontFaceElement;
class Settings;
Modified: trunk/Source/WebCore/platform/graphics/FontCreationContext.h (283209 => 283210)
--- trunk/Source/WebCore/platform/graphics/FontCreationContext.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/platform/graphics/FontCreationContext.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -28,15 +28,80 @@
#include "FontPaletteValues.h"
#include "FontSelectionAlgorithm.h"
#include "FontTaggedSettings.h"
+#include <wtf/PointerComparison.h>
namespace WebCore {
-struct FontCreationContext {
+class FontCreationContextRareData : public RefCounted<FontCreationContextRareData> {
+public:
+ static Ref<FontCreationContextRareData> create(const FontFeatureSettings& fontFaceFeatures, const FontPaletteValues& fontPaletteValues)
+ {
+ return adoptRef(*new FontCreationContextRareData(fontFaceFeatures, fontPaletteValues));
+ }
+
+ const FontFeatureSettings& fontFaceFeatures() const
+ {
+ return m_fontFaceFeatures;
+ }
+
+ const FontPaletteValues& fontPaletteValues() const
+ {
+ return m_fontPaletteValues;
+ }
+
+ bool operator==(const FontCreationContextRareData& other) const
+ {
+ return m_fontFaceFeatures == other.m_fontFaceFeatures
+ && m_fontPaletteValues == other.m_fontPaletteValues;
+ }
+
+ bool operator!=(const FontCreationContextRareData& other) const
+ {
+ return !(*this == other);
+ }
+
+private:
+ FontCreationContextRareData(const FontFeatureSettings& fontFaceFeatures, const FontPaletteValues& fontPaletteValues)
+ : m_fontFaceFeatures(fontFaceFeatures)
+ , m_fontPaletteValues(fontPaletteValues)
+ {
+ }
+
+ FontFeatureSettings m_fontFaceFeatures;
+ FontPaletteValues m_fontPaletteValues;
+ // FIXME: Add support for font-feature-values.
+};
+
+class FontCreationContext {
+public:
+ FontCreationContext() = default;
+
+ FontCreationContext(const FontFeatureSettings& fontFaceFeatures, const FontSelectionSpecifiedCapabilities& fontFaceCapabilities, const FontPaletteValues& fontPaletteValues)
+ : m_fontFaceCapabilities(fontFaceCapabilities)
+ {
+ if (!fontFaceFeatures.isEmpty() || fontPaletteValues)
+ m_rareData = FontCreationContextRareData::create(fontFaceFeatures, fontPaletteValues);
+ }
+
+ const FontFeatureSettings* fontFaceFeatures() const
+ {
+ return m_rareData ? &m_rareData->fontFaceFeatures() : nullptr;
+ }
+
+ const FontSelectionSpecifiedCapabilities& fontFaceCapabilities() const
+ {
+ return m_fontFaceCapabilities;
+ }
+
+ const FontPaletteValues* fontPaletteValues() const
+ {
+ return m_rareData ? &m_rareData->fontPaletteValues() : nullptr;
+ }
+
bool operator==(const FontCreationContext& other) const
{
- return fontFaceFeatures == other.fontFaceFeatures
- && fontFaceCapabilities == other.fontFaceCapabilities
- && fontPaletteValues == other.fontPaletteValues;
+ return m_fontFaceCapabilities == other.m_fontFaceCapabilities
+ && arePointingToEqualData(m_rareData, other.m_rareData);
}
bool operator!=(const FontCreationContext& other) const
@@ -44,17 +109,18 @@
return !(*this == other);
}
- FontFeatureSettings fontFaceFeatures;
- FontSelectionSpecifiedCapabilities fontFaceCapabilities;
- FontPaletteValues fontPaletteValues;
- // FIXME: Add support for font-feature-values.
+private:
+ FontSelectionSpecifiedCapabilities m_fontFaceCapabilities;
+ RefPtr<FontCreationContextRareData> m_rareData;
};
inline void add(Hasher& hasher, const FontCreationContext& fontCreationContext)
{
- add(hasher, fontCreationContext.fontFaceFeatures);
- add(hasher, fontCreationContext.fontFaceCapabilities.tied());
- add(hasher, fontCreationContext.fontPaletteValues);
+ if (fontCreationContext.fontFaceFeatures())
+ add(hasher, *fontCreationContext.fontFaceFeatures());
+ add(hasher, fontCreationContext.fontFaceCapabilities().tied());
+ if (fontCreationContext.fontPaletteValues())
+ add(hasher, *fontCreationContext.fontPaletteValues());
}
}
Modified: trunk/Source/WebCore/platform/graphics/FontPaletteValues.h (283209 => 283210)
--- trunk/Source/WebCore/platform/graphics/FontPaletteValues.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/platform/graphics/FontPaletteValues.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -58,6 +58,15 @@
return m_overrideColors;
}
+ operator bool() const
+ {
+ return WTF::switchOn(m_basePalette, [] (int64_t) {
+ return true;
+ }, [] (const AtomString& string) {
+ return !string.isNull();
+ }) || !m_overrideColors.isEmpty();
+ }
+
bool operator==(const FontPaletteValues& other) const
{
return m_basePalette == other.m_basePalette && m_overrideColors == other.m_overrideColors;
Modified: trunk/Source/WebCore/platform/graphics/cairo/FontCustomPlatformData.h (283209 => 283210)
--- trunk/Source/WebCore/platform/graphics/cairo/FontCustomPlatformData.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/platform/graphics/cairo/FontCustomPlatformData.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -31,7 +31,7 @@
namespace WebCore {
-struct FontCreationContext;
+class FontCreationContext;
class FontDescription;
class FontPlatformData;
class SharedBuffer;
Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp (283209 => 283210)
--- trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp 2021-09-29 04:52:27 UTC (rev 283210)
@@ -443,7 +443,7 @@
bool aatShaping { false };
};
-static void addAttributesForFontPalettes(CFMutableDictionaryRef attributes, const FontPalette& fontPalette, const FontPaletteValues& fontPaletteValues)
+static void addAttributesForFontPalettes(CFMutableDictionaryRef attributes, const FontPalette& fontPalette, const FontPaletteValues* fontPaletteValues)
{
switch (fontPalette.type) {
case FontPalette::Type::None:
@@ -464,7 +464,9 @@
break;
}
case FontPalette::Type::Custom: {
- WTF::switchOn(fontPaletteValues.basePalette(), [&](unsigned index) {
+ if (!fontPaletteValues)
+ break;
+ WTF::switchOn(fontPaletteValues->basePalette(), [&](int64_t index) {
int64_t rawIndex = index; // There is no kCFNumberUIntType.
auto number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &rawIndex));
CFDictionaryAddValue(attributes, kCTFontPaletteAttribute, number.get());
@@ -472,9 +474,9 @@
// This is unimplementable in Core Text.
});
- if (!fontPaletteValues.overrideColors().isEmpty()) {
+ if (!fontPaletteValues->overrideColors().isEmpty()) {
auto overrideDictionary = adoptCF(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
- for (const auto& pair : fontPaletteValues.overrideColors()) {
+ for (const auto& pair : fontPaletteValues->overrideColors()) {
const auto& paletteColorIndex = pair.first;
const auto& color = pair.second;
WTF::switchOn(paletteColorIndex, [](const AtomString&) {
@@ -523,7 +525,7 @@
bool textRenderingModeIsAuto = textRenderingMode == TextRenderingMode::AutoTextRendering;
bool variantSettingsIsNormal = variantSettings.isAllNormal();
bool dontNeedToApplyOpticalSizing = fontOpticalSizing == FontOpticalSizing::Enabled && !forceOpticalSizingOn;
- bool fontFaceDoesntSpecifyFeatures = fontCreationContext.fontFaceFeatures.isEmpty();
+ bool fontFaceDoesntSpecifyFeatures = !fontCreationContext.fontFaceFeatures() || fontCreationContext.fontFaceFeatures()->isEmpty();
if (noFontFeatureSettings && noFontVariationSettings && textRenderingModeIsAuto && variantSettingsIsNormal && dontNeedToApplyOpticalSizing && fontFaceDoesntSpecifyFeatures && !shouldDisableLigaturesForSpacing && dontNeedToApplyFontPalettes) {
#if HAVE(CTFONTCREATEFORCHARACTERSWITHLANGUAGEANDOPTION)
return originalFont;
@@ -569,11 +571,11 @@
float weight = fontSelectionRequest.weight;
float width = fontSelectionRequest.width;
float slope = fontSelectionRequest.slope.value_or(normalItalicValue());
- if (auto weightValue = fontCreationContext.fontFaceCapabilities.weight)
+ if (auto weightValue = fontCreationContext.fontFaceCapabilities().weight)
weight = std::max(std::min(weight, static_cast<float>(weightValue->maximum)), static_cast<float>(weightValue->minimum));
- if (auto widthValue = fontCreationContext.fontFaceCapabilities.width)
+ if (auto widthValue = fontCreationContext.fontFaceCapabilities().width)
width = std::max(std::min(width, static_cast<float>(widthValue->maximum)), static_cast<float>(widthValue->minimum));
- if (auto slopeValue = fontCreationContext.fontFaceCapabilities.weight)
+ if (auto slopeValue = fontCreationContext.fontFaceCapabilities().weight)
slope = std::max(std::min(slope, static_cast<float>(slopeValue->maximum)), static_cast<float>(slopeValue->minimum));
if (needsConversion) {
weight = denormalizeWeight(weight);
@@ -593,8 +595,8 @@
// FIXME: Implement Step 6: the font-variation-settings descriptor inside @font-face
// Step 7: Consult with font-feature-settings inside @font-face
- if (!fontCreationContext.fontFaceFeatures.isEmpty()) {
- for (auto& fontFaceFeature : fontCreationContext.fontFaceFeatures)
+ if (fontCreationContext.fontFaceFeatures() && !fontCreationContext.fontFaceFeatures()->isEmpty()) {
+ for (auto& fontFaceFeature : *fontCreationContext.fontFaceFeatures())
applyFeature(fontFaceFeature.tag(), fontFaceFeature.value());
}
@@ -674,7 +676,7 @@
#endif
}
- addAttributesForFontPalettes(attributes.get(), fontDescription.fontPalette(), fontCreationContext.fontPaletteValues);
+ addAttributesForFontPalettes(attributes.get(), fontDescription.fontPalette(), fontCreationContext.fontPaletteValues());
addAttributesForInstalledFonts(attributes.get(), fontDescription.shouldAllowUserInstalledFonts());
Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.h (283209 => 283210)
--- trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -34,7 +34,7 @@
namespace WebCore {
-struct FontCreationContext;
+class FontCreationContext;
struct SynthesisPair {
explicit SynthesisPair(bool needsSyntheticBold, bool needsSyntheticOblique)
Modified: trunk/Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp (283209 => 283210)
--- trunk/Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp 2021-09-29 04:52:27 UTC (rev 283210)
@@ -573,8 +573,8 @@
bool fixedWidth, syntheticBold, syntheticOblique;
getFontPropertiesFromPattern(resultPattern.get(), fontDescription, fixedWidth, syntheticBold, syntheticOblique);
- if (!fontCreationContext.fontFaceFeatures.isEmpty()) {
- for (auto& fontFaceFeature : fontCreationContext.fontFaceFeatures) {
+ if (fontCreationContext.fontFaceFeatures() && !fontCreationContext.fontFaceFeatures()->isEmpty()) {
+ for (auto& fontFaceFeature : *fontCreationContext.fontFaceFeatures()) {
if (fontFaceFeature.enabled()) {
const auto& tag = fontFaceFeature.tag();
const char buffer[] = { tag[0], tag[1], tag[2], tag[3], '\0' };
Modified: trunk/Source/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp (283209 => 283210)
--- trunk/Source/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp 2021-09-29 04:52:27 UTC (rev 283210)
@@ -81,11 +81,13 @@
RefPtr<FcPattern> pattern = defaultFontconfigOptions();
FcPatternAddString(pattern.get(), FC_FAMILY, reinterpret_cast<const FcChar8*>(freeTypeFace->family_name));
- for (auto& fontFaceFeature : fontCreationContext.fontFaceFeatures) {
- if (fontFaceFeature.enabled()) {
- const auto& tag = fontFaceFeature.tag();
- const char buffer[] = { tag[0], tag[1], tag[2], tag[3], '\0' };
- FcPatternAddString(pattern.get(), FC_FONT_FEATURES, reinterpret_cast<const FcChar8*>(buffer));
+ if (fontCreationContext.fontFaceFeatures()) {
+ for (auto& fontFaceFeature : *fontCreationContext.fontFaceFeatures()) {
+ if (fontFaceFeature.enabled()) {
+ const auto& tag = fontFaceFeature.tag();
+ const char buffer[] = { tag[0], tag[1], tag[2], tag[3], '\0' };
+ FcPatternAddString(pattern.get(), FC_FONT_FEATURES, reinterpret_cast<const FcChar8*>(buffer));
+ }
}
}
Modified: trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.h (283209 => 283210)
--- trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -33,7 +33,7 @@
namespace WebCore {
-struct FontCreationContext;
+class FontCreationContext;
class FontDescription;
struct FontSelectionSpecifiedCapabilities;
class SharedBuffer;
Modified: trunk/Source/WebCore/platform/graphics/win/FontCustomPlatformData.h (283209 => 283210)
--- trunk/Source/WebCore/platform/graphics/win/FontCustomPlatformData.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/platform/graphics/win/FontCustomPlatformData.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -36,7 +36,7 @@
namespace WebCore {
-struct FontCreationContext;
+class FontCreationContext;
class FontDescription;
class FontMemoryResource;
class SharedBuffer;
Modified: trunk/Source/WebCore/workers/WorkerFontLoadRequest.h (283209 => 283210)
--- trunk/Source/WebCore/workers/WorkerFontLoadRequest.h 2021-09-29 03:52:14 UTC (rev 283209)
+++ trunk/Source/WebCore/workers/WorkerFontLoadRequest.h 2021-09-29 04:52:27 UTC (rev 283210)
@@ -34,7 +34,7 @@
namespace WebCore {
-struct FontCreationContext;
+class FontCreationContext;
class ScriptExecutionContext;
class SharedBuffer;
class WorkerGlobalScope;