Reply-to: mfabian@xxxxxxx X-Face: "';oPz9V1+<,`}1ZuxRv~EiSusWq*{Yjr"Sdvbhq'?q=2R\\6Y9O/,SAE`{J|6I=|w/sQg< rW_N'E3IV6~f8?\l#Es`]S`mv',PY(`8{$$R?+gLu}Qv/Mn>)?uladFjJ@yl!_p_Jh;5QxlD6zL:?r IXe4FfK$C^mWhh$o`yt;.r.FLZLQOWBt><!;-.DYZ)Nu&1?~*:\36\BGz]"L;nue;l\%sJ/]l{is5O Ew?0CF}dPS(ezG0xqUR)xa(L&&c;x{By"`oKvM&i!%+ From: Mike FABIAN <mfabian@xxxxxxx> Date: Wed, 19 Oct 2005 16:12:05 +0200 Message-ID: <s3ty84p4mve.fsf@xxxxxxxxxxxxxxxx> User-Agent: Gnus/5.1006 (Gnus v5.10.6) XEmacs/21.5 (cucumber, linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" --text follows this line-- --=-=-= Here is a patch by Zhe Su <zsu@xxxxxxxxxx> to improve support for localized font family and style names. For details see: http://bugzilla.novell.com/show_bug.cgi?id=128930 --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=bugzilla-128930-support-localized-family-and-style-names.patch diff -ur fontconfig-2.3.91.20051007.old/src/fcdefault.c fontconfig-2.3.91.20051007/src/fcdefault.c --- fontconfig-2.3.91.20051007.old/src/fcdefault.c 2005-10-17 22:40:43.000000000 +0800 +++ fontconfig-2.3.91.20051007/src/fcdefault.c 2005-10-17 23:24:44.000000000 +0800 @@ -38,6 +38,67 @@ #define NUM_FC_BOOL_DEFAULTS (int) (sizeof FcBoolDefaults / sizeof FcBoolDefaults[0]) +FcChar8 * +FcGetDefaultLang (void) +{ + static char lang_local [128] = {0}; + char *ctype; + char *territory; + char *after; + int lang_len, territory_len; + + if (lang_local [0]) + return (FcChar8 *) lang_local; + + ctype = setlocale (LC_CTYPE, NULL); + + /* + * Check if setlocale (LC_ALL, "") has been called + */ + if (!ctype || !strcmp (ctype, "C")) + { + ctype = getenv ("LC_ALL"); + if (!ctype) + { + ctype = getenv ("LC_CTYPE"); + if (!ctype) + ctype = getenv ("LANG"); + } + } + + /* ignore missing or empty ctype */ + if (ctype && *ctype != '\0') + { + territory = strchr (ctype, '_'); + if (territory) + { + lang_len = territory - ctype; + territory = territory + 1; + after = strchr (territory, '.'); + if (!after) + { + after = strchr (territory, '@'); + if (!after) + after = territory + strlen (territory); + } + territory_len = after - territory; + if (lang_len + 1 + territory_len + 1 <= (int) sizeof (lang_local)) + { + strncpy (lang_local, ctype, lang_len); + lang_local[lang_len] = '-'; + strncpy (lang_local + lang_len + 1, territory, territory_len); + lang_local[lang_len + 1 + territory_len] = '\0'; + } + } + } + + /* set default lang to en */ + if (!lang_local [0]) + strcpy (lang_local, "en"); + + return (FcChar8 *) lang_local; +} + void FcDefaultSubstitute (FcPattern *pattern) { @@ -92,55 +153,7 @@ if (FcPatternGet (pattern, FC_LANG, 0, &v) == FcResultNoMatch) { - char *lang; - char *territory; - char *after; - int lang_len, territory_len; - char lang_local[128]; - char *ctype = setlocale (LC_CTYPE, NULL); - - /* - * Check if setlocale (LC_ALL, "") has been called - */ - if (!ctype || !strcmp (ctype, "C")) - { - ctype = getenv ("LC_ALL"); - if (!ctype) - { - ctype = getenv ("LC_CTYPE"); - if (!ctype) - ctype = getenv ("LANG"); - } - } - /* ignore missing or empty ctype */ - if (ctype && *ctype != '\0') - { - lang = ctype; - territory = strchr (ctype, '_'); - if (territory) - { - lang_len = territory - lang; - territory = territory + 1; - after = strchr (territory, '.'); - if (!after) - { - after = strchr (territory, '@'); - if (!after) - after = territory + strlen (territory); - } - territory_len = after - territory; - if (lang_len + 1 + territory_len + 1 <= (int) sizeof (lang_local)) - { - strncpy (lang_local, lang, lang_len); - lang_local[lang_len] = '-'; - strncpy (lang_local + lang_len + 1, territory, territory_len); - lang_local[lang_len + 1 + territory_len] = '\0'; - FcPatternAddString (pattern, FC_LANG, (FcChar8 *) lang_local); - } - } - else - FcPatternAddString (pattern, FC_LANG, (FcChar8 *) lang); - } + FcPatternAddString (pattern, FC_LANG, FcGetDefaultLang ()); } if (FcPatternGet (pattern, FC_FONTVERSION, 0, &v) == FcResultNoMatch) { diff -ur fontconfig-2.3.91.20051007.old/src/fcint.h fontconfig-2.3.91.20051007/src/fcint.h --- fontconfig-2.3.91.20051007.old/src/fcint.h 2005-10-07 19:00:55.000000000 +0800 +++ fontconfig-2.3.91.20051007/src/fcint.h 2005-10-18 09:57:14.000000000 +0800 @@ -571,6 +571,10 @@ int FcDebug (void); +/* fcdefault.c */ +FcChar8 * +FcGetDefaultLang (void); + /* fcdir.c */ FcBool diff -ur fontconfig-2.3.91.20051007.old/src/fclist.c fontconfig-2.3.91.20051007/src/fclist.c --- fontconfig-2.3.91.20051007.old/src/fclist.c 2005-10-07 19:00:55.000000000 +0800 +++ fontconfig-2.3.91.20051007/src/fclist.c 2005-10-18 12:43:54.000000000 +0800 @@ -337,6 +337,37 @@ table->entries = 0; } +static int +FcGetDefaultObjectLangIndex (FcPattern *font, const char *object) +{ + FcChar8 *lang = FcGetDefaultLang (); + FcPatternElt *e = FcPatternFindElt (font, object); + FcValueListPtr v; + FcValue value; + int idx = -1; + int i; + int langlen = strlen (lang); + + if (e) + { + for (v = e->values, i = 0; FcValueListPtrU(v); v = FcValueListPtrU(v)->next, ++i) + { + value = FcValueCanonicalize (&FcValueListPtrU (v)->value); + + if ((value.type & ~FC_STORAGE_STATIC) == FcTypeString) + { + FcLangResult res = FcLangCompare (value.u.s, lang); + if (res == FcLangEqual) + idx = i; + else if (res == FcLangDifferentCountry && strlen (value.u.s) < langlen && idx < 0) + idx = i; + } + } + } + + return (idx > 0) ? idx : 0; +} + static FcBool FcListAppend (FcListHashTable *table, FcPattern *font, @@ -347,6 +378,11 @@ FcValueListPtr v; FcChar32 hash; FcListBucket **prev, *bucket; + int familyidx = -1; + int fullnameidx = -1; + int styleidx = -1; + int defidx = 0; + int idx; hash = FcListPatternHash (font, os); for (prev = &table->buckets[hash % FC_LIST_HASH_SIZE]; @@ -368,15 +404,36 @@ for (o = 0; o < os->nobject; o++) { + if (!strcmp (os->objects[o], FC_FAMILY) || !strcmp (os->objects[o], FC_FAMILYLANG)) + { + if (familyidx < 0) + familyidx = FcGetDefaultObjectLangIndex (font, FC_FAMILYLANG); + defidx = familyidx; + } + else if (!strcmp (os->objects[o], FC_FULLNAME) || !strcmp (os->objects[o], FC_FULLNAMELANG)) + { + if (fullnameidx < 0) + fullnameidx = FcGetDefaultObjectLangIndex (font, FC_FULLNAMELANG); + defidx = fullnameidx; + } + else if (!strcmp (os->objects[o], FC_STYLE) || !strcmp (os->objects[o], FC_STYLELANG)) + { + if (styleidx < 0) + styleidx = FcGetDefaultObjectLangIndex (font, FC_STYLELANG); + defidx = styleidx; + } + else + defidx = 0; + e = FcPatternFindElt (font, os->objects[o]); if (e) { - for (v = e->values; FcValueListPtrU(v); - v = FcValueListPtrU(v)->next) + for (v = e->values, idx = 0; FcValueListPtrU(v); + v = FcValueListPtrU(v)->next, ++idx) { if (!FcPatternAdd (bucket->pattern, os->objects[o], - FcValueCanonicalize(&FcValueListPtrU(v)->value), FcTrue)) + FcValueCanonicalize(&FcValueListPtrU(v)->value), defidx != idx)) goto bail2; } } --=-=-= Content-Type: text/plain; charset=iso-2022-jp -- Mike FABIAN <mfabian@xxxxxxx> http://www.suse.de/~mfabian 睡眠不足はいい仕事の敵だ。 --=-=-=--