diff -ru fontconfig-2.8.0.orig/src/fcmatch.c fontconfig-2.8.0/src/fcmatch.c --- fontconfig-2.8.0.orig/src/fcmatch.c 2009-11-16 22:46:18.000000000 +0000 +++ fontconfig-2.8.0/src/fcmatch.c 2011-03-08 15:40:33.360456944 +0000 @@ -118,11 +118,65 @@ switch (result) { case FcLangEqual: return 0; - case FcLangDifferentCountry: - return 1; + /* + * Different territories: + * Return 1 if value2 has a value1 variant + * without territory + * Return 2 otherwise + * e.g. prefer fonts that provide "pa" over + * fonts that provide "pa-pk" when requesting + * support for "pa-in" + */ + case FcLangDifferentCountry: { + double ret = 2; + FcChar8 *name1=NULL; + FcStrSet *ss; + FcStrList *sl; + + switch (value1.type) { + case FcTypeLangSet: + if ((ss = FcLangSetGetLangs (value1.u.l))) { + if ((sl = FcStrListCreate (ss))) { + FcChar8 *se; + if ((se = FcStrListNext (sl)) && !FcStrListNext (sl)) { + name1 = FcStrCopy (se); + } + FcStrListDone (sl); + } + FcStrSetDestroy (ss); + } + break; + case FcTypeString: + name1 = FcStrCopy (value1.u.s); + break; + default: + break; + } + + if (name1) { + char *sep; + if ((sep = strchr((char*)name1, '-'))) { + *sep = '\0'; + switch (value2.type) { + case FcTypeLangSet: + if (FcLangEqual == FcLangSetHasLang (value2.u.l, name1)) + ret = 1; + break; + case FcTypeString: + if (0 == FcStrCmpIgnoreCase (value2.u.s, name1)) + ret = 1; + break; + default: + break; + } + } + FcStrFree (name1); + } + return ret; + } case FcLangDifferentLang: default: - return 2; + return 3; } }