- From: Håkon Wium Lie <howcome@opera.com>
- Date: Wed, 12 Nov 2008 18:40:33 +0100
- To: John Daggett <jdaggett@mozilla.com>
- Cc: "L. David Baron" <dbaron@dbaron.org>, www-style@w3.org
Also sprach John Daggett:
> > I'll start with the easiest of the three issues: when the same
> > descriptor appears twice in an @font-face rule, which one or ones
> > matter?
> >
> > CSS 2.0 is clear on this:
> >
> > # If a font descriptor is duplicated, the last occurring
> > # descriptor wins and the rest must be ignored.
>
> This makes the most sense to me.
Agreed.
> > 2. Handling of lists of values of the 'src' descriptor
> > ======================================================
> >
> > The second issue is that the spec doesn't describe how a user agent
> > should process multiple values of the 'src' descriptor. In
> > particular, when the 'src' descriptor is a list of values, there
> > seem to be two reasonable possibilities:
> >
> > (A) The user agent uses the first of those values for which it has
> > a usable font (e.g., a local() font that is present or a url()
> > that is in a format it supports) and ignores the rest.
> >
> > (B) The user agent uses all of the values for which it has a
> > usable font, picking each glyph from the earliest in the list that
> > has a glyph for the character.
> >
> > (B) seems like it has some advantages, particularly when local() and
> > src() are combined, and the font available locally may have more or
> > fewer glyphs in it depending on what the user has chosen to install.
> > It also feels more CSS-like to me (which could mean it fits author
> > expectations better, although maybe not).
Agreed, it feels more CSS-like -- it's iso-morphic to the
comma-separated list on 'font-family'.
> > (A) seems like it may have some advantages in terms of speed or
> > bandwidth usage.
> >
> > However, current implementations in WebKit nightlies and in Gecko
> > nightlies seem to do (A).
>
> I actually think it's important to separate font loading behavior from
> font fallback, so that web authors have more control over when fonts are
> downloaded and used. Method (B) may seem more like normal CSS fallback
> but it gives authors less control.
>
> Example: use an SVG font as a substitute for when Futura not available
> locally
>
> @font-face {
> font-family: MyFutura;
> src: local(Futura-Medium), url(fonts/MyGeometricModern.svg) format("svg");
> }
>
> body { font-family: MyFutura, sans-serif; }
>
> With method (B), user agents supporting SVG fonts would *always*
> download the SVG font in fallback situations, even if the web author
> already knew that both fonts supported the same set of characters.
That's only a slight inconvenience, I believe. And you could get
around it by saying:
@font-face {
font-family: MyFutura1;
unicode-range: U+A5, U+4E00-9FFF, U+30??, U+FF00-FF9F;
src: local(Futura-Medium);
}
@font-face {
font-family: MyFutura2;
unicode-range: U+A5, U+4E00-9FFF, U+30??, U+FF00-FF9F;
src: url(fonts/MyGeometricModern.svg) format("svg");
}
* { font-family: MyFutura1, MyFutura2 }
> Example: set up a font for use with Arabic text that works across
> different platforms
>
> @font-face {
> font-family: Lateef;
> src: url(../fonts/LateefRegAAT.ttf) format("truetype-aat"),
> url(../fonts/LateefRegOT.ttf) format("opentype");
> }
>
> body { Lateef, sans-serif; }
>
> In this case, user agents under Mac OS X would use the AAT font while
> user agents on other platforms would skip the AAT font and use the
> OpenType font. In the case of fallback for non-Arabic text, method (B)
> would require both fonts to be downloaded under Mac OS X.
Ditto.
> Example: set up an alias for Japanese fonts on different platforms
>
> @font-face {
> font-family: Japanese;
> src: local(Meiryo), local(HiraKakuPro-W3), local(IPAPGothic);
> }
>
> body { Helvetica, Japanese, Arabic, sans-serif; }
>
> Method (A) allows a simple way to just lookup a character in one font
> per possible script. Method (B) requires a lot of extra lookups.
>
> Method (B) mimics normal font fallback, so it's possible to get the same
> results with a normal font-family list using fonts defined by simple
> @font-face rules. Method (A) can't be simulated in a user agent that
> uses method (B).
This is a good argument. I also like the simplicity of it.
Another argument for (A) is that you could list alternative sources
for the same font file:
@font-face {
font-family: foo;
src-fallback: url(http://server1.com/foo.ttf), url(http://server2.com/foo.ttf)
}
One arguement for (B) is that Prince has implemented it this way and
that it uses it in the default style sheet:
@font-face {
font-family: sans-serif;
src: local("Arial"), local("Helvetica"), local("OpenSymbol"), local("DejaVu Sans")
}
If we remove the fallback behavior, glyphs from "OpenSymbol" are
unlikely to ever be used. One could argue that, since this is a kind
of init-file, a different descriptor could be used, e.g.:
@font-face {
font-family: sans-serif;
src-fallback: local("Arial"), local("Helvetica"), local("OpenSymbol"), local("DejaVu Sans")
}
This way we could support both scenarios.
> > 3. Handling multiple @font-face rules defining the same fonts
> > =============================================================
> >
> > The third issue is somewhat similar to the second, except it
> > involves some additional forward-compatibility issues:
> >
> > Given two @font-face rules that describe the same font but have
> > different 'src' descriptors, which fonts are used? For example:
> >
> > @font-face {
> > font-family: "Foo";
> > src: url(a.ttf);
> > }
> >
> > @font-face {
> > font-family: "Foo";
> > src: url(b.ttf);
> > }
> >
> > body { font-family: "Foo", Arial, sans-serif; }
> >
> > In this case, does the search for glyphs look in:
> > (1) a.ttf, then b.ttf, then Arial, then other sans-serif fonts
> > (2) b.ttf, then a.ttf, then Arial, then other sans-serif fonts
> > (3) a.ttf, then Arial, then other sans-serif fonts
> > (4) b.ttf, then Arial, then other sans-serif fonts
> > ?
> >
> > Right now WebKit nightlies appear to do (2) and Gecko nightlies
> > appear to do (4).
> >
> > I think I prefer (4) because:
> >
> > (a) @font-face rules that are identical might actually differ in
> > descriptors that the user-agent doesn't understand or can't parse.
> > If these descriptors are like 'font-weight', then in doesn't matter
> > what the behavior is, and authors can work around the lack of
> > support for those descriptors by choosing one of the fonts over the
> > other by putting the @font-face rules in a particular order
> > (whichever way they want), no matter which solution is chosen (as
> > long as the solution is consistent across browsers). However, if
> > the unknown descriptor (or descriptor with an unknown value) is one
> > like 'unicode-range', the user-agent is clearly better using both of
> > the sources provided.
> >
> > (b) It has more similarity to the way descriptors like
> > 'unicode-range' are handled.
> >
> > (c) Again, it seems somewhat more CSS-like to me.
>
> I agree, for two @font-face rules that specify the same set of font
> descriptor values with different src values, the first rule should
> effectively be ignored. I'm surprised that WebKit uses (2) that doesn't
> make a lot of sense.
It's a hassle to have to record seemingly duplicate @font-faces, but
with extensibility in mind, 2 may actually make more sense. 4 is
simpler, though. I'm torn.
-h&kon
Håkon Wium Lie CTO °þe®ª
howcome@opera.com http://people.opera.com/howcome
Received on Wednesday, 12 November 2008 17:41:48 UTC