Re: [css3-fonts] font-specific feature handling

In the telecon this week one of the topics discussed [1] was
font-specific font variant features in the CSS3 Fonts spec [2].  The
original post on this is here:

  http://lists.w3.org/Archives/Public/www-style/2010Feb/0244.html

In the current draft some of the 'font-variant-alternates' values take
numeric values to indicate specific variants.  These values are tied
to a specific font.  If fallback occurs, the concern is that those
values will apply to a fallback font and that will lead to "bad"
results:

  body {
    font-family: MyFancyFont, SomePlatformFont;
    font-variant: additional-ligatures styleset(1,3);
  }

Note that for anything other than default glyphs to be rendered in
the fallback font, a given character would have to be missing in the
initial font *and* a variant would have to be available for that
character in the fallback font.

Fantasai and Peter suggested that values that take numerical values
should only be available within @font-face rules and not available in
the general version of the property (the draft spec currently allows
both).  The above example would be instead written as:

  @font-face {
    font-family: MyFancyFont;
    font-variant: styleset(1,3);
  }

  body {
    font-family: MyFancyFont, SomePlatformFont;
    font-variant: additional-ligatures;
  }

In this case, stylesets 1 and 3 are only applied to MyFancyFont (i.e.
ss01 and ss03) and never to a fallback font.

Allowing both gives authors flexibility but I really don't like the
idea of restricting font-specific values to @font-face rules, it makes
normal authoring more cumbersome because an @font-face rule would need
to be defined for *each* combination of restricted values:

  @font-face {
    font-family: MyFancyFont-Ornament1;
    font-variant: ornaments(1);
  }

  @font-face {
    font-family: MyFancyFont-Ornament3;
    font-variant: ornaments(3);
  }

  @font-face {
    font-family: MyFancyFont-Headings;
    font-variant: swash(1) styleset(6);
  }

  @font-face {
    font-family: MyFancyFont-Text;
    font-variant: styleset(2,3);
  }

  p.special:first-letter { font-family: MyFancyFont-Ornament1; }
  p.regular:first-letter { font-family: MyFancyFont-Ornament3; }
  h1, h2 { font-family: MyFancyFont-Headings; }
  p.special { font-family: MyFancyFont-Text; }
  
Dang, that's verbose!  Compare this to using just the general property:

  p.special:first-letter { font-variant: ornaments(1); }
  p.regular:first-letter { font-variant: ornaments(3); }
  h1, h2 { font-variant: swash(1) styleset(6); }
  p.special { font-variant: styleset(2,3); }
 
In general, it's really, really hard to construct an example where
fallback occurs and anything other than the default glyphs are used. 
Most platform fonts lack alternate variants.

Where authors run into the exceptional situation in which fallback
rendering is somehow a problem, the ability to specify font-variant
values in @font-face rules would provide a way to work around these
problems.

I think we're all accustomed to dealing with font stacks and fallback
issues but with downloadable fonts, that's really an old paradigm.  In
a world where web fonts are ubiquitous, an author specifies the font
they want and doesn't worry so much about fallback.  I don't think we
should make authoring more difficult in this situation for the sake of
fallback problems that are theoretically possible but generally don't
occur in practice.

Regards,

John

[1] http://krijnhoetmer.nl/irc-logs/css/20100317#l-117
[2] http://dev.w3.org/csswg/css3-fonts/

Received on Thursday, 18 March 2010 14:32:00 UTC