- From: John Daggett <jdaggett@mozilla.com>
- Date: Fri, 14 Aug 2015 11:38:52 +0900
- To: "Myles C. Maxfield" <mmaxfield@apple.com>
- Cc: www-style list <www-style@w3.org>
- Message-ID: <CALYZoVN25CUnFbOLJAfR2J9LYozQ+fc=qsg6u=og7m1pJUmXxQ@mail.gmail.com>
Myles Maxfield wrote: > > The distinction you're making here isn't really "TrueType" vs. > > "OpenType" but between fonts supporting font features via OpenType > > layout tables (GSUB/GPOS/GDEF) vs. AAT tables (morx, etc.). > > I'm not actually describing "TrueType vs. OpenType" but instead about > "specific to one font technology" vs "generalizable to more than one > specific font technology." The 'font-feature-settings' property explicitly defines how to enable/disable OpenType features. It's an escape hatch because we can't possibly support all features in the OpenType feature registry. The font-variant-* subproperties define features that can be mapped to future font technologies. The mapping to OpenType features is normative. > > Rather than mapping feature tags in 'font-feature-settings' to Apple > > font feature constants [1], I think the best way forward for Apple would > > be to map the property values of 'font-variant' to associated AAT > > feature id's, where they exist. This would be fairly easy to support in > > existing Webkit code. We could incorporate this sort of mapping into a > > future version of the spec. > > My proposal isn't anything quite so stringent. I am not advocating > that a specific mapping be supplied in the fonts spec (or even that > the term "TrueType" appear anywhere in it). Instead, I'm simply > proposing one sentence encouraging UAs to do their best to map > OpenType feature tags & values onto whichever underlying font > technology is used. WebKit currently does this for TrueType fonts [1]. The code you're pointing to uses CoreText which shapes text using *either* TrueType AAT or OpenType layout tables depending upon the font. The set of features defined in CoreText in SFNTLayoutTypes.h is a merged combination of common features in the OpenType layout registry and features originally defined in TrueType AAT (this merge was done in 10.8). Some features exist in one but not the other (e.g. both have a notion of common ligatures while AAT fonts allowed "Rebus Picture" ligatures and OpenType allowed historical ligatures). CoreText is basically papering over the differences between these two distinct underlying font types. Mapping isn't going to work completely unless the underlying implementation exposes direct access to arbitrary features, which CoreText doesn't. The only real alternatives to OpenType layout features are AAT and Graphite font features. I think based on Webkit's implementation experience we could add an informative appendix to suggest how to map OpenType features to underlying AAT features via CoreText under OSX/iOS. Something like this table in the Harfbuzz CoreText shaping code: https://github.com/behdad/harfbuzz/blob/master/src/hb-coretext.cc#L346 This would be better than a general statement about mapping features and would produce more interoperable browser support. Cheers, John Daggett Merge history for AAT and OpenType font features ================================================ MacOS 10.6 features, original AAT font features: https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX10.6.sdk/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Headers/SFNTLayoutTypes.h MacOS 10.8 font features, merged combination of AAT features with features defined in OpenType: https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX10.8.sdk/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Headers/SFNTLayoutTypes.h Diff: 58c40 < kLetterCaseType = 3, --- > kLetterCaseType = 3, /* deprecated - use kLowerCaseType or kUpperCaseType instead */ 85a68,73 > kCaseSensitiveLayoutType = 33, > kAlternateKanaType = 34, > kStylisticAlternativesType = 35, > kContextualAlternatesType = 36, > kLowerCaseType = 37, > kUpperCaseType = 38, 124c112,116 < kSymbolLigaturesOffSelector = 17 --- > kSymbolLigaturesOffSelector = 17, > kContextualLigaturesOnSelector = 18, > kContextualLigaturesOffSelector = 19, > kHistoricalLigaturesOnSelector = 20, > kHistoricalLigaturesOffSelector = 21 144,149c136,141 < kUpperAndLowerCaseSelector = 0, < kAllCapsSelector = 1, < kAllLowerCaseSelector = 2, < kSmallCapsSelector = 3, < kInitialCapsSelector = 4, < kInitialCapsAndSmallCapsSelector = 5 --- > kUpperAndLowerCaseSelector = 0, /* deprecated */ > kAllCapsSelector = 1, /* deprecated */ > kAllLowerCaseSelector = 2, /* deprecated */ > kSmallCapsSelector = 3, /* deprecated */ > kInitialCapsSelector = 4, /* deprecated */ > kInitialCapsAndSmallCapsSelector = 5 /* deprecated */ 222c214,215 < kOrdinalsSelector = 3 --- > kOrdinalsSelector = 3, > kScientificInferiorsSelector = 4 281c274,276 < kExponentsOffSelector = 9 --- > kExponentsOffSelector = 9, > kMathematicalGreekOnSelector = 10, > kMathematicalGreekOffSelector = 11 351c346,350 < kExpertCharactersSelector = 10 --- > kExpertCharactersSelector = 10, > kJIS2004CharactersSelector = 11, > kHojoCharactersSelector = 12, > kNLCCharactersSelector = 13, > kTraditionalNamesCharactersSelector = 14 372c371,375 < kHalfWidthTextSelector = 2 --- > kHalfWidthTextSelector = 2, > kThirdWidthTextSelector = 3, > kQuarterWidthTextSelector = 4, > kAltProportionalTextSelector = 5, > kAltHalfWidthTextSelector = 6 511a515,623 > * Selectors for feature type kCaseSensitiveLayoutType > */ > enum { > kCaseSensitiveLayoutOnSelector = 0, > kCaseSensitiveLayoutOffSelector = 1, > kCaseSensitiveSpacingOnSelector = 2, > kCaseSensitiveSpacingOffSelector = 3 > }; > > > /* > * Summary: > * Selectors for feature type kAlternateKanaType > */ > enum { > kAlternateHorizKanaOnSelector = 0, > kAlternateHorizKanaOffSelector = 1, > kAlternateVertKanaOnSelector = 2, > kAlternateVertKanaOffSelector = 3 > }; > > > /* > * Summary: > * Selectors for feature type kStylisticAlternativesType > */ > enum { > kNoStylisticAlternatesSelector = 0, > kStylisticAltOneOnSelector = 2, > kStylisticAltOneOffSelector = 3, > kStylisticAltTwoOnSelector = 4, > kStylisticAltTwoOffSelector = 5, > kStylisticAltThreeOnSelector = 6, > kStylisticAltThreeOffSelector = 7, > kStylisticAltFourOnSelector = 8, > kStylisticAltFourOffSelector = 9, > kStylisticAltFiveOnSelector = 10, > kStylisticAltFiveOffSelector = 11, > kStylisticAltSixOnSelector = 12, > kStylisticAltSixOffSelector = 13, > kStylisticAltSevenOnSelector = 14, > kStylisticAltSevenOffSelector = 15, > kStylisticAltEightOnSelector = 16, > kStylisticAltEightOffSelector = 17, > kStylisticAltNineOnSelector = 18, > kStylisticAltNineOffSelector = 19, > kStylisticAltTenOnSelector = 20, > kStylisticAltTenOffSelector = 21, > kStylisticAltElevenOnSelector = 22, > kStylisticAltElevenOffSelector = 23, > kStylisticAltTwelveOnSelector = 24, > kStylisticAltTwelveOffSelector = 25, > kStylisticAltThirteenOnSelector = 26, > kStylisticAltThirteenOffSelector = 27, > kStylisticAltFourteenOnSelector = 28, > kStylisticAltFourteenOffSelector = 29, > kStylisticAltFifteenOnSelector = 30, > kStylisticAltFifteenOffSelector = 31, > kStylisticAltSixteenOnSelector = 32, > kStylisticAltSixteenOffSelector = 33, > kStylisticAltSeventeenOnSelector = 34, > kStylisticAltSeventeenOffSelector = 35, > kStylisticAltEighteenOnSelector = 36, > kStylisticAltEighteenOffSelector = 37, > kStylisticAltNineteenOnSelector = 38, > kStylisticAltNineteenOffSelector = 39, > kStylisticAltTwentyOnSelector = 40, > kStylisticAltTwentyOffSelector = 41 > }; > > > /* > * Summary: > * Selectors for feature type kContextualAlternatesType > */ > enum { > kContextualAlternatesOnSelector = 0, > kContextualAlternatesOffSelector = 1, > kSwashAlternatesOnSelector = 2, > kSwashAlternatesOffSelector = 3, > kContextualSwashAlternatesOnSelector = 4, > kContextualSwashAlternatesOffSelector = 5 > }; > > > /* > * Summary: > * Selectors for feature type kLowerCaseType > */ > enum { > kDefaultLowerCaseSelector = 0, > kLowerCaseSmallCapsSelector = 1, > kLowerCasePetiteCapsSelector = 2 > }; > > > /* > * Summary: > * Selectors for feature type kUpperCaseType > */ > enum { > kDefaultUpperCaseSelector = 0, > kUpperCaseSmallCapsSelector = 1, > kUpperCasePetiteCapsSelector = 2 > };
Received on Friday, 14 August 2015 02:39:21 UTC