Font Feature Registry

Introduction

This document describes the set of currently defined typographic and layout features available from applications using AAT. It describes these features from several points of view, including that of the font designer, the user, and the application developer. This is a dynamic list - the AAT architecture allows new kinds of features to be defined without requiring a revision to either the application or the ATSUI software itself. You can submit new features to the Registry here.


The designer/user model

Typographic effects are achieved in AAT through the use of two sixteen-bit numbers called a feature and selector. (Selectors are often called “settings.”) The feature code indicates a general class of effect (e.g., ligatures) and the selector code the specific effect (e.g., rare ligatures).

Features are classified as "exclusive" and "nonexclusive." This indicates whether several different selectors within a given feature type may be selected at once. Thus, it is possible to have both common and rare ligatures turned on, whereas it is impossible to display a given fraction as simultaneously vertical and diagonal.

For nonexclusive features, selectors come in pairs consisting of an even number (0, 2, 4,…) and the odd number following it (1, 3, 5,…). The even number indicates that the selector is on, and the odd number that it is explicitly off.

For example, the ligature feature has selectors for common ligatures. A selector of 2 means that they are to be turned on and a selector of 3 forces them to be off. Now, Unicode includes a pre-defined fi ligature, fi U+FB01 LATIN SMALL LIGATURE FI. It is included in Unicode for compatibility reasons and ordinarily should not be inserted into text by the user. If for any reason it is, then the feature/selector pair 1/3 could be used to display the ligature as separate f and i glyphs.

In the tables below, the value shown for such paired selectors is always the even one, turning the feature on.

Defined Features

A list of the main features types follows, with links to their descriptions. This is not an exhaustive list of possible feature/selector pairs. In particular, font designers may use custom feature/selector pairs as required. Such custom feature/selector pairs will appear in the UI if the 'feat', 'morx', and 'name' tables are properly set up. Feature types greater than 255 are reserved for custom features.

Early versions of the AAT Font Feature Registry included a number of feature/selector pairs whose use is now discouraged. As a rule, font features should not be used to change the appearance of text when the same effect can be achieved by changing the character stream.

For example, the feature/selector pair kMathematicalExtrasType/kAsteriskToMultiplyOnSelector is used to give an asterisk (*) the appearance of a multiplication sign (×). Both are encoded in Unicode (the asterisk as U+002A and multiplication sign as U+00D7). Changes such as these are generally confusing to users because they can't tell whether the text itself has changed or just its appearance. Such feature/selector pairs were generally defined before all text could be assumed to be Unicode. Since that all text on OS X and iOS is now represented as Unicode, such feature/selector pairs should generally not be used.

The exception would be cases where a character is in Unicode only for compatibility reasons, such as the fi ligature.

Discouraged and deprecated selectors are shown like this.

 

 

All Typographic Features

Feature Constant Feature Value Feature Type
kAllTypographicFeatures 0 Nonexclusive

The All Typographic Features feature type allows the user to specify whether or not any effects should occur. It is an all or nothing bit—if off, all other specifications are ignored. This feature might be turned off by a user who receives a non-AAT document and wants to ensure that the document does not reflow.

Note that this feature should be present in the UI only for debugging purposes. It should not be shown to general users, as it will disable features required to make the text legible.

Selector Name Selector Constant(s) Selector Value Selector Function
All Typographic Features kAllTypeFeaturesOnSelector
kAllTypeFeaturesOffSelector
0 Turns on or off all other features. This feature/selector pair is required and will be added to a 'morx' table automatically by ftxenhancer.

 

 

Ligatures

Feature Constant Feature Value Feature Type
kLigatures 1 Nonexclusive

The Ligatures feature type permits selection from different kinds of ligatures. It is a non-exclusive feature type.

Selector Name Selector Constant(s) Selector Value Selector Function
Required Ligatures kRequiredLigaturesOnSelector
kRequiredLigaturesOffSelector
0 Those ligatures that are linguistically required, such as occur in Arabic or Hindi. This should generally not be visible in the UI.
Common Ligatures kCommonLigaturesOnSelector
kCommonLigaturesOffSelector
2 The ligatures that usually appear in well-set text, for instance the "fi" and "fl" ligatures in English. (Note that such ligatures may be serpately encoded within Unicode, but only as compatibility characters.)
Rare Ligatures kRareLigaturesOnSelector
kRareLigaturesOffSelector
4 Ligatures in a font that are less common than those included in the Common category, for instance an "fj" ligature. (Note that such ligatures may be serpately encoded within Unicode, but only as compatibility characters.)
Logos kLogosOnSelector
kLogosOffSelector
6 Ligatures representing logos (e.g. trademarks). For instance, typing the word "Taligent" and seeing the Taligent logo. This feature/selector pair should not be used; rather, appropriate graphics should be inserted into the text.
Rebus Pictures kRebusPicturesOnSelector
kRebusPicturesOffSelector
8 Ligatures that are pictures representing words or syllables.
Diphthong Ligatures kDiphthongLigaturesOnSelector
kDiphthongLigaturesOffSelector
10 Ligatures like Æ and æ. The use of this selector is strongly discouraged.
Squared Ligatures kSquaredLigaturesOnSelector
kSquaredLigaturesOffSelector
12 These are ligatures where the component letters are arranged in a lattice, such that the ligature fits into the space of a single letter. For examples, see Unicodes U+3300 through U+3357 and U+337B through U+337F.
Squared Ligatures, Abbreviated kAbbrevSquaredLigaturesOnSelector
kAbbrevSquaredLigaturesOffSelector
14 These are similar to the previously described ligatures, but in abbreviated form.
Symbol Ligatures kSymbolLigaturesOnSelector
kSymbolLigaturesOffSelector
16 Ligatures displayed using a graphic (e.g., emoji)
Contextual Ligatures kContextualLigaturesOnSelector
kContextualLigaturesOffSelector
18 Ligatures which appear in some context and not in others.
Historical Ligatures kHistoricalLigaturesOnSelector
kHistoricalLigaturesOffSelector
20 Ligatures which are generally not in current use.

 

 

Cursive Connection

Feature Constant Feature Value Feature Type
kCursiveConnection 2 Exclusive

The Cursive Connection feature type is used for cursively-connected scripts. It is required for Arabic, but may be used for other scripts as well.

Selector Name Selector Constant(s) Selector Value Selector Function
Unconnected kUnconnectedSelector 0 Disables cursive connection altogether. Note that selecting this for some scripts will result in incorrect liguistic appearance.
Partially Connected kPartiallyConnectedSelector 1 Selects pre-drawn letterforms that connect in a non-contextual manner.
Cursive kCursiveSelector 2 Selects full, contextual connection of letterforms. This setting must always be the default in fonts for scripts that require this behavior.

 

 

Letter Case

Feature Constant Feature Value Feature Type
kLetterCase 3 Exclusive

The Letter Case feature type is used to specify changes to the case of letters (in scripts where case has meaning), in either a contextual or a non-contextual manner.

The Letter Case feature is deprecated. Use the Lower Case and Upper Case features instead.

Selector Name Selector Constant(s) Selector Value Selector Function
Upper & Lower Case kUpperAndLowerCaseSelector 0 The default setting; it leaves letters in whichever case the user has specified.
All Caps kAllCapsSelector 1 Converts all letters non-contextually to upper-case. Remember that this effect (like all others described in this document) happens only to the appearance of the letters; even though a lower-case letter may have an upper-case appearance through the use of this feature, the string the user typed remains invariant (i.e. still lower-case).
All Lower Case kAllLowerCaseSelector 2 Converts all letters non-contextually to lower-case.
Small Caps kSmallCapsSelector 3 Converts lower-case letters non-contextually into true small caps forms.
Initial Caps kInitialCapsSelector 4 Contextually converts the first letter of a word into upper-case and the remaining letters into lower-case.
Initial Caps and Small Caps kInitialCapsAndSmallCapsSelector 5 Contextually converts the first letter of a word into upper-case and the remaining letters into small caps.

 

 

Vertical Substitution

Feature Constant Feature Value Feature Type
kVerticalSubstitution 4 Nonexclusive

The Vertical Substitution feature type can be used to specify that glyphs need to change their appearance in vertical runs of text.

There is only one selector for this feature:

Selector Name Selector Constant(s) Selector Value Selector Function
Vertical Substitution kSubstituteVerticalFormsOnSelector
kSubstituteVerticalFormsOffSelector
0 Turns on the feature.

 

 

Linguistic Rearrangement

Feature Constant Feature Value Feature Type
kLinguisticRearrangement 5 Nonexclusive

The Linguistic Rearrangement feature type specifies whether linguistic rearrangement of glyphs (such as happens in South Asian scripts) should happen. It is on by default for fonts representing these scripts.

It is important to note that this feature is different than the notion of linguistic reordering, which happens when text from predominantly left-to-right scripts (such as Latin) is mixed with text from predominantly right-to-left scripts (such as Hebrew).

As a rule, this feature should not be visible in the UI.

There is only one selector for this feature:

Selector Name Selector Constant(s) Selector Value Selector Function
Linguistic Rearrangement kLinguisticRearrangementOnSelector
kLinguisticRearrangementOffSelector
0 Turns on the feature.

 

 

Number Spacing

Feature Constant Feature Value Feature Type
kNumberSpacing 6 Exclusive

The Number Spacing feature type specifies a choice for the appearance of digits.

Selector Name Selector Constant(s) Selector Value Selector Function
Monospaced Numbers kMonospacedNumbersSelector 0 Uniform width numbers, useful for displaying in columns. Sometimes known as "columnating" numbers.
Proportional Numbers kProportionalNumbersSelector 1 Numbers whose widths vary.
Third-width Numerals kThirdWidthNumbersSelector 2 Thin numerals.
Quarter-width Numerals kQuarterWidthNumbersSelector 3 Very thin numerals.

 

 

Smart Swash

Feature Constant Feature Value Feature Type
kSmartSwash 8 Nonexclusive

The Smart Swashes feature type controls contextual swash substitution. These are swashes that appear based on an analysis of context, rather than via simple substitution. This is a non-exclusive feature type.

Selector Name Selector Constant(s) Selector Value Selector Function
Word Initial Swashes kWordInitialSwashesOnSelector
kWordInitialSwashesOffSelector
0 Special forms that can appear at the start of a word (or a line).
Word Final Swashes kWordFinalSwashesOnSelector
kWordFinalSwashesOffSelector
2 Special forms that can appear at the end of a word (or a line).
Line Initial Swashes kLineInitialSwashesOnSelector
kLineInitialSwashesOffSelector
4 Special forms that can appear only at the start of a line. This is unsupported in CoreText.
Line Final Swashes kLineFinalSwashesOnSelector
kLineFinalSwashesOffSelector
6 Special forms that can appear only at the end of a line. This is unsupported in CoreText.
Non-Final Swashes kNonFinalSwashesOnSelector
kNonFinalSwashesOffSelector
8 Forms that are used at the beginning or middle of words. An example of this is the archaic use of the long-s (ſ) for a medial s.

 

 

Diacritics

Feature Constant Feature Value Feature Type
kDiacritics 9 Exclusive

The Diacritics feature type allows control over how diacritics (i.e. accent marks or applied vowels) appear in text.

Selector Name Selector Constant(s) Selector Value Selector Function
Show Diacritics kShowDiacriticsSelector 0 This is the default. It means to display the diacritics normally (that is, attached to their baseforms in the right place).
Hide Diacritics kHideDiacriticsSelector 1 Don't show the diacritics. This is useful in Arabic children's book text, where the same text can be shown with vowels for one reading audience and without vowels for another.
Decompose Diacritics kDecomposeDiacriticsSelector 2 Show the diacritics, but rather than attaching them to their baseforms, show them inline with the rest of the text.

 

 

Vertical Position

Feature Constant Feature Value Feature Type
kVerticalPosition 10 Exclusive

The Vertical Position feature type controls things like superscripts and subscripts.

Selector Name Selector Constant(s) Selector Value Selector Function
No Vertical Position kNormalPositionSelector 0 This is the default. It means to display the text with no vertical displacement.
Superiors kSuperiorsSelector 1 Changes any characters having superior forms in the font into those forms.
Inferiors kInferiorsSelector 2 Changes any characters having inferior forms in the font into those forms.
Ordinals kOrdinalsSelector 3 Contextually changes certain letters into their superior forms, like in Spanish changing from 1a to 1ª.
Scientific Inferiors kScientificInferiorsSelector 4 Changes any characters having them into inferior forms designed for a technical context (as in H2O).

 

 

Fractions

Feature Constant Feature Value Feature Type
kFractions 11 Exclusive

The Fractions feature type controls the selection and/or generation of fractions.

Selector Name Selector Constant(s) Selector Value Selector Function
No Fractions kNoFractionsSelector 0 This means fractions should not be formed automatically.
Vertical Fractions kVerticalFractionsSelector 1 Form vertical (pre-drawn) fractions present in the font.
Diagonal Fractions kDiagonalFractionsSelector 2 Acts like the Vertical Fractions selector, but fractions will be synthesized using superiors and inferiors (or special-purpose numerator and denominator forms, if present in the font).

 

 

Overlapping Characters

Feature Constant Feature Value Feature Type
kOverlappingCharacters 13 Nonexclusive

The Overlapping Characters feature type permits the user to prevent the collision of long tails on characters with other characters.

Selector Name Selector Constant(s) Selector Value Selector Function
Overlap Prevention kPreventOverlapOnSelector
kPreventOverlapOffSelector
0 Turns overlap prevention on or off.

 

 

Typographic Extras

Feature Constant Feature Value Feature Type
kTypographicExtras 14 Nonexclusive

The Typographic Extras feature type represents a collection of effects that are associated with fine typography. It is a non-exclusive feature type.

Except for the slashed/unslashed selector, the use of this feature is discouraged. Font features should not be used to mimic possible changes in the underlying text, as it confuses users.

Selector Name Selector Constant(s) Selector Value Selector Function
Hyphens to Em Dash kHyphensToEmDashOnSelector
kHyphensToEmDashOffSelector
0 Causes two adjacent hyphens to change into a single em dash. Use of this selector is discouraged.
Hyphen to En Dash kHyphenToEnDashOnSelector
kHyphenToEnDashOffSelector
2 Changes the hyphen in a space-hyphen-space or digit-hyphen-digit group into an en dash. Use of this selector is discouraged.
Unslashed Zero kSlashedZeroOnSelector
kSlashedZeroOffSelector
4 Makes sure the unslashed zero is always used (even if the font designates the slashed zero as default), of course assuming the unslashed zero actually exists in the font.
Form Interrobang kFormInterrobangOnSelector
kFormInterrobangOffSelector
6 Maps the strings '?!' or '!?' to the interrobang (if present in the font). Use of this selector is discouraged.
Smart Quotes kSmartQuotesOnSelector
kSmartQuotesOffSelector
8 Contextually replaces straight quotes with curly quotes. Use of this selector is discouraged.
Periods to Ellipsis kPeriodsToEllipsisOnSelector
kPeriodsToEllipsisOffSelector
10 Replaces a sequence of three periods with the ellipsis. Use of this selector is discouraged.

 

 

Mathematical Extras

Feature Constant Feature Value Feature Type
kMathematicalExtras 15 Nonexclusive

The Mathematical Extras feature type represents a collection of effects useful in setting figures and mathematics. It is a non-exclusive feature type.

Selector Name Selector Constant(s) Selector Value Selector Function
Hyphen To Minus kHyphenToMinusOnSelector
kHyphenToMinusOffSelector
0 Changes the hyphen in a space-hyphen-space or digit-hyphen-digit group into a minus. Use of this selector is discouraged.
Asterisk to Multiply kAsteriskToMultiplyOnSelector
kAsteriskToMultiplyOffSelector
2 Changes the "*" in a space-*-space group into a multiplication sign (×). Use of this selector is discouraged.
Slash to Divide kSlashToDivideOnSelector
kSlashToDivideOffSelector
4 Changes the "/" in a space-/-space group into a division sign (÷). Use of this selector is discouraged.
Inequality Ligatures kInequalityLigaturesOnSelector
kInequalityLigaturesOffSelector
6 Changes the >= sequence into a greater-than-or-equal glyph and the <= sequence into a less-than-or-equal glyph. Use of this selector is discouraged.
Exponents kExponentsOnSelector
kExponentsOffSelector
8 Takes digits immediately following a "^" and changes them into their superior forms. Use of this selector is discouraged.
Mathematical Greek kMathematicalGreekOnSelector
kMathematicalGreekOffSelector
10 Special forms of Greek glyphs designed for use in mathematics (as opposed to writing Greek).

 

 

Ornament Sets

Feature Constant Feature Value Feature Type
kOrnamentSets 16 Exclusive

The Ornament Sets feature type specifies non-letter ornament sets of glyphs. For example, fleurons or decorative borders could be represented by this feature type.

This feature is useful to allow a single pi font to stand in for several.

As a rule, this feature should only be used for characters in one of Unicode's private use areas.

Selector Name Selector Constant(s) Selector Value Selector Function
None kNoOrnamentsSelector 0 Do not select any ornaments.
Dingbats kDingbatsSelector 1 Chooses miscellaneous symbols such as arrows, stars, and pointing hands used for occasional emphasis in display.
Pi Characters kPiCharactersSelector 2 Chooses a set of related symbols designed for a particular purpose (e.g. cartography or musical notation) which do not make up a formal alphabet.
Fleurons kFleuronsSelector 3 Chooses ornaments in the shape of flowers, vine leaves, and so on.
Decorative Borders kDecorativeBordersSelector 4 Chooses glyphs designed to be used in interlocking or repeating patterns as borders for text.
International Symbols kInternationalSymbolsSelector 5 Chooses glyphs representing standard, internationally-recognizable icons.
Math Symbols kMathSymbolsSelector 6 Chooses special symbols used in setting mathematics or logic text. This should only be used for forms which are not already included in Unicode.

 

 

Character Alternatives

Feature Constant Feature Value Feature Type
kCharacterAlternatives 17 Exclusive

The selectors for this feature simply select different sets of glyphs in a font. For example, a font with twenty ampersands could place them in twenty selectors under this feature type. Use of the Style Options feature type is, however, preferred when feasible. The first setting for this feature (selector 0) should be "No Alternates".

The selectors are not ennumerated.

 

 

Design Complexity

Feature Constant Feature Value Feature Type
kDesignComplexity 18 Exclusive

The Design Complexity feature type controls the overall appearance of the font. It can be used to allow a single font to contain plain glyphs, italic glyphs, calligraphic chancery glyphs, etc. Design Level 1 should be available for any font which utilizes this feature type, and it should generally be the default setting. The remaining design levels progress from simplest to most complex.

Selector Name Selector Constant(s) Selector Value Selector Function
Design Level 1 kDesignLevel1Selector 0 Normal glyphs (first design level)
Design Level 2 kDesignLevel2Selector 1 Second design level
Design Level 3 kDesignLevel3Selector 2 Third design level
Design Level 4 kDesignLevel4Selector 3 Fourth design level
Design Level 5 kDesignLevel5Selector 4 Fifth design level

 

 

Style Options

Feature Constant Feature Value Feature Type
kStyleOptions 19 Exclusive

The Style Options feature type allows the font designer to group together collections of non-contextual substitutions into named sets.

Selector Name Selector Constant(s) Selector Value Selector Function
No Style Options kNoStyleOptionsSelector 0 Use plain text.
Display Text kDisplayTextSelector 1 Chooses glyphs designed to emphasize the unique appearance of the design at display sizes, typically above 24 point.
Engraved Text kEngravedTextSelector 2 Chooses glyphs with contrasting strokes parallel to the main strokes, particularly those designed to look like they're engraved in stone.
Illuminated Caps kIlluminatedCapsSelector 3 Chooses capital letter glyphs with decoration filling the white space surrounding the glyph, in the manner used by medieval scribes.
Titling Caps kTitlingCapsSelector 4 Specifies conversion of capital letters to a special titling form.
Tall Caps kTallCapsSelector 5 Specifies conversion of certain capital letters into taller forms.

 

 

Character Shape

Feature Constant Feature Value Feature Type
kCharacterShape 20 Exclusive

The Character Shape feature type is useful when a single font contains different appearances for the same character which are not traditionally treated as swashes.

Note that for a Simplified Chinese to Traditional Chinese mapping, there are often several possible choices. Use the traditional characters alternative sets for these.

Selector Name Selector Constant(s) Selector Value Selector Function
Traditional Glyphs kTraditionalCharactersSelector 0 Use traditional forms for characters.
Simplified Glyphs kSimplifiedCharactersSelector 1 Use simplified forms for characters. The use of this selector for simplified glyphs sperately encoded within Unicode (e.g., 说 for 説).
JIS 1978 Glyphs kJIS1978CharactersSelector 2 Use character shapes for Japanese characters as defined by the JIS (Japanese Industrial Standard) C 6226-1978 document.
JIS 1983 Glyphs kJIS1983CharactersSelector 3 Use character shapes for Japanese characters as defined by the JIS X 0208-1983 document.
JIS 1990 Glyphs kJIS1990CharactersSelector 4 Use character shapes for Japanese characters as defined by the JIS X 0208-1990 document.
Traditional Glyphs, Alternative Set 1 kTraditionalAltOneSelector 5 Use alternate set 1 of traditional forms for characters.
Traditional Glyphs, Alternative Set 2 kTraditionalAltTwoSelector 6 Use alternate set 2 of traditional forms for characters.
Traditional Glyphs, Alternative Set 3 kTraditionalAltThreeSelector 7 Use alternate set 3 of traditional forms for characters.
Traditional Glyphs, Alternative Set 4 kTraditionalAltFourSelector 8 Use alternate set 4 of traditional forms for characters.
Traditional Glyphs, Alternative Set 5 kTraditionalAltFiveSelector 9 Use alternate set 5 of traditional forms for characters.
Expert Glyphs kExpertCharactersSelector 10 Use "expert" forms of ideographs, such as are defined in the Fujitsu FMR character set.
JIS 2004 Glyphs kJIS2004CharactersSelector 11 Use character shapes for Japanese characters as defined by the JIS X 0208-2004 document.
Hojo Glyphs kHojoCharactersSelector 12 The JIS X 0212-1990 (aka, “Hojo Kanji”) and JIS X 0213:2004 character sets overlap significantly. In some cases their prototypical glyphs differ. When building fonts that support both JIS X 0212-1990 and JIS X 0213:2004 (such as those supporting the Adobe-Japan 1-6 character collection), it is recommended that JIS X 0213:2004 forms be preferred as the encoded form. The 'hojo' feature is used to access the JIS X 0212-1990 glyphs for the cases when the JIS X 0213:2004 form is encoded.
NLC Glyphs kNLCCharactersSelector 13 The National Language Council (NLC) of Japan has defined new glyph shapes for a number of JIS characters in 2000. This selector is used to access those glyphs.
Traditional Names kTraditionalNamesCharactersSelector 14 Maps simplified forms in a font to corresponding traditional forms which can be used in personal names.

 

 

Number Case

Feature Constant Feature Value Feature Type
kNumberCase 21 Exclusive

Number Case is independent of Letter Case. Lower Case Numbers (also called "traditional" or "old style") are digits which may descend below the baseline, as opposed to Upper Case Numbers (also called "lining"), which do not descend below the baseline.

Selector Name Selector Constant(s) Selector Value Selector Function
Lower Case Numbers kLowerCaseNumbersSelector 0 These forms of numbers may descend below the baseline. They are sometimes known as "traditional" or "old-style" numbers.
Upper Case Numbers kUpperCaseNumbersSelector 1 These forms of numbers do not descend below the baseline. They are sometimes known as "lining" numbers.

 

 

Text Spacing

Feature Constant Feature Value Feature Type
kTextSpacing 22 Exclusive

The Text Spacing feature type is used to select between the proportional, monospaced and half-width forms of characters in a font. Use of this feature type is optional; for more precise control see the Kana Spacing and Ideographic Spacing feature types.

Selector Name Selector Constant(s) Selector Value Selector Function
Proportional kProportionalTextSelector 0 Selects the proportional forms of letters.
Monospace kMonospacedTextSelector 1 Selects the monospace forms of letters.
Half-width kHalfWidthTextSelector 2 Selects the half-width forms of letters.
Third-width kThirdWidthTextSelector 3 Selects the third-width forms of letters.
Quarter-width kQuarterWidthTextSelector 4 Selects the quarter-width forms of letters.
Alternate Proportional kAltProportionalTextSelector 5 Selects alternate proportional forms of letters.
Alternate Half-width kAltHalfWidthTextSelector 6 Selects alternate half-width forms of letters.

 

 

Transliteration

Feature Constant Feature Value Feature Type
kTransliteration 23 Exclusive

The Transliteration feature types allows text is one format to be displayed using another format. An example is taking a hiragana string and displaying it as katakana. As transliteration is usually done in character space, its use is strongly discouraged.

Selector Name Selector Constant(s) Selector Value Selector Function
No Transliteration kNoTransliterationSelector 0 Indicates that no transliteration should take place.
Hanja to Hangul kHanjaToHangulSelector 1 Indicates hanja should be transliterated to hangul.
Hiragana To Katakana kHiraganaToKatakanaSelector 2 Indicates hiragana should be transliterated to katakana.
Katakana To Hiragana kKatakanaToHiraganaSelector 3 Indicates katakana should be transliterated to hiragana.
Kana To Romanization kKanaToRomanizationSelector 4 Indicates hiragana and katakana should be transliterated to romaji.
Romanization To Hiragana kRomanizationToHiraganaSelector 5 Indicates romaji should be transliterated to hiragana.
Romanization To Katakana kRomanizationToKatakanaSelector 6 Indicates romaji should be transliterated to katakana.
Hanja To Hangul Alt One kHanjaToHangulAltOneSelector 7 This indicates that hanja with multiple readings should be translirated into hangul for their second reading.
Hanja To Hangul Alt Two kHanjaToHangulAltTwoSelector 8 This indicates that hanja with multiple readings should be translirated into hangul for their third reading.
Hanja To Hangul Alt Three kHanjaToHangulAltThreeSelector 9 This indicates that hanja with multiple readings should be translirated into hangul for their fourth reading.

 

 

Annotation

Feature Constant Feature Value Feature Type
kAnnotation 24 Exclusive

The Annotation feature type specifies annotations (or adornments) to basic lettershapes. For instance, most Japanese fonts include versions of numbers that are circled, parenthesized, have periods after them, and so on. Many of these are separately encoded in Unicode for compatibility reasons, but the use of this feature allows for a more extensive set of annotated numerals to be available.

Selector Name Selector Constant(s) Selector Value Selector Function
No Annotation kNoAnnotationSelector 0 Indicates that characters should appear without annotation.
Box Annotation kBoxAnnotationSelector 1 Use the forms of characters surrounded by a box cartouche.
Rounded Box Annotation kRoundedBoxAnnotationSelector 2 Use the forms of characters surrounded by a box cartouche with rounded corners.
Circle Annotation kCircleAnnotationSelector 3 Use the forms of characters surrounded by a circle. For instance, see Unicodes U+3260 through U+326F.
Inverted Circle Annotation kInvertedCircleAnnotationSelector 4 Same as Circle Annotation, but with white and black reversed. For instance, see Unicodes U+2776 through U+277F.
Parenthesis Annotation kParenthesisAnnotationSelector 5 Use the forms of characters surrounded by parentheses. For instance, see Unicodes U+2474 through U+2487.
Period Annotation kPeriodAnnotationSelector 6 Use the forms of characters followed by a period. For instance, see Unicodes U+2488 through U+249B.
Roman Numeral Annotation kRomanNumeralAnnotationSelector 7 Display the given characters in their Roman Numeral form.
Diamond Annotation kDiamondAnnotationSelector 8 Display the text surrounded by a diamond.
Inverted Box Annotation kInvertedBoxAnnotationSelector 9 Same as Box Annotation, but with white and black reversed.
Inverted Rounded Box Annotation kInvertedRoundedBoxAnnotationSelector 10 Same as Rounded Box Annotation, but with white and black reversed.

 

 

Kana Spacing

Feature Constant Feature Value Feature Type
kKanaSpacing 25 Exclusive

The Kana Spacing feature type is used to select widths specifically for Japanese hiragana and katakana characters.

Selector Name Selector Constant(s) Selector Value Selector Function
Full Width kFullWidthKanaSelector 0 Selects the full width forms of kana.
Proportional kProportionalKanaSelector 1 Selects the proportional forms of kana.

 

 

Ideographic Spacing

Feature Constant Feature Value Feature Type
kIdeographicSpacing 26 Exclusive

The Ideographic Spacing feature type is used to select between full-width and proportional forms of ideographs (i.e. Han-derived characters).

Selector Name Selector Constant(s) Selector Value Selector Function
Full Width kFullWidthIdeographsSelector 0 Selects the full width forms of ideographs.
Proportional kProportionalIdeographsSelector 1 Selects the proportional forms of ideographs.
Half Width kHalfWidthIdeographsSelector 2 Selects the half-width forms of ideographs.

 

 

Unicode Decomposition

Feature Constant Feature Value Feature Type
kUnicodeDecomposition 27 Nonexclusive

This feature is used to make various forms of Unicode composition/decomposition visible to the user.

Selector Name Selector Constant(s) Selector Value Selector Function
Canonical Composition kCanonicalCompositionOnSelector
kCanonicalCompositionOffSelector
0 Displays decomposed Unicode as fully composed. This selector should generally not appear in the UI.
Compatibility Composition kCompatibilityCompositionOnSelector
kCompatibilityCompositionOffSelector
2 Displays decomposed compatibility Unicode as fully composed. This selector should generally not appear in the UI.
Transcoding Composition kTranscodingCompositionOnSelector
kTranscodingCompositionOffSelector
4 Some of the old Macintosh text encodings used with QuickDraw included characters not encoded in Unicode. To provide round-trip compatibility between the two, Apple includes in its implementation of Unicode's Private Use area characters that interact with others to control the transcoding process. This feature/selector pair is used to control whether or not these transcoding controls are used.

 

 

Ruby Kana

Feature Constant Feature Value Feature Type
kRubyKana 28 Nonexclusive

Japanese typesetting often uses smaller kana glyphs, generally in superscripted form, to clarify the meaning of kanji which may be unfamiliar to the reader. These are called ruby, from the old typesetting term for four-point-sized type. This feature identifies glyphs in the font which have been designed for this use, substituting them for the default designs.

A layout engine will need to do scaling and repositioning of glyphs in order to generate proper ruby. This feature by itself is insufficient.

Selector Name Selector Constant(s) Selector Value Selector Function
No Ruby Kana kNoRubyKanaSelector 0 Do not use ruby shapes
Ruby Kana kRubyKanaSelector 1 Use ruby shapes
Ruby Kana kRubyKanaOnSelector
RubyKanaOffSelector
2 Turns ruby shapes on or off

 

 

CJK Symbol Alternatives

Feature Constant Feature Value Feature Type
kCJKSymbolAlternatives 29 Exclusive

This feature allows the selection of various alternate forms specific to East Asian symbol characters (e.g., 〠 U+3020 POSTAL MARK FACE).

Selector Name Selector Constant(s) Selector Value Selector Function
No CJK Symbol Alternatives kNoCJKSymbolAlternativesSelector 0 Use standard forms (that is, the ones characters are mapped to by the 'cmap')
CJK Symbol Alt One kCJKSymbolAltOneSelector 1 Use the first set of alternate forms
CJK Symbol Alt Two kCJKSymbolAltTwoSelector 2 Use the second set of alternate forms
CJK Symbol Alt Three kCJKSymbolAltThreeSelector 3 Use the third set of alternate forms
CJK Symbol Alt Four kCJKSymbolAltFourSelector 4 Use the fourth set of alternate forms
CJK Symbol Alt Five kCJKSymbolAltFiveSelector 5 Use the fifth set of alternate forms

 

 

Ideographic Alternatives

Feature Constant Feature Value Feature Type
kIdeographicAlternatives 30 Exclusive

This feature allows the selection of various alternate forms specific to East Asian ideographs (e.g., 誠 U+8AA0 vs. 説 U+8AAC, although these two have been separately encoded).

Selector Name Selector Constant(s) Selector Value Selector Function
No Ideographic Alternatives kNoIdeographicAlternativesSelector 0 Use standard forms (that is, the ones characters are mapped to by the 'cmap')
Ideographic Alt One kIdeographicAltOneSelector 1 Use the first set of alternate forms
Ideographic Alt Two kIdeographicAltTwoSelector 2 Use the second set of alternate forms
Ideographic Alt Three kIdeographicAltThreeSelector 3 Use the third set of alternate forms
Ideographic Alt Four kIdeographicAltFourSelector 4 Use the fourth set of alternate forms
Ideographic Alt Five kIdeographicAltFiveSelector 5 Use the fifth set of alternate forms

 

 

CJK Vertical Roman Placement

Feature Constant Feature Value Feature Type
kCJKVerticalRomanPlacement 31 Exclusive

This feature controls how romaji are positioned relative to kanji. The same effect can be achieved by setting the baseline.

Selector Name Selector Constant(s) Selector Value Selector Function
CJK Vertical Roman Centered kCJKVerticalRomanCenteredSelector 0 Center Roman glyphs vertically so that their centers and the centers of ideographs are the same
CJK Vertical Roman H Baseline kCJKVerticalRomanHBaselineSelector 1 Use a standard Roman baseline for Roman glyphs

 

 

Italic CJK Roman

Feature Constant Feature Value Feature Type
kItalicCJKRoman 32 Nonexclusive

Determines whether romaji are written using italic glyphs when mixed with kanji.

Selector Name Selector Constant(s) Selector Value Selector Function
No CJK Italic Roman kNoCJKItalicRomanSelector 0 Do not use italic glyphs for romaji
CJK Italic Roman kCJKItalicRomanSelector 1 Use italic glyphs for romaji
CJK Italic Roman kCJKItalicRomanOnSelector
CJKItalicRomanOffSelector
2 Turns the use of italics for romaji on and off

 

 

Case Sensitive Layout

Feature Constant Feature Value Feature Type
kCaseSensitiveLayout 33 Nonexclusive

This feature allows for alternate forms of punctuation when found in lower-case-only text. For example, an em-dash looks best if its position when surrounded by lower-case letters is lower than its position when surrounded by numerals or upper-case letters.

Selector Name Selector Constant(s) Selector Value Selector Function
Case Sensitive Layout kCaseSensitiveLayoutOnSelector
CaseSensitiveLayoutOffSelector
0 Turn case-sensitive casing on or off
Case Sensitive Spacing kCaseSensitiveSpacingOnSelector
CaseSensitiveSpacingOffSelector
2 Turn case-sensitive spacing on or off

 

 

Alternate Kana

Feature Constant Feature Value Feature Type
kAlternateKana 34 Nonexclusive

This allows different forms for kana to be used in horizontal or vertical text.

Selector Name Selector Constant(s) Selector Value Selector Function
Alternate Horiz Kana kAlternateHorizKanaOnSelector
AlternateHorizKanaOffSelector
0 Indicates that alternate forms for hiragana and katakana should be used in horizontal text.
Alternate Vert Kana kAlternateVertKanaOnSelector
AlternateVertKanaOffSelector
2 Indicates that alternate forms for hiragana and katakana should be used in vertical text.

 

 

Stylistic Alternatives

Feature Constant Feature Value Feature Type
kStylisticAlternatives 35 Nonexclusive

This feature allows for different stylistic alternatives for glyphs and is largely equivalent to a nonexclusive version of the Character Alternatives feature. It is intended specifically to be used as the AAT equivalent of the OpenType 'ss01' through 'ss20' features.

Selector Name Selector Constant(s) Selector Value Selector Function
No Stylistic Alternates kNoStylisticAlternatesSelector 0 Use standard forms (that is, the ones characters are mapped to by the 'cmap')
Stylistic Alt One kStylisticAltOneOnSelector
StylisticAltOneOffSelector
2 Turns the first set of alternates on or off
Stylistic Alt Two kStylisticAltTwoOnSelector
StylisticAltTwoOffSelector
4 Turns the second set of alternates on or off
Stylistic Alt Three kStylisticAltThreeOnSelector
StylisticAltThreeOffSelector
6 Turns the third set of alternates on or off
Stylistic Alt Four kStylisticAltFourOnSelector
StylisticAltFourOffSelector
8 Turns the fourth set of alternates on or off
Stylistic Alt Five kStylisticAltFiveOnSelector
StylisticAltFiveOffSelector
10 Turns the fifth set of alternates on or off
Stylistic Alt Six kStylisticAltSixOnSelector
StylisticAltSixOffSelector
12 Turns the sixth set of alternates on or off
Stylistic Alt Seven kStylisticAltSevenOnSelector
StylisticAltSevenOffSelector
14 Turns the seventh set of alternates on or off
Stylistic Alt Eight kStylisticAltEightOnSelector
StylisticAltEightOffSelector
16 Turns the eighth set of alternates on or off
Stylistic Alt Nine kStylisticAltNineOnSelector
StylisticAltNineOffSelector
18 Turns the ninth set of alternates on or off
Stylistic Alt Ten kStylisticAltTenOnSelector
StylisticAltTenOffSelector
20 Turns the tenth set of alternates on or off
Stylistic Alt Eleven kStylisticAltElevenOnSelector
StylisticAltElevenOffSelector
22 Turns the eleventh set of alternates on or off
Stylistic Alt Twelve kStylisticAltTwelveOnSelector
StylisticAltTwelveOffSelector
24 Turns the twelfth set of alternates on or off
Stylistic Alt Thirteen kStylisticAltThirteenOnSelector
StylisticAltThirteenOffSelector
26 Turns the thirteenth set of alternates on or off
Stylistic Alt Fourteen kStylisticAltFourteenOnSelector
StylisticAltFourteenOffSelector
28 Turns the fourteenth set of alternates on or off
Stylistic Alt Fifteen kStylisticAltFifteenOnSelector
StylisticAltFifteenOffSelector
30 Turns the fifteenth set of alternates on or off
Stylistic Alt Sixteen kStylisticAltSixteenOnSelector
StylisticAltSixteenOffSelector
32 Turns the sixteenth set of alternates on or off
Stylistic Alt Seventeen kStylisticAltSeventeenOnSelector
StylisticAltSeventeenOffSelector
34 Turns the seventeenth set of alternates on or off
Stylistic Alt Eighteen kStylisticAltEighteenOnSelector
StylisticAltEighteenOffSelector
36 Turns the eighteenth set of alternates on or off
Stylistic Alt Nineteen kStylisticAltNineteenOnSelector
StylisticAltNineteenOffSelector
38 Turns the nineteenth set of alternates on or off
Stylistic Alt Twenty kStylisticAltTwentyOnSelector
StylisticAltTwentyOffSelector
40 Turns the twentieth set of alternates on or off

 

 

Contextual Alternates

Feature Constant Feature Value Feature Type
kContextualAlternates 36 Nonexclusive

This feature is used to support alternate shapes for context-dependent glyphs and swashes

Selector Name Selector Constant(s) Selector Value Selector Function
Contextual Alternates kContextualAlternatesOnSelector
ContextualAlternatesOffSelector
0 Turn alternates on or off for context-dependent glyphs
Swash Alternates kSwashAlternatesOnSelector
SwashAlternatesOffSelector
2 Turn alternates on or off for context-dependent swashes
Contextual Swash Alternates kContextualSwashAlternatesOnSelector
ContextualSwashAlternatesOffSelector
4 Turn alternates on or off for context-dependent glyphs and swashes

 

 

Lower Case

Feature Constant Feature Value Feature Type
kLowerCase 37 Exclusive

This feature replaces some of the functionality of the Letter Case feature. It is used to alter the appearance of lower-case text to that either of small caps or petite caps. [Some fonts contain an additional size of capital letters, shorter than the regular smallcaps and whimsically referred to as petite caps. Such forms are most likely to be found in designs with a small lowercase x-height, where they better harmonise with lowercase text than the taller smallcaps [for examples of petite caps, see the Emigre type families Mrs Eaves and Filosofia].) The display of actual upper-case glyphs for lower-case letters is discouraged.

Selector Name Selector Constant(s) Selector Value Selector Function
Default Lower Case kDefaultLowerCaseSelector 0 Use standard lower-case glyphs
Lower Case Small Caps kLowerCaseSmallCapsSelector 1 Display lower-case glyphs as small caps. (This is the most common way of displaying small caps.)
Lower Case Petite Caps kLowerCasePetiteCapsSelector 2 Display lower-case glyphs as petite caps

 

 

Upper Case

Feature Constant Feature Value Feature Type
kUpperCase 38 Exclusive

This feature replaces some of the functionality of the Letter Case feature. It is used to alter the appearance of upper-case text to that either of small caps or petite caps. [Some fonts contain an additional size of capital letters, shorter than the regular smallcaps and whimsically referred to as petite caps. Such forms are most likely to be found in designs with a small lowercase x-height, where they better harmonise with lowercase text than the taller smallcaps [for examples of petite caps, see the Emigre type families Mrs Eaves and Filosofia].) The display of actual lower-case glyphs for upper-case letters is discouraged.

Selector Name Selector Constant(s) Selector Value Selector Function
Default Upper Case kDefaultUpperCaseSelector 0 Use standard upper-case glyphs
Upper Case Small Caps kUpperCaseSmallCapsSelector 1 Display upper-case glyphs as small caps (used commonly with acronyms).
Upper Case Petite Caps kUpperCasePetiteCapsSelector 2 Display upper-case glyphs as petite caps

 

 

Language Tag

Feature Constant Feature Value Feature Type
kLanguageTag 39 Exclusive

This feature allows the use of language-specific glyphs. The selectors, other than 0, are one more than indices within the 'ltag' table, which then maps them to a standard IETF language tag.

For example, if the language tag at index 0 of the 'ltag' table is "sr" (for Serbian), then a feature/selector combination of 39/1 would change glyphs into any Serbian-specific shapes.

 

 

CJK Roman Spacing

Feature Constant Feature Value Feature Type
kCJKRomanSpacing 103 Exclusive

The CJK Roman Spacing feature type is used to select between the proportional and half-width forms of Roman characters in a CJK font.

Selector Name Selector Constant(s) Selector Value Selector Function
Half-width kHalfWidthCJKRomanSelector 0 Selects the half-width forms of letters.
Proportional kProportionalCJKRomanSelector 1 Selects the proportional forms of letters.
Default Roman kDefaultCJKRomanSelector 2 Selects the default Roman forms of letters.
Full-width Roman kFullWidthCJKRomanSelector 3 Selects the full-width Roman forms of letters.

 

 


The application interface

For convenience, this section gives the C language interface that applications use to support the feature types and selectors listed above.

The most current version of this interface is available in the header SFNTTypes.h.

 

enum {
  kAllTypographicFeaturesType   = 0,
  kLigaturesType                = 1,
  kCursiveConnectionType        = 2,
  kLetterCaseType               = 3,    /* deprecated - use kLowerCaseType or kUpperCaseType instead */
  kVerticalSubstitutionType     = 4,
  kLinguisticRearrangementType  = 5,
  kNumberSpacingType            = 6,
  kSmartSwashType               = 8,
  kDiacriticsType               = 9,
  kVerticalPositionType         = 10,
  kFractionsType                = 11,
  kOverlappingCharactersType    = 13,
  kTypographicExtrasType        = 14,
  kMathematicalExtrasType       = 15,
  kOrnamentSetsType             = 16,
  kCharacterAlternativesType    = 17,
  kDesignComplexityType         = 18,
  kStyleOptionsType             = 19,
  kCharacterShapeType           = 20,
  kNumberCaseType               = 21,
  kTextSpacingType              = 22,
  kTransliterationType          = 23,
  kAnnotationType               = 24,
  kKanaSpacingType              = 25,
  kIdeographicSpacingType       = 26,
  kUnicodeDecompositionType     = 27,
  kRubyKanaType                 = 28,
  kCJKSymbolAlternativesType    = 29,
  kIdeographicAlternativesType  = 30,
  kCJKVerticalRomanPlacementType = 31,
  kItalicCJKRomanType           = 32,
  kCaseSensitiveLayoutType      = 33,
  kAlternateKanaType            = 34,
  kStylisticAlternativesType    = 35,
  kContextualAlternatesType     = 36,
  kLowerCaseType                = 37,
  kUpperCaseType                = 38,
  kLanguageTagType              = 39,
  kCJKRomanSpacingType          = 103,
  kLastFeatureType              = -1
};
/*
 *  Summary:
 *    Selectors for feature type kAllTypographicFeaturesType
 */
enum {
  kAllTypeFeaturesOnSelector    = 0,
  kAllTypeFeaturesOffSelector   = 1
};
/*
 *  Summary:
 *    Selectors for feature type kLigaturesType
 */
enum {
  kRequiredLigaturesOnSelector  = 0,
  kRequiredLigaturesOffSelector = 1,
  kCommonLigaturesOnSelector    = 2,
  kCommonLigaturesOffSelector   = 3,
  kRareLigaturesOnSelector      = 4,
  kRareLigaturesOffSelector     = 5,
  kLogosOnSelector              = 6,
  kLogosOffSelector             = 7,
  kRebusPicturesOnSelector      = 8,
  kRebusPicturesOffSelector     = 9,
  kDiphthongLigaturesOnSelector = 10,
  kDiphthongLigaturesOffSelector = 11,
  kSquaredLigaturesOnSelector   = 12,
  kSquaredLigaturesOffSelector  = 13,
  kAbbrevSquaredLigaturesOnSelector = 14,
  kAbbrevSquaredLigaturesOffSelector = 15,
  kSymbolLigaturesOnSelector    = 16,
  kSymbolLigaturesOffSelector   = 17,
  kContextualLigaturesOnSelector = 18,
  kContextualLigaturesOffSelector = 19,
  kHistoricalLigaturesOnSelector = 20,
  kHistoricalLigaturesOffSelector = 21
};
/*
 *  Summary:
 *    Selectors for feature type kCursiveConnectionType
 */
enum {
  kUnconnectedSelector          = 0,
  kPartiallyConnectedSelector   = 1,
  kCursiveSelector              = 2
};
/*
 *  Summary:
 *    Selectors for feature type kLetterCaseType
 */
enum {
  kUpperAndLowerCaseSelector    = 0,    /* deprecated */
  kAllCapsSelector              = 1,    /* deprecated */
  kAllLowerCaseSelector         = 2,    /* deprecated */
  kSmallCapsSelector            = 3,    /* deprecated */
  kInitialCapsSelector          = 4,    /* deprecated */
  kInitialCapsAndSmallCapsSelector = 5  /* deprecated */
};
/*
 *  Summary:
 *    Selectors for feature type kVerticalSubstitutionType
 */
enum {
  kSubstituteVerticalFormsOnSelector = 0,
  kSubstituteVerticalFormsOffSelector = 1
};
/*
 *  Summary:
 *    Selectors for feature type kLinguisticRearrangementType
 */
enum {
  kLinguisticRearrangementOnSelector = 0,
  kLinguisticRearrangementOffSelector = 1
};
/*
 *  Summary:
 *    Selectors for feature type kNumberSpacingType
 */
enum {
  kMonospacedNumbersSelector    = 0,
  kProportionalNumbersSelector  = 1,
  kThirdWidthNumbersSelector    = 2,
  kQuarterWidthNumbersSelector  = 3
};
/*
 *  Summary:
 *    Selectors for feature type kSmartSwashType
 */
enum {
  kWordInitialSwashesOnSelector = 0,
  kWordInitialSwashesOffSelector = 1,
  kWordFinalSwashesOnSelector   = 2,
  kWordFinalSwashesOffSelector  = 3,
  kLineInitialSwashesOnSelector = 4,
  kLineInitialSwashesOffSelector = 5,
  kLineFinalSwashesOnSelector   = 6,
  kLineFinalSwashesOffSelector  = 7,
  kNonFinalSwashesOnSelector    = 8,
  kNonFinalSwashesOffSelector   = 9
};
/*
 *  Summary:
 *    Selectors for feature type kDiacriticsType
 */
enum {
  kShowDiacriticsSelector       = 0,
  kHideDiacriticsSelector       = 1,
  kDecomposeDiacriticsSelector  = 2
};
/*
 *  Summary:
 *    Selectors for feature type kVerticalPositionType
 */
enum {
  kNormalPositionSelector       = 0,
  kSuperiorsSelector            = 1,
  kInferiorsSelector            = 2,
  kOrdinalsSelector             = 3,
  kScientificInferiorsSelector  = 4
};
/*
 *  Summary:
 *    Selectors for feature type kFractionsType
 */
enum {
  kNoFractionsSelector          = 0,
  kVerticalFractionsSelector    = 1,
  kDiagonalFractionsSelector    = 2
};
/*
 *  Summary:
 *    Selectors for feature type kOverlappingCharactersType
 */
enum {
  kPreventOverlapOnSelector     = 0,
  kPreventOverlapOffSelector    = 1
};
/*
 *  Summary:
 *    Selectors for feature type kTypographicExtrasType
 */
enum {
  kHyphensToEmDashOnSelector    = 0,
  kHyphensToEmDashOffSelector   = 1,
  kHyphenToEnDashOnSelector     = 2,
  kHyphenToEnDashOffSelector    = 3,
  kSlashedZeroOnSelector        = 4,
  kSlashedZeroOffSelector       = 5,
  kFormInterrobangOnSelector    = 6,
  kFormInterrobangOffSelector   = 7,
  kSmartQuotesOnSelector        = 8,
  kSmartQuotesOffSelector       = 9,
  kPeriodsToEllipsisOnSelector  = 10,
  kPeriodsToEllipsisOffSelector = 11
};
/*
 *  Summary:
 *    Selectors for feature type kMathematicalExtrasType
 */
enum {
  kHyphenToMinusOnSelector      = 0,
  kHyphenToMinusOffSelector     = 1,
  kAsteriskToMultiplyOnSelector = 2,
  kAsteriskToMultiplyOffSelector = 3,
  kSlashToDivideOnSelector      = 4,
  kSlashToDivideOffSelector     = 5,
  kInequalityLigaturesOnSelector = 6,
  kInequalityLigaturesOffSelector = 7,
  kExponentsOnSelector          = 8,
  kExponentsOffSelector         = 9,
  kMathematicalGreekOnSelector  = 10,
  kMathematicalGreekOffSelector = 11
};
/*
 *  Summary:
 *    Selectors for feature type kOrnamentSetsType
 */
enum {
  kNoOrnamentsSelector          = 0,
  kDingbatsSelector             = 1,
  kPiCharactersSelector         = 2,
  kFleuronsSelector             = 3,
  kDecorativeBordersSelector    = 4,
  kInternationalSymbolsSelector = 5,
  kMathSymbolsSelector          = 6
};
/*
 *  Summary:
 *    Selectors for feature type kCharacterAlternativesType
 */
enum {
  kNoAlternatesSelector         = 0
};
/*
 *  Summary:
 *    Selectors for feature type kDesignComplexityType
 */
enum {
  kDesignLevel1Selector         = 0,
  kDesignLevel2Selector         = 1,
  kDesignLevel3Selector         = 2,
  kDesignLevel4Selector         = 3,
  kDesignLevel5Selector         = 4
};
/*
 *  Summary:
 *    Selectors for feature type kStyleOptionsType
 */
enum {
  kNoStyleOptionsSelector       = 0,
  kDisplayTextSelector          = 1,
  kEngravedTextSelector         = 2,
  kIlluminatedCapsSelector      = 3,
  kTitlingCapsSelector          = 4,
  kTallCapsSelector             = 5
};
/*
 *  Summary:
 *    Selectors for feature type kCharacterShapeType
 */
enum {
  kTraditionalCharactersSelector = 0,
  kSimplifiedCharactersSelector = 1,
  kJIS1978CharactersSelector    = 2,
  kJIS1983CharactersSelector    = 3,
  kJIS1990CharactersSelector    = 4,
  kTraditionalAltOneSelector    = 5,
  kTraditionalAltTwoSelector    = 6,
  kTraditionalAltThreeSelector  = 7,
  kTraditionalAltFourSelector   = 8,
  kTraditionalAltFiveSelector   = 9,
  kExpertCharactersSelector     = 10,
  kJIS2004CharactersSelector    = 11,
  kHojoCharactersSelector       = 12,
  kNLCCharactersSelector        = 13,
  kTraditionalNamesCharactersSelector = 14
};
/*
 *  Summary:
 *    Selectors for feature type kNumberCaseType
 */
enum {
  kLowerCaseNumbersSelector     = 0,
  kUpperCaseNumbersSelector     = 1
};
/*
 *  Summary:
 *    Selectors for feature type kTextSpacingType
 */
enum {
  kProportionalTextSelector     = 0,
  kMonospacedTextSelector       = 1,
  kHalfWidthTextSelector        = 2,
  kThirdWidthTextSelector       = 3,
  kQuarterWidthTextSelector     = 4,
  kAltProportionalTextSelector  = 5,
  kAltHalfWidthTextSelector     = 6
};
/*
 *  Summary:
 *    Selectors for feature type kTransliterationType
 */
enum {
  kNoTransliterationSelector    = 0,
  kHanjaToHangulSelector        = 1,
  kHiraganaToKatakanaSelector   = 2,
  kKatakanaToHiraganaSelector   = 3,
  kKanaToRomanizationSelector   = 4,
  kRomanizationToHiraganaSelector = 5,
  kRomanizationToKatakanaSelector = 6,
  kHanjaToHangulAltOneSelector  = 7,
  kHanjaToHangulAltTwoSelector  = 8,
  kHanjaToHangulAltThreeSelector = 9
};
/*
 *  Summary:
 *    Selectors for feature type kAnnotationType
 */
enum {
  kNoAnnotationSelector         = 0,
  kBoxAnnotationSelector        = 1,
  kRoundedBoxAnnotationSelector = 2,
  kCircleAnnotationSelector     = 3,
  kInvertedCircleAnnotationSelector = 4,
  kParenthesisAnnotationSelector = 5,
  kPeriodAnnotationSelector     = 6,
  kRomanNumeralAnnotationSelector = 7,
  kDiamondAnnotationSelector    = 8,
  kInvertedBoxAnnotationSelector = 9,
  kInvertedRoundedBoxAnnotationSelector = 10
};
/*
 *  Summary:
 *    Selectors for feature type kKanaSpacingType
 */
enum {
  kFullWidthKanaSelector        = 0,
  kProportionalKanaSelector     = 1
};
/*
 *  Summary:
 *    Selectors for feature type kIdeographicSpacingType
 */
enum {
  kFullWidthIdeographsSelector  = 0,
  kProportionalIdeographsSelector = 1,
  kHalfWidthIdeographsSelector  = 2
};
/*
 *  Summary:
 *    Selectors for feature type kUnicodeDecompositionType
 */
enum {
  kCanonicalCompositionOnSelector = 0,
  kCanonicalCompositionOffSelector = 1,
  kCompatibilityCompositionOnSelector = 2,
  kCompatibilityCompositionOffSelector = 3,
  kTranscodingCompositionOnSelector = 4,
  kTranscodingCompositionOffSelector = 5
};
/*
 *  Summary:
 *    Selectors for feature type kRubyKanaType
 */
enum {
  kNoRubyKanaSelector           = 0,    /* deprecated - use kRubyKanaOffSelector instead */
  kRubyKanaSelector             = 1,    /* deprecated - use kRubyKanaOnSelector instead */
  kRubyKanaOnSelector           = 2,
  kRubyKanaOffSelector          = 3
};
/*
 *  Summary:
 *    Selectors for feature type kCJKSymbolAlternativesType
 */
enum {
  kNoCJKSymbolAlternativesSelector = 0,
  kCJKSymbolAltOneSelector      = 1,
  kCJKSymbolAltTwoSelector      = 2,
  kCJKSymbolAltThreeSelector    = 3,
  kCJKSymbolAltFourSelector     = 4,
  kCJKSymbolAltFiveSelector     = 5
};
/*
 *  Summary:
 *    Selectors for feature type kIdeographicAlternativesType
 */
enum {
  kNoIdeographicAlternativesSelector = 0,
  kIdeographicAltOneSelector    = 1,
  kIdeographicAltTwoSelector    = 2,
  kIdeographicAltThreeSelector  = 3,
  kIdeographicAltFourSelector   = 4,
  kIdeographicAltFiveSelector   = 5
};
/*
 *  Summary:
 *    Selectors for feature type kCJKVerticalRomanPlacementType
 */
enum {
  kCJKVerticalRomanCenteredSelector = 0,
  kCJKVerticalRomanHBaselineSelector = 1
};
/*
 *  Summary:
 *    Selectors for feature type kItalicCJKRomanType
 */
enum {
  kNoCJKItalicRomanSelector     = 0,    /* deprecated - use kCJKItalicRomanOffSelector instead */
  kCJKItalicRomanSelector       = 1,    /* deprecated - use kCJKItalicRomanOnSelector instead */
  kCJKItalicRomanOnSelector     = 2,
  kCJKItalicRomanOffSelector    = 3
};
/*
 *  Summary:
 *    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
};
/*
 *  Summary:
 *    Selectors for feature type kCJKRomanSpacingType
 */
enum {
  kHalfWidthCJKRomanSelector    = 0,
  kProportionalCJKRomanSelector = 1,
  kDefaultCJKRomanSelector      = 2,
  kFullWidthCJKRomanSelector    = 3
};