Table of Contents
Fri, 24 May 2002 19:38:31 +0800
> > 3) Besides that, I need to fix the spacing value 'p' to 'c' because the > > value 'p' will cause delay in several seconds when start-up rxvt. > > Again, that's a font bug; mkfontscale tries to work out which fonts > are proportional. On the other hand, it doesn't yet implement a > heuristic to distinguich monospaced (-m-) from charcell (-c-) fonts.
I tested your program with another two Chinese ttf from win9x - MINGLIU.TTC and KAIU.TTF, here is the result:
MINGLIU.TTC -dynalab-MingLiU-medium-r-normal--0-0-0-0-m-0-iso8859-1 MINGLIU.TTC -dynalab-MingLiU-medium-r-normal--0-0-0-0-m-0-iso10646-1 KAIU.TTF -dynalab-DFKai-SB-medium-r-normal--0-0-0-0-m-0-iso8859-1 KAIU.TTF -dynalab-DFKai-SB-medium-r-normal--0-0-0-0-m-0-iso10646-1
It looks better then I added this line by hand:
MINGLIU.TTC -dynalab-MingLiU-medium-r-normal--0-0-0-0-m-0-big5-0
The spacing value 'm' still will cause delay with rxvt. Don't know why. :) The CJK ttf seem must use the 'c' value to avoid this problem. ps. how to fix the font's bugs if I want?
maybe fixing this program will be much easy. :)
> I guess a suitable heuristic would be to decalare all monospaced fonts > in East-Asian encodings to be charcell.
How about using os2->ulCodePageRange1 to lookup the font encoding for supporting modren Unicode encoded CJK fonts? This idea is from another program. Then set their spacing value to 'c'. Here is a patch to do it:
--- mkfontscale.c.orig Sat May 18 18:15:35 2002 +++ mkfontscale.c @@ -37,6 +37,12 @@ #include "freetype/internal/t1types.h" #include "freetype/ftmodule.h" +#define TT_CODEPAGE_RANGE_932 (1L << 17) /* JIS/Japan */ +#define TT_CODEPAGE_RANGE_936 (1L << 18) /* Chinese: Simplified */ +#define TT_CODEPAGE_RANGE_949 (1L << 19) /* Korean Wansung */ +#define TT_CODEPAGE_RANGE_950 (1L << 20) /* Chinese: Traditional */ +#define TT_CODEPAGE_RANGE_1361 (1L << 21) /* Korean Johab */ + #define FACE_TYPE(FACE) ((FACE)->driver->clazz->root.module_name) #define T1INFO(FACE) \ (strcasecmp(FACE_TYPE(FACE), "type1") == 0 ?\ @@ -58,7 +64,7 @@ "adobe-standard", "adobe-symbol", "ibm-cp437", "microsoft-cp1252", /* But not "adobe-dingbats", as it uses generic glyph names. */ "jisx0201.1976-0", "jisx0208.1983-0", "jisx0208.1990-0", - "jisx0212.1190-0", "big5.eten-0", "gb2312.1980-0", + "jisx0212.1990-0", "big5-0", "gb2312.1980-0", "ksc5601.1987-0", "ksc5601.1992-3"}; char *extra_encodings_array[] = @@ -69,7 +75,7 @@ #define countof(_a) (sizeof(_a)/sizeof((_a)[0])) int doDirectory(char*); -static int checkEncoding(FT_Face face, char *encoding_name); +static int checkEncoding(FT_Face face, char *encoding_name, TT_OS2 *os2); static int checkExtraEncoding(FT_Face face, char *encoding_name, int found); static int find_cmap(int type, int pid, int eid, FT_Face face, FT_CharMap *cmap_return); @@ -456,7 +462,12 @@ if(!spacing) spacing = "p"; for(encoding = encodings; encoding; encoding = encoding->next) - if(checkEncoding(face, encoding->value)) { + if(checkEncoding(face, encoding->value, os2)) { + if((strncmp("jis", encoding->value, 3) == 0) || + (strncmp("big5", encoding->value, 4) == 0) || + (strncmp("gb", encoding->value, 2) == 0) || + (strncmp("ksc", encoding->value, 3) == 0)) + spacing = "c"; found = 1; entries = listConsF(entries, "%s -%s-%s-%s-%s-%s-%s-0-0-0-0-%s-0-%s", @@ -491,7 +502,7 @@ } static int -checkEncoding(FT_Face face, char *encoding_name) +checkEncoding(FT_Face face, char *encoding_name, TT_OS2 *os2) { FontEncPtr encoding; FontMapPtr mapping; @@ -542,6 +553,18 @@ if(CODE_IGNORED(c)) { continue; } else { + if((strcmp(encoding->name, "jisx0208.1983-0")==0) & & + (os2->ulCodePageRange1 & TT_CODEPAGE_RANGE_932)) + return 1; + if((strcmp(encoding->name, "big5.eten-0")==0) && + (os2->ulCodePageRange1 & TT_CODEPAGE_RANGE_950)) + return 1; + if((strcmp(encoding->name, "gb2312.1980-0")==0) && + (os2->ulCodePageRange1 & TT_CODEPAGE_RANGE_936)) + return 1; + if((strcmp(encoding->name, "ksc5601.1987-0")==0) && + (os2->ulCodePageRange1 & TT_CODEPAGE_RANGE_949)) + return 1; if(FT_Get_Char_Index(face, c) == 0) { return 0; }
After adopting this patch, I test it with arphic ttf again, the result is what I need:
gkai00mp.ttf -arphic-AR PL KaitiM GB-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0 gkai00mp.ttf -arphic-AR PL KaitiM GB-medium-r-normal--0-0-0-0-c-0-iso10646-1 gbsn00lp.ttf -arphic-AR PL SungtiL GB-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0 gbsn00lp.ttf -arphic-AR PL SungtiL GB-medium-r-normal--0-0-0-0-c-0-iso10646-1 bsmi00lp.ttf -arphic-AR PL Mingti2L Big5-medium-r-normal--0-0-0-0-c-0-big5-0 bsmi00lp.ttf -arphic-AR PL Mingti2L Big5-medium-r-normal--0-0-0-0-c-0-iso10646-1 bkai00mp.ttf -arphic-AR PL KaitiM Big5-medium-r-normal--0-0-0-0-c-0-big5-0 bkai00mp.ttf -arphic-AR PL KaitiM Big5-medium-r-normal--0-0-0-0-c-0-iso10646-1
then test it with baekmuk ttf:
batang.ttf -misc-Baekmuk Batang-medium-r-normal--0-0-0-0-c-0-ksc5601.1987-0 batang.ttf -misc-Baekmuk Batang-medium-r-normal--0-0-0-0-c-0-iso10646-1 dotum.ttf -ibm-Baekmuk Dotum-medium-r-normal--0-0-0-0-c-0-ksc5601.1987-0 dotum.ttf -ibm-Baekmuk Dotum-medium-r-normal--0-0-0-0-c-0-iso10646-1 gulim.ttf -misc-Baekmuk Gulim-medium-r-normal--0-0-0-0-c-0-ksc5601.1987-0 gulim.ttf -misc-Baekmuk Gulim-medium-r-normal--0-0-0-0-c-0-iso10646-1 hline.ttf -ibm-Baekmuk Headline-medium-r-normal--0-0-0-0-c-0-ksc5601.1987-0 hline.ttf -ibm-Baekmuk Headline-medium-r-normal--0-0-0-0-c-0-iso10646-1
and check ARIAL.TTF again:
ARIAL.TTF -monotype-Arial-medium-r-normal--0-0-0-0-p-0-iso8859-1 ARIAL.TTF -monotype-Arial-medium-r-normal--0-0-0-0-p-0-iso8859-15 ARIAL.TTF -monotype-Arial-medium-r-normal--0-0-0-0-p-0-microsoft-cp1252 ARIAL.TTF -monotype-Arial-medium-r-normal--0-0-0-0-p-0-iso10646-1
Well, looks fine. :) This patch is ugly but maybe it is a start point.
Sorry for such long descriptions!
Rui-Xiang Guo @XFree86.Org