Closed Bug 196312 Opened 22 years ago Closed 13 years ago

Gfx-Xft needs a work-around for Xft/Freetype problem with CJK 'monospace' (bi-width) fonts

Categories

(Core Graveyard :: GFX: Gtk, defect)

x86
Linux
defect
Not set
normal

Tracking

(Not tracked)

RESOLVED INCOMPLETE

People

(Reporter: jshin1987, Assigned: blizzard)

References

Details

(Keywords: intl)

Attachments

(3 files, 2 obsolete files)

There are several CJK truetype fonts with fixed-width 'bit' set, that are actually 'bi-width' fonts with glyphs for CJK characters (East Asian width property 'full') being twice as wide as glyphs for (most) Latin alphabetic letters and numerals (East Asian width property 'half' See Unicode Technical Report 11 :http://www.unicode.org/reports/tr11/ ). Currently, Freetype2 and Xft don't have a special provision to handle those fonts and regard all the glyphs in them as having the same width as CJK characters(max_advance). The result is that alphabetic letters and numbers are rendered in a rectangular cell twice wider than necessary to 'enclose' glyphs for them. There are a couple of patches around (see http://bugzilla.gnome.org/show_bug.cgi?id=106618 and links refered to there), but it may take a while until this issue is addressed in those libraries. In the meantime, their 'clients' may need to haev a work-around. For gnome 'vte' and gtk2 port of Vim, I provided a patch (which was committed about a week ago) that worked quite well. Mozilla may need to implement a similar work-around that would kick in only when upperstream libraries (Xft, FT2 and possibly fontconfig) don't take care of the issue.
Note that in the screenshot, all alphabets and numbers have the same width, exactly _half_ the width of Korean Hangul syllables. However, they're rendered in cells of the same width as cells for Korean characters leading to 's p a c e d o u t' rendering.
Mozilla-Win does not have this problem apparently because Windows font library takes care of the issue unlike FT2 and Xft. Both screenshots were taken with 'Gulimche' (available in any language version of Windows 2k and Windows XP or Global IME for Korean for Windows 9x/ME). 'Gulimche' is one of fonts in 'gulim.ttc'.
fontconfig believed fonts that said they were 'monospaced' and set the FC_SPACING value to FC_MONO. FC_SPACING is used by Xft to force fonts to be monospaced by setting their glyph widths to the maximum over the whole font. Hence, any font advertised as monospaced is forced to be monospaced by Xft. The work around is pretty simple for older verisons of fontconfig. After the font is matched and before it is opened, set the FC_SPACING value to FC_PROPORTIONAL, that will make Xft obey the individual glyph widths.
Were you implying that a newer version of fontconfig behaves differently? When did that change get effective? I pulled fonconfig and Xft out of the xf86 cvs repository in late February and it appeared that it worked the old way. BTW, wouldn't it be nice to keep setting FC_SPACING to FC_MONO for CJK bi-width fonts in fontconfig and to deal with them in Xft?
Yes, current fontconfig bits don't ever set FC_SPACING; most real monospaced fonts (i.e. those suitable for use in a simplistic terminal emulator) don't bother to indicate this, and (as we've just seen), many non-monospaced fonts set the attribute. I'd originally assumed that fonts indicating monospacing were likely to be correct. XFree86 CVS doesn't hold the canonical fontconfig repository, that's at cvs.fontconfig.org. I'm working towards a 2.2 release a this point; all that's left is to reformat some of the documentation.
Thank you for the info. With libfontconfig built from the cvs snapshot, Mozilla works fine as it is. As for old fontconfig, IMHO, we'd rather not do anything because I found that putting the following lines into font config. file also works: <match target="font"> <test name="family"><string>GulimChe</string></test> <edit name="globaladvance"><bool>false</bool></edit> </match> BTW, I did try changing FC_SPACING from FC_MONOSPACE to FC_PROPORTIONAL in mozilla, but somehow I got segfaulted in xftfreetype.c (of Xft) > (as we've just seen), many non-monospaced fonts set > the attribute. This is not so simple, I guess. Literally, they're not monospace, but 'semantically', CJK bi-width fonts are 'monospace' and are used where 'monospace' fonts are used (terminal emulators, rendering of <pre> in html). That's why foundries set the attribute. Because it's kinda off-topic here, I'll write more about it in other forums.
> we'd rather not do anything because I found that putting > the following lines into font config. file also works: > <match target="font"> > <test name="family"><string>GulimChe</string></test> > <edit name="globaladvance"><bool>false</bool></edit> > </match> It was premature to say that the above worked for me. (I heard that it worked for someone, but it never worked for me). Anyway, presumably it'll take fontconfig 2.2 to get widely deployed. For those who still use earlier versions, I think it's a good idea to offer a work around (similar to that for Xrender crash problem with Xft.). I would have done it back in March, but at that time I was modifying the code at a wrong place and couldn't make it work. Because monospace font is also used for textarea, textarea always comes up twice as wide as the specified width (when a CJK bi-width font is used for monospace). blizzard, can we get this simple patch in? This will remove one item from I18N release notes of 1.4 final. Of course, if 'globaladvance' setting can be made to work, I'd withdraw the patch and release-note that, instead.
Attached patch a patch with typo fixed (obsolete) — Splinter Review
I'm sorry that attachment 122833 [details] [diff] [review] had a typoe. It's beyond me why the prev. patch had a typo because I think I compiled it and confirmed that it worked as intended.
Attachment #122833 - Attachment is obsolete: true
Comment on attachment 122853 [details] [diff] [review] a patch with typo fixed >+ >+ // bug 196312 : work around problem with CJK bi-width fonts >+ if (gFcWorkaroundBiWidthFont ) >+ FcPatternDel(pat, FC_SPACING); This isn't called all that often. Just use FcGetVersion() and compare it against the value directly. And make the comment a little bigger, explaining what's going on.
Attachment #122853 - Flags: review-
blizzard, can you review?
Attachment #122853 - Attachment is obsolete: true
Comment on attachment 122916 [details] [diff] [review] two liner + comment r=blizzard Thanks! Go ahead and check this in.
Attachment #122916 - Flags: review+
Purely by chance (I was looking for another bug), I got to know that fontconfig 2.2 still has the problem (2.1.90 - 2.1.92 don't have the problem). I confirmed the problem by installing fc 2.2. I took keith's word in comment #5 :-). Apparently, he added some optimization after writting comment #5 (in 2.1.93.) See http://fontconfig.org/cgi-bin/bugzilla/show_bug.cgi?id=82 This time it appears that it's FT2's fault. Perhaps, we just have to call |FcPatternDel| unconditionally in the meantime.
Does this bug still occur in a recent trunk build? (If so, please change the Component to GFX:Thebes)
Product: Core → Core Graveyard
The code changed by the patch no longer exists, and we're long past fontconfig 2.2 on current Linux distros, so I suspect this is no longer a problem. If it is still a problem, please file a new bug; it would be very helpful if that bug had a test case using @font-face so everyone was looking at the same fonts.
Status: NEW → RESOLVED
Closed: 13 years ago
Resolution: --- → INCOMPLETE
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: