Changeset 214364 in webkit


Ignore:
Timestamp:
Mar 24, 2017 12:01:54 PM (7 years ago)
Author:
mmaxfield@apple.com
Message:

Implement font-optical-sizing
https://bugs.webkit.org/show_bug.cgi?id=168895

Reviewed by Dean Jackson.

Source/WebCore:

Upon advice from Microsoft, the only input to optical sizing is just the
font-size computed value. It is implemented by setting the 'opsz' font
variation axis. Because the propery has such a simple grammar, the
implementation is quite straightforward.

Test: fast/text/variations/optical-sizing.html

  • css/CSSComputedStyleDeclaration.cpp:

(WebCore::ComputedStyleExtractor::propertyValue):

  • css/CSSPrimitiveValueMappings.h:

(WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
(WebCore::CSSPrimitiveValue::operator FontOpticalSizing):

  • css/CSSProperties.json:
  • css/parser/CSSParserFastPaths.cpp:

(WebCore::CSSParserFastPaths::isValidKeywordPropertyAndValue):
(WebCore::CSSParserFastPaths::isKeywordPropertyID):

  • platform/graphics/FontCache.h:

(WebCore::FontDescriptionKey::makeFlagsKey):

  • platform/graphics/FontDescription.h:

(WebCore::FontDescription::opticalSizing):
(WebCore::FontDescription::setOpticalSizing):
(WebCore::FontDescription::operator==):
(WebCore::FontCascadeDescription::initialOpticalSizing):

  • platform/graphics/cocoa/FontCacheCoreText.cpp:

(WebCore::preparePlatformFont):
(WebCore::fontWithFamily):
(WebCore::FontCache::createFontPlatformData):
(WebCore::FontCache::systemFallbackForCharacters):

  • platform/graphics/mac/FontCustomPlatformData.cpp:

(WebCore::FontCustomPlatformData::fontPlatformData):

  • platform/text/TextFlags.h:

LayoutTests:

  • fast/text/variations/optical-sizing-expected.txt: Added.
  • fast/text/variations/optical-sizing.html: Added.
Location:
trunk
Files:
2 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r214361 r214364  
     12017-03-24  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        Implement font-optical-sizing
     4        https://bugs.webkit.org/show_bug.cgi?id=168895
     5
     6        Reviewed by Dean Jackson.
     7
     8        * fast/text/variations/optical-sizing-expected.txt: Added.
     9        * fast/text/variations/optical-sizing.html: Added.
     10
    1112017-03-24  Yoav Weiss  <yoav@yoav.ws>
    212
  • trunk/Source/WebCore/ChangeLog

    r214362 r214364  
     12017-03-24  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        Implement font-optical-sizing
     4        https://bugs.webkit.org/show_bug.cgi?id=168895
     5
     6        Reviewed by Dean Jackson.
     7
     8        Upon advice from Microsoft, the only input to optical sizing is just the
     9        font-size computed value. It is implemented by setting the 'opsz' font
     10        variation axis. Because the propery has such a simple grammar, the
     11        implementation is quite straightforward.
     12
     13        Test: fast/text/variations/optical-sizing.html
     14
     15        * css/CSSComputedStyleDeclaration.cpp:
     16        (WebCore::ComputedStyleExtractor::propertyValue):
     17        * css/CSSPrimitiveValueMappings.h:
     18        (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
     19        (WebCore::CSSPrimitiveValue::operator FontOpticalSizing):
     20        * css/CSSProperties.json:
     21        * css/parser/CSSParserFastPaths.cpp:
     22        (WebCore::CSSParserFastPaths::isValidKeywordPropertyAndValue):
     23        (WebCore::CSSParserFastPaths::isKeywordPropertyID):
     24        * platform/graphics/FontCache.h:
     25        (WebCore::FontDescriptionKey::makeFlagsKey):
     26        * platform/graphics/FontDescription.h:
     27        (WebCore::FontDescription::opticalSizing):
     28        (WebCore::FontDescription::setOpticalSizing):
     29        (WebCore::FontDescription::operator==):
     30        (WebCore::FontCascadeDescription::initialOpticalSizing):
     31        * platform/graphics/cocoa/FontCacheCoreText.cpp:
     32        (WebCore::preparePlatformFont):
     33        (WebCore::fontWithFamily):
     34        (WebCore::FontCache::createFontPlatformData):
     35        (WebCore::FontCache::systemFallbackForCharacters):
     36        * platform/graphics/mac/FontCustomPlatformData.cpp:
     37        (WebCore::FontCustomPlatformData::fontPlatformData):
     38        * platform/text/TextFlags.h:
     39
    1402017-03-24  Chris Dumez  <cdumez@apple.com>
    241
  • trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp

    r214359 r214364  
    29502950            return WTFMove(list);
    29512951        }
     2952        case CSSPropertyFontOpticalSizing:
     2953            return cssValuePool.createValue(style->fontDescription().opticalSizing());
    29522954#endif
    29532955        case CSSPropertyGridAutoFlow: {
  • trunk/Source/WebCore/css/CSSPrimitiveValueMappings.h

    r213464 r214364  
    56175617}
    56185618
    5619 }
     5619template<> inline CSSPrimitiveValue::CSSPrimitiveValue(FontOpticalSizing sizing)
     5620    : CSSValue(PrimitiveClass)
     5621{
     5622    m_primitiveUnitType = CSS_VALUE_ID;
     5623    switch (sizing) {
     5624    case FontOpticalSizing::Enabled:
     5625        m_value.valueID = CSSValueAuto;
     5626        break;
     5627    case FontOpticalSizing::Disabled:
     5628        m_value.valueID = CSSValueNone;
     5629        break;
     5630    default:
     5631        ASSERT_NOT_REACHED();
     5632        break;
     5633    }
     5634}
     5635
     5636template<> inline CSSPrimitiveValue::operator FontOpticalSizing() const
     5637{
     5638    ASSERT(isValueID());
     5639    switch (m_value.valueID) {
     5640    case CSSValueAuto:
     5641        return FontOpticalSizing::Enabled;
     5642    case CSSValueNone:
     5643        return FontOpticalSizing::Disabled;
     5644    default:
     5645        break;
     5646    }
     5647    ASSERT_NOT_REACHED();
     5648    return FontOpticalSizing::Enabled;
     5649}
     5650
     5651}
  • trunk/Source/WebCore/css/CSSProperties.json

    r213634 r214364  
    521521            }
    522522        },
     523        "font-synthesis": {
     524            "inherited": true,
     525            "codegen-properties": {
     526                "converter": "FontSynthesis",
     527                "font-property": true,
     528                "high-priority": true
     529            },
     530            "specification": {
     531                "category": "css-fonts",
     532                "url": "https://drafts.csswg.org/css-fonts-3/#font-synthesis-prop"
     533            }
     534        },
     535        "font-optical-sizing": {
     536            "inherited": true,
     537            "values": [
     538                "auto",
     539                "none"
     540            ],
     541            "codegen-properties": {
     542                "name-for-methods": "OpticalSizing",
     543                "font-property": true,
     544                "high-priority": true,
     545                "enable-if": "ENABLE_VARIATION_FONTS"
     546            },
     547            "specification": {
     548                "category": "css-fonts",
     549                "url": "https://drafts.csswg.org/css-fonts-4/#optical-sizing-control-the-font-optical-sizing-property"
     550            }
     551        },
     552        "font": {
     553            "inherited": true,
     554            "codegen-properties": {
     555                "longhands": [
     556                              "font-family",
     557                              "font-size",
     558                              "font-style",
     559                              "font-variant-caps",
     560                              "font-weight",
     561                              "font-stretch",
     562                              "line-height"
     563                              ]
     564            },
     565            "specification": {
     566                "category": "css-fonts",
     567                "url": "https://www.w3.org/TR/css-fonts-3/#font-prop"
     568            }
     569        },
     570        "font-variant": {
     571            "inherited": true,
     572            "codegen-properties": {
     573                "longhands": [
     574                              "font-variant-ligatures",
     575                              "font-variant-position",
     576                              "font-variant-caps",
     577                              "font-variant-numeric",
     578                              "font-variant-alternates",
     579                              "font-variant-east-asian"
     580                              ]
     581            },
     582            "specification": {
     583                "category": "css-fonts",
     584                "url": "https://www.w3.org/TR/css-fonts-3/#propdef-font-variant"
     585            }
     586        },
    523587        "-webkit-locale": {
    524588            "inherited": true,
     
    654718            "specification": {
    655719                "url": "https://msdn.microsoft.com/en-us/library/ms531189(v=vs.85).aspx"
    656             }
    657         },
    658         "font-synthesis": {
    659             "inherited": true,
    660             "codegen-properties": {
    661                 "converter": "FontSynthesis",
    662                 "font-property": true,
    663                 "high-priority": true
    664             },
    665             "specification": {
    666                 "category": "css-fonts",
    667                 "url": "https://drafts.csswg.org/css-fonts-3/#font-synthesis-prop"
    668720            }
    669721        },
     
    20162068                "category": "svg",
    20172069                "url": "https://www.w3.org/TR/SVG/filters.html#FloodOpacityProperty"
    2018             }
    2019         },
    2020         "font": {
    2021             "inherited": true,
    2022             "codegen-properties": {
    2023                 "longhands": [
    2024                     "font-family",
    2025                     "font-size",
    2026                     "font-style",
    2027                     "font-variant-caps",
    2028                     "font-weight",
    2029                     "font-stretch",
    2030                     "line-height"
    2031                 ]
    2032             },
    2033             "specification": {
    2034                 "category": "css-fonts",
    2035                 "url": "https://www.w3.org/TR/css-fonts-3/#font-prop"
    2036             }
    2037         },
    2038         "font-variant": {
    2039             "inherited": true,
    2040             "codegen-properties": {
    2041                 "longhands": [
    2042                     "font-variant-ligatures",
    2043                     "font-variant-position",
    2044                     "font-variant-caps",
    2045                     "font-variant-numeric",
    2046                     "font-variant-alternates",
    2047                     "font-variant-east-asian"
    2048                 ]
    2049             },
    2050             "specification": {
    2051                 "category": "css-fonts",
    2052                 "url": "https://www.w3.org/TR/css-fonts-3/#propdef-font-variant"
    20532070            }
    20542071        },
  • trunk/Source/WebCore/css/parser/CSSParserFastPaths.cpp

    r213567 r214364  
    800800    case CSSPropertyWebkitOverflowScrolling:
    801801        return valueID == CSSValueAuto || valueID == CSSValueTouch;
     802#endif
     803#if ENABLE(VARIATION_FONTS)
     804    case CSSPropertyFontOpticalSizing:
     805        return valueID == CSSValueAuto || valueID == CSSValueNone;
    802806#endif
    803807    default:
     
    963967    case CSSPropertyApplePayButtonType:
    964968#endif
     969#if ENABLE(VARIATION_FONTS)
     970    case CSSPropertyFontOpticalSizing:
     971#endif
    965972        return true;
    966973    case CSSPropertyJustifyContent:
  • trunk/Source/WebCore/platform/graphics/FontCache.h

    r213505 r214364  
    123123    {
    124124        static_assert(USCRIPT_CODE_LIMIT < 0x1000, "Script code must fit in an unsigned along with the other flags");
    125         unsigned first = static_cast<unsigned>(description.script()) << 11
     125        unsigned first = static_cast<unsigned>(description.script()) << 12
     126            | static_cast<unsigned>(description.opticalSizing()) << 11
    126127            | static_cast<unsigned>(description.textRenderingMode()) << 9
    127128            | static_cast<unsigned>(description.fontSynthesis()) << 6
     
    276277};
    277278
    278 RetainPtr<CTFontRef> preparePlatformFont(CTFontRef, TextRenderingMode, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, const FontFeatureSettings& features, const FontVariantSettings&, FontSelectionRequest, const FontVariationSettings&);
     279RetainPtr<CTFontRef> preparePlatformFont(CTFontRef, TextRenderingMode, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, const FontFeatureSettings& features, const FontVariantSettings&, FontSelectionRequest, const FontVariationSettings&, FontOpticalSizing, float size);
    279280SynthesisPair computeNecessarySynthesis(CTFontRef, const FontDescription&, bool isPlatformFont = false);
    280281RetainPtr<CTFontRef> platformFontWithFamilySpecialCase(const AtomicString& family, FontSelectionRequest, float size);
  • trunk/Source/WebCore/platform/graphics/FontDescription.h

    r213464 r214364  
    9696            variantEastAsianRuby() };
    9797    }
     98    FontOpticalSizing opticalSizing() const { return static_cast<FontOpticalSizing>(m_opticalSizing); }
    9899
    99100    void setComputedSize(float s) { m_computedSize = clampToFloat(s); }
     
    128129    void setVariantEastAsianWidth(FontVariantEastAsianWidth variant) { m_variantEastAsianWidth = static_cast<unsigned>(variant); }
    129130    void setVariantEastAsianRuby(FontVariantEastAsianRuby variant) { m_variantEastAsianRuby = static_cast<unsigned>(variant); }
     131    void setOpticalSizing(FontOpticalSizing sizing) { m_opticalSizing = static_cast<unsigned>(sizing); }
    130132
    131133private:
     
    159161    unsigned m_variantEastAsianWidth : 2; // FontVariantEastAsianWidth
    160162    unsigned m_variantEastAsianRuby : 1; // FontVariantEastAsianRuby
     163    unsigned m_opticalSizing : 1; // FontOpticalSizing
    161164};
    162165
     
    190193        && m_variantEastAsianVariant == other.m_variantEastAsianVariant
    191194        && m_variantEastAsianWidth == other.m_variantEastAsianWidth
    192         && m_variantEastAsianRuby == other.m_variantEastAsianRuby;
     195        && m_variantEastAsianRuby == other.m_variantEastAsianRuby
     196        && m_opticalSizing == other.m_opticalSizing;
    193197}
    194198
     
    272276    static FontVariantCaps initialVariantCaps() { return FontVariantCaps::Normal; }
    273277    static FontVariantAlternates initialVariantAlternates() { return FontVariantAlternates::Normal; }
     278    static FontOpticalSizing initialOpticalSizing() { return FontOpticalSizing::Enabled; }
    274279    static const AtomicString& initialLocale() { return nullAtom; }
    275280
  • trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp

    r214242 r214364  
    431431#endif
    432432
    433 RetainPtr<CTFontRef> preparePlatformFont(CTFontRef originalFont, TextRenderingMode textRenderingMode, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, const FontFeatureSettings& features, const FontVariantSettings& variantSettings, FontSelectionRequest fontSelectionRequest, const FontVariationSettings& variations)
     433RetainPtr<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)
    434434{
    435435    bool alwaysAddVariations = false;
     
    441441#else
    442442    UNUSED_PARAM(fontSelectionRequest);
     443    UNUSED_PARAM(fontOpticalSizing);
     444    UNUSED_PARAM(size);
    443445#endif
    444446
     
    505507
    506508    // The system font is somewhat magical. Don't mess with its variations.
    507     if (!fontIsSystemFont(originalFont))
    508     {
     509    if (!fontIsSystemFont(originalFont)) {
    509510        applyVariation({{'w', 'g', 'h', 't'}}, static_cast<float>(fontSelectionRequest.weight));
    510511        applyVariation({{'w', 'd', 't', 'h'}}, static_cast<float>(fontSelectionRequest.width));
    511512        applyVariation({{'s', 'l', 'n', 't'}}, static_cast<float>(fontSelectionRequest.slope));
    512513    }
     514
     515    if (fontOpticalSizing == FontOpticalSizing::Enabled) {
     516        const float pxToPtRatio = 3.0f / 4;
     517        applyVariation({{'o', 'p', 's', 'z'}}, size * pxToPtRatio);
     518    }
     519
    513520    for (auto& newVariation : variations)
    514521        applyVariation(newVariation.tag(), newVariation.value());
     
    10381045}
    10391046
    1040 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, float size)
     1047static 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)
    10411048{
    10421049    if (family.isEmpty())
     
    10461053    if (!foundFont)
    10471054        foundFont = platformFontLookupWithFamily(family, request, size);
    1048     return preparePlatformFont(foundFont.get(), textRenderingMode, fontFaceFeatures, fontFaceVariantSettings, featureSettings, variantSettings, fontSelectionRequest, variationSettings);
     1055    return preparePlatformFont(foundFont.get(), textRenderingMode, fontFaceFeatures, fontFaceVariantSettings, featureSettings, variantSettings, fontSelectionRequest, variationSettings, fontOpticalSizing, size);
    10491056}
    10501057
     
    10851092    float size = fontDescription.computedPixelSize();
    10861093
    1087     auto font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, fontDescription.textRenderingMode(), fontDescription.fontSelectionRequest(), size);
     1094    auto font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, fontDescription.textRenderingMode(), fontDescription.fontSelectionRequest(), fontDescription.opticalSizing(), size);
    10881095
    10891096#if PLATFORM(MAC)
     
    10961103        autoActivateFont(family.string(), size);
    10971104
    1098         font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, fontDescription.textRenderingMode(), fontDescription.fontSelectionRequest(), size);
     1105        font = fontWithFamily(family, fontDescription.fontSelectionRequest(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontDescription.variationSettings(), fontFaceFeatures, fontFaceVariantSettings, fontDescription.textRenderingMode(), fontDescription.fontSelectionRequest(), fontDescription.opticalSizing(), size);
    10991106    }
    11001107#endif
     
    11841191    const FontPlatformData& platformData = originalFontData->platformData();
    11851192    auto result = lookupFallbackFont(platformData.font(), description.weight(), description.locale(), characters, length);
    1186     result = preparePlatformFont(result.get(), description.textRenderingMode(), nullptr, nullptr, description.featureSettings(), description.variantSettings(), description.fontSelectionRequest(), description.variationSettings());
     1193    result = preparePlatformFont(result.get(), description.textRenderingMode(), nullptr, nullptr, description.featureSettings(), description.variantSettings(), description.fontSelectionRequest(), description.variationSettings(), description.opticalSizing(), description.computedSize());
    11871194    if (!result)
    11881195        return lastResortFallbackFont(description);
  • trunk/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp

    r213505 r214364  
    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());
     43    font = preparePlatformFont(font.get(), fontDescription.textRenderingMode(), &fontFaceFeatures, &fontFaceVariantSettings, 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/text/TextFlags.h

    r213464 r214364  
    352352};
    353353
     354enum class FontOpticalSizing {
     355    Enabled,
     356    Disabled
     357};
     358
    354359}
  • trunk/Source/WebInspectorUI/UserInterface/Models/CSSKeywordCompletions.js

    r212985 r214364  
    9393    "azimuth", "border-collapse", "border-spacing", "caption-side", "clip-rule", "color", "color-interpolation",
    9494    "color-interpolation-filters", "color-rendering", "cursor", "direction", "elevation", "empty-cells", "fill",
    95     "fill-opacity", "fill-rule", "font", "font-family", "font-size", "font-style", "font-variant", "font-variant-numeric", "font-weight",
     95    "fill-opacity", "fill-rule", "font", "font-family", "font-size", "font-style", "font-variant", "font-variant-numeric", "font-weight", "font-optical-sizing",
    9696    "glyph-orientation-horizontal", "glyph-orientation-vertical", "hanging-punctuation", "image-rendering", "kerning", "letter-spacing",
    9797    "line-height", "list-style", "list-style-image", "list-style-position", "list-style-type", "marker", "marker-end",
     
    196196        "semi-expanded", "expanded", "extra-expanded", "ultra-expanded"
    197197    ],
     198    "font-optical-sizing": [
     199        "auto", "none",
     200    ],
    198201    "-webkit-color-correction": [
    199202        "default", "srgb"
Note: See TracChangeset for help on using the changeset viewer.