Title: [267141] trunk
Revision
267141
Author
akeer...@apple.com
Date
2020-09-16 06:45:53 -0700 (Wed, 16 Sep 2020)

Log Message

[Cocoa] Use OTF font features instead of AAT font features when possible
https://bugs.webkit.org/show_bug.cgi?id=182845
<rdar://problem/33046942>

Reviewed by Myles C. Maxfield.

Source/WebCore:

Using OTF font features instead of AAT font features allows WebKit to
leverage CoreText's mapping between OTF and AAT features. This prevents us
from having to maintain our own mapping, and adds support for previously
missing features (for AAT fonts), such as stylistic alternatives.

Note that the hlig and hist features are not mapped by CoreText for AAT
fonts, in which case we handle the mapping to an AAT font feature ourselves.

Test: css3/font-feature-settings-stylistic-set.html

* platform/graphics/cocoa/FontCacheCoreText.cpp:
(WebCore::appendTrueTypeFeature):
(WebCore::preparePlatformFont):

LayoutTests:

* css3/font-feature-settings-stylistic-set-expected-mismatch.html: Added.
* css3/font-feature-settings-stylistic-set.html: Added.
* platform/win/TestExpectations:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (267140 => 267141)


--- trunk/LayoutTests/ChangeLog	2020-09-16 07:18:59 UTC (rev 267140)
+++ trunk/LayoutTests/ChangeLog	2020-09-16 13:45:53 UTC (rev 267141)
@@ -1,3 +1,15 @@
+2020-09-16  Aditya Keerthi  <akeer...@apple.com>
+
+        [Cocoa] Use OTF font features instead of AAT font features when possible
+        https://bugs.webkit.org/show_bug.cgi?id=182845
+        <rdar://problem/33046942>
+
+        Reviewed by Myles C. Maxfield.
+
+        * css3/font-feature-settings-stylistic-set-expected-mismatch.html: Added.
+        * css3/font-feature-settings-stylistic-set.html: Added.
+        * platform/win/TestExpectations:
+
 2020-09-15  Rob Buis  <rb...@igalia.com>
 
         Fix lazy image load painting

Added: trunk/LayoutTests/css3/font-feature-settings-stylistic-set-expected-mismatch.html (0 => 267141)


--- trunk/LayoutTests/css3/font-feature-settings-stylistic-set-expected-mismatch.html	                        (rev 0)
+++ trunk/LayoutTests/css3/font-feature-settings-stylistic-set-expected-mismatch.html	2020-09-16 13:45:53 UTC (rev 267141)
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+.test {
+    font-family: "system-ui";
+}
+</style>
+</head>
+<body>
+<p>This test verifies that stylistic alternatives are rendered for TrueType fonts.</p>
+<div class="test">:</div>
+</body>
+</html>

Added: trunk/LayoutTests/css3/font-feature-settings-stylistic-set.html (0 => 267141)


--- trunk/LayoutTests/css3/font-feature-settings-stylistic-set.html	                        (rev 0)
+++ trunk/LayoutTests/css3/font-feature-settings-stylistic-set.html	2020-09-16 13:45:53 UTC (rev 267141)
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+.test {
+    font-family: "system-ui";
+    font-feature-settings: "ss03";
+}
+</style>
+</head>
+<body>
+<p>This test verifies that stylistic alternatives are rendered for TrueType fonts.</p>
+<div class="test">:</div>
+</body>
+</html>

Modified: trunk/LayoutTests/platform/win/TestExpectations (267140 => 267141)


--- trunk/LayoutTests/platform/win/TestExpectations	2020-09-16 07:18:59 UTC (rev 267140)
+++ trunk/LayoutTests/platform/win/TestExpectations	2020-09-16 13:45:53 UTC (rev 267141)
@@ -536,6 +536,7 @@
 
 # Font feature settings is not implemented.
 css3/font-feature-settings-rendering.html [ Skip ]
+css3/font-feature-settings-stylistic-set.html [ ImageOnlyFailure ]
 
 webkit.org/b/149771 css3/font-feature-settings-font-face-rendering.html [ Skip ] # WontFix
 webkit.org/b/149771 css3/font-variant-font-face-override.html [ Skip ] # WontFix

Modified: trunk/Source/WebCore/ChangeLog (267140 => 267141)


--- trunk/Source/WebCore/ChangeLog	2020-09-16 07:18:59 UTC (rev 267140)
+++ trunk/Source/WebCore/ChangeLog	2020-09-16 13:45:53 UTC (rev 267141)
@@ -1,3 +1,25 @@
+2020-09-16  Aditya Keerthi  <akeer...@apple.com>
+
+        [Cocoa] Use OTF font features instead of AAT font features when possible
+        https://bugs.webkit.org/show_bug.cgi?id=182845
+        <rdar://problem/33046942>
+
+        Reviewed by Myles C. Maxfield.
+
+        Using OTF font features instead of AAT font features allows WebKit to
+        leverage CoreText's mapping between OTF and AAT features. This prevents us
+        from having to maintain our own mapping, and adds support for previously
+        missing features (for AAT fonts), such as stylistic alternatives.
+
+        Note that the hlig and hist features are not mapped by CoreText for AAT
+        fonts, in which case we handle the mapping to an AAT font feature ourselves.
+
+        Test: css3/font-feature-settings-stylistic-set.html
+
+        * platform/graphics/cocoa/FontCacheCoreText.cpp:
+        (WebCore::appendTrueTypeFeature):
+        (WebCore::preparePlatformFont):
+
 2020-09-16  Philippe Normand  <pnorm...@igalia.com>
 
         [GStreamer][1.18] Regressions

Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp (267140 => 267141)


--- trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp	2020-09-16 07:18:59 UTC (rev 267140)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp	2020-09-16 13:45:53 UTC (rev 267141)
@@ -46,7 +46,7 @@
 
 namespace WebCore {
 
-static inline void appendRawTrueTypeFeature(CFMutableArrayRef features, int type, int selector)
+static inline void appendTrueTypeFeature(CFMutableArrayRef features, int type, int selector)
 {
     auto typeNumber = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &type));
     auto selectorNumber = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &selector));
@@ -61,85 +61,6 @@
     return equalIgnoringASCIICase(tag.data(), comparison, 4);
 }
 
-static inline void appendTrueTypeFeature(CFMutableArrayRef features, const FontFeature& feature)
-{
-    if (tagEquals(feature.tag(), "liga") || tagEquals(feature.tag(), "clig")) {
-        if (feature.enabled()) {
-            appendRawTrueTypeFeature(features, kLigaturesType, kCommonLigaturesOnSelector);
-            appendRawTrueTypeFeature(features, kLigaturesType, kContextualLigaturesOnSelector);
-        } else {
-            appendRawTrueTypeFeature(features, kLigaturesType, kCommonLigaturesOffSelector);
-            appendRawTrueTypeFeature(features, kLigaturesType, kContextualLigaturesOffSelector);
-        }
-    } else if (tagEquals(feature.tag(), "dlig")) {
-        if (feature.enabled())
-            appendRawTrueTypeFeature(features, kLigaturesType, kRareLigaturesOnSelector);
-        else
-            appendRawTrueTypeFeature(features, kLigaturesType, kRareLigaturesOffSelector);
-    } else if (tagEquals(feature.tag(), "hlig")) {
-        if (feature.enabled())
-            appendRawTrueTypeFeature(features, kLigaturesType, kHistoricalLigaturesOnSelector);
-        else
-            appendRawTrueTypeFeature(features, kLigaturesType, kHistoricalLigaturesOffSelector);
-    } else if (tagEquals(feature.tag(), "calt")) {
-        if (feature.enabled())
-            appendRawTrueTypeFeature(features, kContextualAlternatesType, kContextualAlternatesOnSelector);
-        else
-            appendRawTrueTypeFeature(features, kContextualAlternatesType, kContextualAlternatesOffSelector);
-    } else if (tagEquals(feature.tag(), "subs") && feature.enabled())
-        appendRawTrueTypeFeature(features, kVerticalPositionType, kInferiorsSelector);
-    else if (tagEquals(feature.tag(), "sups") && feature.enabled())
-        appendRawTrueTypeFeature(features, kVerticalPositionType, kSuperiorsSelector);
-    else if (tagEquals(feature.tag(), "smcp") && feature.enabled())
-        appendRawTrueTypeFeature(features, kLowerCaseType, kLowerCaseSmallCapsSelector);
-    else if (tagEquals(feature.tag(), "c2sc") && feature.enabled())
-        appendRawTrueTypeFeature(features, kUpperCaseType, kUpperCaseSmallCapsSelector);
-    else if (tagEquals(feature.tag(), "pcap") && feature.enabled())
-        appendRawTrueTypeFeature(features, kLowerCaseType, kLowerCasePetiteCapsSelector);
-    else if (tagEquals(feature.tag(), "c2pc") && feature.enabled())
-        appendRawTrueTypeFeature(features, kUpperCaseType, kUpperCasePetiteCapsSelector);
-    else if (tagEquals(feature.tag(), "unic") && feature.enabled())
-        appendRawTrueTypeFeature(features, kLetterCaseType, 14);
-    else if (tagEquals(feature.tag(), "titl") && feature.enabled())
-        appendRawTrueTypeFeature(features, kStyleOptionsType, kTitlingCapsSelector);
-    else if (tagEquals(feature.tag(), "lnum") && feature.enabled())
-        appendRawTrueTypeFeature(features, kNumberCaseType, kUpperCaseNumbersSelector);
-    else if (tagEquals(feature.tag(), "onum") && feature.enabled())
-        appendRawTrueTypeFeature(features, kNumberCaseType, kLowerCaseNumbersSelector);
-    else if (tagEquals(feature.tag(), "pnum") && feature.enabled())
-        appendRawTrueTypeFeature(features, kNumberSpacingType, kProportionalNumbersSelector);
-    else if (tagEquals(feature.tag(), "tnum") && feature.enabled())
-        appendRawTrueTypeFeature(features, kNumberSpacingType, kMonospacedNumbersSelector);
-    else if (tagEquals(feature.tag(), "frac") && feature.enabled())
-        appendRawTrueTypeFeature(features, kFractionsType, kDiagonalFractionsSelector);
-    else if (tagEquals(feature.tag(), "afrc") && feature.enabled())
-        appendRawTrueTypeFeature(features, kFractionsType, kVerticalFractionsSelector);
-    else if (tagEquals(feature.tag(), "ordn") && feature.enabled())
-        appendRawTrueTypeFeature(features, kVerticalPositionType, kOrdinalsSelector);
-    else if (tagEquals(feature.tag(), "zero") && feature.enabled())
-        appendRawTrueTypeFeature(features, kTypographicExtrasType, kSlashedZeroOnSelector);
-    else if (tagEquals(feature.tag(), "hist") && feature.enabled())
-        appendRawTrueTypeFeature(features, kLigaturesType, kHistoricalLigaturesOnSelector);
-    else if (tagEquals(feature.tag(), "jp78") && feature.enabled())
-        appendRawTrueTypeFeature(features, kCharacterShapeType, kJIS1978CharactersSelector);
-    else if (tagEquals(feature.tag(), "jp83") && feature.enabled())
-        appendRawTrueTypeFeature(features, kCharacterShapeType, kJIS1983CharactersSelector);
-    else if (tagEquals(feature.tag(), "jp90") && feature.enabled())
-        appendRawTrueTypeFeature(features, kCharacterShapeType, kJIS1990CharactersSelector);
-    else if (tagEquals(feature.tag(), "jp04") && feature.enabled())
-        appendRawTrueTypeFeature(features, kCharacterShapeType, kJIS2004CharactersSelector);
-    else if (tagEquals(feature.tag(), "smpl") && feature.enabled())
-        appendRawTrueTypeFeature(features, kCharacterShapeType, kSimplifiedCharactersSelector);
-    else if (tagEquals(feature.tag(), "trad") && feature.enabled())
-        appendRawTrueTypeFeature(features, kCharacterShapeType, kTraditionalCharactersSelector);
-    else if (tagEquals(feature.tag(), "fwid") && feature.enabled())
-        appendRawTrueTypeFeature(features, kTextSpacingType, kMonospacedTextSelector);
-    else if (tagEquals(feature.tag(), "pwid") && feature.enabled())
-        appendRawTrueTypeFeature(features, kTextSpacingType, kProportionalTextSelector);
-    else if (tagEquals(feature.tag(), "ruby") && feature.enabled())
-        appendRawTrueTypeFeature(features, kRubyKanaType, kRubyKanaOnSelector);
-}
-
 static inline void appendOpenTypeFeature(CFMutableArrayRef features, const FontFeature& feature)
 {
     auto featureKey = adoptCF(CFStringCreateWithBytes(kCFAllocatorDefault, reinterpret_cast<const UInt8*>(feature.tag().data()), feature.tag().size() * sizeof(FontTag::value_type), kCFStringEncodingASCII, false));
@@ -658,10 +579,17 @@
         auto featureArray = adoptCF(CFArrayCreateMutable(kCFAllocatorDefault, features.size(), &kCFTypeArrayCallBacks));
         for (auto& p : featuresToBeApplied) {
             auto feature = FontFeature(p.key, p.value);
-            if (fontType.aatShaping)
-                appendTrueTypeFeature(featureArray.get(), feature);
-            if (fontType.openTypeShaping)
-                appendOpenTypeFeature(featureArray.get(), feature);
+
+            // CoreText does not map hlig and hist for TrueType fonts.
+            if (fontType.aatShaping && (tagEquals(feature.tag(), "hlig") || tagEquals(feature.tag(), "hist"))) {
+                if (feature.enabled())
+                    appendTrueTypeFeature(featureArray.get(), kLigaturesType, kHistoricalLigaturesOnSelector);
+                else if (tagEquals(feature.tag(), "hlig"))
+                    appendTrueTypeFeature(featureArray.get(), kLigaturesType, kHistoricalLigaturesOffSelector);
+                continue;
+            }
+
+            appendOpenTypeFeature(featureArray.get(), feature);
         }
         CFDictionaryAddValue(attributes.get(), kCTFontFeatureSettingsAttribute, featureArray.get());
     }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to