Changeset 275488 in webkit


Ignore:
Timestamp:
Apr 5, 2021 9:18:26 PM (3 years ago)
Author:
Simon Fraser
Message:

Wasted vector capacity in CSSSegmentedFontFace
https://bugs.webkit.org/show_bug.cgi?id=224167

Reviewed by Myles C. Maxfield.

Shrink FontRanges.m_ranges. This saves about 12KB on youtube.com.

  • css/CSSSegmentedFontFace.cpp:

(WebCore::CSSSegmentedFontFace::fontRanges):

  • platform/graphics/FontRanges.h:

(WebCore::FontRanges::shrinkToFit):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r275485 r275488  
     12021-04-05  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Wasted vector capacity in CSSSegmentedFontFace
     4        https://bugs.webkit.org/show_bug.cgi?id=224167
     5
     6        Reviewed by Myles C. Maxfield.
     7
     8        Shrink FontRanges.m_ranges. This saves about 12KB on youtube.com.
     9
     10        * css/CSSSegmentedFontFace.cpp:
     11        (WebCore::CSSSegmentedFontFace::fontRanges):
     12        * platform/graphics/FontRanges.h:
     13        (WebCore::FontRanges::shrinkToFit):
     14
    1152021-04-05  Chris Dumez  <cdumez@apple.com>
    216
  • trunk/Source/WebCore/css/CSSSegmentedFontFace.cpp

    r256659 r275488  
    109109FontRanges CSSSegmentedFontFace::fontRanges(const FontDescription& fontDescription)
    110110{
     111    auto addResult = m_cache.add(FontDescriptionKey(fontDescription), FontRanges());
     112    auto& ranges = addResult.iterator->value;
     113
     114    if (!addResult.isNewEntry)
     115        return ranges;
     116
    111117    auto desiredRequest = fontDescription.fontSelectionRequest();
    112118
    113     auto addResult = m_cache.add(FontDescriptionKey(fontDescription), FontRanges());
    114     auto& result = addResult.iterator->value;
     119    for (auto& face : m_fontFaces) {
     120        if (face->computeFailureState())
     121            continue;
    115122
    116     if (addResult.isNewEntry) {
    117         for (auto& face : m_fontFaces) {
    118             if (face->computeFailureState())
    119                 continue;
     123        auto selectionCapabilitiesWrapped = face->fontSelectionCapabilities();
     124        ASSERT(selectionCapabilitiesWrapped.hasValue());
     125        auto selectionCapabilities = selectionCapabilitiesWrapped.value();
    120126
    121             auto selectionCapabilitiesWrapped = face->fontSelectionCapabilities();
    122             ASSERT(selectionCapabilitiesWrapped.hasValue());
    123             auto selectionCapabilities = selectionCapabilitiesWrapped.value();
     127        bool syntheticBold = (fontDescription.fontSynthesis() & FontSynthesisWeight) && !isFontWeightBold(selectionCapabilities.weight.maximum) && isFontWeightBold(desiredRequest.weight);
     128        bool syntheticItalic = (fontDescription.fontSynthesis() & FontSynthesisStyle) && !isItalic(selectionCapabilities.slope.maximum) && isItalic(desiredRequest.slope);
    124129
    125             bool syntheticBold = (fontDescription.fontSynthesis() & FontSynthesisWeight) && !isFontWeightBold(selectionCapabilities.weight.maximum) && isFontWeightBold(desiredRequest.weight);
    126             bool syntheticItalic = (fontDescription.fontSynthesis() & FontSynthesisStyle) && !isItalic(selectionCapabilities.slope.maximum) && isItalic(desiredRequest.slope);
    127 
    128             // Metrics used for layout come from FontRanges::fontForFirstRange(), which assumes that the first font is non-null.
    129             auto fontAccessor = CSSFontAccessor::create(face, fontDescription, syntheticBold, syntheticItalic);
    130             if (result.isNull() && !fontAccessor->font(ExternalResourceDownloadPolicy::Forbid))
    131                 continue;
    132            
    133             auto faceRangesWrapped = face->ranges();
    134             ASSERT(faceRangesWrapped.hasValue());
    135             auto faceRanges = faceRangesWrapped.value();
    136             appendFont(result, WTFMove(fontAccessor), faceRanges);
    137         }
     130        // Metrics used for layout come from FontRanges::fontForFirstRange(), which assumes that the first font is non-null.
     131        auto fontAccessor = CSSFontAccessor::create(face, fontDescription, syntheticBold, syntheticItalic);
     132        if (ranges.isNull() && !fontAccessor->font(ExternalResourceDownloadPolicy::Forbid))
     133            continue;
     134       
     135        auto faceRangesWrapped = face->ranges();
     136        ASSERT(faceRangesWrapped.hasValue());
     137        auto faceRanges = faceRangesWrapped.value();
     138        appendFont(ranges, WTFMove(fontAccessor), faceRanges);
    138139    }
    139     return result;
     140   
     141    ranges.shrinkToFit();
     142    return ranges;
    140143}
    141144
  • trunk/Source/WebCore/platform/graphics/FontRanges.h

    r226668 r275488  
    8484    const Range& rangeAt(unsigned i) const { return m_ranges[i]; }
    8585
     86    void shrinkToFit() { m_ranges.shrinkToFit(); }
     87
    8688    WEBCORE_EXPORT GlyphData glyphDataForCharacter(UChar32, ExternalResourceDownloadPolicy) const;
    8789    WEBCORE_EXPORT const Font* fontForCharacter(UChar32) const;
Note: See TracChangeset for help on using the changeset viewer.