RE: CFF and Uniscribe (was: Merits and deficiencies of EOT Lite)

Problem that we experience with embedded fonts originates in GDI. GDI itself is fine working with CFF fonts. However, it does not provide obvious way to check if font is CFF OpenType. Lots of places in code that tries to determine type of the font check for TrueType flag thinking that it would automatically cover all scalable Unicode fonts. Most of this code existed before OpenType. We continue finding such problematic code across all Microsoft codebase, Windows or Office.

Both t2embed and Uniscribe would work with CFF fonts fine, in both cases this is the last minute one-line check that does not recognize font type and rejects the font. In case of t2embed it results in font failed to load. One this check is modified to recognize CFF font t2embed started to behave as expected. AFAIK, Safari tried (at least at some point) to use t2embed to load plain ttf files, so t2embed problem may affect it as well. I do not know if other browsers are affected.

If browser is using Uniscribe, it will not work with CFF fonts because of Uniscribe problem which affects only fonts installed privately inside single process. Glyphs will display, but no complex script or contextual shaping will happen. It affects any embedded fonts format, because this code works after font is unpacked and installed with GDI. In fact, this problem had been reported to me by John Daggett himself when he was working on naked font embedding.

There is nothing wrong with EOT format that makes it impossible to work with CFF. It is only implementation bug in Windows codebase and this should not prevent other products willing to support EOT or EOT-Lite. Both problems are currently fixed in Windows7. Although, as much as I want to release patches to pre-Win7 versions of OS, I can't currently make such commitment. It is proven to be very hard to push anything downlevel except security fixes. I can only tell that I am pushing for that.

Thanks,
Sergey

Received on Tuesday, 28 July 2009 21:44:59 UTC