- From: John Daggett <jdaggett@mozilla.com>
- Date: Mon, 29 Jun 2009 00:51:34 -0700 (PDT)
- To: www-style <www-style@w3.org>
Below is a proposal for supporting in CSS advanced font features found in OpenType and AAT fonts. Supporting features available in "smart font" formats like OpenType and AAT presents a quandary, there are lots and lots of features and the list is constantly evolving. The proposal below is an attempt to capture some of these without producing an explosion in the number of CSS properties. As much as possible, the features are grouped to try and make their use intuitive but it's assumed that the mapping onto underlying OpenType/AAT features will need to be normative, without it interoperability would be almost impossible. For comparison, see the link below describing WPF OpenType feature properties. At this point I think the actual property names and values are less important than whether the set of underlying OpenType features is sufficient/appropriate. Are there OpenType features omitted here that should really be exposed for authors? Or limitations that are unfortunate? For example, OpenType allows distinct sets of glyphs with a common style to be specified independently but the 'styleset' value defined here is associated with a single numeric value, so only one of these stylesets could be applied at a time. OpenType also contains many language-specific features; some of these are best left to the control of the shaping engine using them. Others, such as the CJK related glyphset and width properties listed below seem like interesting candidates for inclusion but I'm still unsure of the exact set of properties/values that are supported currently. Overall shorthand The font-variant property is extended to be a shorthand for all the properties below. Values that don't seem to fit into a separate property are added here. The 'normal' keyword resets all properties below and any specification of values resets features whose value was omitted. font-variant: normal | [<ligature-values> | <alternate-values> | <caps-value> | <numeric-values> | <char-position-value>]+ ; font-variant-ligatures: normal | <ligature-values> ; font-variant-alternates: normal | <alternates-values> ; font-variant-caps: normal | <caps-value> ; font-variant-numeric: normal | <numeric-values> ; font-variant-position: normal | <char-position-value> ; Each of the font-variant-xxx properties above allows for a specific subset of features to be overridden. In cases where multiple values that are mutually exclusive are listed, the last value is used. Other than 'small-caps', these properties are not involved with the font matching process, they are applied as rendering properties; if a font lacks support for a given feature, default rendering takes place. OpenType is sensitive to language when font features like ligatures are enabled. For example, in Turkish the fi ligature is typically disabled so that the distinction with the dotless-i is clear. It would make sense for user agents to map document language to OpenType language but this is probably somewhat tricky to do normatively. Some feature selections only apply to a single font. Swashes and styleset values are defined differently across fonts, so applying those values across fonts would not always give the intended result. One way of allowing per-face control would be to define the font-variant descriptor within @font-face rules to imply font feature settings for a single face: @font-face { font-family: Rebus; src: url(xxx); font-variant: contextual; /* enable calt only for this font */ } Using src local(), this could be applied to individual locally available font faces although this is somewhat awkward. The descriptor value would apply on top of values specified through font properties. Value definitions are listed below along with the intended mapping to OpenType and AAT feature settings. Ligatures <ligature-values> :== [common-ligs | additional-ligs | historical-ligs | no-common-ligs | no-additional-ligs | no-historical-ligs]+ where these keywords imply the following underlying features normal: clears all features below, uses font defaults common-ligs: liga (OT), ligatures = common (AAT) additional-ligs: dlig (OT), AAT? historical-ligs: hlig (OT), ligatures = rare (AAT) no-xxx: disables features above mutually exclusive values: (common-ligs, no-common-ligs) (additional-ligs, no-additional-ligs) (historical-ligs, no-historical-ligs) Note: no control over rlig, required ligatures, since this should be under the control of the shaping engine. Should "common" ligatures be labeled another way? "default"? Alternates and Swashes <alternates-values> :== [alternates <number> | contextual | no-contextual | styleset <number> | swash <number> | random-alternates]+ where these keywords imply the following underlying features normal: clears all features below, uses font defaults alternates: salt(number) (OT), character alternatives = number (AAT) contextual: calt, clig (OT), not in AAT no-contextual: disable feature above random-alternates: rand (OT), not in AAT styleset: ss## where ## = number (OT), design complexity = number (AAT) swash: swsh(number), cswh(number) (OT), AAT? mutually exclusive values: (contextual, no-contextual) Capitalization <caps-value> :== small-caps | petite-caps | titling-caps where these keywords imply the following underlying features normal: clears all features below, uses font defaults small-caps: smcp (OT), letter case = small caps (AAT) petite-caps: pcap (OT), not in AAT titling-caps: titl (OT), style options = titling caps (AAT) All capitalization values are mutually exclusive. Numeric styles This is relatively easy to define, both AAT and OpenType have these features, although with fractions there's some interaction with other features (numr/dnom). Not sure if there would be feature interactions when rendering MathML for example. These properties all relate to numerics but it may make sense to split out fractions, since these are typically to specific values and not to overall runs of text. <numeric-values> :== [<number-style> | <number-width> | <fraction> | slashed-zero]+ where <number-style> :== [lining-nums | oldstyle-nums] <number-width> :== [proportional-nums | tabular-nums] <fraction> :== [diagonal-fractions | stacked-fractions] and these keywords imply the following underlying features normal: clears all features below, uses font defaults lining-nums: lnum (OT), number case = upper case (AAT) oldstyle-nums: onum (OT), number case = lower case (AAT) proportional-nums: pnum (OT), number spacing = proportional (AAT) tabular-nums: tnum (OT), number spacing = monospaced (AAT) diagonal-fractions: frac (OT), fractions = diagonal stacked-fractions: afrc (OT), fractions = stacked slashed-zero: zero (OT), AAT? mutually exclusive values: (lining-nums, oldstyle-nums) (proportional-nums, tabular-nums) (diagonal-fractions, stacked-fractions) Character position <char-position-value> :== inferior | ordinal | ruby | subscript | superscript and these keywords imply the following underlying features normal: clears all features below, uses font defaults inferior: sinf (OT), vertical position = inferiors ordinal: ordn (OT), vertical position = ordinals ruby: ruby (OT), AAT? subscript: subs (OT), vertical position = inferiors superscript: supr (OT), vertical position = superiors All character position values are mutually exclusive. Other properties still under investigation font-variant-east-asian: normal | [<char-variant-value> | <char-width-value>]+ ; <char-variant-value> :== hojo-kanji | jis04 | jis78 | jis83 | jis90 | nlckanji | simplified | traditional | traditional-names <char-width-value> :== full-width | half-width | third-width | quarter-width | proportional References: HÃ¥kon's proposal for extending font-variant to make it a shorthand property for a set of font-variant-xxx properties: http://lists.w3.org/Archives/Public/www-style/2008Jan/0380.html Interesting comments on www-style from Sergey Malkin, who worked on Uniscribe and WPF at Microsoft: http://lists.w3.org/Archives/Public/www-style/2008Jan/0422.html A more extensive, slightly different proposal was posted by Etan Wexler a few months later: http://lists.w3.org/Archives/Public/www-style/2008Jun/0091.html OpenType feature list: http://www.microsoft.com/opentype/otspec/featurelist.htm AAT font feature registry: http://developer.apple.com/textfonts/Registry/index.html WPF api for OpenType features: http://msdn.microsoft.com/en-us/library/ms745109.aspx Flash 10 API (see ElementFormat): http://injun.ru/flash10api/flash/text/engine/package-detail.html
Received on Monday, 29 June 2009 07:52:19 UTC