Hello, I was assigned with the task of dealing with "s p a c e d - o u t " CJK "fixedPitch" font issue in konsole. There are quite a few modern CJK TrueType fonts with the "fixedPitch" flag set to "true" to mean that:
* All CJK glyphs have the same "fullwidth" * The ASCII glyphs and other special glyphs have the same "halfwidth" I have submitted a small patch to the FreeType mailing list to deal with the "halfwidth" monospace font issue, and it turns out that Xft has the same issue. It took me a while to figure out that it was not konsole or Qt. :-) Anyhow, to demonstrate the issue, the following screenshot was taken after patching FreeType and before patching Xft: http://anthony.homelinux.net/~foka/xft/halfwidth-rendered-as-fullwidth.png The font therein is a popular "fixedPitch" Chinese TrueType font. After applying the patch to Xft, it looks much nicer: http://anthony.homelinux.net/~foka/xft/halfwidth-even-advance.png Note that this is the case when the "fullwidth" (or full advance width) is an *even* number, say "16", so that the halfwidth would be "8". How, when the fullwidth is an *odd* number, say "15", the halfwidth would be rounded off to "7", but 7 + 7 = 14. And as you can see from the following screenshot, the text aren't as nicely aligned: http://anthony.homelinux.net/~foka/xft/halfwidth-odd-advance.png (but of course, still much better than before. :-) Any idea on how to deal with the "15 / 2 = 7; 7 + 7 = 14" issue? :-) Oh yes, please let me know if the attached patch is okay. Many thanks! Cheer, Anthony -- Anthony Fok Tung-Ling ThizLinux Laboratory <[EMAIL PROTECTED]> http://www.thizlinux.com/ Debian Chinese Project <[EMAIL PROTECTED]> http://www.debian.org/intl/zh/ Come visit Our Lady of Victory Camp! http://www.olvc.ab.ca/
--- Xft~/xftglyphs.c 2002-10-12 01:53:02.000000000 +0800 +++ Xft/xftglyphs.c 2002-12-09 01:42:56.000000000 +0800 @@ -298,6 +298,13 @@ xftg->metrics.yOff = 0; } } + + /* + * Halfwidth characters in fixed-width CJK fonts + */ + if (TRUNC(ROUND(glyphslot->advance.x)) <= (font->public.max_advance_width +>> 1) + 1 + && xftg->metrics.xOff > 1) + xftg->metrics.xOff = xftg->metrics.xOff >> 1; } else {