OpenType Layout feature classification

OpenType Layout features allow for orthographically correct display of complex scripts such as Arabic and Indic and provide a mechanism for the user to apply advanced typographic formatting to text. They are used in the SFNT GSUB and GPOS tables.

This document contains a useful classification of OpenType Layout feature tags. It is based on the OpenType spec version 1.6, with some additional entries about removed features and Microsoft-only Math features related to the MATH OpenType table.

This document is very technical in nature, and is primarily aimed at software developers who wish to implement user interfaces for applying OpenType Layout features in applications. 

TagFriendly nameSpecAccessShow in UIUI levelScriptScript-specificDefaultGroupSubgroupRemarks
aaltAccess All AlternatesOpenTypeopt-inspecialcharacter, wordALLoutsideneverTypographyvariants
abvfAbove-Base FormsOpenTypemandatorynononekhmrduringshapingLanguagecomplex scripts
abvmAbove-Base Mark PositioningOpenTypemandatorynononeINDIC, khmraftershapingLanguagecomplex scripts
abvsAbove-Base SubstitutionsOpenTypemandatorynononeINDIC, khmrduringshapingLanguagecomplex scripts
afrcAlternative FractionsOpenTypeopt-inyescharacter, wordALLafterneverTypographynumerals and scientific
akhnAkhandsOpenTypemandatorynononeINDICduringshapingLanguagecomplex scripts
altvAlternate Vertical MetricsRemovednevernononeNONEnoneneverRemovednone
blwfBelow-Base FormsOpenTypemandatorynononeINDIC, khmrduringshapingLanguagecomplex scripts
blwmBelow-Base Mark PositioningOpenTypemandatorynononeINDIC, khmraftershapingLanguagecomplex scripts
blwsBelow-Base SubstitutionsOpenTypemandatorynononeINDIC, khmrduringshapingLanguagecomplex scripts
c2pcPetite Capitals From CapitalsOpenTypeopt-inyesword, paragraphALLafterneverTypographyletter case
c2scSmall Capitals From CapitalsOpenTypeopt-inyesword, paragraphALLafterneverTypographyletter case
caltContextual AlternatesOpenTypeopt-outyesword, paragraphALL, (except) haniafteralwaysTypographybasic support
caseCase-Sensitive FormsOpenTypeopt-inyesword, paragraphALLafterneverTypographyletter case
ccmpGlyph Composition/DecompositionOpenTypemandatorynononeALLbeforealwaysLanguagebasic support
cfarConjunct Form After RoOpenTypemandatorynononekhmrduringshapingLanguagecomplex scripts
cjctConjunct FormsOpenTypemandatorynononeALLduringshapingLanguagecomplex scripts
cligContextual LigaturesOpenTypeopt-outyesword, paragraphALLafteralwaysTypographybasic support
cpspCapital SpacingOpenTypeopt-inyesword, paragraphALLafterneverTypographyletter case
crcyCurrencyRemovednevernononeNONEnoneneverRemovednone
cswhContextual SwashOpenTypeopt-inyesword, paragraphALLafterneverTypographyvariants
cursCursive PositioningOpenTypemandatorynononeALLafteralwaysLanguagecomplex scripts
cv[01-99]Character Variant [01-99]OpenTypeopt-inyesspecialALLafterneverTypographyvariants
dfltDefault ProcessingRemovednevernononeNONEnoneneverRemovednone
distDistancesOpenTypemandatorynononeINDIC, khmraftershapingLanguagecomplex scripts
dligDiscretionary LigaturesOpenTypeopt-inyesword, paragraphALLafterneverTypographyvariants
dnomDenominatorsOpenTypeopt-inyescharacter, wordALLafterneverTypographynumerals and scientific
dpngDiphthongsRemovednevernononeNONEnoneneverRemovednone
dtlsDotless FormsMathmandatorynomathmathduringshapingTypographynumerals and scientific
exptExpert FormsOpenTypeopt-inyesword, paragraphhani, kanaaftermaybeTypographyAsian CJK
faltFinal Glyph AlternatesOpenTypeopt-inyesparagraph, documentCURSIVE, syrcafterneverTypographycomplex scripts
fin2Terminal Forms #2OpenTypemandatorynononesyrcduringshapingLanguagecomplex scripts
fin3Terminal Forms #3OpenTypemandatorynononesyrcduringshapingLanguagecomplex scripts
finaTerminal FormsOpenTypespecialspecialnone | word, paragraph*ARABIC, syrc | ALLduringshapingLanguagecomplex scriptsUI only where not required by shaping
flacFlattened Accents over CapitalsMathmandatorynomathmathduringshapingTypographynumerals and scientific
fracFractionsOpenTypeopt-inyescharacter, wordALLafterneverTypographynumerals and scientific
fwidFull WidthOpenTypeopt-inyesword, paragraphhani, kanaafterneverTypographyAsian CJK
halfHalf FormsOpenTypemandatorynononeINDICduringshapingLanguagecomplex scripts
halnHalant FormsOpenTypemandatorynononeINDICduringshapingLanguagecomplex scripts
haltAlternate Half WidthOpenTypeopt-inyesparagraph, documenthani, kanaafterneverTypographyAsian CJK
histHistorical FormsOpenTypeopt-inyescharacter, wordALLafterneverTypographyvariants
hknaHorizontal Kana AlternatesOpenTypespecialspecialorientationkanaafterorientationLanguageAsian CJK
hligHistorical LigaturesOpenTypeopt-inyescharacter, wordALLafterneverTypographyvariants
hnglHangulOpenTypeopt-inyescharacter, wordhang, haniafterneverLanguageAsian CJK
hojoHojo Kanji Forms (JIS x 212-1990 Kanji Forms)OpenTypeopt-inyesword, paragraphhani, kanaafterneverTypographyAsian CJK
hwidHalf WidthOpenTypeopt-inyesword, paragraphhani, kanaafterneverTypographyAsian CJK
initInitial FormsOpenTypespecialspecialnone | word, paragraph*ARABIC, syrc | ALLduringshapingLanguagecomplex scriptsUI only where not required by shaping
isolIsolated FormsOpenTypespecialspecialnone | word, paragraph*ARABIC, syrc | ALLduringshapingLanguagecomplex scriptsUI only where not required by shaping
italItalicsOpenTypeopt-inyesword, paragraphlatn, cyrl, grekafterneverTypographyAsian CJK
jajpJapanese FormsRemovednevernononeNONEnoneneverRemovednone
jaltJustification AlternativesOpenTypeopt-inyesparagraph, documentALLafterneverTypographybasic support
jp03JIS03 FormsRemovednevernononeNONEnoneneverRemovednone
jp04JIS2004 FormsOpenTypeopt-inyescharacter, wordhani, kanaafterneverLanguageAsian CJK
jp78JIS78 FormsOpenTypeopt-inyescharacter, wordhani, kanaafterneverLanguageAsian CJK
jp83JIS83 FormsOpenTypeopt-inyescharacter, wordhani, kanaafterneverLanguageAsian CJK
jp90JIS90 FormsOpenTypeopt-inyescharacter, wordhani, kanaafterneverLanguageAsian CJK
kernKerningOpenTypemandatorynodocumentALLafteralwaysTypographybasic support
kokrKorean FormsRemovednevernononeNONEnoneneverRemovednone
lfbdLeft BoundsOpenTypemandatorynodocumentALLafteralwaysTypographybasic support
ligaStandard LigaturesOpenTypeopt-outyesword, paragraphALLafteralwaysTypographybasic support
ljmoLeading Jamo FormsOpenTypemandatorynononehang, jamoduringshapingLanguageAsian CJK
lnumLining FiguresOpenTypeopt-inyescharacter, wordALLafterneverTypographynumerals and scientific
loclLocalized FormsOpenTypemandatoryspeciallanguage selectionALLbeforealwaysLanguagebasic support
ltraLeft-to-right alternatesOpenTypemandatorynononeRTLbeforebidiLanguagecomplex scripts
ltrmLeft-to-right mirrored formsOpenTypemandatorynononeRTLbeforebidiLanguagecomplex scripts
markMark PositioningOpenTypemandatorynononeALLafteralwaysLanguagebasic support
med2Medial Forms #2OpenTypemandatorynononesyrcduringalwaysLanguagecomplex scripts
mediMedial FormsOpenTypespecialspecialnone | word, paragraph*ARABIC, syrc | ALLduringshapingLanguagecomplex scriptsUI only where not required by shaping
mgrkMathematical GreekOpenTypeopt-inyescharacter, wordgrekafterneverTypographynumerals and scientific
mkmkMark to Mark PositioningOpenTypemandatorynononeALLafteralwaysLanguagebasic support
msetMark Positioning via SubstitutionOpenTypemandatorynononeALLafteralwaysLanguagebasic support
naltAlternate Annotation FormsOpenTypeopt-inyescharacter, wordhani, kana, latn, cyrl, grekafterneverTypographyAsian CJK
nlckNLC Kanji FormsOpenTypeopt-inyescharacter, wordhani, kanaafterneverLanguageAsian CJK
nuktNukta FormsOpenTypemandatorynononeINDICduringshapingLanguagecomplex scripts
numrNumeratorsOpenTypeopt-inyescharacter, wordALLafterneverTypographynumerals and scientific
onumOld Style FiguresOpenTypeopt-inyesword, paragraphALLafterneverTypographynumerals and scientific
opbdOptical BoundsOpenTypemandatoryspecialdocumentALLafteralwaysTypographybasic support
ordnOrdinalsOpenTypeopt-inyescharacter, wordALLafterneverTypographybasic support
ornmOrnamentsOpenTypeopt-inyescharacter, wordALLafterneverTypographyvariants
paltProportional Alternate WidthOpenTypeopt-inyesword, paragraphhani, kana, latn, cyrl, grekafterneverTypographyAsian CJK
pcapPetite CapitalsOpenTypeopt-inyesword, paragraphALLafterneverTypographyletter case
pknaProportional KanaOpenTypeopt-inyesword, paragraphkanaafterneverTypographyAsian CJK
pnumProportional FiguresOpenTypeopt-inyesword, paragraphALLafterneverTypographynumerals and scientific
prefPre-base FormsOpenTypemandatorynononeINDIC, khmrduringshapingLanguagecomplex scripts
presPre-base SubstitutionsOpenTypemandatorynononeINDIC, khmrduringshapingLanguagecomplex scripts
pstfPost-base FormsOpenTypemandatorynononeINDIC, khmrduringshapingLanguagecomplex scripts
pstsPost-base SubstitutionsOpenTypemandatorynononeINDIC, khmrduringshapingLanguagecomplex scripts
pwidProportional WidthsOpenTypeopt-inyesword, paragraphhani, kana, latn, cyrl, grekafterneverTypographyAsian CJK
qwidQuarter WidthsOpenTypeopt-inyesword, paragraphhani, kanaafterneverTypographyAsian CJK
randRandomizeOpenTypeopt-inyesword, paragraphALLafterneverTypographyvariants
rcltRequired Contextual FormsProposedopt-outnononeALLafter?alwaysTypographybasic supportProposed in Aug 2012
rkrfRakar FormsOpenTypemandatorynononeINDICduringshapingLanguagecomplex scripts
rligRequired LigaturesOpenTypemandatorynononeALLduringalwaysLanguagebasic support
rphfReph FormOpenTypemandatorynononeINDICduringshapingLanguagecomplex scripts
rtbdRight BoundsOpenTypemandatorynodocumentALLafteralwaysTypographybasic support
rtlaRight-To-Left AlternatesOpenTypemandatorynononeRTLbeforeshapingLanguagecomplex scripts
rubyRuby Notation FormsOpenTypeopt-inyesword, paragraphhani, kanaafterneverTypographyAsian CJK
saltStylistic AlternatesOpenTypeopt-inyesword, paragraphALLafterneverTypographyvariants
sinfScientific InferiorsOpenTypeopt-inyescharacter, wordALLafterneverTypographynumerals and scientific
sizeOptical SizeOpenTypemandatoryspecialdocumentALLbeforealwaysTypographybasic support
smcpSmall CapitalsOpenTypeopt-inyesword, paragraphALLafterneverTypographyletter case
smplSimplified FormsOpenTypeopt-inyesdocumenthani, kanaafterneverLanguageAsian CJK
ss[01-20]Stylistic Set [01-20]OpenTypeopt-inyesword, paragraphALLafterneverTypographyvariants
sstyScript StyleMathmandatorynomathmathduringshapingTypographynumerals and scientific
subsSubscriptOpenTypeopt-inyescharacter, wordALLafterneverTypographynumerals and scientific
supsSuperscriptOpenTypeopt-inyescharacter, wordALLafterneverTypographynumerals and scientific
swshSwashOpenTypeopt-inyescharacter, wordALLafterneverTypographyvariants
titlTitlingOpenTypeopt-inyesword, paragraphALLafterneverTypographyvariants
tjmoTrailing Jamo FormsOpenTypemandatorynononehang, jamoduringshapingLanguageAsian CJK
tnamTraditional Name FormsOpenTypeopt-inyesdocumenthani, kanaafterneverLanguageAsian CJK
tnumTabular FiguresOpenTypeopt-inyesword, paragraphALLafterneverTypographynumerals and scientific
tradTraditional FormsOpenTypeopt-inyesdocumenthani, kanaafterneverLanguageAsian CJK
twidThird WidthsOpenTypeopt-inyesword, paragraphhani, kanaafterneverTypographyAsian CJK
unicUnicaseOpenTypeopt-inyesword, paragraphALLafterneverTypographyletter case
valtAlternate Vertical MetricsOpenTypespecialspecialorientationhani, kanaafterorientationTypographyAsian CJK
vatuVattu VariantsOpenTypemandatorynononeINDICduringshapingLanguagecomplex scripts
vertVertical WritingOpenTypespecialspecialorientationhani, kanaafterorientationTypographyAsian CJK
vhalAlternate Vertical Half MetricsOpenTypeopt-inyesword, paragraphhani, kanaafterneverTypographyAsian CJK
vivnVietnamese FormsRemovednevernononeNONEnoneneverRemovednone
vjmoVowel Jamo FormsOpenTypemandatorynononehang, jamoduringshapingLanguageAsian CJK
vknaVertical Kana AlternatesOpenTypespecialspecialorientationkanaafterorientationTypographyAsian CJK
vkrnVertical KerningOpenTypespecialspecialorientationhani, kanaafterorientationTypographyAsian CJK
vpalProportional Alternate Vertical MetricsOpenTypeopt-inyesword, paragraphhani, kanaafterneverTypographyAsian CJK
vrt2Vertical RotationOpenTypespecialspecialorientationhani, kanaafterorientationTypographyAsian CJK
zeroSlashed ZeroOpenTypeopt-inyesword, paragraphALLafterneverTypographynumerals and scientific
zhcnSimplified Chinese FormsRemovednevernononeNONEnoneneverRemovednone
zntwTraditional Chinese FormsRemovednevernononeNONEnoneneverRemovednone
Standalone view

Notational convention: Underlined text means verbatim entries, “,” in the Values entry means that multiple values are permitted, “|” in the Values entry means that values are mutualy exclusive.

Description of table columns

Spec

Values: OpenType | Math | Removed

Tag

Values: 4-letter OpenType feature tag name

Notes: the features which contain numbers are represented as ranges. The entry cv[01-99] means a range of tags: cv01, cv02, cv03, …, cv99. The entry ss[01-20] means a range of tags: ss01, ss02, ss03, …, ss20.

Friendly name

Values: Official feature name as registered in the specification

Show in UI

Values: no | yes | special

Determines whether a certain feature should be somehow exposed in an application’s UI. “no” means that no UI is necessary, “yes” generally means that a UI element should be exposed that is directly related to the feature, “special” indicates a special treatment for the UI, e.g. associating the feature activity with some general-level application or document preferences (e.g. optical bounds or CJK orientation).

UI level

Values: none, character, word, paragraph, document

Indicates at what level the UI should be implemented: none, character, word, paragraph, document. Some features are sensibly applied to just one character or a few, while others can be applied to long runs of text.

Script

Values: ALL, INDIC, RTL, ARABIC, CURSIVE, NONE or 4-letter OpenType script tags

Indicates a generalization of which features are used with which scripts. This is not 100% accurate, I think it’d be a good idea to produce an exhaustive mapping of all registered features and mapping them to all registered script tags. Currently, the OT spec has some unclear wording e.g. “Indic scripts similar to Devanagari”. So the column sometimes uses script tags and sometimes generic terms like “ALL”, “INDIC”, “ARABIC”, “RTL”, “CURSIVE”.

Future work: I think that it would be useful to categorize the OpenType script tag list into such groups (so there is an exhaustive mapping of which script tags are classified as “European”, “Indic”, “Arabetic”, “CJK” etc., plus which writing direction they may have (three columns: LTR, RTL, vert).

Script-specific shaping

Values: none | before | during | after | outside

Classification of when, in relation to script-specific shaping, a feature is being applied: before the script-specific shaping (I was able to come up with only four definitive entries for it: ccmp, locl, rtla and size), during the script-specific shaping, or after the script-specific shaping.

Unfortunately, Adobe follows a different paradigm of describing their features than Microsoft. I think Adobe’s CJK layout principles would be better off if described in form of a shaping specification like Microsoft’s, rather than spreading it around the feature description list. Therefore, I have classified all of Adobe’s CJK features as “to be applied after shaping”, since “shaping” is not defined in this context — though I think it could.

Applied by default

Values: never | shaping | always | maybe | orientation

Indicates whether the feature should be always on by default, never on by default, or whether shaping (or in CJK case, orientation) determines if the feature is applied.

Functional category

Values: Language | Typography | Removed
Loose way of classifying the OpenType Layout features into some categories. There is a major distinction between “language” and “typography” (there is such distinction in the script-specific specs already).

Functional subcategory

Values: Asian CJK | complex scripts | basic support | numerals and scientific | letter case | variants
Additional functional sub-categorization, useful for grouping features in UIs.

Notes

Loose comments on particular entries.

Tags: , , , , , , , , , , ,

Trackback from your site.

Adam Twardoch

Adam Twardoch is Director of Products at FontLab, and a font consultant specializing in font technology, multilingual typography, CSS webfonts, Unicode and OpenType. He also works as the glyph wrangler at MyFonts. He regularly teaches workshops in font creation and is a board member of Association Typographique Internationale (ATypI). Originally from Poland, he lives and works in Berlin.

Add a comment