- From: Myles C. Maxfield <mmaxfield@apple.com>
- Date: Tue, 18 Aug 2015 14:07:54 -0700
- To: John Daggett <jdaggett@mozilla.com>
- Cc: www-style list <www-style@w3.org>
- Message-id: <F5824DD3-8F55-458D-B394-A86D904A5237@apple.com>
Reply inline. > On Aug 13, 2015, at 7:38 PM, John Daggett <jdaggett@mozilla.com> wrote: > > > 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 <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. I think this would be a good idea in the form of an appendix. Would you like me to draft up a table? > > 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 <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 <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 Tuesday, 18 August 2015 21:08:27 UTC